# HG changeset patch # User Simon Cross # Date 1315746236 -7200 # Node ID 3ab5097e875739a43c9bf3ffb42d4df7632dc074 # Parent 047273a6305492db370944c67b2dd7a879ed5843 Refactor options. diff -r 047273a63054 -r 3ab5097e8757 mamba/__main__.py --- 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() diff -r 047273a63054 -r 3ab5097e8757 mamba/constants.py --- 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, diff -r 047273a63054 -r 3ab5097e8757 mamba/options.py --- /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()