source: gamelib/engine.py @ 179:e2b5262c2b11

Last change on this file since 179:e2b5262c2b11 was 179:e2b5262c2b11, checked in by Neil Muller <drnlmuller@…>, 11 years ago

Add basic help screen

File size: 7.0 KB
Line 
1"""Game engine and states."""
2
3from pgu.engine import Game, State, Quit
4import pygame
5from pygame.locals import USEREVENT, QUIT, KEYDOWN, K_ESCAPE, K_n, K_d, K_s
6
7import gameboard
8import gameover
9import sound
10import constants
11import mainmenu
12import helpscreen
13
14class Engine(Game):
15    def __init__(self, main_app):
16        self.main_app = main_app
17        self.clock = pygame.time.Clock()
18        self.main_menu = mainmenu.make_main_menu()
19        self._open_window = None
20
21    def tick(self):
22        """Tic toc."""
23        pygame.time.wait(10)
24
25    def open_window(self, window):
26        """Open a widget as the main window."""
27        if self._open_window is not None:
28            self.main_app.close(self._open_window)
29        self.main_app.open(window)
30        self._open_window = window
31
32    def create_game_board(self):
33        """Create and open a gameboard window."""
34        self.gameboard = gameboard.GameBoard(self.main_app)
35        self.open_window(self.gameboard.get_top_widget())
36
37    def set_main_menu(self):
38        """Open the main menu"""
39        self.open_window(self.main_menu)
40
41    def set_help_screen(self):
42        """Open the main menu"""
43        help_screen = helpscreen.make_help_screen()
44        self.open_window(help_screen)
45
46    def create_game_over(self):
47        """Create and open the Game Over window"""
48        game_over = gameover.create_game_over(self.gameboard)
49        self.open_window(game_over)
50
51class MainMenuState(State):
52    def init(self):
53        sound.stop_background_music()
54        self.game.set_main_menu()
55
56    def event(self, e):
57        if events_equal(e, START_DAY):
58            self.game.create_game_board()
59            return DayState(self.game)
60        elif events_equal(e, GO_HELP_SCREEN):
61            return HelpScreenState(self.game)
62        elif e.type is KEYDOWN:
63            if e.key == K_ESCAPE:
64                return Quit(self.game)
65            elif e.key == K_s:
66                self.game.create_game_board()
67                return DayState(self.game)
68        elif e.type is not QUIT:
69            self.game.main_app.event(e)
70
71    def paint(self, screen):
72        screen.fill((0,0,0))
73        self.game.main_app.paint(screen)
74        pygame.display.flip()
75
76    def update(self, screen):
77        update = self.game.main_app.update(screen)
78        pygame.display.update(update)
79
80class HelpScreenState(State):
81    def init(self):
82        sound.stop_background_music()
83        self.game.set_help_screen()
84
85    def event(self, e):
86        if e.type is KEYDOWN and e.key == K_ESCAPE:
87                return MainMenu(self.game)
88        elif events_equal(e, GO_MAIN_MENU):
89            return MainMenuState(self.game)
90        elif e.type is not QUIT:
91            self.game.main_app.event(e)
92
93    def paint(self, screen):
94        screen.fill((0,0,0))
95        self.game.main_app.paint(screen)
96        pygame.display.flip()
97
98    def update(self, screen):
99        update = self.game.main_app.update(screen)
100        pygame.display.update(update)
101
102class DayState(State):
103    def init(self):
104        """Add some chickens to the farm"""
105        sound.stop_background_music()
106        self.game.gameboard.tv.sun(True)
107
108        sound.play_sound("daybreak.ogg")
109        # disable timer
110        pygame.time.set_timer(MOVE_FOX_ID, 0)
111        self.game.gameboard.advance_day()
112        self.game.gameboard.clear_foxes()
113        sound.background_music("daytime.ogg")
114        self.game.gameboard.hatch_eggs()
115
116    def event(self, e):
117        if events_equal(e, START_NIGHT):
118            return NightState(self.game)
119        elif e.type is KEYDOWN and e.key == K_ESCAPE:
120            self.game.gameboard.reset_cursor()
121            return GameOver(self.game)
122        elif e.type is KEYDOWN and e.key == K_n:
123            return pygame.event.post(START_NIGHT)
124        elif events_equal(e, GO_MAIN_MENU):
125            return MainMenuState(self.game)
126        elif e.type is not QUIT:
127            self.game.main_app.event(e)
128
129    def paint(self, screen):
130        self.game.main_app.paint(screen)
131        pygame.display.flip()
132
133    def update(self, screen):
134        self.game.gameboard.update()
135        update = self.game.main_app.update(screen)
136        pygame.display.update(update)
137
138    def loop(self):
139        self.game.gameboard.loop()
140
141class NightState(State):
142    def init(self):
143        """Add some foxes to the farm"""
144        sound.stop_background_music()
145        self.game.gameboard.tv.sun(False)
146
147        sound.play_sound("nightfall.ogg")
148        # Add a timer to the event queue
149        self.cycle_count = 0
150        pygame.time.set_timer(MOVE_FOX_ID, 200)
151        self.game.gameboard.spawn_foxes()
152        sound.background_music("nighttime.ogg")
153
154        self.game.gameboard.lay_eggs()
155
156    def event(self, e):
157        if events_equal(e, START_DAY):
158            if self.game.gameboard.is_game_over():
159                return GameOver(self.game)
160            return DayState(self.game)
161        elif e.type is KEYDOWN and e.key == K_d:
162            return pygame.event.post(START_DAY)
163        elif e.type is KEYDOWN and e.key == K_ESCAPE:
164            self.game.gameboard.reset_cursor()
165            return GameOver(self.game)
166        elif e.type is MOVE_FOX_ID:
167            self.cycle_count += 1
168            if self.cycle_count > constants.NIGHT_LENGTH:
169                return pygame.event.post(START_DAY)
170            if self.game.gameboard.move_foxes():
171                # All foxes are gone/safe, so dawn happens
172                return pygame.event.post(START_DAY)
173        elif e.type is not QUIT:
174            self.game.main_app.event(e)
175
176    def loop(self):
177        self.game.gameboard.loop()
178
179    def paint(self, screen):
180        self.game.main_app.paint(screen)
181        pygame.display.flip()
182
183    def update(self, screen):
184        self.game.gameboard.update()
185        update = self.game.main_app.update(screen)
186        pygame.display.update(update)
187
188class GameOver(State):
189    def init(self):
190        """Setup everything"""
191        sound.stop_background_music()
192        self.game.create_game_over()
193        pygame.time.set_timer(MOVE_FOX_ID, 0)
194
195    def event(self, e):
196        if e.type is KEYDOWN:
197            if e.key == K_ESCAPE:
198                return MainMenuState(self.game)
199        elif events_equal(e, GO_MAIN_MENU):
200            return MainMenuState(self.game)
201        elif e.type is not QUIT:
202            self.game.main_app.event(e)
203
204    def paint(self, screen):
205        screen.fill((0,0,0))
206        self.game.main_app.paint(screen)
207        pygame.display.flip()
208
209    def update(self, screen):
210        update = self.game.main_app.update(screen)
211        pygame.display.update(update)
212
213# pygame events
214
215def events_equal(e1, e2):
216    """Compare two user events."""
217    return (e1.type is e2.type and e1.name == e2.name)
218
219START_DAY = pygame.event.Event(USEREVENT, name="START_DAY")
220START_NIGHT = pygame.event.Event(USEREVENT, name="START_NIGHT")
221GO_MAIN_MENU = pygame.event.Event(USEREVENT, name="GO_MAIN_MENU")
222GO_HELP_SCREEN = pygame.event.Event(USEREVENT, name="GO_HELP_SCREEN")
223MOVE_FOX_ID = USEREVENT + 1
224MOVE_FOXES = pygame.event.Event(MOVE_FOX_ID, name="MOVE_FOXES")
225QUIT = pygame.event.Event(QUIT)
Note: See TracBrowser for help on using the repository browser.