Mercurial > rinkhals
annotate gamelib/engine.py @ 315:0a3161fec434
Check whether we've made the list before submitting the score
author | Neil Muller <drnlmuller@gmail.com> |
---|---|
date | Sat, 05 Sep 2009 18:56:33 +0000 |
parents | dd1ffee5ccf5 |
children | 9bf0e701a36e |
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 | 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 | 11 import helpscreen |
12
8a7319e4853a
Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents:
11
diff
changeset
|
12 |
11
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
13 class Engine(Game): |
139
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
14 def __init__(self, main_app): |
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
15 self.main_app = main_app |
11
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
16 self.clock = pygame.time.Clock() |
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
|
17 self.main_menu = mainmenu.make_main_menu() |
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
|
18 self._open_window = None |
229
96d440bebdaa
Non-permenant high score table
Neil Muller <drnlmuller@gmail.com>
parents:
223
diff
changeset
|
19 self.scoreboard = gameover.ScoreTable() |
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 |
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
|
26 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
|
27 """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
|
28 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
|
29 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
|
30 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
|
31 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
|
32 |
12
8a7319e4853a
Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents:
11
diff
changeset
|
33 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
|
34 """Create and open a gameboard 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 self.gameboard = gameboard.GameBoard(self.main_app) |
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.open_window(self.gameboard.get_top_widget()) |
12
8a7319e4853a
Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents:
11
diff
changeset
|
37 |
139
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
38 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
|
39 """Open the main menu""" |
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.main_menu) |
139
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
41 |
179 | 42 def set_help_screen(self): |
43 """Open the main menu""" | |
44 help_screen = helpscreen.make_help_screen() | |
45 self.open_window(help_screen) | |
46 | |
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
|
47 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
|
48 """Create and open the Game Over window""" |
312
dd1ffee5ccf5
Use different score tables fot the different modes. Refactor game modes code as a result
Neil Muller <drnlmuller@gmail.com>
parents:
262
diff
changeset
|
49 for mode, days in constants.TURN_LIMITS.iteritems(): |
dd1ffee5ccf5
Use different score tables fot the different modes. Refactor game modes code as a result
Neil Muller <drnlmuller@gmail.com>
parents:
262
diff
changeset
|
50 if days == constants.TURN_LIMIT: |
dd1ffee5ccf5
Use different score tables fot the different modes. Refactor game modes code as a result
Neil Muller <drnlmuller@gmail.com>
parents:
262
diff
changeset
|
51 game_over = gameover.create_game_over(self.gameboard, |
dd1ffee5ccf5
Use different score tables fot the different modes. Refactor game modes code as a result
Neil Muller <drnlmuller@gmail.com>
parents:
262
diff
changeset
|
52 self.scoreboard[mode], mode) |
254
f399e4926c36
Fix events getting sent to the gameboard
Neil Muller <drnlmuller@gmail.com>
parents:
245
diff
changeset
|
53 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
|
54 self.open_window(game_over) |
139
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
55 |
254
f399e4926c36
Fix events getting sent to the gameboard
Neil Muller <drnlmuller@gmail.com>
parents:
245
diff
changeset
|
56 def event(self, e): |
262
d508248041ff
avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents:
254
diff
changeset
|
57 if not Game.event(self, e): |
d508248041ff
avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents:
254
diff
changeset
|
58 if self.gameboard: |
d508248041ff
avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents:
254
diff
changeset
|
59 return self.gameboard.event(e) |
d508248041ff
avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents:
254
diff
changeset
|
60 return False |
d508248041ff
avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents:
254
diff
changeset
|
61 return True |
254
f399e4926c36
Fix events getting sent to the gameboard
Neil Muller <drnlmuller@gmail.com>
parents:
245
diff
changeset
|
62 |
f399e4926c36
Fix events getting sent to the gameboard
Neil Muller <drnlmuller@gmail.com>
parents:
245
diff
changeset
|
63 |
11
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
64 class MainMenuState(State): |
139
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
65 def init(self): |
156
210fc1ea0516
Stop background music whenever state changes.
Simon Cross <hodgestar@gmail.com>
parents:
151
diff
changeset
|
66 sound.stop_background_music() |
139
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
67 self.game.set_main_menu() |
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
68 |
11
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
69 def event(self, e): |
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
70 if events_equal(e, START_DAY): |
12
8a7319e4853a
Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents:
11
diff
changeset
|
71 self.game.create_game_board() |
11
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
72 return DayState(self.game) |
179 | 73 elif events_equal(e, GO_HELP_SCREEN): |
74 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
|
75 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
|
76 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
|
77 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
|
78 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
|
79 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
|
80 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
|
81 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
|
82 return HelpScreenState(self.game) |
11
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
83 elif e.type is not QUIT: |
139
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
84 self.game.main_app.event(e) |
11
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
85 |
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
86 def paint(self, screen): |
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
87 screen.fill((0,0,0)) |
139
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
88 self.game.main_app.paint(screen) |
11
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
89 pygame.display.flip() |
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
90 |
15
b69d954f2f1d
Add update call to main menu event
Neil Muller <drnlmuller@gmail.com>
parents:
14
diff
changeset
|
91 def update(self, screen): |
139
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
92 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
|
93 pygame.display.update(update) |
b69d954f2f1d
Add update call to main menu event
Neil Muller <drnlmuller@gmail.com>
parents:
14
diff
changeset
|
94 |
179 | 95 class HelpScreenState(State): |
96 def init(self): | |
97 sound.stop_background_music() | |
98 self.game.set_help_screen() | |
99 | |
100 def event(self, e): | |
101 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
|
102 return MainMenuState(self.game) |
179 | 103 elif events_equal(e, GO_MAIN_MENU): |
104 return MainMenuState(self.game) | |
105 elif e.type is not QUIT: | |
106 self.game.main_app.event(e) | |
107 | |
108 def paint(self, screen): | |
109 screen.fill((0,0,0)) | |
110 self.game.main_app.paint(screen) | |
111 pygame.display.flip() | |
112 | |
113 def update(self, screen): | |
114 update = self.game.main_app.update(screen) | |
115 pygame.display.update(update) | |
116 | |
11
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
117 class DayState(State): |
25
6d6ab0c1479d
Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
15
diff
changeset
|
118 def init(self): |
6d6ab0c1479d
Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
15
diff
changeset
|
119 """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
|
120 sound.stop_background_music() |
223 | 121 self.game.gameboard.start_day() |
30 | 122 |
98
725b292ca07b
Added sounds killing foxes and chickens, and nightfall
David Fraser <davidf@sjsoft.com>
parents:
94
diff
changeset
|
123 sound.play_sound("daybreak.ogg") |
29 | 124 # disable timer |
125 pygame.time.set_timer(MOVE_FOX_ID, 0) | |
237 | 126 pygame.time.set_timer(ANIM_ID, SLOW_ANIM_SPEED) |
139
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
127 self.game.gameboard.advance_day() |
25
6d6ab0c1479d
Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
15
diff
changeset
|
128 self.game.gameboard.clear_foxes() |
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
|
129 sound.background_music("daytime.ogg") |
116
d539ef5a3333
Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents:
99
diff
changeset
|
130 self.game.gameboard.hatch_eggs() |
25
6d6ab0c1479d
Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
15
diff
changeset
|
131 |
11
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
132 def event(self, e): |
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
133 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
|
134 self.game.gameboard.reset_states() |
11
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
135 return NightState(self.game) |
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
136 elif e.type is KEYDOWN and e.key == K_ESCAPE: |
213
07b361ebd87f
Ensure we clean up highlights, etc.
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
137 self.game.gameboard.reset_states() |
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
|
138 return GameOver(self.game) |
202 | 139 elif e.type is ANIM_ID: |
140 self.game.gameboard.run_animations() | |
25
6d6ab0c1479d
Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
15
diff
changeset
|
141 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
|
142 return pygame.event.post(START_NIGHT) |
11
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
143 elif events_equal(e, GO_MAIN_MENU): |
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
144 return MainMenuState(self.game) |
14 | 145 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
|
146 self.game.main_app.event(e) |
11
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
147 |
12
8a7319e4853a
Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents:
11
diff
changeset
|
148 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
|
149 self.game.main_app.paint(screen) |
12
8a7319e4853a
Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents:
11
diff
changeset
|
150 pygame.display.flip() |
8a7319e4853a
Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents:
11
diff
changeset
|
151 |
8a7319e4853a
Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents:
11
diff
changeset
|
152 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
|
153 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
|
154 update = self.game.main_app.update(screen) |
12
8a7319e4853a
Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents:
11
diff
changeset
|
155 pygame.display.update(update) |
8a7319e4853a
Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents:
11
diff
changeset
|
156 |
8a7319e4853a
Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents:
11
diff
changeset
|
157 def loop(self): |
8a7319e4853a
Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents:
11
diff
changeset
|
158 self.game.gameboard.loop() |
8a7319e4853a
Hooked in the game board.
Jeremy Thurgood <firxen@gmail.com>
parents:
11
diff
changeset
|
159 |
11
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
160 class NightState(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 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
|
163 sound.stop_background_music() |
223 | 164 self.game.gameboard.start_night() |
30 | 165 |
98
725b292ca07b
Added sounds killing foxes and chickens, and nightfall
David Fraser <davidf@sjsoft.com>
parents:
94
diff
changeset
|
166 sound.play_sound("nightfall.ogg") |
29 | 167 # Add a timer to the event queue |
168 self.cycle_count = 0 | |
233
d3d5352f5853
Twek speed loop. Document animation assumptions
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
169 self.cycle_time = SLOW_ANIM_SPEED |
d3d5352f5853
Twek speed loop. Document animation assumptions
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
170 pygame.time.set_timer(MOVE_FOX_ID, 4*self.cycle_time) |
d3d5352f5853
Twek speed loop. Document animation assumptions
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
171 pygame.time.set_timer(ANIM_ID, self.cycle_time) |
69
18db99fda6bd
Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents:
31
diff
changeset
|
172 self.game.gameboard.spawn_foxes() |
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
|
173 sound.background_music("nighttime.ogg") |
25
6d6ab0c1479d
Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
15
diff
changeset
|
174 |
116
d539ef5a3333
Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents:
99
diff
changeset
|
175 self.game.gameboard.lay_eggs() |
d539ef5a3333
Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents:
99
diff
changeset
|
176 |
11
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
177 def event(self, e): |
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
178 if events_equal(e, START_DAY): |
139
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
179 if self.game.gameboard.is_game_over(): |
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
180 return GameOver(self.game) |
11
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
181 return DayState(self.game) |
25
6d6ab0c1479d
Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
15
diff
changeset
|
182 elif e.type is KEYDOWN and e.key == K_d: |
233
d3d5352f5853
Twek speed loop. Document animation assumptions
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
183 if self.cycle_time > FAST_ANIM_SPEED: |
d3d5352f5853
Twek speed loop. Document animation assumptions
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
184 self.cycle_time = FAST_ANIM_SPEED |
222
322e6d3a46e4
Turn 'd' into a fast forward / normal speed toggle at night
Neil Muller <drnlmuller@gmail.com>
parents:
213
diff
changeset
|
185 else: |
233
d3d5352f5853
Twek speed loop. Document animation assumptions
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
186 self.cycle_time = SLOW_ANIM_SPEED |
d3d5352f5853
Twek speed loop. Document animation assumptions
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
187 pygame.time.set_timer(ANIM_ID, self.cycle_time) |
d3d5352f5853
Twek speed loop. Document animation assumptions
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
188 pygame.time.set_timer(MOVE_FOX_ID, 4*self.cycle_time) |
25
6d6ab0c1479d
Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
15
diff
changeset
|
189 elif e.type is KEYDOWN and e.key == K_ESCAPE: |
203
653da96db572
Fixed dangling cursor sprite and did some TODO list maintenance.
Jeremy Thurgood <firxen@gmail.com>
parents:
202
diff
changeset
|
190 self.game.gameboard.set_cursor() |
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
|
191 return GameOver(self.game) |
202 | 192 elif e.type is ANIM_ID: |
193 self.game.gameboard.run_animations() | |
29 | 194 elif e.type is MOVE_FOX_ID: |
233
d3d5352f5853
Twek speed loop. Document animation assumptions
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
195 # Timer aren't nessecairly ordered, so we make sure |
d3d5352f5853
Twek speed loop. Document animation assumptions
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
196 # we don't get a ANIM event until at least cycle after this |
d3d5352f5853
Twek speed loop. Document animation assumptions
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
197 pygame.time.set_timer(ANIM_ID, self.cycle_time) |
237 | 198 # Ensure any outstanding animitions get cleaned up |
199 self.game.gameboard.run_animations() | |
29 | 200 self.cycle_count += 1 |
139
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
201 if self.cycle_count > constants.NIGHT_LENGTH: |
29 | 202 return pygame.event.post(START_DAY) |
122
d2b19131d537
Don't continue the night if we're not doing anything anymore
Neil Muller <drnlmuller@gmail.com>
parents:
118
diff
changeset
|
203 if self.game.gameboard.move_foxes(): |
d2b19131d537
Don't continue the night if we're not doing anything anymore
Neil Muller <drnlmuller@gmail.com>
parents:
118
diff
changeset
|
204 # 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
|
205 return pygame.event.post(START_DAY) |
25
6d6ab0c1479d
Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
15
diff
changeset
|
206 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
|
207 self.game.main_app.event(e) |
25
6d6ab0c1479d
Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
15
diff
changeset
|
208 |
6d6ab0c1479d
Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
15
diff
changeset
|
209 def loop(self): |
6d6ab0c1479d
Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
15
diff
changeset
|
210 self.game.gameboard.loop() |
6d6ab0c1479d
Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
15
diff
changeset
|
211 |
6d6ab0c1479d
Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
15
diff
changeset
|
212 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
|
213 self.game.main_app.paint(screen) |
25
6d6ab0c1479d
Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
15
diff
changeset
|
214 pygame.display.flip() |
6d6ab0c1479d
Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
15
diff
changeset
|
215 |
6d6ab0c1479d
Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
15
diff
changeset
|
216 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
|
217 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
|
218 update = self.game.main_app.update(screen) |
25
6d6ab0c1479d
Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
15
diff
changeset
|
219 pygame.display.update(update) |
6d6ab0c1479d
Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
15
diff
changeset
|
220 |
139
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
221 class GameOver(State): |
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
222 def init(self): |
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
223 """Setup everything""" |
156
210fc1ea0516
Stop background music whenever state changes.
Simon Cross <hodgestar@gmail.com>
parents:
151
diff
changeset
|
224 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
|
225 self.game.create_game_over() |
142
1597081e5a84
Disable timer when game is over
Neil Muller <drnlmuller@gmail.com>
parents:
141
diff
changeset
|
226 pygame.time.set_timer(MOVE_FOX_ID, 0) |
202 | 227 pygame.time.set_timer(ANIM_ID, 0) |
139
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
228 |
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
229 def event(self, e): |
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
230 if e.type is KEYDOWN: |
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
231 if e.key == K_ESCAPE: |
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
232 return MainMenuState(self.game) |
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
233 elif events_equal(e, GO_MAIN_MENU): |
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
234 return MainMenuState(self.game) |
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
235 elif e.type is not QUIT: |
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
236 self.game.main_app.event(e) |
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
237 |
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
238 def paint(self, screen): |
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
239 screen.fill((0,0,0)) |
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
240 self.game.main_app.paint(screen) |
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
241 pygame.display.flip() |
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
242 |
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
243 def update(self, screen): |
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
244 update = self.game.main_app.update(screen) |
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
245 pygame.display.update(update) |
1d73de63bd71
Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
246 |
11
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
247 # pygame events |
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
248 |
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
249 def events_equal(e1, e2): |
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
250 """Compare two user events.""" |
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
251 return (e1.type is e2.type and e1.name == e2.name) |
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
252 |
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
253 START_DAY = pygame.event.Event(USEREVENT, name="START_DAY") |
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
254 START_NIGHT = pygame.event.Event(USEREVENT, name="START_NIGHT") |
5d58a5b13731
Extremely rudimentary game engine.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
255 GO_MAIN_MENU = pygame.event.Event(USEREVENT, name="GO_MAIN_MENU") |
179 | 256 GO_HELP_SCREEN = pygame.event.Event(USEREVENT, name="GO_HELP_SCREEN") |
29 | 257 MOVE_FOX_ID = USEREVENT + 1 |
202 | 258 ANIM_ID = USEREVENT + 6 |
29 | 259 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
|
260 QUIT = pygame.event.Event(QUIT) |
233
d3d5352f5853
Twek speed loop. Document animation assumptions
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
261 |
d3d5352f5853
Twek speed loop. Document animation assumptions
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
262 # 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
|
263 # at intervals of 10ms, so there's no point in them not being multiples of 10 |
d3d5352f5853
Twek speed loop. Document animation assumptions
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
264 FAST_ANIM_SPEED=20 |
d3d5352f5853
Twek speed loop. Document animation assumptions
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
265 SLOW_ANIM_SPEED=50 |