view nagslang/world.py @ 342:11febdb72296

Resume from the previous level
author Stefano Rivera <stefano@rivera.za.net>
date Fri, 06 Sep 2013 12:59:51 +0200
parents c2bbb1e70d6f
children 4708e86a9a3c
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.level import Level
from nagslang.protagonist import Protagonist
from nagslang.yamlish import dump, load


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))
        first_level = Level.list_levels()[0]
        self.level = first_level

    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, 'update'):
                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
        ])