Mercurial > skaapsteker
changeset 447:4bec05fed6c7
Load and save.
author | Jeremy Thurgood <firxen@gmail.com> |
---|---|
date | Sat, 09 Apr 2011 20:03:18 +0200 |
parents | 4240854e59b0 |
children | fada4195349d |
files | skaapsteker/__main__.py skaapsteker/engine.py skaapsteker/gamestate.py |
diffstat | 3 files changed, 52 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/skaapsteker/__main__.py Sat Apr 09 19:58:06 2011 +0200 +++ b/skaapsteker/__main__.py Sat Apr 09 20:03:18 2011 +0200 @@ -1,6 +1,7 @@ """Game main module. """ +import os import sys import optparse @@ -15,12 +16,23 @@ from .sound import SoundSystem +def _get_default_save_location(): + """Return a default save game location.""" + app = "ninetales" + if sys.platform.startswith("win") and "APPDATA" in os.environ: + return os.path.join(os.environ["APPDATA"], app) + else: + return os.path.join(os.path.expanduser("~"), ".%s" % app) + + def parse_args(args): parser = optparse.OptionParser() parser.add_option("--no-sound", action="store_false", default=True, dest="sound", help="disable sound") parser.add_option("--dvorak", action="store_true", default=False, dest="dvorak", help="Dvorak keyboard layout") + parser.add_option("--save-location", action="store", default=_get_default_save_location(), + dest="save_location", help="Saved game location") if DEBUG: parser.add_option("--level", type="str", default=None, dest="level", help="Initial level") @@ -29,6 +41,7 @@ opts, _ = parser.parse_args(args or []) options['dvorak'] = opts.dvorak options['sound'] = opts.sound + options['save_location'] = opts.save_location if DEBUG: options['debug_rects'] = opts.rects return opts.level
--- a/skaapsteker/engine.py Sat Apr 09 19:58:06 2011 +0200 +++ b/skaapsteker/engine.py Sat Apr 09 20:03:18 2011 +0200 @@ -1,10 +1,14 @@ """Top-level engine for switching scenes.""" +import os + import pygame.display import pygame.time import pygame.event from pygame.locals import QUIT, USEREVENT +from . import options + class Engine(object): @@ -15,10 +19,15 @@ self._current_scene = None self._fpss = [self._framerate] * 100 self._cur_frame = 0 - self.game_state = GameState("game.json") + self.game_state = GameState(os.path.join(options['save_location'], 'savegame.json')) + if self.game_state.can_resume(): + self.game_state.load_game() + else: + self.game_state.new_game() self.soundsystem = soundsystem def change_scene(self, next_scene): + self.game_state.save_game() self.soundsystem.stop_music() if self._current_scene is not None: self._current_scene.leave()
--- a/skaapsteker/gamestate.py Sat Apr 09 19:58:06 2011 +0200 +++ b/skaapsteker/gamestate.py Sat Apr 09 20:03:18 2011 +0200 @@ -1,3 +1,4 @@ +import os import json from . import data @@ -34,16 +35,35 @@ 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() + def __init__(self, game_file): + self._game_file = game_file + + 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) self.world = StateProxy(self.data) - def save(self, save_game_file): - json.dumps(self.data, open(save_game_file, "wb")) + def new_game(self): + self.load_game(data.filepath("game.json")) + self.save_game() + + def save_game(self): + 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")) + except: + print "Cannot create save game file." def create_sprites(self, level): sprites = [] @@ -57,3 +77,5 @@ if sprite_dict.pop('level') == level: sprites.append(find_sprite(sprite_dict, stype)) return sprites + +