Cheat to gain health
[naja.git] / naja / scenes / load_save.py
index 485b032f61179e1e54a145e416c3e52be446761b..809adbdeb743d0dfe4886f63c0aa390af59906d4 100644 (file)
@@ -9,9 +9,11 @@ from datetime import datetime
 import pygame.locals as pgl
 
 from naja.constants import KEYS
-from naja.events import SceneChangeEvent, InvalidateTheWorld
+from naja.events import SceneChangeEvent, InvalidateTheWorld, LoadGameEvent
+from naja.gamestate import GameState
 from naja.options import options
 from naja.scenes.scene import Scene
+from naja.sound import sound
 from naja.widgets.save_slot import SaveSlotWidget
 from naja.widgets.selector import SelectorWidget
 
@@ -26,9 +28,9 @@ def ensure_save_path_exists():
         os.makedirs(location)
 
 
-class SaveGameScene(Scene):
+class LoadSaveGameBase(Scene):
     def __init__(self, state):
-        super(SaveGameScene, self).__init__(state)
+        super(LoadSaveGameBase, self).__init__(state)
         selector = SelectorWidget()
         self.add(selector)
         self.slots = {}
@@ -55,10 +57,30 @@ class SaveGameScene(Scene):
         game_data = self.get_game_data(slot_num)
         y_offset = 74 * slot_num
         slot = SaveSlotWidget((100, y_offset), slot_num, game_data)
-        slot.add_callback('click', lambda event: self.save_game(slot_num))
+        slot.add_callback('click', lambda event: self.perform_action(slot_num))
         return slot
 
-    def save_game(self, slot_num):
+    def handle_scene_event(self, ev):
+        if ev.type == pgl.KEYDOWN and ev.key in KEYS.QUIT:
+            from naja.scenes.menu import MenuScene
+            SceneChangeEvent.post(MenuScene)
+            return
+
+    def fail(self):
+        sound.play_sound('error.ogg')
+        InvalidateTheWorld.post()
+
+    def succeed(self):
+        from naja.scenes.menu import MenuScene
+        sound.play_sound('chirp.ogg', volume=0.5)
+        SceneChangeEvent.post(MenuScene)
+
+    def perform_action(self, slot_num):
+        raise NotImplementedError("Nothing to see here.")
+
+
+class SaveGameScene(LoadSaveGameBase):
+    def perform_action(self, slot_num):
         save_data = {
             'timestamp': datetime.now().ctime(),
             'data': self.state.gameboard.export(),
@@ -69,11 +91,17 @@ class SaveGameScene(Scene):
                 json.dump(save_data, save_file)
         except Exception as e:
             print "Error saving game in slot %s: %s" % (slot_num, e)
-        self.slots[slot_num].game_data = self.get_game_data(slot_num)
-        InvalidateTheWorld.post()
+            self.fail()
+        else:
+            self.succeed()
 
-    def handle_scene_event(self, ev):
-        if ev.type == pgl.KEYDOWN and ev.key in KEYS.QUIT:
-            from naja.scenes.menu import MenuScene
-            SceneChangeEvent.post(MenuScene)
-            return
+
+class LoadGameScene(LoadSaveGameBase):
+    def perform_action(self, slot_num):
+        game_data = self.get_game_data(slot_num)
+        if game_data is not None:
+            state = GameState.load(game_data['data'])
+            LoadGameEvent.post(state)
+            self.succeed()
+        else:
+            self.fail()