changeset 454:95527fd29872

More complete game load/save/restart.
author Jeremy Thurgood <firxen@gmail.com>
date Sat, 09 Apr 2011 20:47:35 +0200
parents 9c9df17b98a7
children de224d9fb943
files skaapsteker/engine.py skaapsteker/gamestate.py skaapsteker/levelscene.py skaapsteker/menuscene.py
diffstat 4 files changed, 26 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/skaapsteker/engine.py	Sat Apr 09 20:42:48 2011 +0200
+++ b/skaapsteker/engine.py	Sat Apr 09 20:47:35 2011 +0200
@@ -22,8 +22,6 @@
         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):
@@ -44,6 +42,10 @@
             for ev in events:
                 if ev.type is QUIT:
                     return
+                if NewGameEvent.matches(ev):
+                    self.game_state.new_game()
+                    fox = self.game_state.world.fox
+                    ChangeScene.post((ev.scene_type, '.'.join([fox.level, fox.doorway])))
                 if ChangeScene.matches(ev):
                     next_scene = ev.next_scene
                     if not isinstance(next_scene, Scene):
@@ -103,6 +105,14 @@
     def matches(cls, ev):
         return ev.type is USEREVENT and ev.utype == cls.utype
 
+class NewGameEvent(UserEvent):
+
+    utype = "NEW_GAME_EVENT"
+
+    @classmethod
+    def post(cls, scene_type):
+        super(NewGameEvent, cls).post(scene_type=scene_type)
+
 class ChangeScene(UserEvent):
 
     utype = "CHANGE_SCENE"
--- a/skaapsteker/gamestate.py	Sat Apr 09 20:42:48 2011 +0200
+++ b/skaapsteker/gamestate.py	Sat Apr 09 20:47:35 2011 +0200
@@ -37,6 +37,7 @@
 
     def __init__(self, game_file):
         self._game_file = game_file
+        self.world = None
 
     def can_resume(self):
         return os.path.exists(self._game_file)
--- a/skaapsteker/levelscene.py	Sat Apr 09 20:42:48 2011 +0200
+++ b/skaapsteker/levelscene.py	Sat Apr 09 20:47:35 2011 +0200
@@ -118,13 +118,13 @@
     def _quit(self, pause=True):
         import menuscene # avoid circular import
         if pause:
-            engine.ChangeScene.post(menuscene.MenuScene(self.game_state, self._soundsystem, self))
+            engine.ChangeScene.post(menuscene.MenuScene(self.game_state, self._soundsystem))
         else:
             # FIXME: When starting the game, we shoudl ensure we have sane
             # states
             if self._player_dead:
                 self._player.restore()
-            engine.ChangeScene.post(menuscene.MenuScene(self.game_state, self._soundsystem, None))
+            engine.ChangeScene.post(menuscene.MenuScene(self.game_state, self._soundsystem))
 
     def _restart(self):
         if self._player_dead:
--- a/skaapsteker/menuscene.py	Sat Apr 09 20:42:48 2011 +0200
+++ b/skaapsteker/menuscene.py	Sat Apr 09 20:47:35 2011 +0200
@@ -2,17 +2,17 @@
 from pygame.locals import K_ESCAPE, K_q, KEYDOWN, QUIT
 
 from .cutscene import OpeningCutScene, UsageCutScene, CreditsCutScene
-from .engine import ChangeScene, Scene
+from .engine import ChangeScene, Scene, NewGameEvent
 from .levelscene import LevelScene
 from .widgets.text import Text, TextChoice
 
 
 class MenuScene(Scene):
-    def __init__(self, game_state, soundsystem, cur_game=None):
+    def __init__(self, game_state, soundsystem):
         super(MenuScene, self).__init__(game_state, soundsystem)
         self.widgets.append(Text("MENU:", (50, 50), color='white', size=48))
-        self.cur_game = cur_game
         menu_options = [
+            ('Start new game', 'restart'),
             ('Starting Cutscene', 'cutscene'),
             ('Temple', 'temple.starting'),
             ("Temple grounds", "temple_grounds.starting"),
@@ -28,16 +28,22 @@
             ('Credits', 'credits'),
             ('Quit', 'quit'),
         ]
-        if cur_game is not None:
+        if self.game_state.world is not None:
             menu_options.insert(0, ('Resume Game', 'resume'))
         self.choice = TextChoice(menu_options, (50, 100), color='white')
         self.choice.callbacks.append(self.selected)
         self.widgets.append(self.choice)
 
+    def resume_game(self):
+        fox = self.game_state.world.fox
+        ChangeScene.post((LevelScene, '.'.join([fox.level, fox.doorway])))
+
     def selected(self, option, data):
         "Callback from menu TextChoice"
         if data == 'resume':
-            ChangeScene.post(self.cur_game)
+            self.resume_game()
+        elif data == 'restart':
+            NewGameEvent.post(LevelScene)
         elif data == 'cutscene':
             ChangeScene.post(OpeningCutScene(self.game_state, self._soundsystem))
         elif data == 'usage':