view skaapsteker/gamestate.py @ 275:bcdfd2be2eb4

Merged changes, I hope.
author Adrianna Pińska <adrianna.pinska@gmail.com>
date Fri, 08 Apr 2011 19:18:48 +0200
parents 129afb4417cf
children 4bec05fed6c7
line wrap: on
line source

import json

from . import data
from .sprites.base import find_sprite


class StateProxy(object):

    def __init__(self, data):
        self.__dict__['_data'] = data # should be a dict

    def __getattr__(self, key):
        try:
            value = self._data[key]
        except KeyError:
            raise AttributeError
        if isinstance(value, dict):
            return StateProxy(value)
        else:
            return value

    def __setattr__(self, key, value):
        self._data[key] = value

    def __iter__(self):
        return self._data.iterkeys()

    def __contains__(self, key):
        return key in self._data

    def copy(self):
        return self._data.copy()


class GameState(object):

    def __init__(self, game_file, saved=False):
        if saved:
            raw_data = open(game_file, "rb").read()
        else:
            raw_data = data.load(game_file).read()
        self.data = json.loads(raw_data)
        self.world = StateProxy(self.data)

    def save(self, save_game_file):
        json.dumps(self.data, open(save_game_file, "wb"))

    def create_sprites(self, level):
        sprites = []
        for stype, key in [
            ('items', 'items'),
            ('npcs', 'npcs')]:
            for sprite_name, sprite_dict in self.data[key].items():
                sprite_dict = sprite_dict.copy()
                sprite_dict['name'] = sprite_name
                sprite_dict['world'] = self.world
                if sprite_dict.pop('level') == level:
                    sprites.append(find_sprite(sprite_dict, stype))
        return sprites