view nagslang/world.py @ 277:56e42c00da25

Protagonist and enemies should see the world
author Neil Muller <drnlmuller@gmail.com>
date Thu, 05 Sep 2013 13:15:31 +0200
parents 3153196517fc
children c2bbb1e70d6f
line wrap: on
line source

# The world object
#
# This is a global object for tracking state across scenes and all that

import os
import sys

import pymunk

from nagslang.yamlish import dump, load
from nagslang.protagonist import Protagonist


class World(object):

    def __init__(self):
        self.reset()

    def reset(self):
        self.attacks = 0
        self.transformations = 0
        self.kills = 0
        self.rooms = 0
        self.protagonist = Protagonist(pymunk.Space(), self, (350, 300))

    def _save_location(self):
        app = 'nagslang'
        if sys.platform.startswith('win'):
            if 'APPDATA' in os.environ:
                return os.path.join(os.environ['APPDATA'], app)
            return os.path.join(os.path.expanduser('~'), '.' + app)
        elif 'XDG_DATA_HOME' in os.environ:
            return os.path.join(os.environ['XDG_DATA_HOME'], app)
        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, 'animate'):
                continue
            data[attr] = value

        fn = self._save_location()
        if not os.path.isdir(os.path.dirname(fn)):
            os.makedirs(os.path.dirname(fn))
        with open(fn, 'w') as f:
            dump(data, f)

    def load(self):
        fn = self._save_location()
        if not os.path.exists(fn):
            return False
        with open(fn) as f:
            data = load(f)
        for k, v in data.iteritems():
            setattr(self, k, v)
        return True

    def get_formatted_stats(self):
        return "\n".join([
            "Times transformed: %d" % self.transformations,
            "Enemies killed: %d" % self.kills,
            "Rooms entered: %d" % self.rooms
        ])