view skaapsteker/gamestate.py @ 189:9d08f99b5ddf

Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
author Simon Cross <hodgestar@gmail.com>
date Wed, 06 Apr 2011 21:14:26 +0200
parents e1dd3b785269
children 897eec397cbb
line wrap: on
line source

import json

from skaapsteker import data
from skaapsteker.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:
            print self, key
            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.keys()

    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, needs_world in [
            ('items', 'items', False),
            ('npcs', 'npcs', True)]:
            for sprite_dict in self.data[key].values():
                sprite_dict = sprite_dict.copy()
                if needs_world:
                    sprite_dict['world'] = self.world
                if sprite_dict.pop('level') == level:
                    sprites.append(find_sprite(sprite_dict, stype))
        return sprites