Mercurial > skaapsteker
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':