source: gamelib/engine.py @ 31:3c4db7bba432

Last change on this file since 31:3c4db7bba432 was 31:3c4db7bba432, checked in by Simon Cross <hodgestar@…>, 11 years ago

Add 's' as a key for starting the game from the menu.

File size: 6.1 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
7from tiles import TILE_MAP
8import gameboard
9import animal
10import random
11
12class Engine(Game):
13    def __init__(self, main_menu_app):
14        self.main_menu_app = main_menu_app
15        self.clock = pygame.time.Clock()
16
17    def tick(self):
18        """Tic toc."""
19        pygame.time.wait(10)
20
21    def create_game_board(self):
22        self.gameboard = gameboard.GameBoard()
23
24class MainMenuState(State):
25    def event(self, e):
26        if events_equal(e, START_DAY):
27            self.game.create_game_board()
28            return DayState(self.game)
29        elif e.type is KEYDOWN:
30            if e.key == K_ESCAPE:
31                return Quit(self.game)
32            elif e.key == K_s:
33                self.game.create_game_board()
34                return DayState(self.game)
35        elif e.type is not QUIT:
36            self.game.main_menu_app.event(e)
37
38    def paint(self, screen):
39        screen.fill((0,0,0))
40        self.game.main_menu_app.paint(screen)
41        pygame.display.flip()
42
43    def update(self, screen):
44        update = self.game.main_menu_app.update(screen)
45        pygame.display.update(update)
46
47class DayState(State):
48    def init(self):
49        """Add some chickens to the farm"""
50        self.game.gameboard.tv.sun(True)
51
52        # disable timer
53        pygame.time.set_timer(MOVE_FOX_ID, 0)
54        # Very simple, we walk around the tilemap, and, for each farm tile,
55        # we randomly add a chicken (1 in 10 chance) until we have 5 chickens
56        # or we run out of board
57        self.game.gameboard.clear_foxes()
58        chickens = len(self.game.gameboard.chickens)
59        x, y = 0, 0
60        width, height = self.game.gameboard.tv.size
61        while chickens < 5:
62            if x < width:
63                tile = self.game.gameboard.tv.get((x, y))
64            else:
65                y += 1
66                if y >= height:
67                    break
68                x = 0
69                continue
70            # See if we place a chicken
71            if 'grassland' == TILE_MAP[tile]:
72                # Farmland
73                roll = random.randint(1, 20)
74                # We don't place within a tile of the fence, this is to make things
75                # easier
76                for xx in range(x-1, x+2):
77                    if xx >= height or xx < 0:
78                        continue
79                    for yy in range(y-1, y+2):
80                        if yy >= height or yy < 0:
81                            continue
82                        neighbour = self.game.gameboard.tv.get((xx, yy))
83                        if 'fence' == TILE_MAP[neighbour]:
84                            # Fence
85                            roll = 10
86                if roll == 1:
87                    # Create a chicken
88                    chickens += 1
89                    chick = animal.Chicken((x, y))
90                    self.game.gameboard.add_chicken(chick)
91            x += 1
92
93    def event(self, e):
94        if events_equal(e, START_NIGHT):
95            return NightState(self.game)
96        elif e.type is KEYDOWN and e.key == K_ESCAPE:
97            return MainMenuState(self.game)
98        elif e.type is KEYDOWN and e.key == K_n:
99            return pygame.event.post(START_NIGHT)
100        elif events_equal(e, GO_MAIN_MENU):
101            return MainMenuState(self.game)
102        elif e.type is not QUIT:
103            self.game.gameboard.event(e)
104
105    def paint(self, screen):
106        self.game.gameboard.paint(screen)
107        pygame.display.flip()
108
109    def update(self, screen):
110        update = self.game.gameboard.update(screen)
111        pygame.display.update(update)
112
113    def loop(self):
114        self.game.gameboard.loop()
115
116class NightState(State):
117    def init(self):
118        """Add some foxes to the farm"""
119        self.game.gameboard.tv.sun(False)
120
121        # Add a timer to the event queue
122        self.cycle_count = 0
123        pygame.time.set_timer(MOVE_FOX_ID, 300)
124        # Very simple, we walk around the tilemap, and, for each farm tile,
125        # we randomly add a chicken (1 in 10 chance) until we have 5 chickens
126        # or we run out of board
127        foxes = len(self.game.gameboard.foxes)
128        x, y = 0, 0
129        width, height = self.game.gameboard.tv.size
130        while foxes < 5:
131            if x < width:
132                tile = self.game.gameboard.tv.get((x, y))
133            else:
134                y += 1
135                if y >= height:
136                    break
137                x = 0
138                continue
139            # See if we place a fox
140            if TILE_MAP[tile] == 'woodland':
141                # Forest
142                roll = random.randint(1, 20)
143                if roll == 1:
144                    # Create a fox
145                    foxes += 1
146                    fox = animal.Fox((x, y))
147                    self.game.gameboard.add_fox(fox)
148            x += 5
149
150    def event(self, e):
151        if events_equal(e, START_DAY):
152            return DayState(self.game)
153        elif e.type is KEYDOWN and e.key == K_d:
154            return pygame.event.post(START_DAY)
155        elif e.type is KEYDOWN and e.key == K_ESCAPE:
156            return MainMenuState(self.game)
157        elif e.type is MOVE_FOX_ID:
158            self.cycle_count += 1
159            if self.cycle_count > 15:
160                return pygame.event.post(START_DAY)
161            return self.game.gameboard.move_foxes()
162        elif e.type is not QUIT:
163            self.game.gameboard.event(e)
164
165    def loop(self):
166        self.game.gameboard.loop()
167
168    def paint(self, screen):
169        self.game.gameboard.paint(screen)
170        pygame.display.flip()
171
172    def update(self, screen):
173        update = self.game.gameboard.update(screen)
174        pygame.display.update(update)
175
176# pygame events
177
178def events_equal(e1, e2):
179    """Compare two user events."""
180    return (e1.type is e2.type and e1.name == e2.name)
181
182START_DAY = pygame.event.Event(USEREVENT, name="START_DAY")
183START_NIGHT = pygame.event.Event(USEREVENT, name="START_NIGHT")
184GO_MAIN_MENU = pygame.event.Event(USEREVENT, name="GO_MAIN_MENU")
185MOVE_FOX_ID = USEREVENT + 1
186MOVE_FOXES = pygame.event.Event(MOVE_FOX_ID, name="MOVE_FOXES")
187QUIT = pygame.event.Event(QUIT)
Note: See TracBrowser for help on using the repository browser.