changeset 252:73d6abf5ba22

Save game state
author Stefano Rivera <stefano@rivera.za.net>
date Wed, 04 Sep 2013 23:53:34 +0200
parents 611370331bd1
children 4350e3f80ef8
files nagslang/engine.py nagslang/screens/menu.py nagslang/world.py
diffstat 3 files changed, 51 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- 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:
--- 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()
--- 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
-            ])
+        ])