[Sugar-devel] [PATCH] SDXO#2620 Add ability to save unfinished games in Memorize.
Ajay Garg
ajay at activitycentral.com
Thu Jan 10 11:30:08 EST 2013
On Thu, Jan 10, 2013 at 9:56 PM, Walter Bender <walter.bender at gmail.com>wrote:
> On Thu, Jan 10, 2013 at 11:02 AM, Ajay Garg <ajay at activitycentral.com>
> wrote:
> >
> >
> > 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?
>
> Not a very Sugary approach.
>
:D
>
> >
> >
> >> * 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.
>
> Not sure how json makes things either more bloated or more error-prone.
>
Hmmm.. I was just a bit sceptical, since we seem to be doing the
"byte_arrays=True" and "byte_arrays=False" at different places.
Having it as a string, will eliminate all such issues :)
>
> regards.
>
> -walter
>
> >
> >
> >>
> >>
> >> 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
> > _______________________________________________
> > Sugar-devel mailing list
> > Sugar-devel at lists.sugarlabs.org
> > http://lists.sugarlabs.org/listinfo/sugar-devel
> >
>
>
>
> --
> Walter Bender
> Sugar Labs
> http://www.sugarlabs.org
> _______________________________________________
> 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/d7b78d13/attachment.html>
More information about the Sugar-devel
mailing list