annotate pyntnclick/main.py @ 824:9f542ef6e498 pyntnclick

Reorganise code
author Neil Muller <neil@dip.sun.ac.za>
date Tue, 29 Jan 2013 11:41:03 +0200
parents beac13c4e982
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
1 '''Game main module.
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
2
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
3 Contains the entry point used by the run_game.py script.
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
4
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
5 '''
102
322cbc0a8cce Mac build stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
6 import sys
769
43b49f1de828 Merge i18n for before the pyntnclick split
Stefano Rivera <stefano@rivera.za.net>
parents: 758
diff changeset
7 import gettext
43b49f1de828 Merge i18n for before the pyntnclick split
Stefano Rivera <stefano@rivera.za.net>
parents: 758
diff changeset
8 import locale
786
fb8c146017a9 Add warnings for 'po file is older than mo file' and 'mo file missing'
Neil Muller <neil@dip.sun.ac.za>
parents: 785
diff changeset
9 import os
107
5213b45fcc7e Initial event sound support
Neil Muller <neil@dip.sun.ac.za>
parents: 105
diff changeset
10 from optparse import OptionParser
102
322cbc0a8cce Mac build stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
11
17
55f1969e41c9 Add simple menu screen
Neil Muller <neil@dip.sun.ac.za>
parents: 0
diff changeset
12 import pygame
37
d449c4674da8 Fix call to set mode.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 28
diff changeset
13 from pygame.locals import SWSURFACE
26
0a68d137f509 Initial inventory palette thing.
Jeremy Thurgood <firxen@gmail.com>
parents: 25
diff changeset
14
817
beac13c4e982 Also warn about out-of-date tool translations if running rect-drawer
Neil Muller <neil@dip.sun.ac.za>
parents: 802
diff changeset
15 from pyntnclick.i18n import _, get_module_i18n_path
600
fabce47e542f Stop using albow (at least for the menu). Breaks the world. Please fix it, kthx
Stefano Rivera <stefano@rivera.za.net>
parents: 599
diff changeset
16 from pyntnclick.engine import Engine
614
974cc69d3762 Special cases aren't special enough to be named special.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 613
diff changeset
17 from pyntnclick.gamescreen import DefMenuScreen, DefEndScreen, GameScreen
594
a9e9a7fbdbcf Make debug a env variable
Neil Muller <neil@dip.sun.ac.za>
parents: 590
diff changeset
18 from pyntnclick.constants import GameConstants, DEBUG_ENVVAR
569
0587f11ff435 Link up Resource module.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 568
diff changeset
19 from pyntnclick.resources import Resources
564
2f7aa3cad77c Sound hackery
Neil Muller <neil@dip.sun.ac.za>
parents: 560
diff changeset
20 from pyntnclick.sound import Sound
570
9c3528c2cbe5 Bug fixes for sound hook-up.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 569
diff changeset
21 from pyntnclick import state
107
5213b45fcc7e Initial event sound support
Neil Muller <neil@dip.sun.ac.za>
parents: 105
diff changeset
22
691
60bf20849231 Fix detail loading in rect_drawer. Improve error reporting when loading fails
Neil Muller <neil@dip.sun.ac.za>
parents: 673
diff changeset
23 from pyntnclick.tools.rect_drawer import (RectEngine, RectDrawerError,
60bf20849231 Fix detail loading in rect_drawer. Improve error reporting when loading fails
Neil Muller <neil@dip.sun.ac.za>
parents: 673
diff changeset
24 make_rect_display)
824
9f542ef6e498 Reorganise code
Neil Muller <neil@dip.sun.ac.za>
parents: 817
diff changeset
25 from pyntnclick.utils import list_scenes
589
ebc48b397fd5 Turn rect_drawer into a command line option
Neil Muller <neil@dip.sun.ac.za>
parents: 587
diff changeset
26
532
02cf5537d74e PEP-8 main.
Jeremy Thurgood <firxen@gmail.com>
parents: 447
diff changeset
27
554
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
28 class GameDescriptionError(Exception):
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
29 """Raised when an GameDescription is invalid."""
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
30
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
31
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
32 class GameDescription(object):
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
33
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
34 # initial scene for start of game (unless overridden by debug)
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
35 INITIAL_SCENE = None
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
36
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
37 # list of game scenes
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
38 SCENE_LIST = None
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
39
599
2d2ea51b73ad Move menu.py and endscreen.py to gamelib. Add default versions for new games
Neil Muller <neil@dip.sun.ac.za>
parents: 598
diff changeset
40 # starting menu
614
974cc69d3762 Special cases aren't special enough to be named special.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 613
diff changeset
41 SCREENS = {
974cc69d3762 Special cases aren't special enough to be named special.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 613
diff changeset
42 'menu': DefMenuScreen,
974cc69d3762 Special cases aren't special enough to be named special.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 613
diff changeset
43 'end': DefEndScreen,
974cc69d3762 Special cases aren't special enough to be named special.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 613
diff changeset
44 }
599
2d2ea51b73ad Move menu.py and endscreen.py to gamelib. Add default versions for new games
Neil Muller <neil@dip.sun.ac.za>
parents: 598
diff changeset
45
608
a25cd1c6335a Pass screens through engine by name
Neil Muller <neil@dip.sun.ac.za>
parents: 603
diff changeset
46 START_SCREEN = 'menu'
599
2d2ea51b73ad Move menu.py and endscreen.py to gamelib. Add default versions for new games
Neil Muller <neil@dip.sun.ac.za>
parents: 598
diff changeset
47
749
a453731e4531 Game-defined scene module
Stefano Rivera <stefano@rivera.za.net>
parents: 739
diff changeset
48 # Modules
a453731e4531 Game-defined scene module
Stefano Rivera <stefano@rivera.za.net>
parents: 739
diff changeset
49 RESOURCE_MODULE = 'data'
a453731e4531 Game-defined scene module
Stefano Rivera <stefano@rivera.za.net>
parents: 739
diff changeset
50 SCENE_MODULE = 'gamelib.scenes'
569
0587f11ff435 Link up Resource module.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 568
diff changeset
51
750
ef4bda7d623d Better state and inventory management.
Jeremy Thurgood <firxen@gmail.com>
parents: 749
diff changeset
52 def __init__(self):
554
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
53 if self.INITIAL_SCENE is None:
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
54 raise GameDescriptionError("A game must have an initial scene.")
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
55 if not self.SCENE_LIST:
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
56 raise GameDescriptionError("A game must have a non-empty list"
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
57 " of scenes.")
614
974cc69d3762 Special cases aren't special enough to be named special.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 613
diff changeset
58 if 'game' in self.SCREENS:
974cc69d3762 Special cases aren't special enough to be named special.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 613
diff changeset
59 raise GameDescriptionError("The 'game' screen is reserved for the"
974cc69d3762 Special cases aren't special enough to be named special.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 613
diff changeset
60 " game itself.")
554
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
61 self._initial_scene = self.INITIAL_SCENE
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
62 self._scene_list = self.SCENE_LIST
569
0587f11ff435 Link up Resource module.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 568
diff changeset
63 self._resource_module = self.RESOURCE_MODULE
554
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
64 self._debug_rects = False
614
974cc69d3762 Special cases aren't special enough to be named special.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 613
diff changeset
65 self._screens = self.SCREENS.copy()
974cc69d3762 Special cases aren't special enough to be named special.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 613
diff changeset
66 self._screens['game'] = GameScreen
769
43b49f1de828 Merge i18n for before the pyntnclick split
Stefano Rivera <stefano@rivera.za.net>
parents: 758
diff changeset
67 self.constants = self.game_constants()
43b49f1de828 Merge i18n for before the pyntnclick split
Stefano Rivera <stefano@rivera.za.net>
parents: 758
diff changeset
68
43b49f1de828 Merge i18n for before the pyntnclick split
Stefano Rivera <stefano@rivera.za.net>
parents: 758
diff changeset
69 locale.setlocale(locale.LC_ALL, "")
784
29c5badeef98 Use getdefaultlocale, with a envvar list, so that it'll take LANGUAGE first, over LANG
Stefano Rivera <stefano@rivera.za.net>
parents: 782
diff changeset
70 lang = locale.getdefaultlocale(['LANGUAGE', 'LC_ALL', 'LC_CTYPE',
29c5badeef98 Use getdefaultlocale, with a envvar list, so that it'll take LANGUAGE first, over LANG
Stefano Rivera <stefano@rivera.za.net>
parents: 782
diff changeset
71 'LANG'])[0]
769
43b49f1de828 Merge i18n for before the pyntnclick split
Stefano Rivera <stefano@rivera.za.net>
parents: 758
diff changeset
72 self.resource = Resources(self._resource_module, lang)
817
beac13c4e982 Also warn about out-of-date tool translations if running rect-drawer
Neil Muller <neil@dip.sun.ac.za>
parents: 802
diff changeset
73 locale_path = self.resource.get_resource_path('locale')
beac13c4e982 Also warn about out-of-date tool translations if running rect-drawer
Neil Muller <neil@dip.sun.ac.za>
parents: 802
diff changeset
74 gettext.bindtextdomain(self.constants.short_name, locale_path)
792
bdaffaa8b6bf Loading and saving! (Plus a bunch of other stuff to make it possible.)
Jeremy Thurgood <firxen@gmail.com>
parents: 786
diff changeset
75 gettext.textdomain(self.constants.short_name)
769
43b49f1de828 Merge i18n for before the pyntnclick split
Stefano Rivera <stefano@rivera.za.net>
parents: 758
diff changeset
76
817
beac13c4e982 Also warn about out-of-date tool translations if running rect-drawer
Neil Muller <neil@dip.sun.ac.za>
parents: 802
diff changeset
77 popath = self.resource.get_resource_path('po')
beac13c4e982 Also warn about out-of-date tool translations if running rect-drawer
Neil Muller <neil@dip.sun.ac.za>
parents: 802
diff changeset
78 self._check_translations(popath, locale_path)
786
fb8c146017a9 Add warnings for 'po file is older than mo file' and 'mo file missing'
Neil Muller <neil@dip.sun.ac.za>
parents: 785
diff changeset
79
564
2f7aa3cad77c Sound hackery
Neil Muller <neil@dip.sun.ac.za>
parents: 560
diff changeset
80 self.sound = Sound(self.resource)
594
a9e9a7fbdbcf Make debug a env variable
Neil Muller <neil@dip.sun.ac.za>
parents: 590
diff changeset
81 self.debug_options = []
673
f67bc162d69e Working resume button
Stefano Rivera <stefano@rivera.za.net>
parents: 661
diff changeset
82 self.running = False
554
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
83
817
beac13c4e982 Also warn about out-of-date tool translations if running rect-drawer
Neil Muller <neil@dip.sun.ac.za>
parents: 802
diff changeset
84 def _check_translations(self, popath, locale_path):
786
fb8c146017a9 Add warnings for 'po file is older than mo file' and 'mo file missing'
Neil Muller <neil@dip.sun.ac.za>
parents: 785
diff changeset
85 """Check for outdated mo files"""
817
beac13c4e982 Also warn about out-of-date tool translations if running rect-drawer
Neil Muller <neil@dip.sun.ac.za>
parents: 802
diff changeset
86 name = gettext.textdomain() # only check the current app
786
fb8c146017a9 Add warnings for 'po file is older than mo file' and 'mo file missing'
Neil Muller <neil@dip.sun.ac.za>
parents: 785
diff changeset
87 for candidate in os.listdir(popath):
fb8c146017a9 Add warnings for 'po file is older than mo file' and 'mo file missing'
Neil Muller <neil@dip.sun.ac.za>
parents: 785
diff changeset
88 if candidate.endswith('.po'):
fb8c146017a9 Add warnings for 'po file is older than mo file' and 'mo file missing'
Neil Muller <neil@dip.sun.ac.za>
parents: 785
diff changeset
89 polang = candidate.split('.', 1)[0]
fb8c146017a9 Add warnings for 'po file is older than mo file' and 'mo file missing'
Neil Muller <neil@dip.sun.ac.za>
parents: 785
diff changeset
90 pofile = os.path.join(popath, candidate)
817
beac13c4e982 Also warn about out-of-date tool translations if running rect-drawer
Neil Muller <neil@dip.sun.ac.za>
parents: 802
diff changeset
91 mofile = gettext.find(name, locale_path, (polang,))
786
fb8c146017a9 Add warnings for 'po file is older than mo file' and 'mo file missing'
Neil Muller <neil@dip.sun.ac.za>
parents: 785
diff changeset
92 if mofile is None:
fb8c146017a9 Add warnings for 'po file is older than mo file' and 'mo file missing'
Neil Muller <neil@dip.sun.ac.za>
parents: 785
diff changeset
93 print 'Missing mo file for %s' % pofile
fb8c146017a9 Add warnings for 'po file is older than mo file' and 'mo file missing'
Neil Muller <neil@dip.sun.ac.za>
parents: 785
diff changeset
94 continue
fb8c146017a9 Add warnings for 'po file is older than mo file' and 'mo file missing'
Neil Muller <neil@dip.sun.ac.za>
parents: 785
diff changeset
95 if os.stat(pofile).st_mtime > os.stat(mofile).st_mtime:
fb8c146017a9 Add warnings for 'po file is older than mo file' and 'mo file missing'
Neil Muller <neil@dip.sun.ac.za>
parents: 785
diff changeset
96 print 'po file %s is newer than mo file %s' % (pofile,
fb8c146017a9 Add warnings for 'po file is older than mo file' and 'mo file missing'
Neil Muller <neil@dip.sun.ac.za>
parents: 785
diff changeset
97 mofile)
fb8c146017a9 Add warnings for 'po file is older than mo file' and 'mo file missing'
Neil Muller <neil@dip.sun.ac.za>
parents: 785
diff changeset
98
792
bdaffaa8b6bf Loading and saving! (Plus a bunch of other stuff to make it possible.)
Jeremy Thurgood <firxen@gmail.com>
parents: 786
diff changeset
99 def initial_state(self, game_state=None):
554
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
100 """Create a copy of the initial game state."""
792
bdaffaa8b6bf Loading and saving! (Plus a bunch of other stuff to make it possible.)
Jeremy Thurgood <firxen@gmail.com>
parents: 786
diff changeset
101 initial_state = state.Game(self, self.game_state_class()(game_state))
554
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
102 initial_state.set_debug_rects(self._debug_rects)
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
103 for scene in self._scene_list:
612
cfc16ded7b34 Fix scene/screen confusion
Neil Muller <neil@dip.sun.ac.za>
parents: 608
diff changeset
104 initial_state.load_scenes(scene)
792
bdaffaa8b6bf Loading and saving! (Plus a bunch of other stuff to make it possible.)
Jeremy Thurgood <firxen@gmail.com>
parents: 786
diff changeset
105 if initial_state.data['current_scene'] is None:
bdaffaa8b6bf Loading and saving! (Plus a bunch of other stuff to make it possible.)
Jeremy Thurgood <firxen@gmail.com>
parents: 786
diff changeset
106 initial_state.data.set_current_scene(self._initial_scene)
bdaffaa8b6bf Loading and saving! (Plus a bunch of other stuff to make it possible.)
Jeremy Thurgood <firxen@gmail.com>
parents: 786
diff changeset
107 initial_state.change_scene(initial_state.data['current_scene'])
554
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
108 return initial_state
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
109
792
bdaffaa8b6bf Loading and saving! (Plus a bunch of other stuff to make it possible.)
Jeremy Thurgood <firxen@gmail.com>
parents: 786
diff changeset
110 def game_state_class(self):
bdaffaa8b6bf Loading and saving! (Plus a bunch of other stuff to make it possible.)
Jeremy Thurgood <firxen@gmail.com>
parents: 786
diff changeset
111 return state.GameState
750
ef4bda7d623d Better state and inventory management.
Jeremy Thurgood <firxen@gmail.com>
parents: 749
diff changeset
112
576
1b1ab71535bd Classify constants, which involves a whole bunch of XXX comments
Stefano Rivera <stefano@rivera.za.net>
parents: 570
diff changeset
113 def game_constants(self):
1b1ab71535bd Classify constants, which involves a whole bunch of XXX comments
Stefano Rivera <stefano@rivera.za.net>
parents: 570
diff changeset
114 return GameConstants()
1b1ab71535bd Classify constants, which involves a whole bunch of XXX comments
Stefano Rivera <stefano@rivera.za.net>
parents: 570
diff changeset
115
556
a4f28da12720 Move option_parser onto GameDescription so it can be overridden by sub-classes if they lik.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 554
diff changeset
116 def option_parser(self):
a4f28da12720 Move option_parser onto GameDescription so it can be overridden by sub-classes if they lik.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 554
diff changeset
117 parser = OptionParser()
a4f28da12720 Move option_parser onto GameDescription so it can be overridden by sub-classes if they lik.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 554
diff changeset
118 parser.add_option("--no-sound", action="store_false", default=True,
a4f28da12720 Move option_parser onto GameDescription so it can be overridden by sub-classes if they lik.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 554
diff changeset
119 dest="sound", help="disable sound")
594
a9e9a7fbdbcf Make debug a env variable
Neil Muller <neil@dip.sun.ac.za>
parents: 590
diff changeset
120 # We flag these, so we can warn the user that these require debug mode
a9e9a7fbdbcf Make debug a env variable
Neil Muller <neil@dip.sun.ac.za>
parents: 590
diff changeset
121 self.debug_options = ['--scene', '--no-rects', '--rect-drawer',
a9e9a7fbdbcf Make debug a env variable
Neil Muller <neil@dip.sun.ac.za>
parents: 590
diff changeset
122 '--list-scenes', '--details']
576
1b1ab71535bd Classify constants, which involves a whole bunch of XXX comments
Stefano Rivera <stefano@rivera.za.net>
parents: 570
diff changeset
123 if self.constants.debug:
556
a4f28da12720 Move option_parser onto GameDescription so it can be overridden by sub-classes if they lik.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 554
diff changeset
124 parser.add_option("--scene", type="str", default=None,
a4f28da12720 Move option_parser onto GameDescription so it can be overridden by sub-classes if they lik.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 554
diff changeset
125 dest="scene", help="initial scene")
a4f28da12720 Move option_parser onto GameDescription so it can be overridden by sub-classes if they lik.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 554
diff changeset
126 parser.add_option("--no-rects", action="store_false", default=True,
a4f28da12720 Move option_parser onto GameDescription so it can be overridden by sub-classes if they lik.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 554
diff changeset
127 dest="rects", help="disable debugging rects")
589
ebc48b397fd5 Turn rect_drawer into a command line option
Neil Muller <neil@dip.sun.ac.za>
parents: 587
diff changeset
128 parser.add_option("--rect-drawer", action="store_true",
ebc48b397fd5 Turn rect_drawer into a command line option
Neil Muller <neil@dip.sun.ac.za>
parents: 587
diff changeset
129 default=False, dest="rect_drawer",
ebc48b397fd5 Turn rect_drawer into a command line option
Neil Muller <neil@dip.sun.ac.za>
parents: 587
diff changeset
130 help="Launch the rect drawing helper tool. Specify the"
ebc48b397fd5 Turn rect_drawer into a command line option
Neil Muller <neil@dip.sun.ac.za>
parents: 587
diff changeset
131 " scene with --scene")
ebc48b397fd5 Turn rect_drawer into a command line option
Neil Muller <neil@dip.sun.ac.za>
parents: 587
diff changeset
132 parser.add_option("--list-scenes", action="store_true",
ebc48b397fd5 Turn rect_drawer into a command line option
Neil Muller <neil@dip.sun.ac.za>
parents: 587
diff changeset
133 default=False, dest='list_scenes', help="List all scenes"
ebc48b397fd5 Turn rect_drawer into a command line option
Neil Muller <neil@dip.sun.ac.za>
parents: 587
diff changeset
134 " that can be used with --scene and exit.")
ebc48b397fd5 Turn rect_drawer into a command line option
Neil Muller <neil@dip.sun.ac.za>
parents: 587
diff changeset
135 parser.add_option("--detail", type="str", default=None,
ebc48b397fd5 Turn rect_drawer into a command line option
Neil Muller <neil@dip.sun.ac.za>
parents: 587
diff changeset
136 dest="detail", help="Detailed view for rect_drawer")
556
a4f28da12720 Move option_parser onto GameDescription so it can be overridden by sub-classes if they lik.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 554
diff changeset
137 return parser
a4f28da12720 Move option_parser onto GameDescription so it can be overridden by sub-classes if they lik.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 554
diff changeset
138
594
a9e9a7fbdbcf Make debug a env variable
Neil Muller <neil@dip.sun.ac.za>
parents: 590
diff changeset
139 def warn_debug(self, option):
a9e9a7fbdbcf Make debug a env variable
Neil Muller <neil@dip.sun.ac.za>
parents: 590
diff changeset
140 """Warn the user that he needs debug mode"""
a9e9a7fbdbcf Make debug a env variable
Neil Muller <neil@dip.sun.ac.za>
parents: 590
diff changeset
141 print '%s is only valid in debug mode' % option
a9e9a7fbdbcf Make debug a env variable
Neil Muller <neil@dip.sun.ac.za>
parents: 590
diff changeset
142 print 'set %s to enable debug mode' % DEBUG_ENVVAR
a9e9a7fbdbcf Make debug a env variable
Neil Muller <neil@dip.sun.ac.za>
parents: 590
diff changeset
143 print
a9e9a7fbdbcf Make debug a env variable
Neil Muller <neil@dip.sun.ac.za>
parents: 590
diff changeset
144
554
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
145 def main(self):
556
a4f28da12720 Move option_parser onto GameDescription so it can be overridden by sub-classes if they lik.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 554
diff changeset
146 parser = self.option_parser()
594
a9e9a7fbdbcf Make debug a env variable
Neil Muller <neil@dip.sun.ac.za>
parents: 590
diff changeset
147 # This is a bit hack'ish, but works
a9e9a7fbdbcf Make debug a env variable
Neil Muller <neil@dip.sun.ac.za>
parents: 590
diff changeset
148 if not self.constants.debug:
a9e9a7fbdbcf Make debug a env variable
Neil Muller <neil@dip.sun.ac.za>
parents: 590
diff changeset
149 for option in self.debug_options:
a9e9a7fbdbcf Make debug a env variable
Neil Muller <neil@dip.sun.ac.za>
parents: 590
diff changeset
150 if option in sys.argv:
a9e9a7fbdbcf Make debug a env variable
Neil Muller <neil@dip.sun.ac.za>
parents: 590
diff changeset
151 self.warn_debug(option)
782
6a3440c8be8d The title needs to be lazily translated. It's evaluated before we set up gettext
Stefano Rivera <stefano@rivera.za.net>
parents: 772
diff changeset
152 opts, args = parser.parse_args(sys.argv)
554
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
153 pygame.display.init()
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
154 pygame.font.init()
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
155 if opts.sound:
576
1b1ab71535bd Classify constants, which involves a whole bunch of XXX comments
Stefano Rivera <stefano@rivera.za.net>
parents: 570
diff changeset
156 self.sound.enable_sound(self.constants)
554
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
157 else:
564
2f7aa3cad77c Sound hackery
Neil Muller <neil@dip.sun.ac.za>
parents: 560
diff changeset
158 self.sound.disable_sound()
576
1b1ab71535bd Classify constants, which involves a whole bunch of XXX comments
Stefano Rivera <stefano@rivera.za.net>
parents: 570
diff changeset
159 if self.constants.debug:
554
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
160 if opts.scene is not None:
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
161 # debug the specified scene
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
162 self._initial_scene = opts.scene
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
163 self._debug_rects = opts.rects
590
a77dd4619176 Fix to work when debug is not enabled
Neil Muller <neil@dip.sun.ac.za>
parents: 589
diff changeset
164 if self.constants.debug and opts.list_scenes:
758
f4853f817a7a Refactor scene listing, to avoid having to create a window
Stefano Rivera <stefano@rivera.za.net>
parents: 750
diff changeset
165 list_scenes(self.SCENE_MODULE, self._scene_list)
589
ebc48b397fd5 Turn rect_drawer into a command line option
Neil Muller <neil@dip.sun.ac.za>
parents: 587
diff changeset
166 sys.exit(0)
590
a77dd4619176 Fix to work when debug is not enabled
Neil Muller <neil@dip.sun.ac.za>
parents: 589
diff changeset
167 if self.constants.debug and opts.rect_drawer:
589
ebc48b397fd5 Turn rect_drawer into a command line option
Neil Muller <neil@dip.sun.ac.za>
parents: 587
diff changeset
168 if opts.scene is None:
ebc48b397fd5 Turn rect_drawer into a command line option
Neil Muller <neil@dip.sun.ac.za>
parents: 587
diff changeset
169 print 'Need to supply a scene to use the rect drawer'
ebc48b397fd5 Turn rect_drawer into a command line option
Neil Muller <neil@dip.sun.ac.za>
parents: 587
diff changeset
170 sys.exit(1)
817
beac13c4e982 Also warn about out-of-date tool translations if running rect-drawer
Neil Muller <neil@dip.sun.ac.za>
parents: 802
diff changeset
171 locale_path = get_module_i18n_path(
beac13c4e982 Also warn about out-of-date tool translations if running rect-drawer
Neil Muller <neil@dip.sun.ac.za>
parents: 802
diff changeset
172 self.resource.DEFAULT_RESOURCE_MODULE)
beac13c4e982 Also warn about out-of-date tool translations if running rect-drawer
Neil Muller <neil@dip.sun.ac.za>
parents: 802
diff changeset
173 gettext.bindtextdomain('pyntnclick-tools', locale_path)
802
5ec7905b2365 Don't use resource module to find module locale data
Neil Muller <neil@dip.sun.ac.za>
parents: 795
diff changeset
174 gettext.textdomain('pyntnclick-tools')
817
beac13c4e982 Also warn about out-of-date tool translations if running rect-drawer
Neil Muller <neil@dip.sun.ac.za>
parents: 802
diff changeset
175 popath = get_module_i18n_path(
beac13c4e982 Also warn about out-of-date tool translations if running rect-drawer
Neil Muller <neil@dip.sun.ac.za>
parents: 802
diff changeset
176 self.resource.DEFAULT_RESOURCE_MODULE, 'po')
beac13c4e982 Also warn about out-of-date tool translations if running rect-drawer
Neil Muller <neil@dip.sun.ac.za>
parents: 802
diff changeset
177 self._check_translations(popath, locale_path)
661
5dc866e1d71d Misc pep8 and pyflakes fixes
Neil Muller <neil@dip.sun.ac.za>
parents: 655
diff changeset
178 make_rect_display()
589
ebc48b397fd5 Turn rect_drawer into a command line option
Neil Muller <neil@dip.sun.ac.za>
parents: 587
diff changeset
179 try:
691
60bf20849231 Fix detail loading in rect_drawer. Improve error reporting when loading fails
Neil Muller <neil@dip.sun.ac.za>
parents: 673
diff changeset
180 self.engine = RectEngine(self, opts.detail)
60bf20849231 Fix detail loading in rect_drawer. Improve error reporting when loading fails
Neil Muller <neil@dip.sun.ac.za>
parents: 673
diff changeset
181 except RectDrawerError, e:
60bf20849231 Fix detail loading in rect_drawer. Improve error reporting when loading fails
Neil Muller <neil@dip.sun.ac.za>
parents: 673
diff changeset
182 print 'RectDrawer failed with: %s' % e
589
ebc48b397fd5 Turn rect_drawer into a command line option
Neil Muller <neil@dip.sun.ac.za>
parents: 587
diff changeset
183 sys.exit(1)
ebc48b397fd5 Turn rect_drawer into a command line option
Neil Muller <neil@dip.sun.ac.za>
parents: 587
diff changeset
184 else:
600
fabce47e542f Stop using albow (at least for the menu). Breaks the world. Please fix it, kthx
Stefano Rivera <stefano@rivera.za.net>
parents: 599
diff changeset
185 pygame.display.set_mode(self.constants.screen, SWSURFACE)
732
4f34b36ee7c5 Add constants subclass to gamelib, and get the title + icon from it
Stefano Rivera <stefano@rivera.za.net>
parents: 692
diff changeset
186 if self.constants.icon:
4f34b36ee7c5 Add constants subclass to gamelib, and get the title + icon from it
Stefano Rivera <stefano@rivera.za.net>
parents: 692
diff changeset
187 pygame.display.set_icon(self.resource.get_image(
4f34b36ee7c5 Add constants subclass to gamelib, and get the title + icon from it
Stefano Rivera <stefano@rivera.za.net>
parents: 692
diff changeset
188 self.constants.icon, basedir='icons'))
4f34b36ee7c5 Add constants subclass to gamelib, and get the title + icon from it
Stefano Rivera <stefano@rivera.za.net>
parents: 692
diff changeset
189 if self.constants.title:
782
6a3440c8be8d The title needs to be lazily translated. It's evaluated before we set up gettext
Stefano Rivera <stefano@rivera.za.net>
parents: 772
diff changeset
190 title = _(self.constants.title).encode('utf-8')
6a3440c8be8d The title needs to be lazily translated. It's evaluated before we set up gettext
Stefano Rivera <stefano@rivera.za.net>
parents: 772
diff changeset
191 pygame.display.set_caption(title)
589
ebc48b397fd5 Turn rect_drawer into a command line option
Neil Muller <neil@dip.sun.ac.za>
parents: 587
diff changeset
192
608
a25cd1c6335a Pass screens through engine by name
Neil Muller <neil@dip.sun.ac.za>
parents: 603
diff changeset
193 self.engine = Engine(self)
a25cd1c6335a Pass screens through engine by name
Neil Muller <neil@dip.sun.ac.za>
parents: 603
diff changeset
194 # Initialize the special screens in the engine
614
974cc69d3762 Special cases aren't special enough to be named special.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 613
diff changeset
195 for name, cls in self._screens.iteritems():
608
a25cd1c6335a Pass screens through engine by name
Neil Muller <neil@dip.sun.ac.za>
parents: 603
diff changeset
196 screen = cls(self)
a25cd1c6335a Pass screens through engine by name
Neil Muller <neil@dip.sun.ac.za>
parents: 603
diff changeset
197 self.engine.add_screen(name, screen)
600
fabce47e542f Stop using albow (at least for the menu). Breaks the world. Please fix it, kthx
Stefano Rivera <stefano@rivera.za.net>
parents: 599
diff changeset
198 # Should we allow the menu not to be the opening screen?
608
a25cd1c6335a Pass screens through engine by name
Neil Muller <neil@dip.sun.ac.za>
parents: 603
diff changeset
199 self.engine.set_screen(self.START_SCREEN)
107
5213b45fcc7e Initial event sound support
Neil Muller <neil@dip.sun.ac.za>
parents: 105
diff changeset
200 try:
608
a25cd1c6335a Pass screens through engine by name
Neil Muller <neil@dip.sun.ac.za>
parents: 603
diff changeset
201 self.engine.run()
554
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
202 except KeyboardInterrupt:
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
203 pass
792
bdaffaa8b6bf Loading and saving! (Plus a bunch of other stuff to make it possible.)
Jeremy Thurgood <firxen@gmail.com>
parents: 786
diff changeset
204
bdaffaa8b6bf Loading and saving! (Plus a bunch of other stuff to make it possible.)
Jeremy Thurgood <firxen@gmail.com>
parents: 786
diff changeset
205 def get_default_save_location(self):
bdaffaa8b6bf Loading and saving! (Plus a bunch of other stuff to make it possible.)
Jeremy Thurgood <firxen@gmail.com>
parents: 786
diff changeset
206 """Return a default save game location."""
bdaffaa8b6bf Loading and saving! (Plus a bunch of other stuff to make it possible.)
Jeremy Thurgood <firxen@gmail.com>
parents: 786
diff changeset
207 app = self.constants.short_name
bdaffaa8b6bf Loading and saving! (Plus a bunch of other stuff to make it possible.)
Jeremy Thurgood <firxen@gmail.com>
parents: 786
diff changeset
208 if sys.platform.startswith("win"):
bdaffaa8b6bf Loading and saving! (Plus a bunch of other stuff to make it possible.)
Jeremy Thurgood <firxen@gmail.com>
parents: 786
diff changeset
209 if "APPDATA" in os.environ:
bdaffaa8b6bf Loading and saving! (Plus a bunch of other stuff to make it possible.)
Jeremy Thurgood <firxen@gmail.com>
parents: 786
diff changeset
210 return os.path.join(os.environ["APPDATA"], app)
bdaffaa8b6bf Loading and saving! (Plus a bunch of other stuff to make it possible.)
Jeremy Thurgood <firxen@gmail.com>
parents: 786
diff changeset
211 return os.path.join(os.path.expanduser("~"), "." + app)
bdaffaa8b6bf Loading and saving! (Plus a bunch of other stuff to make it possible.)
Jeremy Thurgood <firxen@gmail.com>
parents: 786
diff changeset
212 elif 'XDG_DATA_HOME' in os.environ:
bdaffaa8b6bf Loading and saving! (Plus a bunch of other stuff to make it possible.)
Jeremy Thurgood <firxen@gmail.com>
parents: 786
diff changeset
213 return os.path.join(os.environ["XDG_DATA_HOME"], app)
bdaffaa8b6bf Loading and saving! (Plus a bunch of other stuff to make it possible.)
Jeremy Thurgood <firxen@gmail.com>
parents: 786
diff changeset
214 return os.path.join(os.path.expanduser("~"), ".local", "share", app)