Changeset 252:73d6abf5ba22


Ignore:
Timestamp:
Sep 4, 2013, 9:53:34 PM (7 years ago)
Author:
Stefano Rivera <stefano@…>
Branch:
default
rebase_source:
689a418372e93dbbcfb384d328f2fc9d98ceab0c
Message:

Save game state

Location:
nagslang
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • nagslang/engine.py

    r238 r252  
    2424            'level2': AreaScreen,
    2525        }
     26        self._world.load()
    2627        self.change_screen('menu', None)
    2728        # Dummy resize event, to force us to realise our real size
     
    4849                    self._surface = pygame.display.get_surface()
    4950                elif ScreenChange.matches(ev):
     51                    self._world.save()
    5052                    self._surface.fill(pygame.color.Color(0, 0, 0))
    5153                    self.change_screen(ev.screen, ev.player)
  • nagslang/screens/menu.py

    r238 r252  
    1515        self.cursor_pos = 0
    1616        self.options = [
    17             self.new_game,
    18             self.load_game,
     17            self.play,
     18            self.restart,
    1919            self.quit,
    2020        ]
    2121        self.widgets = [
    2222            TextWidget((10, 10), 'Menu', fontsize=20),
    23             TextWidget((40, 50), 'Start new game'),
    24             TextWidget((40, 70), 'Restore saved game'),
     23            TextWidget((40, 50), 'Play the game'),
     24            TextWidget((40, 70), 'Start the game from the beginning again'),
    2525            TextWidget((40, 90), 'Quit'),
    2626            MultiLineWidget((60, 120), self.world.get_formatted_stats()),
     
    4646            widget.draw(surface)
    4747
    48     def new_game(self):
     48    def play(self):
    4949        ScreenChange.post('level1', None)
    5050
    51     def load_game(self):
    52         raise NotImplementedError()
     51    def restart(self):
     52        self.world.reset()
     53        self.setup()
    5354
    5455    def quit(self):
  • nagslang/world.py

    r238 r252  
    22#
    33# This is a global object for tracking state across scenes and all that
     4
     5import os
     6import sys
     7
     8from nagslang.yamlish import dump, load
    49
    510
     
    712
    813    def __init__(self):
     14        self.reset()
     15
     16    def reset(self):
    917        self.transformations = 0
    1018        self.kills = 0
    1119        self.rooms = 0
    1220
     21    def _save_location(self):
     22        app = 'nagslang'
     23        if sys.platform.startswith('win'):
     24            if 'APPDATA' in os.environ:
     25                return os.path.join(os.environ['APPDATA'], app)
     26            return os.path.join(os.path.expanduser('~'), '.' + app)
     27        elif 'XDG_DATA_HOME' in os.environ:
     28            return os.path.join(os.environ['XDG_DATA_HOME'], app)
     29        return os.path.join(os.path.expanduser('~'), '.local', 'share', app)
     30
    1331    def save(self):
    14         # TODO: Do this
    15         pass
     32        data = {}
     33        for attr in dir(self):
     34            if attr.startswith('_'):
     35                continue
     36            value = getattr(self, attr)
     37            if hasattr(value, '__name__'):
     38                continue
     39            data[attr] = value
     40
     41        fn = self._save_location()
     42        if not os.path.isdir(os.path.dirname(fn)):
     43            os.makedirs(os.path.dirname(fn))
     44        with open(fn, 'w') as f:
     45            dump(data, f)
    1646
    1747    def load(self):
    18         # TODO: Do this
    19         pass
     48        fn = self._save_location()
     49        if not os.path.exists(fn):
     50            return False
     51        with open(fn) as f:
     52            data = load(f)
     53        for k, v in data.iteritems():
     54            setattr(self, k, v)
     55        return True
    2056
    2157    def get_formatted_stats(self):
     
    2460            "Enemies killed: %d" % self.kills,
    2561            "Rooms entered: %d" % self.rooms
    26             ])
     62        ])
Note: See TracChangeset for help on using the changeset viewer.