# HG changeset patch # User Stefano Rivera # Date 1378499631 -7200 # Node ID 8c7c5db5f0d32b26af7238422d437f35d143293d # Parent 024304f6d068df3212334e6e345b5e8783e7786c Change the flavour of magic in World diff -r 024304f6d068 -r 8c7c5db5f0d3 nagslang/world.py --- 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