# HG changeset patch # User Stefano Rivera # Date 1378331614 -7200 # Node ID 73d6abf5ba223e4034da5ec2115bc0ba88c72e04 # Parent 611370331bd140a06a837c4224a76165cecf483e Save game state diff -r 611370331bd1 -r 73d6abf5ba22 nagslang/engine.py --- a/nagslang/engine.py Wed Sep 04 23:46:06 2013 +0200 +++ b/nagslang/engine.py Wed Sep 04 23:53:34 2013 +0200 @@ -23,6 +23,7 @@ 'level1': AreaScreen, 'level2': AreaScreen, } + self._world.load() self.change_screen('menu', None) # Dummy resize event, to force us to realise our real size # http://stackoverflow.com/q/16442573/8629 @@ -47,6 +48,7 @@ pgl.SWSURFACE | pgl.RESIZABLE) self._surface = pygame.display.get_surface() elif ScreenChange.matches(ev): + self._world.save() self._surface.fill(pygame.color.Color(0, 0, 0)) self.change_screen(ev.screen, ev.player) else: diff -r 611370331bd1 -r 73d6abf5ba22 nagslang/screens/menu.py --- a/nagslang/screens/menu.py Wed Sep 04 23:46:06 2013 +0200 +++ b/nagslang/screens/menu.py Wed Sep 04 23:53:34 2013 +0200 @@ -14,14 +14,14 @@ colour='red') self.cursor_pos = 0 self.options = [ - self.new_game, - self.load_game, + self.play, + self.restart, self.quit, ] self.widgets = [ TextWidget((10, 10), 'Menu', fontsize=20), - TextWidget((40, 50), 'Start new game'), - TextWidget((40, 70), 'Restore saved game'), + TextWidget((40, 50), 'Play the game'), + TextWidget((40, 70), 'Start the game from the beginning again'), TextWidget((40, 90), 'Quit'), MultiLineWidget((60, 120), self.world.get_formatted_stats()), self.cursor, @@ -45,11 +45,12 @@ for widget in self.widgets: widget.draw(surface) - def new_game(self): + def play(self): ScreenChange.post('level1', None) - def load_game(self): - raise NotImplementedError() + def restart(self): + self.world.reset() + self.setup() def quit(self): QuitEvent.post() diff -r 611370331bd1 -r 73d6abf5ba22 nagslang/world.py --- a/nagslang/world.py Wed Sep 04 23:46:06 2013 +0200 +++ b/nagslang/world.py Wed Sep 04 23:53:34 2013 +0200 @@ -2,25 +2,61 @@ # # This is a global object for tracking state across scenes and all that +import os +import sys + +from nagslang.yamlish import dump, load + class World(object): def __init__(self): + self.reset() + + def reset(self): self.transformations = 0 self.kills = 0 self.rooms = 0 + def _save_location(self): + app = 'nagslang' + if sys.platform.startswith('win'): + if 'APPDATA' in os.environ: + return os.path.join(os.environ['APPDATA'], app) + return os.path.join(os.path.expanduser('~'), '.' + app) + elif 'XDG_DATA_HOME' in os.environ: + return os.path.join(os.environ['XDG_DATA_HOME'], app) + return os.path.join(os.path.expanduser('~'), '.local', 'share', app) + def save(self): - # TODO: Do this - pass + data = {} + for attr in dir(self): + if attr.startswith('_'): + continue + value = getattr(self, attr) + if hasattr(value, '__name__'): + continue + data[attr] = value + + fn = self._save_location() + if not os.path.isdir(os.path.dirname(fn)): + os.makedirs(os.path.dirname(fn)) + with open(fn, 'w') as f: + dump(data, f) def load(self): - # TODO: Do this - pass + fn = self._save_location() + if not os.path.exists(fn): + return False + with open(fn) as f: + data = load(f) + for k, v in data.iteritems(): + setattr(self, k, v) + return True def get_formatted_stats(self): return "\n".join([ "Times transformed: %d" % self.transformations, "Enemies killed: %d" % self.kills, "Rooms entered: %d" % self.rooms - ]) + ])