annotate gamelib/gameboard.py @ 243:4f86c2616cdf

Variable number of eggs for chickens
author Neil Muller <drnlmuller@gmail.com>
date Sat, 05 Sep 2009 12:05:08 +0000
parents 1a7000c8211c
children 634491bf37e8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
1 import random
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
2
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
3 import pygame
186
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
4 from pygame.locals import MOUSEBUTTONDOWN, MOUSEMOTION, KEYDOWN, K_UP, K_DOWN, K_LEFT, K_RIGHT
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
5 from pgu import gui
9
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
6
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
7 import data
24
7584453f4944 Add support for PNG tiles.
Simon Cross <hodgestar@gmail.com>
parents: 17
diff changeset
8 import tiles
79
8241386a1651 Add chicken counter
Neil Muller <drnlmuller@gmail.com>
parents: 77
diff changeset
9 import icons
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
10 import constants
57
08665fa60345 Implement henhouses and henhouse adding.
Simon Cross <hodgestar@gmail.com>
parents: 54
diff changeset
11 import buildings
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
12 import animal
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
13 import equipment
94
fa8d8fc1bf5b Added some sounds
David Fraser <davidf@sjsoft.com>
parents: 92
diff changeset
14 import sound
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
15 import cursors
186
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
16 import sprite_cursor
241
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
17 import misc
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
18
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
19 class OpaqueLabel(gui.Label):
168
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
20 def __init__(self, value, **params):
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
21 gui.Label.__init__(self, value, **params)
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
22 if 'width' in params:
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
23 self._width = params['width']
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
24 if 'height' in params:
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
25 self._height = params['height']
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
26 self._set_size()
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
27
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
28 def _set_size(self):
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
29 width, height = self.font.size(self.value)
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
30 width = getattr(self, '_width', width)
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
31 height = getattr(self, '_height', height)
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
32 self.style.width, self.style.height = width, height
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
33
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
34 def paint(self, s):
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
35 s.fill(self.style.background)
168
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
36 if self.style.align > 0:
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
37 r = s.get_rect()
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
38 w, _ = self.font.size(self.value)
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
39 s = s.subsurface(r.move((r.w-w, 0)).clip(r))
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
40 gui.Label.paint(self, s)
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
41
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
42 def update_value(self, value):
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
43 self.value = value
168
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
44 self._set_size()
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
45 self.repaint()
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
46
168
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
47 def mklabel(text="", **params):
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
48 params.setdefault('color', constants.FG_COLOR)
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
49 params.setdefault('width', GameBoard.TOOLBAR_WIDTH/2)
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
50 return OpaqueLabel(text, **params)
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
51
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
52 def mkcountupdate(counter):
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
53 def update_counter(self, value):
168
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
54 getattr(self, counter).update_value("%s " % value)
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
55 self.repaint()
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
56 return update_counter
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
57
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
58 class ToolBar(gui.Table):
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
59 def __init__(self, gameboard, **params):
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
60 gui.Table.__init__(self, **params)
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
61 self.gameboard = gameboard
168
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
62 self.cash_counter = mklabel(align=1)
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
63 self.chicken_counter = mklabel(align=1)
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
64 self.egg_counter = mklabel(align=1)
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
65 self.day_counter = mklabel(align=1)
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
66 self.killed_foxes = mklabel(align=1)
83
9bd2c22e1746 Cleaned up some toolbar code a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 80
diff changeset
67
168
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
68 self.tr()
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
69 self.td(gui.Spacer(self.rect.w/2, 0))
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
70 self.td(gui.Spacer(self.rect.w/2, 0))
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
71 self.add_counter(mklabel("Day:"), self.day_counter)
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
72 self.add_counter(mklabel("Groats:"), self.cash_counter)
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
73 self.add_counter(mklabel("Eggs:"), self.egg_counter)
83
9bd2c22e1746 Cleaned up some toolbar code a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 80
diff changeset
74 self.add_counter(icons.CHKN_ICON, self.chicken_counter)
9bd2c22e1746 Cleaned up some toolbar code a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 80
diff changeset
75 self.add_counter(icons.KILLED_FOX, self.killed_foxes)
154
3afdefacb07f Neaten up toolbar.
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
76 self.add_spacer(20)
3afdefacb07f Neaten up toolbar.
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
77
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
78 self.add_tool_button("Move Hen", constants.TOOL_PLACE_ANIMALS,
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
79 cursors.cursors['select'])
154
3afdefacb07f Neaten up toolbar.
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
80 self.add_tool_button("Cut Trees", constants.TOOL_LOGGING)
3afdefacb07f Neaten up toolbar.
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
81 self.add_spacer(20)
83
9bd2c22e1746 Cleaned up some toolbar code a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 80
diff changeset
82
154
3afdefacb07f Neaten up toolbar.
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
83 self.add_heading("Sell ...")
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
84 self.add_tool_button("Chicken", constants.TOOL_SELL_CHICKEN,
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
85 cursors.cursors['select'])
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
86 self.add_tool_button("Egg", constants.TOOL_SELL_EGG,
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
87 cursors.cursors['select'])
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
88 self.add_tool_button("Building", constants.TOOL_SELL_BUILDING,
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
89 cursors.cursors['select'])
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
90 self.add_tool_button("Equipment", constants.TOOL_SELL_EQUIPMENT)
154
3afdefacb07f Neaten up toolbar.
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
91 self.add_spacer(20)
3afdefacb07f Neaten up toolbar.
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
92
3afdefacb07f Neaten up toolbar.
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
93 self.add_heading("Buy ...")
3afdefacb07f Neaten up toolbar.
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
94 self.add_tool_button("Fence", constants.TOOL_BUY_FENCE)
64
99fbb652ce8d Refactor buildings so that new ones can be added just by adding a class to buildings.py.
Simon Cross <hodgestar@gmail.com>
parents: 60
diff changeset
95 for building_cls in buildings.BUILDINGS:
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
96 self.add_tool_button(building_cls.NAME.title(), building_cls,
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
97 cursors.cursors.get('build', None))
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
98 for equipment_cls in equipment.EQUIPMENT:
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
99 self.add_tool_button(equipment_cls.NAME.title(), equipment_cls,
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
100 cursors.cursors.get(equipment_cls.NAME, None))
168
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
101 self.add_spacer(30)
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: 148
diff changeset
102
83
9bd2c22e1746 Cleaned up some toolbar code a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 80
diff changeset
103 self.add_button("Finished Day", self.day_done)
68
6b8ac424da83 Add button for finishing day. Remove debugging print.
Simon Cross <hodgestar@gmail.com>
parents: 67
diff changeset
104
6b8ac424da83 Add button for finishing day. Remove debugging print.
Simon Cross <hodgestar@gmail.com>
parents: 67
diff changeset
105 def day_done(self):
6b8ac424da83 Add button for finishing day. Remove debugging print.
Simon Cross <hodgestar@gmail.com>
parents: 67
diff changeset
106 import engine
6b8ac424da83 Add button for finishing day. Remove debugging print.
Simon Cross <hodgestar@gmail.com>
parents: 67
diff changeset
107 pygame.event.post(engine.START_NIGHT)
6b8ac424da83 Add button for finishing day. Remove debugging print.
Simon Cross <hodgestar@gmail.com>
parents: 67
diff changeset
108
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
109 update_cash_counter = mkcountupdate('cash_counter')
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
110 update_fox_counter = mkcountupdate('killed_foxes')
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
111 update_chicken_counter = mkcountupdate('chicken_counter')
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
112 update_egg_counter = mkcountupdate('egg_counter')
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
113 update_day_counter = mkcountupdate('day_counter')
79
8241386a1651 Add chicken counter
Neil Muller <drnlmuller@gmail.com>
parents: 77
diff changeset
114
168
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
115 def add_spacer(self, height):
83
9bd2c22e1746 Cleaned up some toolbar code a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 80
diff changeset
116 self.tr()
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: 148
diff changeset
117 self.td(gui.Spacer(0, height), colspan=2)
83
9bd2c22e1746 Cleaned up some toolbar code a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 80
diff changeset
118
154
3afdefacb07f Neaten up toolbar.
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
119 def add_heading(self, text):
3afdefacb07f Neaten up toolbar.
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
120 self.tr()
3afdefacb07f Neaten up toolbar.
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
121 self.td(mklabel(text), colspan=2)
3afdefacb07f Neaten up toolbar.
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
122
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
123 def add_tool_button(self, text, tool, cursor=None):
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
124 self.add_button(text, lambda: self.gameboard.set_selected_tool(tool,
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
125 cursor))
83
9bd2c22e1746 Cleaned up some toolbar code a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 80
diff changeset
126
9bd2c22e1746 Cleaned up some toolbar code a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 80
diff changeset
127 def add_button(self, text, func):
154
3afdefacb07f Neaten up toolbar.
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
128 button = gui.Button(text, width=self.rect.w, style={"padding_left": 0})
83
9bd2c22e1746 Cleaned up some toolbar code a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 80
diff changeset
129 button.connect(gui.CLICK, func)
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
130 self.tr()
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: 148
diff changeset
131 self.td(button, align=-1, colspan=2)
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
132
83
9bd2c22e1746 Cleaned up some toolbar code a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 80
diff changeset
133 def add_counter(self, icon, label):
9bd2c22e1746 Cleaned up some toolbar code a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 80
diff changeset
134 self.tr()
168
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
135 self.td(icon, width=self.rect.w/2)
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
136 self.td(label, width=self.rect.w/2)
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
137
152
702bc0eb2ac3 Fix Toolbar width to TOOLBAR_WIDTH by not allowing it to resize.
Simon Cross <hodgestar@gmail.com>
parents: 151
diff changeset
138 def resize(self, width=None, height=None):
702bc0eb2ac3 Fix Toolbar width to TOOLBAR_WIDTH by not allowing it to resize.
Simon Cross <hodgestar@gmail.com>
parents: 151
diff changeset
139 width, height = gui.Table.resize(self, width, height)
702bc0eb2ac3 Fix Toolbar width to TOOLBAR_WIDTH by not allowing it to resize.
Simon Cross <hodgestar@gmail.com>
parents: 151
diff changeset
140 width = GameBoard.TOOLBAR_WIDTH
702bc0eb2ac3 Fix Toolbar width to TOOLBAR_WIDTH by not allowing it to resize.
Simon Cross <hodgestar@gmail.com>
parents: 151
diff changeset
141 return width, height
702bc0eb2ac3 Fix Toolbar width to TOOLBAR_WIDTH by not allowing it to resize.
Simon Cross <hodgestar@gmail.com>
parents: 151
diff changeset
142
702bc0eb2ac3 Fix Toolbar width to TOOLBAR_WIDTH by not allowing it to resize.
Simon Cross <hodgestar@gmail.com>
parents: 151
diff changeset
143
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
144 class VidWidget(gui.Widget):
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
145 def __init__(self, gameboard, vid, **params):
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
146 gui.Widget.__init__(self, **params)
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
147 self.gameboard = gameboard
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
148 self.vid = vid
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: 148
diff changeset
149 self.vid.bounds = pygame.Rect((0, 0), vid.tile_to_view(vid.size))
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
150
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
151 def paint(self, surface):
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
152 self.vid.paint(surface)
202
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
153 # Blit animation frames on top of the drawing
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
154 x, y = self.vid.view.x, self.vid.view.y
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
155 for anim in self.gameboard.animations:
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
156 anim.fix_pos(self.vid)
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
157 anim.irect.x = anim.rect.x - anim.shape.x
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
158 anim.irect.y = anim.rect.y - anim.shape.y
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
159 surface.blit(anim.image, (anim.irect.x - x, anim.irect.y - y))
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
160 # We don't store anim._irect, since we only update anims if the
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
161 # image changes, which kills irect
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
162
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
163 def update(self, surface):
202
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
164 us = []
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
165 x, y = self.vid.view.x, self.vid.view.y
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
166 for anim in self.gameboard.animations[:]:
234
ee1ac134022d Fix drawing bug with multiframe animations
Neil Muller <drnlmuller@gmail.com>
parents: 232
diff changeset
167 if anim.updated or anim.removed:
ee1ac134022d Fix drawing bug with multiframe animations
Neil Muller <drnlmuller@gmail.com>
parents: 232
diff changeset
168 # We flag that we need to redraw stuff undeneath the animation
202
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
169 us.append(pygame.Rect(anim.irect.x - x, anim.irect.y - y,
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
170 anim.irect.width, anim.irect.height))
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
171 self.vid.alayer[anim.pos.y][anim.pos.x]=1
212
b999abd5993b Fix missed status flag in animations
Neil Muller <drnlmuller@gmail.com>
parents: 208
diff changeset
172 self.vid.updates.append(anim.pos.to_tuple())
234
ee1ac134022d Fix drawing bug with multiframe animations
Neil Muller <drnlmuller@gmail.com>
parents: 232
diff changeset
173 if anim.removed:
ee1ac134022d Fix drawing bug with multiframe animations
Neil Muller <drnlmuller@gmail.com>
parents: 232
diff changeset
174 # Remove the animation from the draw loop
ee1ac134022d Fix drawing bug with multiframe animations
Neil Muller <drnlmuller@gmail.com>
parents: 232
diff changeset
175 self.gameboard.animations.remove(anim)
202
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
176 us.extend(self.vid.update(surface))
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
177 for anim in self.gameboard.animations:
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
178 if anim.updated:
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
179 anim.fix_pos(self.vid)
234
ee1ac134022d Fix drawing bug with multiframe animations
Neil Muller <drnlmuller@gmail.com>
parents: 232
diff changeset
180 # setimage has happened, so redraw
202
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
181 anim.irect.x = anim.rect.x - anim.shape.x
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
182 anim.irect.y = anim.rect.y - anim.shape.y
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
183 surface.blit(anim.image, (anim.irect.x - x, anim.irect.y - y))
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
184 anim.updated = 0
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
185 us.append(pygame.Rect(anim.irect.x - x, anim.irect.y - y,
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
186 anim.irect.width, anim.irect.height))
234
ee1ac134022d Fix drawing bug with multiframe animations
Neil Muller <drnlmuller@gmail.com>
parents: 232
diff changeset
187 # This is enough, because sprite changes happen disjoint
ee1ac134022d Fix drawing bug with multiframe animations
Neil Muller <drnlmuller@gmail.com>
parents: 232
diff changeset
188 # from the animation sequence, so we don't need to worry
ee1ac134022d Fix drawing bug with multiframe animations
Neil Muller <drnlmuller@gmail.com>
parents: 232
diff changeset
189 # other changes forcing us to redraw the animation frame.
202
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
190 return us
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
191
39
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
192 def move_view(self, x, y):
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
193 self.vid.view.move_ip((x, y))
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
194
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
195 def event(self, e):
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
196 if e.type == MOUSEBUTTONDOWN:
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
197 self.gameboard.use_tool(e)
186
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
198 elif e.type == MOUSEMOTION and self.gameboard.sprite_cursor:
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
199 self.gameboard.update_sprite_cursor(e)
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
200
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
201
9
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
202 class GameBoard(object):
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
203 TILE_DIMENSIONS = (20, 20)
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
204 TOOLBAR_WIDTH = 140
9
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
205
66
edc15ce8fa30 Implement fence selling (a bit hackish, but fine for now).
Simon Cross <hodgestar@gmail.com>
parents: 65
diff changeset
206 GRASSLAND = tiles.REVERSE_TILE_MAP['grassland']
edc15ce8fa30 Implement fence selling (a bit hackish, but fine for now).
Simon Cross <hodgestar@gmail.com>
parents: 65
diff changeset
207 FENCE = tiles.REVERSE_TILE_MAP['fence']
79
8241386a1651 Add chicken counter
Neil Muller <drnlmuller@gmail.com>
parents: 77
diff changeset
208 WOODLAND = tiles.REVERSE_TILE_MAP['woodland']
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
209 BROKEN_FENCE = tiles.REVERSE_TILE_MAP['broken fence']
66
edc15ce8fa30 Implement fence selling (a bit hackish, but fine for now).
Simon Cross <hodgestar@gmail.com>
parents: 65
diff changeset
210
241
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
211 FOX_WEIGHTINGS = (
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
212 (animal.Fox, 60),
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
213 (animal.GreedyFox, 30),
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
214 (animal.NinjaFox, 5),
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
215 (animal.DemoFox, 5),
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
216 )
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
217
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: 148
diff changeset
218 def __init__(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: 148
diff changeset
219 self.disp = main_app
24
7584453f4944 Add support for PNG tiles.
Simon Cross <hodgestar@gmail.com>
parents: 17
diff changeset
220 self.tv = tiles.FarmVid()
9
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
221 self.tv.tga_load_tiles(data.filepath('tiles.tga'), self.TILE_DIMENSIONS)
24
7584453f4944 Add support for PNG tiles.
Simon Cross <hodgestar@gmail.com>
parents: 17
diff changeset
222 self.tv.png_folder_load_tiles(data.filepath('tiles'))
9
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
223 self.tv.tga_load_level(data.filepath('level1.tga'))
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: 148
diff changeset
224 self.create_display()
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
225
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
226 self.selected_tool = None
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
227 self.animal_to_place = None
186
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
228 self.sprite_cursor = None
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
229 self.chickens = set()
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
230 self.foxes = set()
64
99fbb652ce8d Refactor buildings so that new ones can be added just by adding a class to buildings.py.
Simon Cross <hodgestar@gmail.com>
parents: 60
diff changeset
231 self.buildings = []
202
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
232 self.animations = []
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
233 self.cash = 0
118
2c76ed47fc44 Remove chicken respawn at day start. Handle eaten chickens in henhouses better
Neil Muller <drnlmuller@gmail.com>
parents: 116
diff changeset
234 self.eggs = 0
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
235 self.days = 0
79
8241386a1651 Add chicken counter
Neil Muller <drnlmuller@gmail.com>
parents: 77
diff changeset
236 self.killed_foxes = 0
52
0d4799866bcf Sell chickens and buy fences.
Jeremy Thurgood <firxen@gmail.com>
parents: 40
diff changeset
237 self.add_cash(constants.STARTING_CASH)
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
238 self.day, self.night = True, False
17
cbbc5da7708a Interaction with the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 14
diff changeset
239
67
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
240 self.fix_buildings()
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
241
118
2c76ed47fc44 Remove chicken respawn at day start. Handle eaten chickens in henhouses better
Neil Muller <drnlmuller@gmail.com>
parents: 116
diff changeset
242 self.add_some_chickens()
2c76ed47fc44 Remove chicken respawn at day start. Handle eaten chickens in henhouses better
Neil Muller <drnlmuller@gmail.com>
parents: 116
diff changeset
243
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: 148
diff changeset
244 def get_top_widget(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: 148
diff changeset
245 return self.top_widget
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: 148
diff changeset
246
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: 148
diff changeset
247 def create_display(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: 148
diff changeset
248 width, height = self.disp.rect.w, self.disp.rect.h
36
5569430fd82e Display cleanup and rationalisation.
Jeremy Thurgood <firxen@gmail.com>
parents: 35
diff changeset
249 tbl = gui.Table()
5569430fd82e Display cleanup and rationalisation.
Jeremy Thurgood <firxen@gmail.com>
parents: 35
diff changeset
250 tbl.tr()
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: 148
diff changeset
251 self.toolbar = ToolBar(self, width=self.TOOLBAR_WIDTH)
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: 148
diff changeset
252 tbl.td(self.toolbar, valign=-1)
152
702bc0eb2ac3 Fix Toolbar width to TOOLBAR_WIDTH by not allowing it to resize.
Simon Cross <hodgestar@gmail.com>
parents: 151
diff changeset
253 self.tvw = VidWidget(self, self.tv, width=width-self.TOOLBAR_WIDTH, height=height)
37
497b53b69280 Always update the vidwidget.
Jeremy Thurgood <firxen@gmail.com>
parents: 36
diff changeset
254 tbl.td(self.tvw)
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: 148
diff changeset
255 self.top_widget = tbl
14
d7f295c06a4b Split gameboard screen.
Jeremy Thurgood <firxen@gmail.com>
parents: 12
diff changeset
256
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: 148
diff changeset
257 def update(self):
37
497b53b69280 Always update the vidwidget.
Jeremy Thurgood <firxen@gmail.com>
parents: 36
diff changeset
258 self.tvw.reupdate()
9
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
259
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
260 def loop(self):
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
261 self.tv.loop()
9
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
262
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
263 def set_selected_tool(self, tool, cursor):
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
264 if not self.day:
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
265 return
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
266 self.selected_tool = tool
213
07b361ebd87f Ensure we clean up highlights, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 212
diff changeset
267 if self.animal_to_place:
07b361ebd87f Ensure we clean up highlights, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 212
diff changeset
268 # Clear any highlights
07b361ebd87f Ensure we clean up highlights, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 212
diff changeset
269 self.animal_to_place.unequip_by_name("spotlight")
200
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
270 self.select_animal_to_place(None)
203
653da96db572 Fixed dangling cursor sprite and did some TODO list maintenance.
Jeremy Thurgood <firxen@gmail.com>
parents: 202
diff changeset
271 sprite_curs = None
653da96db572 Fixed dangling cursor sprite and did some TODO list maintenance.
Jeremy Thurgood <firxen@gmail.com>
parents: 202
diff changeset
272 if buildings.is_building(tool):
232
0bd214cf9018 Overlay cost on building sprite cursors.
Simon Cross <hodgestar@gmail.com>
parents: 228
diff changeset
273 sprite_curs = sprite_cursor.SpriteCursor(tool.IMAGE, self.tv, tool.BUY_PRICE)
225
97a22d0b0471 Add sprite cursor for fence buying.
Simon Cross <hodgestar@gmail.com>
parents: 224
diff changeset
274 if tool == constants.TOOL_BUY_FENCE:
97a22d0b0471 Add sprite cursor for fence buying.
Simon Cross <hodgestar@gmail.com>
parents: 224
diff changeset
275 sprite_curs = sprite_cursor.SpriteCursor("tiles/fence.png", self.tv)
203
653da96db572 Fixed dangling cursor sprite and did some TODO list maintenance.
Jeremy Thurgood <firxen@gmail.com>
parents: 202
diff changeset
276 self.set_cursor(cursor, sprite_curs)
653da96db572 Fixed dangling cursor sprite and did some TODO list maintenance.
Jeremy Thurgood <firxen@gmail.com>
parents: 202
diff changeset
277
653da96db572 Fixed dangling cursor sprite and did some TODO list maintenance.
Jeremy Thurgood <firxen@gmail.com>
parents: 202
diff changeset
278 def set_cursor(self, cursor=None, sprite_curs=None):
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
279 if cursor:
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
280 pygame.mouse.set_cursor(*cursor)
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
281 else:
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
282 pygame.mouse.set_cursor(*cursors.cursors['arrow'])
218
5cb0e0b9cd16 Make sprite cursors stay on top by fudging the sprite list. :/
Simon Cross <hodgestar@gmail.com>
parents: 217
diff changeset
283 self.sprite_cursor = sprite_curs
5cb0e0b9cd16 Make sprite cursors stay on top by fudging the sprite list. :/
Simon Cross <hodgestar@gmail.com>
parents: 217
diff changeset
284 self.tv.sprites.set_cursor(sprite_curs)
213
07b361ebd87f Ensure we clean up highlights, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 212
diff changeset
285
07b361ebd87f Ensure we clean up highlights, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 212
diff changeset
286 def reset_states(self):
07b361ebd87f Ensure we clean up highlights, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 212
diff changeset
287 """Clear current states (highlights, etc.)"""
07b361ebd87f Ensure we clean up highlights, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 212
diff changeset
288 if self.animal_to_place:
217
76faa0eb38f0 bugfix: deselect selected chicken at night
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 216
diff changeset
289 self.select_animal_to_place(None)
213
07b361ebd87f Ensure we clean up highlights, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 212
diff changeset
290 self.set_cursor()
17
cbbc5da7708a Interaction with the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 14
diff changeset
291
186
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
292 def update_sprite_cursor(self, e):
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
293 tile_pos = self.tv.screen_to_tile(e.pos)
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
294 self.sprite_cursor.set_pos(tile_pos)
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
295
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
296 def start_night(self):
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
297 self.day, self.night = False, True
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
298 self.tv.sun(False)
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
299 self.reset_states()
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
300
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
301 def start_day(self):
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
302 self.day, self.night = True, False
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
303 self.tv.sun(True)
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
304 self.reset_states()
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
305
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
306 def in_bounds(self, pos):
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
307 """Check if a position is within the game boundaries"""
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
308 if pos.x < 0 or pos.y < 0:
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
309 return False
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
310 width, height = self.tv.size
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
311 if pos.x >= width or pos.y >= height:
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
312 return False
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
313 return True
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
314
17
cbbc5da7708a Interaction with the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 14
diff changeset
315 def use_tool(self, e):
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
316 if not self.day:
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
317 return
189
37af9e5dd292 Use tool with left button, cancel tool with right button.
Jeremy Thurgood <firxen@gmail.com>
parents: 186
diff changeset
318 if e.button == 3: # Right button
37af9e5dd292 Use tool with left button, cancel tool with right button.
Jeremy Thurgood <firxen@gmail.com>
parents: 186
diff changeset
319 self.selected_tool = None
203
653da96db572 Fixed dangling cursor sprite and did some TODO list maintenance.
Jeremy Thurgood <firxen@gmail.com>
parents: 202
diff changeset
320 self.set_cursor()
189
37af9e5dd292 Use tool with left button, cancel tool with right button.
Jeremy Thurgood <firxen@gmail.com>
parents: 186
diff changeset
321 elif e.button != 1: # Left button
37af9e5dd292 Use tool with left button, cancel tool with right button.
Jeremy Thurgood <firxen@gmail.com>
parents: 186
diff changeset
322 return
52
0d4799866bcf Sell chickens and buy fences.
Jeremy Thurgood <firxen@gmail.com>
parents: 40
diff changeset
323 if self.selected_tool == constants.TOOL_SELL_CHICKEN:
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
324 self.sell_chicken(self.tv.screen_to_tile(e.pos))
57
08665fa60345 Implement henhouses and henhouse adding.
Simon Cross <hodgestar@gmail.com>
parents: 54
diff changeset
325 elif self.selected_tool == constants.TOOL_SELL_EGG:
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
326 self.sell_egg(self.tv.screen_to_tile(e.pos))
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
327 elif self.selected_tool == constants.TOOL_PLACE_ANIMALS:
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
328 self.place_animal(self.tv.screen_to_tile(e.pos))
57
08665fa60345 Implement henhouses and henhouse adding.
Simon Cross <hodgestar@gmail.com>
parents: 54
diff changeset
329 elif self.selected_tool == constants.TOOL_BUY_FENCE:
54
b8f64db0d39e Cleaned up buying and selling a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 52
diff changeset
330 self.buy_fence(self.tv.screen_to_tile(e.pos))
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
331 elif self.selected_tool == constants.TOOL_SELL_BUILDING:
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
332 self.sell_building(self.tv.screen_to_tile(e.pos))
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
333 elif self.selected_tool == constants.TOOL_SELL_EQUIPMENT:
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
334 self.sell_equipment(self.tv.screen_to_tile(e.pos))
131
4527e09dc620 Add lumberjacks.
Simon Cross <hodgestar@gmail.com>
parents: 128
diff changeset
335 elif self.selected_tool == constants.TOOL_LOGGING:
4527e09dc620 Add lumberjacks.
Simon Cross <hodgestar@gmail.com>
parents: 128
diff changeset
336 self.logging_forest(self.tv.screen_to_tile(e.pos))
64
99fbb652ce8d Refactor buildings so that new ones can be added just by adding a class to buildings.py.
Simon Cross <hodgestar@gmail.com>
parents: 60
diff changeset
337 elif buildings.is_building(self.selected_tool):
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
338 self.buy_building(self.tv.screen_to_tile(e.pos), self.selected_tool)
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
339 elif equipment.is_equipment(self.selected_tool):
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
340 self.buy_equipment(self.tv.screen_to_tile(e.pos), self.selected_tool)
17
cbbc5da7708a Interaction with the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 14
diff changeset
341
166
4aa800354b7c Rename get_chicken to get_outside_chicken.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
342 def get_outside_chicken(self, tile_pos):
54
b8f64db0d39e Cleaned up buying and selling a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 52
diff changeset
343 for chick in self.chickens:
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
344 if chick.covers(tile_pos) and chick.outside():
54
b8f64db0d39e Cleaned up buying and selling a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 52
diff changeset
345 return chick
b8f64db0d39e Cleaned up buying and selling a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 52
diff changeset
346 return None
57
08665fa60345 Implement henhouses and henhouse adding.
Simon Cross <hodgestar@gmail.com>
parents: 54
diff changeset
347
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
348 def get_building(self, tile_pos):
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
349 for building in self.buildings:
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
350 if building.covers(tile_pos):
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
351 return building
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
352 return None
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
353
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
354 def sell_chicken(self, tile_pos):
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
355
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
356 def do_sell(chicken):
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
357 if not chicken:
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
358 return False # sanity check
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
359 if len(self.chickens) == 1:
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
360 print "You can't sell your last chicken!"
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
361 return False
228
f74de4280e20 Sell chicken's equipment when you sell the chicken.
Simon Cross <hodgestar@gmail.com>
parents: 227
diff changeset
362 for item in list(chicken.equipment):
f74de4280e20 Sell chicken's equipment when you sell the chicken.
Simon Cross <hodgestar@gmail.com>
parents: 227
diff changeset
363 self.add_cash(item.sell_price())
f74de4280e20 Sell chicken's equipment when you sell the chicken.
Simon Cross <hodgestar@gmail.com>
parents: 227
diff changeset
364 chicken.unequip(item)
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
365 self.add_cash(constants.SELL_PRICE_CHICKEN)
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
366 sound.play_sound("sell-chicken.ogg")
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
367 return True
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
368
166
4aa800354b7c Rename get_chicken to get_outside_chicken.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
369 chick = self.get_outside_chicken(tile_pos)
54
b8f64db0d39e Cleaned up buying and selling a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 52
diff changeset
370 if chick is None:
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
371 building = self.get_building(tile_pos)
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
372 if building and building.NAME in buildings.HENHOUSES:
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
373 self.open_building_dialog(building, do_sell)
54
b8f64db0d39e Cleaned up buying and selling a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 52
diff changeset
374 return
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
375
226
86a6d9e360dd Fix outdoor chicken selling bug.
Simon Cross <hodgestar@gmail.com>
parents: 225
diff changeset
376 if do_sell(chick):
86a6d9e360dd Fix outdoor chicken selling bug.
Simon Cross <hodgestar@gmail.com>
parents: 225
diff changeset
377 self.remove_chicken(chick)
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
378
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
379 def sell_one_egg(self, chicken):
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
380 if chicken.eggs:
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
381 self.add_cash(constants.SELL_PRICE_EGG)
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
382 chicken.remove_one_egg()
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
383 self.eggs -= 1
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
384 self.toolbar.update_egg_counter(self.eggs)
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
385 return True
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
386 return False
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
387
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
388 def sell_egg(self, tile_pos):
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
389 def do_sell(chicken):
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
390 # We try sell and egg
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
391 if self.sell_one_egg(chicken):
193
db246683d5da Selling eggs now works
Neil Muller <drnlmuller@gmail.com>
parents: 192
diff changeset
392 sound.play_sound("sell-chicken.ogg")
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
393 # Force toolbar update
193
db246683d5da Selling eggs now works
Neil Muller <drnlmuller@gmail.com>
parents: 192
diff changeset
394 self.toolbar.chsize()
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
395 return False
193
db246683d5da Selling eggs now works
Neil Muller <drnlmuller@gmail.com>
parents: 192
diff changeset
396
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
397 building = self.get_building(tile_pos)
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
398 if building and building.NAME in buildings.HENHOUSES:
193
db246683d5da Selling eggs now works
Neil Muller <drnlmuller@gmail.com>
parents: 192
diff changeset
399 self.open_building_dialog(building, do_sell)
54
b8f64db0d39e Cleaned up buying and selling a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 52
diff changeset
400
200
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
401 def select_animal_to_place(self, animal):
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
402 if self.animal_to_place:
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
403 self.animal_to_place.unequip_by_name("spotlight")
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
404 self.animal_to_place = animal
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
405 if self.animal_to_place:
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
406 self.animal_to_place.equip(equipment.Spotlight())
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
407
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
408 def place_animal(self, tile_pos):
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
409 """Handle an TOOL_PLACE_ANIMALS click.
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
410
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
411 This will either select an animal or
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
412 place a selected animal in a building.
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
413 """
166
4aa800354b7c Rename get_chicken to get_outside_chicken.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
414 chicken = self.get_outside_chicken(tile_pos)
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
415 if chicken:
108
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 105
diff changeset
416 if chicken is self.animal_to_place:
200
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
417 self.select_animal_to_place(None)
165
c7d496556475 Minor cursor bugfixes
Neil Muller <drnlmuller@gmail.com>
parents: 164
diff changeset
418 pygame.mouse.set_cursor(*cursors.cursors['select'])
108
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 105
diff changeset
419 else:
200
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
420 self.select_animal_to_place(chicken)
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
421 pygame.mouse.set_cursor(*cursors.cursors['chicken'])
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
422 return
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
423 building = self.get_building(tile_pos)
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
424 if building:
197
d74693555b86 Put chickens into first empty space in buildings to make it easier to add lots of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 194
diff changeset
425 if self.animal_to_place:
d74693555b86 Put chickens into first empty space in buildings to make it easier to add lots of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 194
diff changeset
426 try:
d74693555b86 Put chickens into first empty space in buildings to make it easier to add lots of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 194
diff changeset
427 place = building.first_empty_place()
d74693555b86 Put chickens into first empty space in buildings to make it easier to add lots of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 194
diff changeset
428 self.relocate_animal(self.animal_to_place, place=place)
201
fe1e9c18d4d7 layering bugfix; indoor chickens now use normal chicken icons
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 200
diff changeset
429 self.animal_to_place.equip(equipment.Nest())
200
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
430 self.select_animal_to_place(None)
197
d74693555b86 Put chickens into first empty space in buildings to make it easier to add lots of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 194
diff changeset
431 pygame.mouse.set_cursor(*cursors.cursors['select'])
d74693555b86 Put chickens into first empty space in buildings to make it easier to add lots of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 194
diff changeset
432 except buildings.BuildingFullError:
d74693555b86 Put chickens into first empty space in buildings to make it easier to add lots of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 194
diff changeset
433 pass
d74693555b86 Put chickens into first empty space in buildings to make it easier to add lots of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 194
diff changeset
434 else:
d74693555b86 Put chickens into first empty space in buildings to make it easier to add lots of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 194
diff changeset
435 self.open_building_dialog(building)
108
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 105
diff changeset
436 return
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 105
diff changeset
437 if self.tv.get(tile_pos) == self.GRASSLAND:
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 105
diff changeset
438 if self.animal_to_place is not None:
201
fe1e9c18d4d7 layering bugfix; indoor chickens now use normal chicken icons
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 200
diff changeset
439 self.animal_to_place.unequip_by_name("nest")
197
d74693555b86 Put chickens into first empty space in buildings to make it easier to add lots of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 194
diff changeset
440 self.relocate_animal(self.animal_to_place, tile_pos=tile_pos)
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
441 self.eggs -= self.animal_to_place.get_num_eggs()
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
442 self.animal_to_place.remove_eggs()
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
443 self.toolbar.update_egg_counter(self.eggs)
197
d74693555b86 Put chickens into first empty space in buildings to make it easier to add lots of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 194
diff changeset
444
d74693555b86 Put chickens into first empty space in buildings to make it easier to add lots of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 194
diff changeset
445 def relocate_animal(self, chicken, tile_pos=None, place=None):
d74693555b86 Put chickens into first empty space in buildings to make it easier to add lots of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 194
diff changeset
446 assert((tile_pos, place) != (None, None))
d74693555b86 Put chickens into first empty space in buildings to make it easier to add lots of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 194
diff changeset
447 if chicken.abode is not None:
d74693555b86 Put chickens into first empty space in buildings to make it easier to add lots of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 194
diff changeset
448 chicken.abode.clear_occupant()
d74693555b86 Put chickens into first empty space in buildings to make it easier to add lots of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 194
diff changeset
449 if tile_pos:
d74693555b86 Put chickens into first empty space in buildings to make it easier to add lots of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 194
diff changeset
450 chicken.set_pos(tile_pos)
d74693555b86 Put chickens into first empty space in buildings to make it easier to add lots of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 194
diff changeset
451 else:
d74693555b86 Put chickens into first empty space in buildings to make it easier to add lots of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 194
diff changeset
452 place.set_occupant(chicken)
d74693555b86 Put chickens into first empty space in buildings to make it easier to add lots of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 194
diff changeset
453 chicken.set_pos(place.get_pos())
d74693555b86 Put chickens into first empty space in buildings to make it easier to add lots of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 194
diff changeset
454 self.set_visibility(chicken)
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
455
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
456 def set_visibility(self, chicken):
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
457 if chicken.outside():
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
458 if chicken not in self.tv.sprites:
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
459 self.tv.sprites.append(chicken)
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
460 else:
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
461 if chicken in self.tv.sprites:
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
462 self.tv.sprites.remove(chicken)
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
463
170
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
464 def open_dialog(self, widget, close_callback=None):
115
2b2007e231da Start of dialog for placing chickens in buildings. Remove chicken in hen house bug by not allowing chickens in hen houses.
Simon Cross <hodgestar@gmail.com>
parents: 109
diff changeset
465 """Open a dialog for the given widget. Add close button."""
2b2007e231da Start of dialog for placing chickens in buildings. Remove chicken in hen house bug by not allowing chickens in hen houses.
Simon Cross <hodgestar@gmail.com>
parents: 109
diff changeset
466 tbl = gui.Table()
2b2007e231da Start of dialog for placing chickens in buildings. Remove chicken in hen house bug by not allowing chickens in hen houses.
Simon Cross <hodgestar@gmail.com>
parents: 109
diff changeset
467
2b2007e231da Start of dialog for placing chickens in buildings. Remove chicken in hen house bug by not allowing chickens in hen houses.
Simon Cross <hodgestar@gmail.com>
parents: 109
diff changeset
468 def close_dialog():
2b2007e231da Start of dialog for placing chickens in buildings. Remove chicken in hen house bug by not allowing chickens in hen houses.
Simon Cross <hodgestar@gmail.com>
parents: 109
diff changeset
469 self.disp.close(tbl)
170
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
470 if close_callback is not None:
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
471 close_callback()
115
2b2007e231da Start of dialog for placing chickens in buildings. Remove chicken in hen house bug by not allowing chickens in hen houses.
Simon Cross <hodgestar@gmail.com>
parents: 109
diff changeset
472
2b2007e231da Start of dialog for placing chickens in buildings. Remove chicken in hen house bug by not allowing chickens in hen houses.
Simon Cross <hodgestar@gmail.com>
parents: 109
diff changeset
473 close_button = gui.Button("Close")
2b2007e231da Start of dialog for placing chickens in buildings. Remove chicken in hen house bug by not allowing chickens in hen houses.
Simon Cross <hodgestar@gmail.com>
parents: 109
diff changeset
474 close_button.connect(gui.CLICK, close_dialog)
2b2007e231da Start of dialog for placing chickens in buildings. Remove chicken in hen house bug by not allowing chickens in hen houses.
Simon Cross <hodgestar@gmail.com>
parents: 109
diff changeset
475
2b2007e231da Start of dialog for placing chickens in buildings. Remove chicken in hen house bug by not allowing chickens in hen houses.
Simon Cross <hodgestar@gmail.com>
parents: 109
diff changeset
476 tbl = gui.Table()
2b2007e231da Start of dialog for placing chickens in buildings. Remove chicken in hen house bug by not allowing chickens in hen houses.
Simon Cross <hodgestar@gmail.com>
parents: 109
diff changeset
477 tbl.tr()
2b2007e231da Start of dialog for placing chickens in buildings. Remove chicken in hen house bug by not allowing chickens in hen houses.
Simon Cross <hodgestar@gmail.com>
parents: 109
diff changeset
478 tbl.td(widget, colspan=2)
2b2007e231da Start of dialog for placing chickens in buildings. Remove chicken in hen house bug by not allowing chickens in hen houses.
Simon Cross <hodgestar@gmail.com>
parents: 109
diff changeset
479 tbl.tr()
2b2007e231da Start of dialog for placing chickens in buildings. Remove chicken in hen house bug by not allowing chickens in hen houses.
Simon Cross <hodgestar@gmail.com>
parents: 109
diff changeset
480 tbl.td(gui.Spacer(100, 0))
172
f7f29f1d434b Don't allow occupied buildings to be sold (dialog can probably be dropped once buildings show their number of occupants).
Simon Cross <hodgestar@gmail.com>
parents: 170
diff changeset
481 tbl.td(close_button, align=1)
115
2b2007e231da Start of dialog for placing chickens in buildings. Remove chicken in hen house bug by not allowing chickens in hen houses.
Simon Cross <hodgestar@gmail.com>
parents: 109
diff changeset
482
2b2007e231da Start of dialog for placing chickens in buildings. Remove chicken in hen house bug by not allowing chickens in hen houses.
Simon Cross <hodgestar@gmail.com>
parents: 109
diff changeset
483 self.disp.open(tbl)
169
946f09ed37cd Make equipment dialog close after selecting an item to sell.
Simon Cross <hodgestar@gmail.com>
parents: 168
diff changeset
484 return tbl
115
2b2007e231da Start of dialog for placing chickens in buildings. Remove chicken in hen house bug by not allowing chickens in hen houses.
Simon Cross <hodgestar@gmail.com>
parents: 109
diff changeset
485
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
486 def open_building_dialog(self, building, sell_callback=None):
115
2b2007e231da Start of dialog for placing chickens in buildings. Remove chicken in hen house bug by not allowing chickens in hen houses.
Simon Cross <hodgestar@gmail.com>
parents: 109
diff changeset
487 """Create dialog for manipulating the contents of a building."""
208
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
488
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
489 place_button_map = {}
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
490
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
491 def update_button(animal, empty=False):
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
492 """Update a button image (either to the animal, or to empty)."""
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
493 if animal:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
494 button = place_button_map.get(id(animal.abode))
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
495 if button:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
496 if empty:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
497 button.value = icons.EMPTY_NEST_ICON
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
498 else:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
499 button.value = icons.animal_icon(animal)
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
500
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
501 def nest_clicked(place, button):
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
502 """Handle a nest being clicked."""
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
503 # sell_callback should return true if we need to remove the
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
504 # occupant
208
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
505 if place.occupant:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
506 # there is an occupant, select or sell it
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
507 if not sell_callback:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
508 old_animal = self.animal_to_place
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
509 self.select_animal_to_place(place.occupant)
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
510 # deselect old animal (on button)
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
511 update_button(old_animal)
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
512 # select new animal (on button)
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
513 update_button(self.animal_to_place)
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
514 else:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
515 # Attempt to sell the occupant
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
516 if sell_callback(place.occupant):
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
517 # empty the nest (on button)
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
518 update_button(place.occupant, empty=True)
219
0a84d5aedc5c Remove eggs from chickens placed outside. Fix some bugs with setting the correct image on buttons
Neil Muller <drnlmuller@gmail.com>
parents: 218
diff changeset
519 self.remove_chicken(place.occupant)
216
962934b8c7dc Implement UI part of egg selling
Neil Muller <drnlmuller@gmail.com>
parents: 215
diff changeset
520 else:
962934b8c7dc Implement UI part of egg selling
Neil Muller <drnlmuller@gmail.com>
parents: 215
diff changeset
521 # Update for equipment changes, etc.
962934b8c7dc Implement UI part of egg selling
Neil Muller <drnlmuller@gmail.com>
parents: 215
diff changeset
522 update_button(place.occupant)
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
523 else:
208
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
524 # there is no occupant, attempt to fill the space
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
525 if self.animal_to_place is not None:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
526 # empty old nest (on button)
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
527 update_button(self.animal_to_place, empty=True)
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
528 self.relocate_animal(self.animal_to_place, place=place)
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
529 # populate the new nest (on button)
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
530 update_button(self.animal_to_place)
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
531
115
2b2007e231da Start of dialog for placing chickens in buildings. Remove chicken in hen house bug by not allowing chickens in hen houses.
Simon Cross <hodgestar@gmail.com>
parents: 109
diff changeset
532 tbl = gui.Table()
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
533 columns = building.max_floor_width()
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
534 kwargs = { 'style': { 'padding_left': 10, 'padding_bottom': 10 }}
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
535 for floor in building.floors():
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
536 tbl.tr()
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
537 tbl.td(gui.Button(floor.title), colspan=columns, align=-1, **kwargs)
115
2b2007e231da Start of dialog for placing chickens in buildings. Remove chicken in hen house bug by not allowing chickens in hen houses.
Simon Cross <hodgestar@gmail.com>
parents: 109
diff changeset
538 tbl.tr()
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
539 for row in floor.rows():
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
540 tbl.tr()
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
541 for place in row:
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
542 if place.occupant is None:
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
543 button = gui.Button(icons.EMPTY_NEST_ICON)
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
544 else:
201
fe1e9c18d4d7 layering bugfix; indoor chickens now use normal chicken icons
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 200
diff changeset
545 button = gui.Button(icons.animal_icon(place.occupant))
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
546 place_button_map[id(place)] = button
208
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
547 button.connect(gui.CLICK, nest_clicked, place, button)
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
548 tbl.td(button, **kwargs)
115
2b2007e231da Start of dialog for placing chickens in buildings. Remove chicken in hen house bug by not allowing chickens in hen houses.
Simon Cross <hodgestar@gmail.com>
parents: 109
diff changeset
549
170
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
550 building.selected(True)
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
551 def close_callback():
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
552 building.selected(False)
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
553
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
554 self.open_dialog(tbl, close_callback=close_callback)
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
555
54
b8f64db0d39e Cleaned up buying and selling a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 52
diff changeset
556 def buy_fence(self, tile_pos):
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
557 this_tile = self.tv.get(tile_pos)
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
558 if this_tile not in [self.GRASSLAND, self.BROKEN_FENCE]:
54
b8f64db0d39e Cleaned up buying and selling a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 52
diff changeset
559 return
77
65958516c7d9 Implement separate fence repair cost (currently 25 groats).
Simon Cross <hodgestar@gmail.com>
parents: 73
diff changeset
560 if this_tile == self.GRASSLAND:
65958516c7d9 Implement separate fence repair cost (currently 25 groats).
Simon Cross <hodgestar@gmail.com>
parents: 73
diff changeset
561 cost = constants.BUY_PRICE_FENCE
65958516c7d9 Implement separate fence repair cost (currently 25 groats).
Simon Cross <hodgestar@gmail.com>
parents: 73
diff changeset
562 else:
65958516c7d9 Implement separate fence repair cost (currently 25 groats).
Simon Cross <hodgestar@gmail.com>
parents: 73
diff changeset
563 cost = constants.REPAIR_PRICE_FENCE
191
3c80f49d7d74 Don't allow buildings and fences to be built on top of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 189
diff changeset
564 if any((chicken.pos.x, chicken.pos.y) == tile_pos for chicken in self.chickens):
3c80f49d7d74 Don't allow buildings and fences to be built on top of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 189
diff changeset
565 return
3c80f49d7d74 Don't allow buildings and fences to be built on top of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 189
diff changeset
566
77
65958516c7d9 Implement separate fence repair cost (currently 25 groats).
Simon Cross <hodgestar@gmail.com>
parents: 73
diff changeset
567 if self.cash < cost:
54
b8f64db0d39e Cleaned up buying and selling a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 52
diff changeset
568 print "You can't afford a fence."
b8f64db0d39e Cleaned up buying and selling a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 52
diff changeset
569 return
77
65958516c7d9 Implement separate fence repair cost (currently 25 groats).
Simon Cross <hodgestar@gmail.com>
parents: 73
diff changeset
570 self.add_cash(-cost)
66
edc15ce8fa30 Implement fence selling (a bit hackish, but fine for now).
Simon Cross <hodgestar@gmail.com>
parents: 65
diff changeset
571 self.tv.set(tile_pos, self.FENCE)
edc15ce8fa30 Implement fence selling (a bit hackish, but fine for now).
Simon Cross <hodgestar@gmail.com>
parents: 65
diff changeset
572
edc15ce8fa30 Implement fence selling (a bit hackish, but fine for now).
Simon Cross <hodgestar@gmail.com>
parents: 65
diff changeset
573 def sell_fence(self, tile_pos):
227
b9782f622006 Allow selling of broken fences.
Simon Cross <hodgestar@gmail.com>
parents: 226
diff changeset
574 this_tile = self.tv.get(tile_pos)
b9782f622006 Allow selling of broken fences.
Simon Cross <hodgestar@gmail.com>
parents: 226
diff changeset
575 if this_tile not in [self.FENCE, self.BROKEN_FENCE]:
66
edc15ce8fa30 Implement fence selling (a bit hackish, but fine for now).
Simon Cross <hodgestar@gmail.com>
parents: 65
diff changeset
576 return
227
b9782f622006 Allow selling of broken fences.
Simon Cross <hodgestar@gmail.com>
parents: 226
diff changeset
577 if this_tile == self.FENCE:
b9782f622006 Allow selling of broken fences.
Simon Cross <hodgestar@gmail.com>
parents: 226
diff changeset
578 self.add_cash(constants.SELL_PRICE_FENCE)
b9782f622006 Allow selling of broken fences.
Simon Cross <hodgestar@gmail.com>
parents: 226
diff changeset
579 elif this_tile == self.BROKEN_FENCE:
b9782f622006 Allow selling of broken fences.
Simon Cross <hodgestar@gmail.com>
parents: 226
diff changeset
580 self.add_cash(constants.SELL_PRICE_BROKEN_FENCE)
66
edc15ce8fa30 Implement fence selling (a bit hackish, but fine for now).
Simon Cross <hodgestar@gmail.com>
parents: 65
diff changeset
581 self.tv.set(tile_pos, self.GRASSLAND)
54
b8f64db0d39e Cleaned up buying and selling a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 52
diff changeset
582
131
4527e09dc620 Add lumberjacks.
Simon Cross <hodgestar@gmail.com>
parents: 128
diff changeset
583 def logging_forest(self, tile_pos):
4527e09dc620 Add lumberjacks.
Simon Cross <hodgestar@gmail.com>
parents: 128
diff changeset
584 if self.tv.get(tile_pos) != self.WOODLAND:
4527e09dc620 Add lumberjacks.
Simon Cross <hodgestar@gmail.com>
parents: 128
diff changeset
585 return
135
149822fbebeb Check that there is enough cash before logging.
Simon Cross <hodgestar@gmail.com>
parents: 131
diff changeset
586 if self.cash < constants.LOGGING_PRICE:
149822fbebeb Check that there is enough cash before logging.
Simon Cross <hodgestar@gmail.com>
parents: 131
diff changeset
587 return
131
4527e09dc620 Add lumberjacks.
Simon Cross <hodgestar@gmail.com>
parents: 128
diff changeset
588 self.add_cash(-constants.LOGGING_PRICE)
4527e09dc620 Add lumberjacks.
Simon Cross <hodgestar@gmail.com>
parents: 128
diff changeset
589 self.tv.set(tile_pos, self.GRASSLAND)
4527e09dc620 Add lumberjacks.
Simon Cross <hodgestar@gmail.com>
parents: 128
diff changeset
590
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
591 def buy_building(self, tile_pos, building_cls):
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
592 building = building_cls(tile_pos)
64
99fbb652ce8d Refactor buildings so that new ones can be added just by adding a class to buildings.py.
Simon Cross <hodgestar@gmail.com>
parents: 60
diff changeset
593 if self.cash < building.buy_price():
57
08665fa60345 Implement henhouses and henhouse adding.
Simon Cross <hodgestar@gmail.com>
parents: 54
diff changeset
594 return
191
3c80f49d7d74 Don't allow buildings and fences to be built on top of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 189
diff changeset
595 if any(building.covers((chicken.pos.x, chicken.pos.y)) for chicken in self.chickens):
3c80f49d7d74 Don't allow buildings and fences to be built on top of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 189
diff changeset
596 return
64
99fbb652ce8d Refactor buildings so that new ones can be added just by adding a class to buildings.py.
Simon Cross <hodgestar@gmail.com>
parents: 60
diff changeset
597 if building.place(self.tv):
99fbb652ce8d Refactor buildings so that new ones can be added just by adding a class to buildings.py.
Simon Cross <hodgestar@gmail.com>
parents: 60
diff changeset
598 self.add_cash(-building.buy_price())
99fbb652ce8d Refactor buildings so that new ones can be added just by adding a class to buildings.py.
Simon Cross <hodgestar@gmail.com>
parents: 60
diff changeset
599 self.add_building(building)
60
e2631c8e2cd6 Implement guard towers (with temporary sprite PNG).
Simon Cross <hodgestar@gmail.com>
parents: 57
diff changeset
600
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
601 def buy_equipment(self, tile_pos, equipment_cls):
166
4aa800354b7c Rename get_chicken to get_outside_chicken.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
602 chicken = self.get_outside_chicken(tile_pos)
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
603 equipment = equipment_cls()
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
604 if chicken is None or self.cash < equipment.buy_price():
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
605 return
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
606 if equipment.place(chicken):
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
607 self.add_cash(-equipment.buy_price())
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
608 chicken.equip(equipment)
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
609
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
610 def sell_building(self, tile_pos):
227
b9782f622006 Allow selling of broken fences.
Simon Cross <hodgestar@gmail.com>
parents: 226
diff changeset
611 if self.tv.get(tile_pos) in [self.FENCE, self.BROKEN_FENCE]:
66
edc15ce8fa30 Implement fence selling (a bit hackish, but fine for now).
Simon Cross <hodgestar@gmail.com>
parents: 65
diff changeset
612 return self.sell_fence(tile_pos)
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
613 building = self.get_building(tile_pos)
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
614 if building is None:
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
615 return
172
f7f29f1d434b Don't allow occupied buildings to be sold (dialog can probably be dropped once buildings show their number of occupants).
Simon Cross <hodgestar@gmail.com>
parents: 170
diff changeset
616 if list(building.occupants()):
f7f29f1d434b Don't allow occupied buildings to be sold (dialog can probably be dropped once buildings show their number of occupants).
Simon Cross <hodgestar@gmail.com>
parents: 170
diff changeset
617 warning = gui.Button("Occupied buildings may not be sold.")
f7f29f1d434b Don't allow occupied buildings to be sold (dialog can probably be dropped once buildings show their number of occupants).
Simon Cross <hodgestar@gmail.com>
parents: 170
diff changeset
618 self.open_dialog(warning)
f7f29f1d434b Don't allow occupied buildings to be sold (dialog can probably be dropped once buildings show their number of occupants).
Simon Cross <hodgestar@gmail.com>
parents: 170
diff changeset
619 return
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
620 self.add_cash(building.sell_price())
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
621 building.remove(self.tv)
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
622 self.remove_building(building)
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
623
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
624 def sell_equipment(self, tile_pos):
166
4aa800354b7c Rename get_chicken to get_outside_chicken.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
625 chicken = self.get_outside_chicken(tile_pos)
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
626 if chicken is None or not chicken.equipment:
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
627 return
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
628 if len(chicken.equipment) == 1:
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
629 item = chicken.equipment[0]
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
630 self.add_cash(item.sell_price())
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
631 chicken.unequip(item)
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
632 else:
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
633 self.open_equipment_dialog(chicken)
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
634
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
635 def open_equipment_dialog(self, chicken):
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
636 tbl = gui.Table()
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
637
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
638 def sell_item(item, button):
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
639 """Select item of equipment."""
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
640 self.add_cash(item.sell_price())
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
641 chicken.unequip(item)
169
946f09ed37cd Make equipment dialog close after selecting an item to sell.
Simon Cross <hodgestar@gmail.com>
parents: 168
diff changeset
642 self.disp.close(dialog)
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
643
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
644 kwargs = { 'style': { 'padding_left': 10, 'padding_bottom': 10 }}
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
645
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
646 tbl.tr()
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
647 tbl.td(gui.Button("Sell ... "), align=-1, **kwargs)
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
648
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
649 for item in chicken.equipment:
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
650 tbl.tr()
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
651 button = gui.Button(item.name().title())
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
652 button.connect(gui.CLICK, sell_item, item, button)
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
653 tbl.td(button, align=1, **kwargs)
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
654
169
946f09ed37cd Make equipment dialog close after selecting an item to sell.
Simon Cross <hodgestar@gmail.com>
parents: 168
diff changeset
655 dialog = self.open_dialog(tbl)
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
656
14
d7f295c06a4b Split gameboard screen.
Jeremy Thurgood <firxen@gmail.com>
parents: 12
diff changeset
657 def event(self, e):
39
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
658 if e.type == KEYDOWN:
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
659 if e.key == K_UP:
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
660 self.tvw.move_view(0, -self.TILE_DIMENSIONS[1])
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
661 if e.key == K_DOWN:
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
662 self.tvw.move_view(0, self.TILE_DIMENSIONS[1])
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
663 if e.key == K_LEFT:
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
664 self.tvw.move_view(-self.TILE_DIMENSIONS[0], 0)
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
665 if e.key == K_RIGHT:
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
666 self.tvw.move_view(self.TILE_DIMENSIONS[0], 0)
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
667 else:
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
668 self.disp.event(e)
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
669
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
670 def advance_day(self):
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
671 self.days += 1
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
672 self.toolbar.update_day_counter(self.days)
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
673
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
674 def clear_foxes(self):
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
675 for fox in self.foxes.copy():
80
ad9d1bc7ef0c Kill foxes that don't reach safety
Neil Muller <drnlmuller@gmail.com>
parents: 79
diff changeset
676 # Any foxes that didn't make it to the woods are automatically
ad9d1bc7ef0c Kill foxes that don't reach safety
Neil Muller <drnlmuller@gmail.com>
parents: 79
diff changeset
677 # killed
ad9d1bc7ef0c Kill foxes that don't reach safety
Neil Muller <drnlmuller@gmail.com>
parents: 79
diff changeset
678 if self.in_bounds(fox.pos) and self.tv.get(fox.pos.to_tuple()) \
ad9d1bc7ef0c Kill foxes that don't reach safety
Neil Muller <drnlmuller@gmail.com>
parents: 79
diff changeset
679 != self.WOODLAND:
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
680 self.kill_fox(fox)
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
681 else:
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
682 self.tv.sprites.remove(fox)
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
683 self.foxes = set() # Remove all the foxes
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
684
202
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
685 def run_animations(self):
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
686 for anim in self.animations:
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
687 anim.animate()
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
688
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
689 def move_foxes(self):
122
d2b19131d537 Don't continue the night if we're not doing anything anymore
Neil Muller <drnlmuller@gmail.com>
parents: 119
diff changeset
690 """Move the foxes.
d2b19131d537 Don't continue the night if we're not doing anything anymore
Neil Muller <drnlmuller@gmail.com>
parents: 119
diff changeset
691
d2b19131d537 Don't continue the night if we're not doing anything anymore
Neil Muller <drnlmuller@gmail.com>
parents: 119
diff changeset
692 We return True if there are no more foxes to move or all the
d2b19131d537 Don't continue the night if we're not doing anything anymore
Neil Muller <drnlmuller@gmail.com>
parents: 119
diff changeset
693 foxes are safely back. This end's the night"""
d2b19131d537 Don't continue the night if we're not doing anything anymore
Neil Muller <drnlmuller@gmail.com>
parents: 119
diff changeset
694 if not self.foxes:
d2b19131d537 Don't continue the night if we're not doing anything anymore
Neil Muller <drnlmuller@gmail.com>
parents: 119
diff changeset
695 return True
d2b19131d537 Don't continue the night if we're not doing anything anymore
Neil Muller <drnlmuller@gmail.com>
parents: 119
diff changeset
696 over = True
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
697 for fox in self.foxes:
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
698 fox.move(self)
122
d2b19131d537 Don't continue the night if we're not doing anything anymore
Neil Muller <drnlmuller@gmail.com>
parents: 119
diff changeset
699 if not fox.safe:
d2b19131d537 Don't continue the night if we're not doing anything anymore
Neil Muller <drnlmuller@gmail.com>
parents: 119
diff changeset
700 over = False
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
701 for chicken in self.chickens:
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
702 chicken.attack(self)
122
d2b19131d537 Don't continue the night if we're not doing anything anymore
Neil Muller <drnlmuller@gmail.com>
parents: 119
diff changeset
703 return over
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
704
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
705 def add_chicken(self, chicken):
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
706 self.chickens.add(chicken)
115
2b2007e231da Start of dialog for placing chickens in buildings. Remove chicken in hen house bug by not allowing chickens in hen houses.
Simon Cross <hodgestar@gmail.com>
parents: 109
diff changeset
707 if chicken.outside():
2b2007e231da Start of dialog for placing chickens in buildings. Remove chicken in hen house bug by not allowing chickens in hen houses.
Simon Cross <hodgestar@gmail.com>
parents: 109
diff changeset
708 self.tv.sprites.append(chicken)
79
8241386a1651 Add chicken counter
Neil Muller <drnlmuller@gmail.com>
parents: 77
diff changeset
709 self.toolbar.update_chicken_counter(len(self.chickens))
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
710
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
711 def add_fox(self, fox):
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
712 self.foxes.add(fox)
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
713 self.tv.sprites.append(fox)
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
714
64
99fbb652ce8d Refactor buildings so that new ones can be added just by adding a class to buildings.py.
Simon Cross <hodgestar@gmail.com>
parents: 60
diff changeset
715 def add_building(self, building):
99fbb652ce8d Refactor buildings so that new ones can be added just by adding a class to buildings.py.
Simon Cross <hodgestar@gmail.com>
parents: 60
diff changeset
716 self.buildings.append(building)
99fbb652ce8d Refactor buildings so that new ones can be added just by adding a class to buildings.py.
Simon Cross <hodgestar@gmail.com>
parents: 60
diff changeset
717 self.tv.sprites.append(building)
60
e2631c8e2cd6 Implement guard towers (with temporary sprite PNG).
Simon Cross <hodgestar@gmail.com>
parents: 57
diff changeset
718
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
719 def lay_eggs(self):
118
2c76ed47fc44 Remove chicken respawn at day start. Handle eaten chickens in henhouses better
Neil Muller <drnlmuller@gmail.com>
parents: 116
diff changeset
720 self.eggs = 0
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
721 for building in self.buildings:
144
a9b800b4175e Add define for henhouses & egg laying.
Neil Muller <drnlmuller@gmail.com>
parents: 139
diff changeset
722 if building.NAME in buildings.HENHOUSES:
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
723 for chicken in building.occupants():
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
724 chicken.lay()
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
725 self.eggs += chicken.get_num_eggs()
118
2c76ed47fc44 Remove chicken respawn at day start. Handle eaten chickens in henhouses better
Neil Muller <drnlmuller@gmail.com>
parents: 116
diff changeset
726 self.toolbar.update_egg_counter(self.eggs)
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
727
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
728 def hatch_eggs(self):
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
729 for building in self.buildings:
144
a9b800b4175e Add define for henhouses & egg laying.
Neil Muller <drnlmuller@gmail.com>
parents: 139
diff changeset
730 if building.NAME in buildings.HENHOUSES:
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
731 for chicken in building.occupants():
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
732 new_chick = chicken.hatch(self)
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
733 if new_chick:
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
734 try:
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
735 building.add_occupant(new_chick)
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
736 self.add_chicken(new_chick)
219
0a84d5aedc5c Remove eggs from chickens placed outside. Fix some bugs with setting the correct image on buttons
Neil Muller <drnlmuller@gmail.com>
parents: 218
diff changeset
737 new_chick.equip(equipment.Nest())
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
738 except buildings.BuildingFullError:
224
c279ad59b8e2 Chicks fill hen house, then adjacent spaces, then die.
Simon Cross <hodgestar@gmail.com>
parents: 223
diff changeset
739 # No space in the hen house, look nearby
c279ad59b8e2 Chicks fill hen house, then adjacent spaces, then die.
Simon Cross <hodgestar@gmail.com>
parents: 223
diff changeset
740 for tile_pos in building.adjacent_tiles():
c279ad59b8e2 Chicks fill hen house, then adjacent spaces, then die.
Simon Cross <hodgestar@gmail.com>
parents: 223
diff changeset
741 if self.tv.get(tile_pos) != self.GRASSLAND:
c279ad59b8e2 Chicks fill hen house, then adjacent spaces, then die.
Simon Cross <hodgestar@gmail.com>
parents: 223
diff changeset
742 continue
c279ad59b8e2 Chicks fill hen house, then adjacent spaces, then die.
Simon Cross <hodgestar@gmail.com>
parents: 223
diff changeset
743 if self.get_outside_chicken(tile_pos) is None:
c279ad59b8e2 Chicks fill hen house, then adjacent spaces, then die.
Simon Cross <hodgestar@gmail.com>
parents: 223
diff changeset
744 self.add_chicken(new_chick)
c279ad59b8e2 Chicks fill hen house, then adjacent spaces, then die.
Simon Cross <hodgestar@gmail.com>
parents: 223
diff changeset
745 self.relocate_animal(new_chick, tile_pos=tile_pos)
c279ad59b8e2 Chicks fill hen house, then adjacent spaces, then die.
Simon Cross <hodgestar@gmail.com>
parents: 223
diff changeset
746 break
221
d46ae64240a1 Accept that new chicks die if you don't treat them properly.
Simon Cross <hodgestar@gmail.com>
parents: 219
diff changeset
747 # if there isn't a space for the
d46ae64240a1 Accept that new chicks die if you don't treat them properly.
Simon Cross <hodgestar@gmail.com>
parents: 219
diff changeset
748 # new chick it dies. :/ Farm life
d46ae64240a1 Accept that new chicks die if you don't treat them properly.
Simon Cross <hodgestar@gmail.com>
parents: 219
diff changeset
749 # is cruel.
118
2c76ed47fc44 Remove chicken respawn at day start. Handle eaten chickens in henhouses better
Neil Muller <drnlmuller@gmail.com>
parents: 116
diff changeset
750 self.toolbar.update_egg_counter(self.eggs)
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
751
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
752 def kill_fox(self, fox):
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
753 if fox in self.foxes:
174
ff168162974e armour gets damaged
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 172
diff changeset
754 if not fox.survive_damage():
158
baf857805867 armour works now
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 154
diff changeset
755 self.killed_foxes += 1
baf857805867 armour works now
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 154
diff changeset
756 self.toolbar.update_fox_counter(self.killed_foxes)
baf857805867 armour works now
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 154
diff changeset
757 self.add_cash(constants.SELL_PRICE_DEAD_FOX)
baf857805867 armour works now
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 154
diff changeset
758 self.remove_fox(fox)
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
759
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
760 def remove_fox(self, fox):
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
761 self.foxes.discard(fox)
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
762 if fox in self.tv.sprites:
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
763 self.tv.sprites.remove(fox)
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
764
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
765 def remove_chicken(self, chick):
215
85a5299caf4a bugfix: deselect eaten chickens
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 213
diff changeset
766 if chick is self.animal_to_place:
85a5299caf4a bugfix: deselect eaten chickens
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 213
diff changeset
767 self.select_animal_to_place(None)
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
768 self.chickens.discard(chick)
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
769 self.eggs -= chick.get_num_eggs()
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
770 self.toolbar.update_egg_counter(self.eggs)
118
2c76ed47fc44 Remove chicken respawn at day start. Handle eaten chickens in henhouses better
Neil Muller <drnlmuller@gmail.com>
parents: 116
diff changeset
771 if chick.abode:
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
772 chick.abode.clear_occupant()
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
773 self.toolbar.update_chicken_counter(len(self.chickens))
144
a9b800b4175e Add define for henhouses & egg laying.
Neil Muller <drnlmuller@gmail.com>
parents: 139
diff changeset
774 if chick in self.tv.sprites and chick.outside():
a9b800b4175e Add define for henhouses & egg laying.
Neil Muller <drnlmuller@gmail.com>
parents: 139
diff changeset
775 self.tv.sprites.remove(chick)
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
776
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
777 def remove_building(self, building):
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
778 if building in self.buildings:
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
779 self.buildings.remove(building)
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
780 self.tv.sprites.remove(building)
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
781
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
782 def add_cash(self, amount):
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
783 self.cash += amount
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
784 self.toolbar.update_cash_counter(self.cash)
67
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
785
118
2c76ed47fc44 Remove chicken respawn at day start. Handle eaten chickens in henhouses better
Neil Muller <drnlmuller@gmail.com>
parents: 116
diff changeset
786 def add_some_chickens(self):
2c76ed47fc44 Remove chicken respawn at day start. Handle eaten chickens in henhouses better
Neil Muller <drnlmuller@gmail.com>
parents: 116
diff changeset
787 """Add some random chickens to start the game"""
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
788 x, y = 0, 0
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
789 width, height = self.tv.size
238
1a7097c0fc8f Try harder to have 10 chickens at the start
Neil Muller <drnlmuller@gmail.com>
parents: 234
diff changeset
790 tries = 0
118
2c76ed47fc44 Remove chicken respawn at day start. Handle eaten chickens in henhouses better
Neil Muller <drnlmuller@gmail.com>
parents: 116
diff changeset
791 while len(self.chickens) < 10:
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
792 if x < width:
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
793 tile = self.tv.get((x, y))
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
794 else:
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
795 y += 1
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
796 if y >= height:
238
1a7097c0fc8f Try harder to have 10 chickens at the start
Neil Muller <drnlmuller@gmail.com>
parents: 234
diff changeset
797 y = 0
1a7097c0fc8f Try harder to have 10 chickens at the start
Neil Muller <drnlmuller@gmail.com>
parents: 234
diff changeset
798 tries += 1
1a7097c0fc8f Try harder to have 10 chickens at the start
Neil Muller <drnlmuller@gmail.com>
parents: 234
diff changeset
799 if tries > 3:
1a7097c0fc8f Try harder to have 10 chickens at the start
Neil Muller <drnlmuller@gmail.com>
parents: 234
diff changeset
800 break # Things have gone wierd
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
801 x = 0
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
802 continue
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
803 # See if we place a chicken
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
804 if 'grassland' == tiles.TILE_MAP[tile]:
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
805 # Farmland
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
806 roll = random.randint(1, 20)
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
807 # We don't place within a tile of the fence, this is to make things
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
808 # easier
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
809 for xx in range(x-1, x+2):
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
810 if xx >= width or xx < 0:
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
811 continue
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
812 for yy in range(y-1, y+2):
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
813 if yy >= height or yy < 0:
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
814 continue
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
815 neighbour = self.tv.get((xx, yy))
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
816 if 'fence' == tiles.TILE_MAP[neighbour]:
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
817 # Fence
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
818 roll = 10
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
819 if roll == 1:
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
820 # Create a chicken
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
821 chick = animal.Chicken((x, y))
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
822 self.add_chicken(chick)
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
823 x += 1
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
824
241
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
825 def _choose_fox(self, (x, y)):
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
826 fox_cls = misc.WeightedSelection(self.FOX_WEIGHTINGS).choose()
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
827 return fox_cls((x, y))
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
828
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
829 def spawn_foxes(self):
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
830 """The foxes come at night, and this is where they come from."""
73
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
831 # Foxes spawn just outside the map
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
832 x, y = 0, 0
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
833 width, height = self.tv.size
239
8224d1ac99c7 Foxes tend to increase with time
Neil Muller <drnlmuller@gmail.com>
parents: 238
diff changeset
834 min_foxes = (self.days+3)/2 # always more than one fox
8224d1ac99c7 Foxes tend to increase with time
Neil Muller <drnlmuller@gmail.com>
parents: 238
diff changeset
835 new_foxes = random.randint(min_foxes, min_foxes*2)
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
836 while len(self.foxes) < new_foxes:
73
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
837 side = random.randint(0, 3)
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
838 if side == 0:
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
839 # top
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
840 y = -1
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
841 x = random.randint(-1, width)
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
842 elif side == 1:
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
843 # bottom
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
844 y = height
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
845 x = random.randint(-1, width)
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
846 elif side == 2:
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
847 # left
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
848 x = -1
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
849 y = random.randint(-1, height)
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
850 else:
73
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
851 x = width
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
852 y = random.randint(-1, height)
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
853 skip = False
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
854 for other_fox in self.foxes:
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
855 if other_fox.pos.x == x and other_fox.pos.y == y:
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
856 skip = True # Choose a new position
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
857 break
73
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
858 if not skip:
241
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
859 self.add_fox(self._choose_fox((x, y)))
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
860
67
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
861 def fix_buildings(self):
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
862 """Go through the level map looking for buildings that haven't
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
863 been added to self.buildings and adding them.
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
864
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
865 Where partial buildings exist (i.e. places where the building
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
866 cannot fit on the available tiles) the building is added anyway
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
867 to the top left corner.
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
868
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
869 Could be a lot faster.
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
870 """
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
871 tile_to_building = dict((b.TILE_NO, b) for b in buildings.BUILDINGS)
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
872
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
873 w, h = self.tv.size
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
874 for x in xrange(w):
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
875 for y in xrange(h):
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
876 tile_pos = (x, y)
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
877 tile_no = self.tv.get(tile_pos)
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
878 if tile_no not in tile_to_building:
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
879 continue
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
880
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
881 covered = False
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
882 for building in self.buildings:
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
883 if building.covers(tile_pos):
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
884 covered = True
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
885 break
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
886
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
887 if covered:
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
888 continue
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
889
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
890 building_cls = tile_to_building[tile_no]
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
891 building = building_cls(tile_pos)
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
892 building.remove(self.tv)
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
893 building.place(self.tv)
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
894 self.add_building(building)
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
895
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
896 def is_game_over(self):
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
897 """Return true if we're complete"""
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
898 if self.days > constants.TURN_LIMIT:
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
899 return True
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
900 if len(self.chickens) == 0:
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
901 return True