Make chess puzzle level (Kasparov to F3) winnable.
[naja.git] / naja / scenes / load_save.py
index 809adbdeb743d0dfe4886f63c0aa390af59906d4..cf06865f97e0283c820ccd2c3f67daefd6955a39 100644 (file)
@@ -28,6 +28,39 @@ def ensure_save_path_exists():
         os.makedirs(location)
 
 
+class SaveGameSlot(object):
+    def __init__(self, slot_num):
+        self.slot_num = slot_num
+
+    def save_path(self):
+        return save_path('slot_%s.json' % (self.slot_num,))
+
+    def get_game_data(self):
+        try:
+            with open(self.save_path(), 'r') as save_file:
+                return json.load(save_file)
+        except IOError:
+            return None
+        except Exception as e:
+            print "Error reading savegame in slot %s: %s" % (self.slot_num, e)
+            return None
+
+    def save(self, state):
+        ensure_save_path_exists()
+        save_data = {
+            'timestamp': datetime.now().ctime(),
+            'data': state.gameboard.export(),
+        }
+        with open(self.save_path(), 'w') as save_file:
+            json.dump(save_data, save_file)
+
+    def load(self):
+        game_data = self.get_game_data()
+        if game_data is None:
+            return
+        return GameState.load(game_data['data'])
+
+
 class LoadSaveGameBase(Scene):
     def __init__(self, state):
         super(LoadSaveGameBase, self).__init__(state)
@@ -40,22 +73,9 @@ class LoadSaveGameBase(Scene):
             self.slots[slot_num] = slot
             selector.add(slot)
 
-    def save_path(self, slot_num):
-        return save_path('slot_%s.json' % (slot_num,))
-
-    def get_game_data(self, slot_num):
-        try:
-            with open(self.save_path(slot_num), 'r') as save_file:
-                return json.load(save_file)
-        except IOError:
-            return None
-        except Exception as e:
-            print "Error reading savegame in slot %s: %s" % (slot_num, e)
-            return None
-
     def make_slot_widget(self, slot_num):
-        game_data = self.get_game_data(slot_num)
-        y_offset = 74 * slot_num
+        game_data = SaveGameSlot(slot_num).get_game_data()
+        y_offset = 74 * slot_num + 8
         slot = SaveSlotWidget((100, y_offset), slot_num, game_data)
         slot.add_callback('click', lambda event: self.perform_action(slot_num))
         return slot
@@ -71,9 +91,7 @@ class LoadSaveGameBase(Scene):
         InvalidateTheWorld.post()
 
     def succeed(self):
-        from naja.scenes.menu import MenuScene
-        sound.play_sound('chirp.ogg', volume=0.5)
-        SceneChangeEvent.post(MenuScene)
+        raise NotImplementedError("Success not implemented.")
 
     def perform_action(self, slot_num):
         raise NotImplementedError("Nothing to see here.")
@@ -81,27 +99,30 @@ class LoadSaveGameBase(Scene):
 
 class SaveGameScene(LoadSaveGameBase):
     def perform_action(self, slot_num):
-        save_data = {
-            'timestamp': datetime.now().ctime(),
-            'data': self.state.gameboard.export(),
-        }
         try:
-            ensure_save_path_exists()
-            with open(self.save_path(slot_num), 'w') as save_file:
-                json.dump(save_data, save_file)
+            SaveGameSlot(slot_num).save(self.state)
         except Exception as e:
             print "Error saving game in slot %s: %s" % (slot_num, e)
             self.fail()
         else:
             self.succeed()
 
+    def succeed(self):
+        from naja.scenes.menu import MenuScene
+        sound.play_sound('chirp.ogg', volume=0.5)
+        SceneChangeEvent.post(MenuScene)
+
 
 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'])
+        state = SaveGameSlot(slot_num).load()
+        if state is not None:
             LoadGameEvent.post(state)
             self.succeed()
         else:
             self.fail()
+
+    def succeed(self):
+        from naja.scenes.game import GameScene
+        sound.play_sound('chirp.ogg', volume=0.5)
+        SceneChangeEvent.post(GameScene)