annotate gamelib/engine.py @ 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).
author Simon Cross <hodgestar@gmail.com>
date Tue, 24 Nov 2009 22:19:53 +0000
parents 2b4cd86dfcaf
children 393e30ea0165
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
182
d63951985313 Make 'i' take you from the main menu to the instructions.
Simon Cross <hodgestar@gmail.com>
parents: 180
diff changeset
4 from pygame.locals import USEREVENT, QUIT, KEYDOWN, K_ESCAPE, K_n, K_d, 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
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
12 import loadlevel
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 369
diff changeset
13 import level
336
82a18615a0ab Ask 'Are you sure?'
Neil Muller <drnlmuller@gmail.com>
parents: 320
diff changeset
14 from misc import check_exit
12
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
15
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
16 class Engine(Game):
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 369
diff changeset
17 def __init__(self, main_app, level_name):
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
18 self.main_app = main_app
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
19 self.clock = pygame.time.Clock()
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 369
diff changeset
20 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
21 self._open_window = None
254
f399e4926c36 Fix events getting sent to the gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 245
diff changeset
22 self.gameboard = None
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
23 self.level_loader = None
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
24
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
25 def tick(self):
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
26 """Tic toc."""
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
27 pygame.time.wait(10)
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
28
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
29 def load_new_level(self):
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
30 self.level = self.level_loader.cur_level
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
31
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
32 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
33 """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
34 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
35 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
36 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
37 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
38
12
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
39 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
40 """Create and open a gameboard window."""
346
6baf8b5beb5c Remove the "constant" constant
Neil Muller <drnlmuller@gmail.com>
parents: 336
diff changeset
41 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
42 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
43 self.open_window(self.gameboard.get_top_widget())
12
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
44
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
45 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
46 """Open the main menu"""
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
47 self.scoreboard = gameover.ScoreTable(self.level)
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
48 self.level_loader = None
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
49 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
50 self.open_window(main_menu)
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
51
179
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
52 def set_help_screen(self):
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
53 """Open the main menu"""
390
2bcfccb8288e Make help screen use goal from the level
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
54 help_screen = helpscreen.make_help_screen(self.level)
179
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
55 self.open_window(help_screen)
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
56
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
57 def set_level_screen(self):
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
58 """Open the Load Level screen"""
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
59 level_screen, self.level_loader = loadlevel.make_load_screen(self.level)
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
60 self.open_window(level_screen)
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
61
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
62 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
63 """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
64 level = self.gameboard.level
346
6baf8b5beb5c Remove the "constant" constant
Neil Muller <drnlmuller@gmail.com>
parents: 336
diff changeset
65 game_over = gameover.create_game_over(self.gameboard,
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
66 self.scoreboard[level.level_name], level)
254
f399e4926c36 Fix events getting sent to the gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 245
diff changeset
67 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
68 self.open_window(game_over)
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
69
254
f399e4926c36 Fix events getting sent to the gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 245
diff changeset
70 def event(self, e):
262
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 254
diff changeset
71 if not Game.event(self, e):
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 254
diff changeset
72 if self.gameboard:
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 254
diff changeset
73 return self.gameboard.event(e)
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 254
diff changeset
74 return False
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 254
diff changeset
75 return True
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
76
254
f399e4926c36 Fix events getting sent to the gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 245
diff changeset
77
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
78 class MainMenuState(State):
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
79 def init(self):
156
210fc1ea0516 Stop background music whenever state changes.
Simon Cross <hodgestar@gmail.com>
parents: 151
diff changeset
80 sound.stop_background_music()
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
81 self.game.set_main_menu()
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
82
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
83 def event(self, e):
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
84 if events_equal(e, START_DAY):
12
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
85 self.game.create_game_board()
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
86 return DayState(self.game)
179
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
87 elif events_equal(e, GO_HELP_SCREEN):
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
88 return HelpScreenState(self.game)
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
89 elif events_equal(e, GO_LEVEL_SCREEN):
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
90 return LevelScreenState(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
91 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
92 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
93 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
94 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
95 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
96 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
97 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
98 return HelpScreenState(self.game)
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
99 elif e.type is not QUIT:
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
100 self.game.main_app.event(e)
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
101
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
102 def paint(self, screen):
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
103 screen.fill((0,0,0))
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
104 self.game.main_app.paint(screen)
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
105 pygame.display.flip()
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
106
15
b69d954f2f1d Add update call to main menu event
Neil Muller <drnlmuller@gmail.com>
parents: 14
diff changeset
107 def update(self, screen):
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
108 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
109 pygame.display.update(update)
b69d954f2f1d Add update call to main menu event
Neil Muller <drnlmuller@gmail.com>
parents: 14
diff changeset
110
179
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
111 class HelpScreenState(State):
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
112 def init(self):
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
113 sound.stop_background_music()
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
114 self.game.set_help_screen()
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
115
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
116 def event(self, e):
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
117 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
118 return MainMenuState(self.game)
179
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
119 elif events_equal(e, GO_MAIN_MENU):
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
120 return MainMenuState(self.game)
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
121 elif e.type is not QUIT:
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
122 self.game.main_app.event(e)
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
123
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
124 def paint(self, screen):
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
125 screen.fill((0,0,0))
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
126 self.game.main_app.paint(screen)
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
127 pygame.display.flip()
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
128
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
129 def update(self, screen):
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
130 update = self.game.main_app.update(screen)
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
131 pygame.display.update(update)
e2b5262c2b11 Add basic help screen
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
132
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
133
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
134 class LevelScreenState(State):
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
135 def init(self):
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
136 sound.stop_background_music()
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
137 self.game.set_level_screen()
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
138
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
139 def event(self, e):
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
140 if e.type is KEYDOWN and e.key == K_ESCAPE:
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
141 return MainMenuState(self.game)
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
142 elif events_equal(e, GO_MAIN_MENU):
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
143 return MainMenuState(self.game)
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
144 elif events_equal(e, DO_LOAD_LEVEL):
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
145 self.game.load_new_level()
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
146 return MainMenuState(self.game)
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
147 elif e.type is not QUIT:
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
148 self.game.main_app.event(e)
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
149
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
150 def paint(self, screen):
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
151 screen.fill((0,0,0))
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
152 self.game.main_app.paint(screen)
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
153 pygame.display.flip()
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
154
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
155 def update(self, screen):
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
156 update = self.game.main_app.update(screen)
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
157 pygame.display.update(update)
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
158
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
159
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
160 class DayState(State):
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
161 def init(self):
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
162 """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
163 sound.stop_background_music()
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 222
diff changeset
164 self.game.gameboard.start_day()
30
2eec29085060 Color night and day.
Simon Cross <hodgestar@gmail.com>
parents: 29
diff changeset
165
98
725b292ca07b Added sounds killing foxes and chickens, and nightfall
David Fraser <davidf@sjsoft.com>
parents: 94
diff changeset
166 sound.play_sound("daybreak.ogg")
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
167 # disable timer
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
168 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
169 sound.background_music("daytime.ogg")
336
82a18615a0ab Ask 'Are you sure?'
Neil Muller <drnlmuller@gmail.com>
parents: 320
diff changeset
170 self.dialog = None
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
171
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
172 def event(self, e):
336
82a18615a0ab Ask 'Are you sure?'
Neil Muller <drnlmuller@gmail.com>
parents: 320
diff changeset
173 if self.dialog and self.dialog.running:
82a18615a0ab Ask 'Are you sure?'
Neil Muller <drnlmuller@gmail.com>
parents: 320
diff changeset
174 if self.dialog.event(e):
82a18615a0ab Ask 'Are you sure?'
Neil Muller <drnlmuller@gmail.com>
parents: 320
diff changeset
175 return
82a18615a0ab Ask 'Are you sure?'
Neil Muller <drnlmuller@gmail.com>
parents: 320
diff changeset
176 elif self.dialog:
82a18615a0ab Ask 'Are you sure?'
Neil Muller <drnlmuller@gmail.com>
parents: 320
diff changeset
177 if self.dialog.do_quit:
82a18615a0ab Ask 'Are you sure?'
Neil Muller <drnlmuller@gmail.com>
parents: 320
diff changeset
178 self.dialog = None
82a18615a0ab Ask 'Are you sure?'
Neil Muller <drnlmuller@gmail.com>
parents: 320
diff changeset
179 self.game.gameboard.reset_states()
82a18615a0ab Ask 'Are you sure?'
Neil Muller <drnlmuller@gmail.com>
parents: 320
diff changeset
180 return GameOver(self.game)
82a18615a0ab Ask 'Are you sure?'
Neil Muller <drnlmuller@gmail.com>
parents: 320
diff changeset
181 self.dialog=None
82a18615a0ab Ask 'Are you sure?'
Neil Muller <drnlmuller@gmail.com>
parents: 320
diff changeset
182 return
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
183 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
184 self.game.gameboard.reset_states()
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
185 return NightState(self.game)
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
186 elif e.type is KEYDOWN and e.key == K_ESCAPE:
336
82a18615a0ab Ask 'Are you sure?'
Neil Muller <drnlmuller@gmail.com>
parents: 320
diff changeset
187 self.dialog = check_exit()
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
188 elif e.type is KEYDOWN and e.key == K_n:
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
189 return pygame.event.post(START_NIGHT)
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
190 elif events_equal(e, GO_MAIN_MENU):
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
191 return MainMenuState(self.game)
14
d7f295c06a4b Split gameboard screen.
Jeremy Thurgood <firxen@gmail.com>
parents: 12
diff changeset
192 elif e.type is not QUIT:
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
193 self.game.main_app.event(e)
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
194
12
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
195 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
196 self.game.main_app.paint(screen)
12
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
197 pygame.display.flip()
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
198
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
199 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
200 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
201 update = self.game.main_app.update(screen)
12
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
202 pygame.display.update(update)
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
203
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
204 def loop(self):
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
205 self.game.gameboard.loop()
8a7319e4853a Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 11
diff changeset
206
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
207 class NightState(State):
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
208 def init(self):
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
209 """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
210 sound.stop_background_music()
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 222
diff changeset
211 self.game.gameboard.start_night()
30
2eec29085060 Color night and day.
Simon Cross <hodgestar@gmail.com>
parents: 29
diff changeset
212
98
725b292ca07b Added sounds killing foxes and chickens, and nightfall
David Fraser <davidf@sjsoft.com>
parents: 94
diff changeset
213 sound.play_sound("nightfall.ogg")
422
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 413
diff changeset
214
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 413
diff changeset
215 self.game.gameboard.chickens_scatter()
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 413
diff changeset
216 self.game.gameboard.chickens_chop_wood()
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
217 # Add a timer to the event queue
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
218 self.cycle_count = 0
435
66bc99477155 Remove references to ANIM timer, so no longer relevant
Neil Muller <drnlmuller@gmail.com>
parents: 434
diff changeset
219 self.cycle_time = SLOW__SPEED
66bc99477155 Remove references to ANIM timer, so no longer relevant
Neil Muller <drnlmuller@gmail.com>
parents: 434
diff changeset
220 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
221 sound.background_music("nighttime.ogg")
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
222
349
a36ab7dd0eb9 Fix 'Are You Sure?' dialog to work at night
Neil Muller <drnlmuller@gmail.com>
parents: 346
diff changeset
223 self.dialog = None
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 99
diff changeset
224
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
225 def event(self, e):
349
a36ab7dd0eb9 Fix 'Are You Sure?' dialog to work at night
Neil Muller <drnlmuller@gmail.com>
parents: 346
diff changeset
226 if self.dialog and self.dialog.running:
a36ab7dd0eb9 Fix 'Are You Sure?' dialog to work at night
Neil Muller <drnlmuller@gmail.com>
parents: 346
diff changeset
227 if self.dialog.event(e):
a36ab7dd0eb9 Fix 'Are You Sure?' dialog to work at night
Neil Muller <drnlmuller@gmail.com>
parents: 346
diff changeset
228 return
a36ab7dd0eb9 Fix 'Are You Sure?' dialog to work at night
Neil Muller <drnlmuller@gmail.com>
parents: 346
diff changeset
229 elif self.dialog:
a36ab7dd0eb9 Fix 'Are You Sure?' dialog to work at night
Neil Muller <drnlmuller@gmail.com>
parents: 346
diff changeset
230 if self.dialog.do_quit:
a36ab7dd0eb9 Fix 'Are You Sure?' dialog to work at night
Neil Muller <drnlmuller@gmail.com>
parents: 346
diff changeset
231 self.dialog = None
a36ab7dd0eb9 Fix 'Are You Sure?' dialog to work at night
Neil Muller <drnlmuller@gmail.com>
parents: 346
diff changeset
232 self.game.gameboard.reset_states()
a36ab7dd0eb9 Fix 'Are You Sure?' dialog to work at night
Neil Muller <drnlmuller@gmail.com>
parents: 346
diff changeset
233 return GameOver(self.game)
a36ab7dd0eb9 Fix 'Are You Sure?' dialog to work at night
Neil Muller <drnlmuller@gmail.com>
parents: 346
diff changeset
234 self.dialog=None
a36ab7dd0eb9 Fix 'Are You Sure?' dialog to work at night
Neil Muller <drnlmuller@gmail.com>
parents: 346
diff changeset
235 return
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
236 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
237 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
238 return GameOver(self.game)
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
239 return DayState(self.game)
320
9bf0e701a36e Switch between 'Finished Day' and 'Fast Forward' modes
Neil Muller <drnlmuller@gmail.com>
parents: 312
diff changeset
240 elif (e.type is KEYDOWN and e.key == K_d) or \
9bf0e701a36e Switch between 'Finished Day' and 'Fast Forward' modes
Neil Muller <drnlmuller@gmail.com>
parents: 312
diff changeset
241 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
242 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
243 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
244 else:
435
66bc99477155 Remove references to ANIM timer, so no longer relevant
Neil Muller <drnlmuller@gmail.com>
parents: 434
diff changeset
245 self.cycle_time = SLOW__SPEED
66bc99477155 Remove references to ANIM timer, so no longer relevant
Neil Muller <drnlmuller@gmail.com>
parents: 434
diff changeset
246 pygame.time.set_timer(MOVE_FOX_ID, self.cycle_time)
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
247 elif e.type is KEYDOWN and e.key == K_ESCAPE:
349
a36ab7dd0eb9 Fix 'Are You Sure?' dialog to work at night
Neil Muller <drnlmuller@gmail.com>
parents: 346
diff changeset
248 self.dialog = check_exit()
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
249 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
250 # 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
251 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
252 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
253 # 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
254 pygame.event.clear(MOVE_FOX_ID)
237
4a87bfa5cc63 Twiddle animation cycle
Neil Muller <drnlmuller@gmail.com>
parents: 233
diff changeset
255 # Ensure any outstanding animitions get cleaned up
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
256 self.cycle_count += 1
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
257 if self.cycle_count > constants.NIGHT_LENGTH:
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
258 return pygame.event.post(START_DAY)
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 392
diff changeset
259 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
260 # 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
261 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
262 # Re-enable timers
436
2b4cd86dfcaf Better approximate constant framerate on move events, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 435
diff changeset
263 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
264 time_left = self.cycle_time - diff
2b4cd86dfcaf Better approximate constant framerate on move events, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 435
diff changeset
265 if time_left < 0:
2b4cd86dfcaf Better approximate constant framerate on move events, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 435
diff changeset
266 time_left = self.cycle_time
2b4cd86dfcaf Better approximate constant framerate on move events, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 435
diff changeset
267 pygame.time.set_timer(MOVE_FOX_ID, time_left)
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
268 elif e.type is not QUIT:
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
269 self.game.main_app.event(e)
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
270
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
271 def loop(self):
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
272 self.game.gameboard.loop()
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
273
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
274 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
275 self.game.main_app.paint(screen)
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
276 pygame.display.flip()
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
277
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
278 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
279 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
280 update = self.game.main_app.update(screen)
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
281 pygame.display.update(update)
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 15
diff changeset
282
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
283 class GameOver(State):
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
284 def init(self):
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
285 """Setup everything"""
156
210fc1ea0516 Stop background music whenever state changes.
Simon Cross <hodgestar@gmail.com>
parents: 151
diff changeset
286 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
287 self.game.create_game_over()
142
1597081e5a84 Disable timer when game is over
Neil Muller <drnlmuller@gmail.com>
parents: 141
diff changeset
288 pygame.time.set_timer(MOVE_FOX_ID, 0)
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
289
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
290 def event(self, e):
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
291 if e.type is KEYDOWN:
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
292 if e.key == K_ESCAPE:
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
293 return MainMenuState(self.game)
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
294 elif events_equal(e, GO_MAIN_MENU):
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
295 return MainMenuState(self.game)
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
296 elif e.type is not QUIT:
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
297 self.game.main_app.event(e)
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
298
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
299 def paint(self, screen):
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
300 screen.fill((0,0,0))
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
301 self.game.main_app.paint(screen)
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
302 pygame.display.flip()
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
303
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
304 def update(self, screen):
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
305 update = self.game.main_app.update(screen)
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
306 pygame.display.update(update)
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 122
diff changeset
307
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
308 # pygame events
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
309
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
310 def events_equal(e1, e2):
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
311 """Compare two user events."""
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
312 return (e1.type is e2.type and e1.name == e2.name)
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
313
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
314 START_DAY = pygame.event.Event(USEREVENT, name="START_DAY")
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
315 START_NIGHT = pygame.event.Event(USEREVENT, name="START_NIGHT")
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
316 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
317 GO_HELP_SCREEN = pygame.event.Event(USEREVENT, name="GO_HELP_SCREEN")
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
318 GO_LEVEL_SCREEN = pygame.event.Event(USEREVENT, name="GO_LEVEL_SCREEN")
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 411
diff changeset
319 DO_LOAD_LEVEL = pygame.event.Event(USEREVENT, name="DO_LEVEL_SCREEN")
320
9bf0e701a36e Switch between 'Finished Day' and 'Fast Forward' modes
Neil Muller <drnlmuller@gmail.com>
parents: 312
diff changeset
320 FAST_FORWARD = pygame.event.Event(USEREVENT, name="FAST_FORWARD")
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
321 MOVE_FOX_ID = USEREVENT + 1
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
322 MOVE_FOXES = pygame.event.Event(MOVE_FOX_ID, name="MOVE_FOXES")
11
5d58a5b13731 Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
323 QUIT = pygame.event.Event(QUIT)
233
d3d5352f5853 Twek speed loop. Document animation assumptions
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
324
d3d5352f5853 Twek speed loop. Document animation assumptions
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
325 # 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
326 # 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
327 FAST__SPEED=80
66bc99477155 Remove references to ANIM timer, so no longer relevant
Neil Muller <drnlmuller@gmail.com>
parents: 434
diff changeset
328 SLOW__SPEED=200