Add save-game loading.
authorSimon Cross <hodgestar@gmail.com>
Sat, 17 May 2014 11:26:31 +0000 (13:26 +0200)
committerSimon Cross <hodgestar@gmail.com>
Sat, 17 May 2014 11:26:39 +0000 (13:26 +0200)
naja/__main__.py
naja/constants.py
naja/options.py
naja/utils.py

index 02f49a3e7c8c2298537f06347dc9b6dcdced6f91..5b76b2d1e6aff75e73e39f1c05c38f9e99c2c62f 100644 (file)
@@ -6,9 +6,10 @@ import pygame.locals as pgl
 from naja.constants import SCREEN
 from naja.engine import Engine
 from naja.sound import sound
-from naja.options import parse_args
+from naja.options import parse_args, options
 from naja.resources.loader import Loader
 from naja.scenes.menu import MenuScene
+from naja.utils import warp_to_game_state
 
 
 def main():
@@ -34,6 +35,10 @@ def main():
     screen = pygame.display.get_surface()
     scene = MenuScene(None)
     engine = Engine(screen, scene, None)
+
+    if options.game_state is not None:
+        warp_to_game_state(options.game_state)
+
     engine.run()
 
 
index ae812f7d6e4d76a63eeb5fb7bd41a5e8c0d2cae1..1205b0bc5bf7a1da2e94d878d51a1beea604936e 100644 (file)
@@ -18,6 +18,7 @@ DEFAULTS = dict(
     # Debug flags:
     initial_bits=None,
     cheat_enabled=False,
+    game_state=None,
 )
 
 # Sound constants
index 6fe75660987b364ab138dc5144156123c72d9b3c..d37f1be1d459861b37db7ff5552d6290b44f1170 100644 (file)
@@ -9,6 +9,41 @@ from naja.constants import DEFAULTS
 options = AttrDict()
 
 
+def check_min_max(option, value, min_value, max_value):
+    '''
+    Check value lies between min and max and raise OptionValueError if it does
+    not.
+    '''
+    if not (min_value <= value <= max_value):
+        raise optparse.OptionValueError(
+            "Value of %s should be between %s and %s but got: %r"
+            % (option.dest, min, max, value))
+
+
+def load_game(option, opt_str, value, parser):
+    '''
+    Load a save game and store it in parser.values.game_state.
+    '''
+    check_min_max(option, value, 0, 7)
+    # madness takes its toll ...
+    options.save_location = parser.values.save_location
+    from naja.scenes.load_save import SaveGameSlot
+    state = SaveGameSlot(value).load()
+    if state is None:
+        raise optparse.OptionValueError(
+            "Could not load game from slot %s" % (value,))
+    parser.values.game_state = state
+
+
+def load_deck(option, opt_str, value, parser):
+    '''
+    Create a new game for a specific deck  and store it in
+    parser.values.game_state.
+    '''
+    raise optparse.OptionalValueError(
+        "Deck loading not implemented.")
+
+
 def parse_args(args):
     '''
     Parse arguments and store them in the options dictionary.
@@ -38,10 +73,12 @@ def parse_args(args):
         parser.add_option('--cheat-enabled', default=False,
                           action='store_true',
                           help='For those too lazy to type the KONAMI code')
-        parser.add_option('--deck', default=None,
+        parser.add_option('--deck', default=None, action="callback",
+                          callback=load_deck,
                           help='Start with a new game for a specific deck')
-        parser.add_option('--load', default=None,
-                          help='Start with a specific save game loaded')
+        parser.add_option('--load', default=None, type=int, action="callback",
+                          callback=load_game,
+                          help='Start with a specific save game loaded (0-7)')
 
     opts, _ = parser.parse_args(args)
 
index d69cd4ad73f42dfc71a28912a9e751deb3de3129..b15302a1bb01effb9e2a991b843654ea91c8aee0 100644 (file)
@@ -25,3 +25,10 @@ def move_glyph(move_name):
         'BISHOP': u'\u265d',
         'KNIGHT': u'\u265e',
     }.get(move_name, move_name.lower())
+
+
+def warp_to_game_state(game_state):
+    from naja.events import LoadGameEvent, SceneChangeEvent
+    from naja.scenes.game import GameScene
+    LoadGameEvent.post(game_state)
+    SceneChangeEvent.post(GameScene)