view skaapsteker/gamestate.py @ 612:a91b2e4400a5

Fallback to using simplejson if json does not exist (this appears to be all that is needed to add Python2.5 compatibility).
author Simon Cross <hodgestar@gmail.com>
date Mon, 11 Apr 2011 23:54:56 +0200
parents aa01ca54dce2
children 0675f390653c
line wrap: on
line source

try:
    import json
except:
    import simplejson as json

import os

from . import data
from . import options
from .sprites.base import find_sprite


class StateProxy(object):

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

    def __getattr__(self, key):
        try:
            value = self._data[key]
        except KeyError:
            raise AttributeError
        if isinstance(value, dict):
            return StateProxy(value, None) # surprise people
        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()

    def gamestate(self):
        return self._gamestate


class GameState(object):

    def __init__(self, game_file):
        self._game_file = game_file
        self.world = None

    def can_resume(self):
        return os.path.exists(self._game_file)

    def load_game(self, game_file=None):
        if game_file is None:
            game_file = self._game_file
        raw_data = open(game_file, "rb").read()
        self.data = json.loads(raw_data, encoding='utf-8')
        self.world = StateProxy(self.data, self)

    def new_game(self):
        self.load_game(data.filepath("game.json"))
        if options['all_tails']:
            self.data['fox']['tails'] += [
                "fireball",
                "flight",
                "invisibility",
                "lightning",
                "shapeshift",
                "shield",
                "sprint",
                "steal",
            ]
        self.save_game()

    def save_game(self):
        if self.world is None:
            return
        save_dir, _ = os.path.split(self._game_file)
        if not os.path.exists(save_dir):
            try:
                os.makedirs(save_dir)
            except:
                print "Cannot create save game directory."
                return
        try:
            json.dump(self.data, open(self._game_file, "wb"), indent=4)
        except:
            print "Cannot create save game file."

    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

    def create_item_sprite(self, item, to_level=None, to_pos=None):
        itemdef = self.data['items'][item]

        if to_level is not None:
            itemdef['level'] = to_level
        if to_pos is not None:
            itemdef['pos'] = to_pos

        sprite_dict = itemdef.copy()
        sprite_dict.pop('level')
        sprite_dict['name'] = item
        sprite_dict['world'] = self.world
        return find_sprite(sprite_dict, 'items')

    def create_npc_sprite(self, npc, to_level=None, to_pos=None):
        npcdef = self.data['npcs'][npc]

        if to_level is not None:
            npcdef['level'] = to_level
        if to_pos is not None:
            npcdef['pos'] = to_pos

        sprite_dict = npcdef.copy()
        sprite_dict.pop('level')
        sprite_dict['name'] = npc
        sprite_dict['world'] = self.world
        return find_sprite(sprite_dict, 'npcs')