source: gamelib/engine.py @ 30:2eec29085060

Last change on this file since 30:2eec29085060 was 30:2eec29085060, checked in by Simon Cross <hodgestar@…>, 11 years ago

Color night and day.

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