changeset 166:bea4857487de

Game state and level list
author Stefano Rivera <stefano@rivera.za.net>
date Wed, 14 Sep 2011 00:38:08 +0200
parents 0b2f2627a0ac
children ce30befccc94
files mamba/__main__.py mamba/constants.py mamba/habitats/levelmenu.py mamba/options.py
diffstat 4 files changed, 44 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/mamba/__main__.py	Wed Sep 14 00:19:55 2011 +0200
+++ b/mamba/__main__.py	Wed Sep 14 00:38:08 2011 +0200
@@ -7,6 +7,7 @@
 from mamba.constants import SCREEN, NAME
 from mamba.options import options, parse_args, check_args
 from mamba.engine import Engine
+from mamba.gamestate import load_state, load_levels
 from mamba.sound import SoundSystem
 from mamba.habitats.mainmenu import MainMenu
 from mamba.habitats.level import LevelHabitat
@@ -25,6 +26,9 @@
     pygame.display.set_mode(SCREEN, SWSURFACE)
     pygame.display.set_caption(NAME)
 
+    load_state()
+    load_levels()
+
     if options.edit:
         start = EditorHabitat(options.level)
     elif options.level is not None:
--- a/mamba/constants.py	Wed Sep 14 00:19:55 2011 +0200
+++ b/mamba/constants.py	Wed Sep 14 00:38:08 2011 +0200
@@ -32,4 +32,5 @@
     'sound': True,
     'level': None,
     'edit': False,
+    'save_location': None,  # Determined by a function in options
 }
--- a/mamba/habitats/levelmenu.py	Wed Sep 14 00:19:55 2011 +0200
+++ b/mamba/habitats/levelmenu.py	Wed Sep 14 00:38:08 2011 +0200
@@ -2,6 +2,7 @@
 
 from pygame.locals import KEYDOWN
 
+from mamba.gamestate import levels, unlocked_levels, done_levels
 from mamba.constants import ESCAPE_KEYS
 from mamba.engine import Habitat, NewHabitatEvent
 from mamba.widgets.imagebutton import LockableTextButton
@@ -11,23 +12,35 @@
 
     def __init__(self):
         super(LevelMenu, self).__init__()
-        self.levels = []
-        for level in range(1, 6):
-            button = LockableTextButton((50 + 75 * level, 100), str(level))
+        self.level_buttons = []
+        for level, name in enumerate(levels):
+            button = LockableTextButton((50 + 75 * level, 100), str(level + 1),
+                                        color='white')
+            button.add_callback('clicked', self.level_selected, name)
+            button.locked = level not in unlocked_levels
             self.container.add(button)
-            button.add_callback('clicked', self.level_selected, level)
-            if level > 1:
-                button.locked = True
+            self.level_buttons.append(button)
         self.container.add_callback(KEYDOWN, self.keydown_event)
+        self.update_button_colors()
 
-    def level_selected(self, ev, widget, level):
+    def update_button_colors(self):
+        for level, button in enumerate(self.level_buttons):
+            if not button.locked and level not in done_levels:
+                button.color = 'green'
+            else:
+                button.color = 'white'
+
+    def level_selected(self, ev, widget, name):
         # Demo:
         if widget.locked:
             widget.locked = False
-        if level == 1:
+            self.update_button_colors()
+            return True
+
+        if not widget.locked:
             from mamba.habitats.level import LevelHabitat
-            NewHabitatEvent.post(LevelHabitat('dev'))
-        return True
+            NewHabitatEvent.post(LevelHabitat(name))
+            return True
 
     def keydown_event(self, ev, widget):
         if ev.key in ESCAPE_KEYS:
--- a/mamba/options.py	Wed Sep 14 00:19:55 2011 +0200
+++ b/mamba/options.py	Wed Sep 14 00:38:08 2011 +0200
@@ -2,6 +2,7 @@
 
 import optparse
 import os
+import sys
 from mamba.constants import DEFAULTS
 
 
@@ -35,6 +36,8 @@
     parser = optparse.OptionParser()
     parser.add_option("--no-sound", action="store_false", default=True,
                       dest="sound", help="disable sound")
+    parser.add_option("--save-location", default=_get_default_save_location(),
+                      dest="save_location", help="Saved game location")
 
     if options.debug:
         parser.add_option("--level", type="str", default=None,
@@ -45,6 +48,7 @@
     opts, _ = parser.parse_args(args)
 
     options.set_option('sound', opts.sound)
+    options.set_option('save_location', opts.save_location)
 
     if options.debug:
         options.set_option('level', opts.level)
@@ -59,3 +63,15 @@
         print "You must supply --level when using --edit."
         return False
     return True
+
+
+def _get_default_save_location():
+    """Return a default save game location."""
+    app = "mamba"
+    if sys.platform.startswith("win"):
+        if "APPDATA" in os.environ:
+            return os.path.join(os.environ["APPDATA"], app)
+        return os.path.join(os.path.expanduser("~"), "." + app)
+    elif 'XDG_DATA_HOME' in os.environ:
+        return os.path.join(os.environ["XDG_DATA_HOME"], app)
+    return os.path.join(os.path.expanduser("~"), ".local", "share", app)