comparison gamelib/config.py @ 486:8897a436a8cb

Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
author Simon Cross <hodgestar@gmail.com>
date Wed, 25 Nov 2009 21:50:54 +0000
parents 03d5cb669298
children
comparison
equal deleted inserted replaced
485:6f0385ebcb4f 486:8897a436a8cb
1 # level.py 1 # level.py
2 2
3 from ConfigParser import RawConfigParser 3 from ConfigParser import RawConfigParser
4 from optparse import OptionParser 4 from optparse import OptionParser
5 import sys
6 import os
5 7
6 class Config(object): 8 class Config(object):
7 """Container for various global configuration knobs and levers.""" 9 """Container for various global configuration knobs and levers."""
8 10
9 valid_options = { 11 valid_options = {
10 'sound': {'type': 'boolean', 'default': 'true'}, 12 'sound': {'type': 'boolean', 'default': 'true'},
11 'level_name': {'type': 'string', 'default': 'two_weeks'}, 13 'level_name': {'type': 'string', 'default': 'two_weeks'},
12 } 14 }
13
14 config_filename = 'config.ini'
15 15
16 def configure(self, params=None): 16 def configure(self, params=None):
17 self._config = RawConfigParser(dict( 17 self._config = RawConfigParser(dict(
18 [(k, v['default']) for k, v in self.valid_options.items() if 'default' in v] 18 [(k, v['default']) for k, v in self.valid_options.items() if 'default' in v]
19 )) 19 ))
20 self._config.add_section('Options') 20 self._config.add_section('Options')
21 self._set_up_params(params) 21 self._set_up_params(params)
22 self._config.read(self.config_filename) 22 self._config.read(self.config_filename)
23 self._process_params() 23 self._process_params()
24 24
25 def ensure_dir_exists(self, folder):
26 """Ensure the given folder exists."""
27 if os.path.exists(folder):
28 assert os.path.isdir(folder)
29 else:
30 os.makedirs(folder)
31
25 def _set_up_params(self, params): 32 def _set_up_params(self, params):
26 parser = OptionParser() 33 parser = OptionParser()
27 parser.add_option("-c", "--config", metavar="FILE", dest="config_filename", 34 parser.add_option("-c", "--config", metavar="FILE", dest="config_filename",
28 help="read configuration from FILE") 35 help="read configuration from FILE")
36 parser.add_option("-p", "--prefs-folder", metavar="PREFS_FOLDER", dest="prefs_folder",
37 help="store preferences and save games in PREFS_FOLDER")
29 parser.add_option("-l", "--level", metavar="LEVEL", dest="level_name", 38 parser.add_option("-l", "--level", metavar="LEVEL", dest="level_name",
30 help="select level LEVEL") 39 help="select level LEVEL")
31 parser.add_option("--sound", action="store_const", const="on", dest="sound", 40 parser.add_option("--sound", action="store_const", const="on", dest="sound",
32 help="enable sound") 41 help="enable sound")
33 parser.add_option("--no-sound", action="store_const", const="off", dest="sound", 42 parser.add_option("--no-sound", action="store_const", const="off", dest="sound",
34 help="disable sound") 43 help="disable sound")
35 (self._opts, _) = parser.parse_args(params or []) 44 (self._opts, _) = parser.parse_args(params or [])
36 self.config_filename = self._opts.config_filename or self.config_filename 45 self.prefs_folder = self._opts.prefs_folder or self._default_prefs_dir()
46 self.ensure_dir_exists(self.prefs_folder)
47 self.save_folder = os.path.join(self.prefs_folder, "savegames")
48 self.ensure_dir_exists(self.save_folder)
49 self.config_filename = self._opts.config_filename or os.path.join(self.prefs_folder, "config.ini")
50
51 def _default_prefs_dir(self):
52 """Return a default preference folder name."""
53 app = "foxassault"
54 if sys.platform.startswith("win") and "APPDATA" in os.environ:
55 return os.path.join(os.environ["APPDATA"], app)
56 else:
57 return os.path.join(os.path.expanduser("~"), ".%s" % app)
37 58
38 def _process_params(self): 59 def _process_params(self):
39 for name in self.valid_options: 60 for name in self.valid_options:
40 opt = getattr(self._opts, name) 61 opt = getattr(self._opts, name)
41 if opt is not None: 62 if opt is not None: