changeset 39:3ab5097e8757

Refactor options.
author Simon Cross <hodgestar@gmail.com>
date Sun, 11 Sep 2011 15:03:56 +0200
parents 047273a63054
children 967762f042f8
files mamba/__main__.py mamba/constants.py mamba/options.py
diffstat 3 files changed, 61 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/mamba/__main__.py	Sun Sep 11 14:57:11 2011 +0200
+++ b/mamba/__main__.py	Sun Sep 11 15:03:56 2011 +0200
@@ -1,58 +1,34 @@
 """Main module for the game"""
 
 import sys
-import os
-import optparse
 import pygame
 from pygame.locals import SWSURFACE
 
-from mamba.constants import SCREEN, DEFAULTS
+from mamba.constants import SCREEN
+from mamba.options import options, parse_args
 from mamba.engine import Engine
 from mamba.sound import SoundSystem
 from mamba.habitats.mainmenu import MainMenu
 from mamba.habitats.level import LevelHabitat
 
-# For future use
-DEBUG = False
-if os.environ.get('DEBUG'):
-    DEBUG = True
-
-
-def parse_args(args, options):
-    parser = optparse.OptionParser()
-    parser.add_option("--no-sound", action="store_false", default=True,
-            dest="sound", help="disable sound")
-    if DEBUG:
-        parser.add_option("--level", type="str", default=None,
-                dest="level", help="Initial level")
-        parser.add_option('--edit', action="store_true", default=False,
-                dest="edit", help="Edit given level")
-    opts, _ = parser.parse_args(args)
-    options['sound'] = opts.sound
-    if DEBUG:
-        options['level'] = opts.level
-        options['edit'] = opts.edit
-
 
 def main():
     """Launch the currently unnamed mamab game"""
-    options = DEFAULTS.copy()
-    parse_args(sys.argv, options)
-    sound = SoundSystem(options['sound'])
+    parse_args(sys.argv)
+    SoundSystem(options.sound)
     pygame.display.init()
     pygame.font.init()
-    # TODO: Sound initialisation
     pygame.display.set_mode(SCREEN, SWSURFACE)
     pygame.display.set_caption('Mamba')
 
     engine = Engine()
-    if options['level'] is None:
-        if options['edit']:
+    if options.level is None:
+        if options.edit:
             print 'You must specifiy a level name when using --edit'
             sys.exit(1)
         start = MainMenu()
     else:
-        start = LevelHabitat(options['level'])
+        start = LevelHabitat(options.level)
         # TODO: Hook up firing up editor
     engine.set_habitat(start)
     engine.run()
--- a/mamba/constants.py	Sun Sep 11 14:57:11 2011 +0200
+++ b/mamba/constants.py	Sun Sep 11 15:03:56 2011 +0200
@@ -3,13 +3,13 @@
 SCREEN = (800, 600)
 
 # Sound constants
-SCREEN = (800, 600)
 FREQ = 44100   # same as audio CD
 BITSIZE = -16  # unsigned 16 bit
 CHANNELS = 2   # 1 == mono, 2 == stereo
 BUFFER = 1024  # audio buffer size in no. of samples
 
 DEFAULTS = {
+    'debug': False,
     'sound': True,
     'level': None,
     'edit': False,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mamba/options.py	Sun Sep 11 15:03:56 2011 +0200
@@ -0,0 +1,53 @@
+# global options that are set on startup
+
+import optparse
+import os
+from mamba.constants import DEFAULTS
+
+
+class OptionGetter(object):
+    """Object grabber."""
+
+    def __init__(self, options):
+        self._options = options
+        self._finalized = False
+
+    def set_option(self, name, value):
+        if self._finalized:
+            raise RuntimeError("Cannot set option %r to %r after"
+                               "options are finalized." % (name, value))
+        self._options[name] = value
+
+    def finalize(self):
+        self._finalized = True
+
+    def __getattr__(self, name):
+        if name in self._options:
+            return self._options[name]
+        raise AttributeError("Unknown option %r" % (name,))
+
+options = OptionGetter(DEFAULTS.copy())
+
+
+def parse_args(args, options=options):
+    options.set_option('debug', 'DEBUG' in os.environ)
+
+    parser = optparse.OptionParser()
+    parser.add_option("--no-sound", action="store_false", default=True,
+                      dest="sound", help="disable sound")
+
+    if options.debug:
+        parser.add_option("--level", type="str", default=None,
+                dest="level", help="Initial level")
+        parser.add_option('--edit', action="store_true", default=False,
+                dest="edit", help="Edit given level")
+
+    opts, _ = parser.parse_args(args)
+
+    options.set_option('sound', opts.sound)
+
+    if options.debug:
+        options.set_option('level', opts.level)
+        options.set_option('edit', opts.edit)
+
+    options.finalize()