annotate gamelib/engine.py @ 555:296c73dcd286

Add high score dialog to main menu.
author Simon Cross <hodgestar@gmail.com>
date Sat, 28 Nov 2009 17:53:42 +0000
parents 27c09c58d89d
children 8cd13b82585e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
1 """Game engine and states."""
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
2 from pgu.engine import Game, State, Quit
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
3 import pygame
548
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 541
diff changeset
4 from pygame.locals import USEREVENT, QUIT, KEYDOWN, K_ESCAPE, K_s, K_i
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
5
12
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
6 import gameboard
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
7 import gameover
94
fa8d8fc1bf5b Added some sounds
David Fraser <davidf@sjsoft.com>
parents: 91
diff changeset
8 import sound
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
9 import constants
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
10 import mainmenu
179
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
11 import helpscreen
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 369
diff changeset
12 import level
12
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
13
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
14 class Engine(Game):
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 369
diff changeset
15 def __init__(self, main_app, level_name):
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
16 self.main_app = main_app
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
17 self.clock = pygame.time.Clock()
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 369
diff changeset
18 self.level = level.Level(level_name)
151
082868bea873 Refactor UI so that only a single gui.App is used. Pass all UI events via main_app. Change Toolbar table to use .td() everywhere. Move toolbar to top.
Simon Cross <hodgestar@gmail.com>
parents: 142
diff changeset
19 self._open_window = None
254
f399e4926c36 Fix events getting sent to the gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 245
diff changeset
20 self.gameboard = None
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
21
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
22 def tick(self):
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
23 """Tic toc."""
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
24 pygame.time.wait(10)
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
25
532
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 513
diff changeset
26 def load_new_level(self, new_level):
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 513
diff changeset
27 self.level = new_level
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
28
151
082868bea873 Refactor UI so that only a single gui.App is used. Pass all UI events via main_app. Change Toolbar table to use .td() everywhere. Move toolbar to top.
Simon Cross <hodgestar@gmail.com>
parents: 142
diff changeset
29 def open_window(self, window):
082868bea873 Refactor UI so that only a single gui.App is used. Pass all UI events via main_app. Change Toolbar table to use .td() everywhere. Move toolbar to top.
Simon Cross <hodgestar@gmail.com>
parents: 142
diff changeset
30 """Open a widget as the main window."""
082868bea873 Refactor UI so that only a single gui.App is used. Pass all UI events via main_app. Change Toolbar table to use .td() everywhere. Move toolbar to top.
Simon Cross <hodgestar@gmail.com>
parents: 142
diff changeset
31 if self._open_window is not None:
082868bea873 Refactor UI so that only a single gui.App is used. Pass all UI events via main_app. Change Toolbar table to use .td() everywhere. Move toolbar to top.
Simon Cross <hodgestar@gmail.com>
parents: 142
diff changeset
32 self.main_app.close(self._open_window)
082868bea873 Refactor UI so that only a single gui.App is used. Pass all UI events via main_app. Change Toolbar table to use .td() everywhere. Move toolbar to top.
Simon Cross <hodgestar@gmail.com>
parents: 142
diff changeset
33 self.main_app.open(window)
082868bea873 Refactor UI so that only a single gui.App is used. Pass all UI events via main_app. Change Toolbar table to use .td() everywhere. Move toolbar to top.
Simon Cross <hodgestar@gmail.com>
parents: 142
diff changeset
34 self._open_window = window
082868bea873 Refactor UI so that only a single gui.App is used. Pass all UI events via main_app. Change Toolbar table to use .td() everywhere. Move toolbar to top.
Simon Cross <hodgestar@gmail.com>
parents: 142
diff changeset
35
12
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
36 def create_game_board(self):
151
082868bea873 Refactor UI so that only a single gui.App is used. Pass all UI events via main_app. Change Toolbar table to use .td() everywhere. Move toolbar to top.
Simon Cross <hodgestar@gmail.com>
parents: 142
diff changeset
37 """Create and open a gameboard window."""
346
6baf8b5beb5c Remove the "constant" constant
Neil Muller <drnlmuller@gmail.com>
parents: 336
diff changeset
38 self.gameboard = gameboard.GameBoard(self.main_app,
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 369
diff changeset
39 self.level)
151
082868bea873 Refactor UI so that only a single gui.App is used. Pass all UI events via main_app. Change Toolbar table to use .td() everywhere. Move toolbar to top.
Simon Cross <hodgestar@gmail.com>
parents: 142
diff changeset
40 self.open_window(self.gameboard.get_top_widget())
12
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
41
532
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 513
diff changeset
42 def switch_gameboard(self, new_gameboard):
504
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 469
diff changeset
43 """Switch over to a new gameboard."""
532
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 513
diff changeset
44 self.gameboard = new_gameboard
504
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 469
diff changeset
45 self.gameboard.disp = self.main_app
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 469
diff changeset
46 self.gameboard.create_display()
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 469
diff changeset
47 self.open_window(self.gameboard.get_top_widget())
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 469
diff changeset
48
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
49 def set_main_menu(self):
151
082868bea873 Refactor UI so that only a single gui.App is used. Pass all UI events via main_app. Change Toolbar table to use .td() everywhere. Move toolbar to top.
Simon Cross <hodgestar@gmail.com>
parents: 142
diff changeset
50 """Open the main menu"""
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
51 main_menu = mainmenu.make_main_menu(self.level)
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
52 self.open_window(main_menu)
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
53
179
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
54 def set_help_screen(self):
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
55 """Open the main menu"""
390
2bcfccb8288e Make help screen use goal from the level
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
56 help_screen = helpscreen.make_help_screen(self.level)
179
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
57 self.open_window(help_screen)
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
58
151
082868bea873 Refactor UI so that only a single gui.App is used. Pass all UI events via main_app. Change Toolbar table to use .td() everywhere. Move toolbar to top.
Simon Cross <hodgestar@gmail.com>
parents: 142
diff changeset
59 def create_game_over(self):
082868bea873 Refactor UI so that only a single gui.App is used. Pass all UI events via main_app. Change Toolbar table to use .td() everywhere. Move toolbar to top.
Simon Cross <hodgestar@gmail.com>
parents: 142
diff changeset
60 """Create and open the Game Over window"""
469
e0b11d684ee8 Reference gameboard.level rather than game.level where appropriate. Saving and restoring games appears to largely work now (even if the level of the restored game is different to the current one).
Simon Cross <hodgestar@gmail.com>
parents: 436
diff changeset
61 level = self.gameboard.level
555
296c73dcd286 Add high score dialog to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 548
diff changeset
62 game_over = gameover.create_game_over(self.gameboard, level)
254
f399e4926c36 Fix events getting sent to the gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 245
diff changeset
63 self.gameboard = None
151
082868bea873 Refactor UI so that only a single gui.App is used. Pass all UI events via main_app. Change Toolbar table to use .td() everywhere. Move toolbar to top.
Simon Cross <hodgestar@gmail.com>
parents: 142
diff changeset
64 self.open_window(game_over)
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
65
254
f399e4926c36 Fix events getting sent to the gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 245
diff changeset
66 def event(self, e):
541
450de9dfa106 Move gameboard event prodding into the widgets - better matches pgu internals
Neil Muller <drnlmuller@gmail.com>
parents: 539
diff changeset
67 return Game.event(self, e)
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
68
254
f399e4926c36 Fix events getting sent to the gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 245
diff changeset
69
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
70 class MainMenuState(State):
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
71 def init(self):
156
210fc1ea0516 Stop background music whenever state changes.
Simon Cross <hodgestar@gmail.com>
parents: 151
diff changeset
72 sound.stop_background_music()
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
73 self.game.set_main_menu()
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
74
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
75 def event(self, e):
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
76 if events_equal(e, START_DAY):
12
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
77 self.game.create_game_board()
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
78 return DayState(self.game)
179
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
79 elif events_equal(e, GO_HELP_SCREEN):
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
80 return HelpScreenState(self.game)
31
3c4db7bba432 Add 's' as a key for starting the game from the menu.
Simon Cross <hodgestar@gmail.com>
parents: 30
diff changeset
81 elif e.type is KEYDOWN:
3c4db7bba432 Add 's' as a key for starting the game from the menu.
Simon Cross <hodgestar@gmail.com>
parents: 30
diff changeset
82 if e.key == K_ESCAPE:
3c4db7bba432 Add 's' as a key for starting the game from the menu.
Simon Cross <hodgestar@gmail.com>
parents: 30
diff changeset
83 return Quit(self.game)
3c4db7bba432 Add 's' as a key for starting the game from the menu.
Simon Cross <hodgestar@gmail.com>
parents: 30
diff changeset
84 elif e.key == K_s:
3c4db7bba432 Add 's' as a key for starting the game from the menu.
Simon Cross <hodgestar@gmail.com>
parents: 30
diff changeset
85 self.game.create_game_board()
3c4db7bba432 Add 's' as a key for starting the game from the menu.
Simon Cross <hodgestar@gmail.com>
parents: 30
diff changeset
86 return DayState(self.game)
182
d63951985313 Make 'i' take you from the main menu to the instructions.
Simon Cross <hodgestar@gmail.com>
parents: 180
diff changeset
87 elif e.key == K_i:
d63951985313 Make 'i' take you from the main menu to the instructions.
Simon Cross <hodgestar@gmail.com>
parents: 180
diff changeset
88 return HelpScreenState(self.game)
532
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 513
diff changeset
89 elif e.type is DO_LOAD_LEVEL:
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 513
diff changeset
90 self.game.load_new_level(e.level)
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 513
diff changeset
91 return
512
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 504
diff changeset
92 elif e.type is DO_LOAD_SAVEGAME:
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 504
diff changeset
93 self.game.switch_gameboard(e.gameboard)
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 504
diff changeset
94 e.gameboard.skip_next_start_day()
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 504
diff changeset
95 return DayState(self.game)
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
96 elif e.type is not QUIT:
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
97 self.game.main_app.event(e)
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
98
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
99 def paint(self, screen):
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
100 screen.fill((0,0,0))
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
101 self.game.main_app.paint(screen)
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
102 pygame.display.flip()
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
103
15
b69d954f2f1d Add update call to main menu event
Neil Muller <drnlmuller@gmail.com>
parents: 14
diff changeset
104 def update(self, screen):
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
105 update = self.game.main_app.update(screen)
15
b69d954f2f1d Add update call to main menu event
Neil Muller <drnlmuller@gmail.com>
parents: 14
diff changeset
106 pygame.display.update(update)
b69d954f2f1d Add update call to main menu event
Neil Muller <drnlmuller@gmail.com>
parents: 14
diff changeset
107
179
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
108 class HelpScreenState(State):
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
109 def init(self):
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
110 sound.stop_background_music()
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
111 self.game.set_help_screen()
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
112
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
113 def event(self, e):
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
114 if e.type is KEYDOWN and e.key == K_ESCAPE:
180
c0cad267222b Fix typo in reference to MainMenuState.
Simon Cross <hodgestar@gmail.com>
parents: 179
diff changeset
115 return MainMenuState(self.game)
179
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
116 elif events_equal(e, GO_MAIN_MENU):
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
117 return MainMenuState(self.game)
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
118 elif e.type is not QUIT:
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
119 self.game.main_app.event(e)
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
120
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
121 def paint(self, screen):
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
122 screen.fill((0,0,0))
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
123 self.game.main_app.paint(screen)
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
124 pygame.display.flip()
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
125
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
126 def update(self, screen):
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
127 update = self.game.main_app.update(screen)
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
128 pygame.display.update(update)
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
129
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
130
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
131 class DayState(State):
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
132 def init(self):
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
133 """Add some chickens to the farm"""
99
f5d56688943b Added background music support, and daytime and night time music (really animal sounds, not music)
David Fraser <davidf@sjsoft.com>
parents: 98
diff changeset
134 sound.stop_background_music()
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 222
diff changeset
135 self.game.gameboard.start_day()
30
2eec29085060 Color night and day.
Simon Cross <hodgestar@gmail.com>
parents: 29
diff changeset
136
98
725b292ca07b Added sounds killing foxes and chickens, and nightfall
David Fraser <davidf@sjsoft.com>
parents: 94
diff changeset
137 sound.play_sound("daybreak.ogg")
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
138 # disable timer
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
139 pygame.time.set_timer(MOVE_FOX_ID, 0)
99
f5d56688943b Added background music support, and daytime and night time music (really animal sounds, not music)
David Fraser <davidf@sjsoft.com>
parents: 98
diff changeset
140 sound.background_music("daytime.ogg")
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
141
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
142 def event(self, e):
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
143 if events_equal(e, START_NIGHT):
245
634491bf37e8 Change toolbar to gui.Toolbar -- gives nicer highlighting.
Simon Cross <hodgestar@gmail.com>
parents: 237
diff changeset
144 self.game.gameboard.reset_states()
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
145 return NightState(self.game)
548
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 541
diff changeset
146 elif events_equal(e, GO_GAME_OVER):
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 541
diff changeset
147 return GameOver(self.game)
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
148 elif events_equal(e, GO_MAIN_MENU):
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
149 return MainMenuState(self.game)
504
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 469
diff changeset
150 elif e.type is DO_LOAD_SAVEGAME:
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 469
diff changeset
151 self.game.switch_gameboard(e.gameboard)
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 469
diff changeset
152 return
548
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 541
diff changeset
153
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 541
diff changeset
154 self.game.main_app.event(e)
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
155
12
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
156 def paint(self, screen):
151
082868bea873 Refactor UI so that only a single gui.App is used. Pass all UI events via main_app. Change Toolbar table to use .td() everywhere. Move toolbar to top.
Simon Cross <hodgestar@gmail.com>
parents: 142
diff changeset
157 self.game.main_app.paint(screen)
12
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
158 pygame.display.flip()
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
159
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
160 def update(self, screen):
151
082868bea873 Refactor UI so that only a single gui.App is used. Pass all UI events via main_app. Change Toolbar table to use .td() everywhere. Move toolbar to top.
Simon Cross <hodgestar@gmail.com>
parents: 142
diff changeset
161 self.game.gameboard.update()
082868bea873 Refactor UI so that only a single gui.App is used. Pass all UI events via main_app. Change Toolbar table to use .td() everywhere. Move toolbar to top.
Simon Cross <hodgestar@gmail.com>
parents: 142
diff changeset
162 update = self.game.main_app.update(screen)
12
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
163 pygame.display.update(update)
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
164
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
165 def loop(self):
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
166 self.game.gameboard.loop()
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
167
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
168 class NightState(State):
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
169 def init(self):
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
170 """Add some foxes to the farm"""
99
f5d56688943b Added background music support, and daytime and night time music (really animal sounds, not music)
David Fraser <davidf@sjsoft.com>
parents: 98
diff changeset
171 sound.stop_background_music()
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 222
diff changeset
172 self.game.gameboard.start_night()
30
2eec29085060 Color night and day.
Simon Cross <hodgestar@gmail.com>
parents: 29
diff changeset
173
98
725b292ca07b Added sounds killing foxes and chickens, and nightfall
David Fraser <davidf@sjsoft.com>
parents: 94
diff changeset
174 sound.play_sound("nightfall.ogg")
422
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 413
diff changeset
175
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
176 # Add a timer to the event queue
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
177 self.cycle_count = 0
435
66bc99477155 Remove references to ANIM timer, so no longer relevant
Neil Muller <drnlmuller@gmail.com>
parents: 434
diff changeset
178 self.cycle_time = SLOW__SPEED
66bc99477155 Remove references to ANIM timer, so no longer relevant
Neil Muller <drnlmuller@gmail.com>
parents: 434
diff changeset
179 pygame.time.set_timer(MOVE_FOX_ID, self.cycle_time)
99
f5d56688943b Added background music support, and daytime and night time music (really animal sounds, not music)
David Fraser <davidf@sjsoft.com>
parents: 98
diff changeset
180 sound.background_music("nighttime.ogg")
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
181
349
a36ab7dd0eb9 Fix 'Are You Sure?' dialog to work at night
Neil Muller <drnlmuller@gmail.com>
parents: 346
diff changeset
182 self.dialog = None
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 99
diff changeset
183
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
184 def event(self, e):
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
185 if events_equal(e, START_DAY):
469
e0b11d684ee8 Reference gameboard.level rather than game.level where appropriate. Saving and restoring games appears to largely work now (even if the level of the restored game is different to the current one).
Simon Cross <hodgestar@gmail.com>
parents: 436
diff changeset
186 if self.game.gameboard.level.is_game_over(self.game.gameboard):
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
187 return GameOver(self.game)
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
188 return DayState(self.game)
548
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 541
diff changeset
189 elif events_equal(e, GO_GAME_OVER):
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 541
diff changeset
190 return GameOver(self.game)
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 541
diff changeset
191 elif events_equal(e, FAST_FORWARD):
435
66bc99477155 Remove references to ANIM timer, so no longer relevant
Neil Muller <drnlmuller@gmail.com>
parents: 434
diff changeset
192 if self.cycle_time > FAST__SPEED:
66bc99477155 Remove references to ANIM timer, so no longer relevant
Neil Muller <drnlmuller@gmail.com>
parents: 434
diff changeset
193 self.cycle_time = FAST__SPEED
222
322e6d3a46e4 Turn 'd' into a fast forward / normal speed toggle at night
Neil Muller <drnlmuller@gmail.com>
parents: 213
diff changeset
194 else:
435
66bc99477155 Remove references to ANIM timer, so no longer relevant
Neil Muller <drnlmuller@gmail.com>
parents: 434
diff changeset
195 self.cycle_time = SLOW__SPEED
66bc99477155 Remove references to ANIM timer, so no longer relevant
Neil Muller <drnlmuller@gmail.com>
parents: 434
diff changeset
196 pygame.time.set_timer(MOVE_FOX_ID, self.cycle_time)
548
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 541
diff changeset
197 return
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
198 elif e.type is MOVE_FOX_ID:
369
25f7d4824250 Disable timers during move_foxes loop to stop events piling up too much
Neil Muller <drnlmuller@gmail.com>
parents: 349
diff changeset
199 # ensure no timers trigger while we're running
25f7d4824250 Disable timers during move_foxes loop to stop events piling up too much
Neil Muller <drnlmuller@gmail.com>
parents: 349
diff changeset
200 pygame.time.set_timer(MOVE_FOX_ID, 0)
436
2b4cd86dfcaf Better approximate constant framerate on move events, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 435
diff changeset
201 cur_time = pygame.time.get_ticks()
369
25f7d4824250 Disable timers during move_foxes loop to stop events piling up too much
Neil Muller <drnlmuller@gmail.com>
parents: 349
diff changeset
202 # Clear any queued timer events, so we don't full the queue
25f7d4824250 Disable timers during move_foxes loop to stop events piling up too much
Neil Muller <drnlmuller@gmail.com>
parents: 349
diff changeset
203 pygame.event.clear(MOVE_FOX_ID)
237
4a87bfa5cc63 Twiddle animation cycle
Neil Muller <drnlmuller@gmail.com>
parents: 233
diff changeset
204 # Ensure any outstanding animitions get cleaned up
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
205 self.cycle_count += 1
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
206 if self.cycle_count > constants.NIGHT_LENGTH:
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
207 return pygame.event.post(START_DAY)
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 392
diff changeset
208 if self.game.gameboard.do_night_step():
122
d2b19131d537 Don't continue the night if we're not doing anything anymore
Neil Muller <drnlmuller@gmail.com>
parents: 118
diff changeset
209 # All foxes are gone/safe, so dawn happens
d2b19131d537 Don't continue the night if we're not doing anything anymore
Neil Muller <drnlmuller@gmail.com>
parents: 118
diff changeset
210 return pygame.event.post(START_DAY)
369
25f7d4824250 Disable timers during move_foxes loop to stop events piling up too much
Neil Muller <drnlmuller@gmail.com>
parents: 349
diff changeset
211 # Re-enable timers
436
2b4cd86dfcaf Better approximate constant framerate on move events, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 435
diff changeset
212 diff = pygame.time.get_ticks() - cur_time
2b4cd86dfcaf Better approximate constant framerate on move events, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 435
diff changeset
213 time_left = self.cycle_time - diff
513
399bb3cb4761 Fix corner case timer fiddling bug
Neil Muller <drnlmuller@gmail.com>
parents: 512
diff changeset
214 if time_left <= 0:
436
2b4cd86dfcaf Better approximate constant framerate on move events, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 435
diff changeset
215 time_left = self.cycle_time
2b4cd86dfcaf Better approximate constant framerate on move events, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 435
diff changeset
216 pygame.time.set_timer(MOVE_FOX_ID, time_left)
548
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 541
diff changeset
217 return
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 541
diff changeset
218
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 541
diff changeset
219 self.game.main_app.event(e)
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
220
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
221 def loop(self):
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
222 self.game.gameboard.loop()
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
223
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
224 def paint(self, screen):
151
082868bea873 Refactor UI so that only a single gui.App is used. Pass all UI events via main_app. Change Toolbar table to use .td() everywhere. Move toolbar to top.
Simon Cross <hodgestar@gmail.com>
parents: 142
diff changeset
225 self.game.main_app.paint(screen)
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
226 pygame.display.flip()
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
227
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
228 def update(self, screen):
151
082868bea873 Refactor UI so that only a single gui.App is used. Pass all UI events via main_app. Change Toolbar table to use .td() everywhere. Move toolbar to top.
Simon Cross <hodgestar@gmail.com>
parents: 142
diff changeset
229 self.game.gameboard.update()
082868bea873 Refactor UI so that only a single gui.App is used. Pass all UI events via main_app. Change Toolbar table to use .td() everywhere. Move toolbar to top.
Simon Cross <hodgestar@gmail.com>
parents: 142
diff changeset
230 update = self.game.main_app.update(screen)
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
231 pygame.display.update(update)
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
232
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
233 class GameOver(State):
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
234 def init(self):
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
235 """Setup everything"""
156
210fc1ea0516 Stop background music whenever state changes.
Simon Cross <hodgestar@gmail.com>
parents: 151
diff changeset
236 sound.stop_background_music()
151
082868bea873 Refactor UI so that only a single gui.App is used. Pass all UI events via main_app. Change Toolbar table to use .td() everywhere. Move toolbar to top.
Simon Cross <hodgestar@gmail.com>
parents: 142
diff changeset
237 self.game.create_game_over()
142
1597081e5a84 Disable timer when game is over
Neil Muller <drnlmuller@gmail.com>
parents: 141
diff changeset
238 pygame.time.set_timer(MOVE_FOX_ID, 0)
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
239
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
240 def event(self, e):
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
241 if e.type is KEYDOWN:
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
242 if e.key == K_ESCAPE:
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
243 return MainMenuState(self.game)
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
244 elif events_equal(e, GO_MAIN_MENU):
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
245 return MainMenuState(self.game)
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
246 elif e.type is not QUIT:
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
247 self.game.main_app.event(e)
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
248
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
249 def paint(self, screen):
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
250 screen.fill((0,0,0))
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
251 self.game.main_app.paint(screen)
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
252 pygame.display.flip()
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
253
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
254 def update(self, screen):
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
255 update = self.game.main_app.update(screen)
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
256 pygame.display.update(update)
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
257
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
258 # pygame events
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
259
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
260 def events_equal(e1, e2):
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
261 """Compare two user events."""
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
262 return (e1.type is e2.type and e1.name == e2.name)
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
263
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
264 START_DAY = pygame.event.Event(USEREVENT, name="START_DAY")
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
265 START_NIGHT = pygame.event.Event(USEREVENT, name="START_NIGHT")
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
266 GO_MAIN_MENU = pygame.event.Event(USEREVENT, name="GO_MAIN_MENU")
179
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
267 GO_HELP_SCREEN = pygame.event.Event(USEREVENT, name="GO_HELP_SCREEN")
548
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 541
diff changeset
268 GO_GAME_OVER = pygame.event.Event(USEREVENT, name="GO_GAME_OVER")
320
9bf0e701a36e Switch between 'Finished Day' and 'Fast Forward' modes
Neil Muller <drnlmuller@gmail.com>
parents: 312
diff changeset
269 FAST_FORWARD = pygame.event.Event(USEREVENT, name="FAST_FORWARD")
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
270 MOVE_FOX_ID = USEREVENT + 1
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
271 MOVE_FOXES = pygame.event.Event(MOVE_FOX_ID, name="MOVE_FOXES")
504
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 469
diff changeset
272 DO_LOAD_SAVEGAME = USEREVENT + 2
532
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 513
diff changeset
273 DO_LOAD_LEVEL = USEREVENT + 3
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
274 QUIT = pygame.event.Event(QUIT)
233
d3d5352f5853 Twek speed loop. Document animation assumptions
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
275
d3d5352f5853 Twek speed loop. Document animation assumptions
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
276 # Due to the way pgu's loop timing works, these will only get proceesed
d3d5352f5853 Twek speed loop. Document animation assumptions
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
277 # at intervals of 10ms, so there's no point in them not being multiples of 10
435
66bc99477155 Remove references to ANIM timer, so no longer relevant
Neil Muller <drnlmuller@gmail.com>
parents: 434
diff changeset
278 FAST__SPEED=80
66bc99477155 Remove references to ANIM timer, so no longer relevant
Neil Muller <drnlmuller@gmail.com>
parents: 434
diff changeset
279 SLOW__SPEED=200