annotate pyntnclick/main.py @ 556:a4f28da12720 pyntnclick

Move option_parser onto GameDescription so it can be overridden by sub-classes if they lik.
author Simon Cross <hodgestar+bzr@gmail.com>
date Sat, 11 Feb 2012 14:12:11 +0200
parents 99a1420097df
children 28f03563f4db
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 '''
f2c3b516741b Theme is 'Caught'. Start with Skellington 1.9.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
6
102
322cbc0a8cce Mac build stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
7 # Albow looks for stuff in os.path[0], which isn't always where it expects.
322cbc0a8cce Mac build stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
8 # The following horribleness fixes this.
322cbc0a8cce Mac build stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
9 import sys
322cbc0a8cce Mac build stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
10 import os.path
322cbc0a8cce Mac build stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
11 right_path = os.path.dirname(os.path.dirname(__file__))
322cbc0a8cce Mac build stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
12 sys.path.insert(0, right_path)
107
5213b45fcc7e Initial event sound support
Neil Muller <neil@dip.sun.ac.za>
parents: 105
diff changeset
13 from optparse import OptionParser
102
322cbc0a8cce Mac build stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
14
17
55f1969e41c9 Add simple menu screen
Neil Muller <neil@dip.sun.ac.za>
parents: 0
diff changeset
15 import pygame
37
d449c4674da8 Fix call to set mode.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 28
diff changeset
16 from pygame.locals import SWSURFACE
17
55f1969e41c9 Add simple menu screen
Neil Muller <neil@dip.sun.ac.za>
parents: 0
diff changeset
17 from albow.shell import Shell
26
0a68d137f509 Initial inventory palette thing.
Jeremy Thurgood <firxen@gmail.com>
parents: 25
diff changeset
18
551
38fb04728ac5 Rearrange import.
Jeremy Thurgood <firxen@gmail.com>
parents: 548
diff changeset
19 from pyntnclick.menu import MenuScreen
38fb04728ac5 Rearrange import.
Jeremy Thurgood <firxen@gmail.com>
parents: 548
diff changeset
20 from pyntnclick.gamescreen import GameScreen
38fb04728ac5 Rearrange import.
Jeremy Thurgood <firxen@gmail.com>
parents: 548
diff changeset
21 from pyntnclick.endscreen import EndScreen
38fb04728ac5 Rearrange import.
Jeremy Thurgood <firxen@gmail.com>
parents: 548
diff changeset
22 from pyntnclick.constants import (
532
02cf5537d74e PEP-8 main.
Jeremy Thurgood <firxen@gmail.com>
parents: 447
diff changeset
23 SCREEN, FRAME_RATE, FREQ, BITSIZE, CHANNELS, BUFFER, DEBUG)
551
38fb04728ac5 Rearrange import.
Jeremy Thurgood <firxen@gmail.com>
parents: 548
diff changeset
24 from pyntnclick.sound import no_sound, disable_sound
38fb04728ac5 Rearrange import.
Jeremy Thurgood <firxen@gmail.com>
parents: 548
diff changeset
25 from pyntnclick import state, data
107
5213b45fcc7e Initial event sound support
Neil Muller <neil@dip.sun.ac.za>
parents: 105
diff changeset
26
532
02cf5537d74e PEP-8 main.
Jeremy Thurgood <firxen@gmail.com>
parents: 447
diff changeset
27
17
55f1969e41c9 Add simple menu screen
Neil Muller <neil@dip.sun.ac.za>
parents: 0
diff changeset
28 class MainShell(Shell):
553
ebb2efcb4ea7 Create a re-usable main function.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 551
diff changeset
29 def __init__(self, display, initial_state):
17
55f1969e41c9 Add simple menu screen
Neil Muller <neil@dip.sun.ac.za>
parents: 0
diff changeset
30 Shell.__init__(self, display)
55f1969e41c9 Add simple menu screen
Neil Muller <neil@dip.sun.ac.za>
parents: 0
diff changeset
31 self.menu_screen = MenuScreen(self)
553
ebb2efcb4ea7 Create a re-usable main function.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 551
diff changeset
32 self.game_screen = GameScreen(self, initial_state)
443
3dab4984cbd7 Redo way of reaching end screen
Neil Muller <neil@dip.sun.ac.za>
parents: 282
diff changeset
33 self.end_screen = EndScreen(self)
105
65976205fc2d Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents: 102
diff changeset
34 self.set_timer(FRAME_RATE)
17
55f1969e41c9 Add simple menu screen
Neil Muller <neil@dip.sun.ac.za>
parents: 0
diff changeset
35 self.show_screen(self.menu_screen)
55f1969e41c9 Add simple menu screen
Neil Muller <neil@dip.sun.ac.za>
parents: 0
diff changeset
36
532
02cf5537d74e PEP-8 main.
Jeremy Thurgood <firxen@gmail.com>
parents: 447
diff changeset
37
554
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
38 class GameDescriptionError(Exception):
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
39 """Raised when an GameDescription is invalid."""
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
40
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
41
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
42 class GameDescription(object):
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
43
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
44 # initial scene for start of game (unless overridden by debug)
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
45 INITIAL_SCENE = None
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
46
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
47 # list of game scenes
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
48 SCENE_LIST = None
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
49
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
50 def __init__(self):
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
51 if self.INITIAL_SCENE is None:
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
52 raise GameDescriptionError("A game must have an initial scene.")
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
53 if not self.SCENE_LIST:
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
54 raise GameDescriptionError("A game must have a non-empty list"
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
55 " of scenes.")
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
56 self._initial_scene = self.INITIAL_SCENE
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
57 self._scene_list = self.SCENE_LIST
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
58 self._debug_rects = False
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
59
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
60 def initial_state(self):
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
61 """Create a copy of the initial game state."""
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
62 initial_state = state.GameState()
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
63 initial_state.set_debug_rects(self._debug_rects)
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
64 for scene in self._scene_list:
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
65 initial_state.load_scenes(scene)
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
66 initial_state.set_current_scene(self._initial_scene)
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
67 initial_state.set_do_enter_leave()
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
68 return initial_state
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
69
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
70 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
71 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
72 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
73 dest="sound", help="disable sound")
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
74 if DEBUG:
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
75 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
76 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
77 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
78 dest="rects", help="disable debugging rects")
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
79 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
80
554
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
81 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
82 parser = self.option_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
83 opts, _ = parser.parse_args(sys.argv)
554
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
84 pygame.display.init()
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
85 pygame.font.init()
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
86 if opts.sound:
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
87 try:
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
88 pygame.mixer.init(FREQ, BITSIZE, CHANNELS, BUFFER)
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
89 except pygame.error, exc:
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
90 no_sound(exc)
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
91 else:
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
92 # Ensure get_sound returns nothing, so everything else just works
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
93 disable_sound()
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
94 if DEBUG:
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
95 if opts.scene is not None:
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
96 # debug the specified scene
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
97 self._initial_scene = opts.scene
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
98 self._debug_rects = opts.rects
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
99 display = pygame.display.set_mode(SCREEN, SWSURFACE)
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
100 pygame.display.set_icon(pygame.image.load(
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
101 data.filepath('icons/suspended_sentence24x24.png')))
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
102 pygame.display.set_caption("Suspended Sentence")
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
103 shell = MainShell(display, self.initial_state)
107
5213b45fcc7e Initial event sound support
Neil Muller <neil@dip.sun.ac.za>
parents: 105
diff changeset
104 try:
554
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
105 shell.run()
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
106 except KeyboardInterrupt:
99a1420097df Create GameDescription object.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 553
diff changeset
107 pass