[Sugar-devel] [PATCH] SDXO#2620 Add ability to save unfinished games in Memorize.

Ajay Garg ajay at activitycentral.com
Thu Jan 10 11:02:49 EST 2013


On Thu, Jan 10, 2013 at 8:49 PM, Gonzalo Odiard <gonzalo at laptop.org> wrote:

> Thanks Ajay and Ariel.
> I filled sl #4373 to follow this issue.
>
> Comments:
> * Now you save the game data and the game session data every time. There
> are small games, like aritmetic or letters, but can be big if have images
> or sounds attached. Should be good save the data only if is a custom game.
>

Or may be ask the user  (while exiting), that whether the user wishes to
save the game?


* I think is better use json to persist a structure like a list instead of
> str/eval.
>

Hmm.. the  current approach kind of copies the game-image, thus making it
immune to any change in the game-state-image.
Also, having it persisted in any other form will just make the code too
bloatful and error-prone.



>
> I haven't tested this yet.
>
> Gonzalo
>
>
> On Thu, Jan 10, 2013 at 11:44 AM, Ariel Calzada <ariel.calzada at gmail.com>wrote:
>
>> From: Ajay Garg <ajay at activitycentral.com>
>>
>> The approach followed has been simply to save the current-game image
>> when closing the game. The game resumes from that image next time
>> onwards.
>>
>> Tests conducted ::
>>
>> a)
>>
>>    (i)
>>    User exits, without finishing the current game.
>>
>>    (ii)
>>    When she next starts, she will proceed from the same game, from the
>> same stage.
>>
>> b)
>>
>>    (i)
>>    User exits, without finishing the current game.
>>
>>    (ii)
>>    She then transfers the journal-entry to another XO.
>>
>>    (iii)
>>    Tries to resume the game, from the (transferred) journal entry.
>>
>>    (iv)
>>    Game resumes, from the same stage.
>>
>>
>> Signed-off-by: Ajay Garg <ajay at activitycentral.com>
>> ---
>>  activity.py        | 16 ++++++++++++++--
>>  cardlist.py        |  3 ++-
>>  game.py            | 14 ++++++++++++--
>>  memorizetoolbar.py |  2 +-
>>  model.py           | 12 +++++++++++-
>>  5 files changed, 40 insertions(+), 7 deletions(-)
>>
>> diff --git a/activity.py b/activity.py
>> index 8bfd758..8bc679d 100644
>> --- a/activity.py
>> +++ b/activity.py
>> @@ -107,7 +107,7 @@ class MemorizeActivity(Activity):
>>          # Play game mode
>>          self.table = cardtable.CardTable()
>>          self.scoreboard = scoreboard.Scoreboard()
>> -        self.cardlist = cardlist.CardList()
>> +        self.cardlist = cardlist.CardList(self)
>>          self.createcardpanel = createcardpanel.CreateCardPanel()
>>          self.cardlist.connect('pair-selected',
>>                  self.createcardpanel.pair_selected)
>> @@ -127,7 +127,7 @@ class MemorizeActivity(Activity):
>>                  self._memorizeToolbarBuilder.reset)
>>          self._createToolbarBuilder.connect('create_equal_pairs',
>>                  self.change_equal_pairs)
>> -        self.game = game.MemorizeGame()
>> +        self.game = game.MemorizeGame(self)
>>
>>          self._edit_button.connect('toggled', self._change_mode_bt)
>>
>> @@ -232,11 +232,16 @@ class MemorizeActivity(Activity):
>>
>>      def write_file(self, file_path):
>>          logging.debug('WRITE_FILE is_demo %s', self.game.model.is_demo)
>> +
>> +        # We want to save the game-image for demo games too !!!
>> +        """
>>          if self.game.model.is_demo:
>>              # if is a demo game only want keep the metadata
>>              self._jobject.set_file_path(None)
>>              raise NotImplementedError
>>              return
>> +        """
>> +
>>          if self.cardlist.pair_list_modified:
>>              self.cardlist.update_model(self.game.model)
>>
>> @@ -285,6 +290,13 @@ class MemorizeActivity(Activity):
>>          game_zip.close()
>>          self.metadata['mime_type'] = 'application/x-memorize-project'
>>
>> +        # Store the game image as a string - that is simpler instead of
>> +        # having to deal with the dbus-converted list.
>> +        # When reading back, we use "eval" to convert the string into
>> +        # the correct type ("list" in this case).
>> +        self.metadata['saved_game_data_image'] =
>> str(self.game.model.grid)
>> +        self.metadata['size'] = int(self.game.model.data['size'])
>> +
>>      def _complete_close(self):
>>          self._remove_temp_files()
>>          Activity._complete_close(self)
>> diff --git a/cardlist.py b/cardlist.py
>> index 6bc781c..65e44f1 100644
>> --- a/cardlist.py
>> +++ b/cardlist.py
>> @@ -40,8 +40,9 @@ class CardList(gtk.EventBox):
>>          'update-create-toolbar': (SIGNAL_RUN_FIRST, None, 3 *
>> [TYPE_PYOBJECT]),
>>      }
>>
>> -    def __init__(self):
>> +    def __init__(self, activity_instance):
>>          gtk.EventBox.__init__(self)
>> +        self._activity_instance = activity_instance
>>          self.pairs = []
>>          self.current_pair = None
>>          self.current_game_key = None
>> diff --git a/game.py b/game.py
>> index c5e54d1..9d21b4b 100644
>> --- a/game.py
>> +++ b/game.py
>> @@ -57,7 +57,7 @@ class MemorizeGame(GObject):
>>          'change-turn': (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT]),
>>          }
>>
>> -    def __init__(self):
>> +    def __init__(self, activity_instance):
>>          gobject.GObject.__init__(self)
>>          self.myself = None
>>          self.players_score = {}
>> @@ -70,7 +70,7 @@ class MemorizeGame(GObject):
>>          self.messenger = None
>>          self.sentitive = True
>>
>> -        self.model = Model()
>> +        self.model = Model(activity_instance=activity_instance)
>>          self.flip_block = False
>>          self._flop_cards = None
>>
>> @@ -109,6 +109,16 @@ class MemorizeGame(GObject):
>>          self.change_turn()
>>          self.model.data['running'] = 'False'
>>
>> +        # Card 'state' is an aawesome field.
>> +        # Its takes on the following values ::
>> +        #
>> +        # 0                              ==>    for flopped cards.
>> +        #
>> +        # 1                              ==>    for flipped unmatched
>> cards
>> +        #                                       (can be a maximum of 1
>> such card).
>> +        #
>> +        # <stroke_color>, <fill_color>   ==>    for flipped matched cards
>> +
>>          for card in self.model.grid:
>>              if card['state'] == '1':
>>                  self.emit('flip-card', self.model.grid.index(card),
>> False)
>> diff --git a/memorizetoolbar.py b/memorizetoolbar.py
>> index 1a06da7..07ceecf 100644
>> --- a/memorizetoolbar.py
>> +++ b/memorizetoolbar.py
>> @@ -135,5 +135,5 @@ class MemorizeToolbarBuilder(gobject.GObject):
>>          self._demo_games.props.icon_name = 'memorize-collection'
>>
>>      def update_toolbar(self, widget, data, grid):
>> -        size = data.get('size')
>> +        size = str(data.get('size'))
>>          self._size_combo.props.icon_name = size + ' X ' + size
>> diff --git a/model.py b/model.py
>> index 2567ed2..16239c4 100644
>> --- a/model.py
>> +++ b/model.py
>> @@ -100,11 +100,13 @@ class Model(object):
>>      information.
>>      '''
>>
>> -    def __init__(self, game_path=None):
>> +    def __init__(self, game_path=None, activity_instance=None):
>>          tmp_root = join(environ['SUGAR_ACTIVITY_ROOT'], 'instance')
>>          self.temp_folder = tempfile.mkdtemp(dir=tmp_root)
>>          chmod(self.temp_folder, 0777)
>> +        self._saved_game_loaded = False
>>
>> +        self._activity_instance = activity_instance
>>          self.data = {}
>>
>>          if game_path is None:
>> @@ -366,6 +368,14 @@ class Model(object):
>>              temp1.extend(temp2)
>>              random.shuffle(temp1)
>>          self.grid = temp1
>> +
>> +        if not self._saved_game_loaded:
>> +            if self._activity_instance is not None:
>> +                if 'saved_game_data_image' in
>> self._activity_instance.metadata.keys():
>> +                    self.grid =
>> eval(self._activity_instance.metadata['saved_game_data_image'])
>> +                    self.data['size'] =
>> int(self._activity_instance.metadata['size'])
>> +                    self._saved_game_loaded = True
>> +
>>          _logger.debug('Defgrid: grid( size=%s ): %s'
>>                        % (self.data['size'], self.grid))
>>          _logger.debug('Defgrid: data: %s', self.data)
>> --
>> 1.7.11.7
>>
>> _______________________________________________
>> Sugar-devel mailing list
>> Sugar-devel at lists.sugarlabs.org
>> http://lists.sugarlabs.org/listinfo/sugar-devel
>>
>
>


-- 
Regards,

Ajay Garg
Dextrose Developer
Activity Central: http://activitycentral.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sugarlabs.org/archive/sugar-devel/attachments/20130110/ba2141ee/attachment.html>


More information about the Sugar-devel mailing list