changeset 373:8c7c5db5f0d3

Change the flavour of magic in World
author Stefano Rivera <stefano@rivera.za.net>
date Fri, 06 Sep 2013 22:33:51 +0200
parents 024304f6d068
children 150332d6c1fb
files nagslang/world.py
diffstat 1 files changed, 24 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/nagslang/world.py	Fri Sep 06 22:27:08 2013 +0200
+++ b/nagslang/world.py	Fri Sep 06 22:33:51 2013 +0200
@@ -18,15 +18,29 @@
         self.reset()
 
     def reset(self):
-        self.attacks = 0
-        self.transformations = 0
-        self.kills = 0
-        self.rooms = 0
         first_level = Level.list_levels()[0]
         starting_position = (350, 300)
-        self.protagonist = Protagonist(pymunk.Space(), self, starting_position)
-        self.level = (first_level, starting_position)
-        self.level_state = {}
+        self.__dict__['_data'] = {
+            'attacks': 0,
+            'transformations': 0,
+            'kills': 0,
+            'rooms': 0,
+            'protagonist': Protagonist(pymunk.Space(), self,
+                                       starting_position),
+            'level': (first_level, starting_position),
+            'level_state': {},
+        }
+
+    def __getattr__(self, name):
+        try:
+            return self._data[name]
+        except KeyError:
+            raise AttributeError()
+
+    def __setattr__(self, name, value):
+        if name not in self._data:
+            raise AttributeError("Worlds don't have a %s property" % name)
+        self._data[name] = value
 
     def _save_location(self):
         app = 'nagslang'
@@ -39,18 +53,8 @@
         return os.path.join(os.path.expanduser('~'), '.local', 'share', app)
 
     def save(self):
-        data = {}
-        for attr in dir(self):
-            if attr.startswith('_'):
-                continue
-            value = getattr(self, attr)
-            if hasattr(value, '__name__'):
-                continue
-            # Hack until we save protagonist state
-            if hasattr(value, 'update') and not isinstance(value, dict):
-                continue
-            data[attr] = value
-
+        data = self._data.copy()
+        data['inventory'] = sorted(data.pop('protagonist').inventory)
         fn = self._save_location()
         if not os.path.isdir(os.path.dirname(fn)):
             os.makedirs(os.path.dirname(fn))
@@ -63,6 +67,7 @@
             return False
         with open(fn) as f:
             data = load(f)
+        self.protagonist.inventory = set(data.pop('inventory', []))
         for k, v in data.iteritems():
             setattr(self, k, v)
         return True