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
+
+