annotate gamelib/gameboard.py @ 400:d146b7bb9b99

Fix lurking future bug
author Neil Muller <drnlmuller@gmail.com>
date Tue, 17 Nov 2009 22:22:47 +0000
parents 3294929223bd
children 7405f7db469f
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
262
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
4 from pygame.locals import MOUSEBUTTONDOWN, MOUSEMOTION, KEYDOWN, K_UP, K_DOWN, \
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
5 K_LEFT, K_RIGHT
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
6 from pgu import gui
9
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
7
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
8 import data
24
7584453f4944 Add support for PNG tiles.
Simon Cross <hodgestar@gmail.com>
parents: 17
diff changeset
9 import tiles
79
8241386a1651 Add chicken counter
Neil Muller <drnlmuller@gmail.com>
parents: 77
diff changeset
10 import icons
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
11 import constants
57
08665fa60345 Implement henhouses and henhouse adding.
Simon Cross <hodgestar@gmail.com>
parents: 54
diff changeset
12 import buildings
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
13 import animal
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
14 import equipment
94
fa8d8fc1bf5b Added some sounds
David Fraser <davidf@sjsoft.com>
parents: 92
diff changeset
15 import sound
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
16 import cursors
186
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
17 import sprite_cursor
241
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
18 import misc
320
9bf0e701a36e Switch between 'Finished Day' and 'Fast Forward' modes
Neil Muller <drnlmuller@gmail.com>
parents: 316
diff changeset
19 import engine
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
20
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
21 class OpaqueLabel(gui.Label):
168
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
22 def __init__(self, value, **params):
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
23 gui.Label.__init__(self, value, **params)
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
24 if 'width' in params:
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
25 self._width = params['width']
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
26 if 'height' in params:
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
27 self._height = params['height']
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
28 self._set_size()
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
29
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
30 def _set_size(self):
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
31 width, height = self.font.size(self.value)
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
32 width = getattr(self, '_width', width)
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
33 height = getattr(self, '_height', height)
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
34 self.style.width, self.style.height = width, height
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
35
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
36 def paint(self, s):
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
37 s.fill(self.style.background)
168
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
38 if self.style.align > 0:
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
39 r = s.get_rect()
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
40 w, _ = self.font.size(self.value)
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
41 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
42 gui.Label.paint(self, s)
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
43
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
44 def update_value(self, value):
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
45 self.value = value
168
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
46 self._set_size()
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
47 self.repaint()
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
48
168
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
49 def mklabel(text="", **params):
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
50 params.setdefault('color', constants.FG_COLOR)
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
51 params.setdefault('width', GameBoard.TOOLBAR_WIDTH/2)
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
52 return OpaqueLabel(text, **params)
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
53
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
54 def mkcountupdate(counter):
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
55 def update_counter(self, value):
168
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
56 getattr(self, counter).update_value("%s " % value)
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
57 self.repaint()
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
58 return update_counter
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
59
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
60 class ToolBar(gui.Table):
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
61 def __init__(self, gameboard, level, **params):
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
62 gui.Table.__init__(self, **params)
245
634491bf37e8 Change toolbar to gui.Toolbar -- gives nicer highlighting.
Simon Cross <hodgestar@gmail.com>
parents: 243
diff changeset
63 self.group = gui.Group(name='toolbar', value=None)
634491bf37e8 Change toolbar to gui.Toolbar -- gives nicer highlighting.
Simon Cross <hodgestar@gmail.com>
parents: 243
diff changeset
64 self._next_tool_value = 0
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
65 self.gameboard = gameboard
168
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
66 self.cash_counter = mklabel(align=1)
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
67 self.chicken_counter = mklabel(align=1)
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
68 self.egg_counter = mklabel(align=1)
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
69 self.day_counter = mklabel(align=1)
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
70 self.killed_foxes = mklabel(align=1)
83
9bd2c22e1746 Cleaned up some toolbar code a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 80
diff changeset
71
168
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
72 self.tr()
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
73 self.td(gui.Spacer(self.rect.w/2, 0))
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
74 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
75 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
76 self.add_counter(mklabel("Groats:"), self.cash_counter)
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
77 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
78 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
79 self.add_counter(icons.KILLED_FOX, self.killed_foxes)
378
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
80 self.add_spacer(5)
154
3afdefacb07f Neaten up toolbar.
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
81
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
82 self.add_tool_button("Move Hen", constants.TOOL_PLACE_ANIMALS,
270
31f5033eac70 Add prices to all tools where is makes sense to do so.
Simon Cross <hodgestar@gmail.com>
parents: 264
diff changeset
83 None, cursors.cursors['select'])
31f5033eac70 Add prices to all tools where is makes sense to do so.
Simon Cross <hodgestar@gmail.com>
parents: 264
diff changeset
84 self.add_tool_button("Cut Trees", constants.TOOL_LOGGING,
272
cade64404997 Use (wrecking) ball for smashing down trees.
Simon Cross <hodgestar@gmail.com>
parents: 270
diff changeset
85 constants.LOGGING_PRICE, cursors.cursors['ball'])
378
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
86 self.add_spacer(5)
83
9bd2c22e1746 Cleaned up some toolbar code a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 80
diff changeset
87
154
3afdefacb07f Neaten up toolbar.
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
88 self.add_heading("Sell ...")
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
89 self.add_tool_button("Chicken", constants.TOOL_SELL_CHICKEN,
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
90 level.sell_price_chicken, cursors.cursors['sell'])
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
91 self.add_tool_button("Egg", constants.TOOL_SELL_EGG,
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
92 level.sell_price_egg, cursors.cursors['sell'])
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
93 self.add_tool_button("Building", constants.TOOL_SELL_BUILDING,
270
31f5033eac70 Add prices to all tools where is makes sense to do so.
Simon Cross <hodgestar@gmail.com>
parents: 264
diff changeset
94 None, cursors.cursors['sell'])
252
e12b39132ffb Make sell equipment use the select cursor for consistency with the other sell tools.
Simon Cross <hodgestar@gmail.com>
parents: 251
diff changeset
95 self.add_tool_button("Equipment", constants.TOOL_SELL_EQUIPMENT,
270
31f5033eac70 Add prices to all tools where is makes sense to do so.
Simon Cross <hodgestar@gmail.com>
parents: 264
diff changeset
96 None, cursors.cursors['sell'])
378
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
97 self.add_spacer(5)
154
3afdefacb07f Neaten up toolbar.
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
98
3afdefacb07f Neaten up toolbar.
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
99 self.add_heading("Buy ...")
270
31f5033eac70 Add prices to all tools where is makes sense to do so.
Simon Cross <hodgestar@gmail.com>
parents: 264
diff changeset
100
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
101 for building_cls in buildings.BUILDINGS:
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
102 self.add_tool_button(building_cls.NAME.title(), building_cls,
270
31f5033eac70 Add prices to all tools where is makes sense to do so.
Simon Cross <hodgestar@gmail.com>
parents: 264
diff changeset
103 None, cursors.cursors.get('build', None))
31f5033eac70 Add prices to all tools where is makes sense to do so.
Simon Cross <hodgestar@gmail.com>
parents: 264
diff changeset
104
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
105 for equipment_cls in equipment.EQUIPMENT:
270
31f5033eac70 Add prices to all tools where is makes sense to do so.
Simon Cross <hodgestar@gmail.com>
parents: 264
diff changeset
106 self.add_tool_button(equipment_cls.NAME.title(),
31f5033eac70 Add prices to all tools where is makes sense to do so.
Simon Cross <hodgestar@gmail.com>
parents: 264
diff changeset
107 equipment_cls,
31f5033eac70 Add prices to all tools where is makes sense to do so.
Simon Cross <hodgestar@gmail.com>
parents: 264
diff changeset
108 equipment_cls.BUY_PRICE,
247
5b9cd693fe7c Add sprite cursors for equipment buying.
Simon Cross <hodgestar@gmail.com>
parents: 245
diff changeset
109 cursors.cursors.get('buy', None))
270
31f5033eac70 Add prices to all tools where is makes sense to do so.
Simon Cross <hodgestar@gmail.com>
parents: 264
diff changeset
110
378
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
111 self.add_spacer(5)
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
112 self.add_tool_button("Repair", constants.TOOL_REPAIR_BUILDING, None, cursors.cursors['repair'])
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
113
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
114 self.add_spacer(5)
286
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
115 self.add_tool("Price Reference", self.show_prices)
378
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
116 self.add_spacer(10)
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
320
9bf0e701a36e Switch between 'Finished Day' and 'Fast Forward' modes
Neil Muller <drnlmuller@gmail.com>
parents: 316
diff changeset
118 self.fin_tool = self.add_tool("Finished Day", self.day_done)
68
6b8ac424da83 Add button for finishing day. Remove debugging print.
Simon Cross <hodgestar@gmail.com>
parents: 67
diff changeset
119
292
bf271e857157 Clear tool when calling price dialog
Neil Muller <drnlmuller@gmail.com>
parents: 290
diff changeset
120 self.anim_clear_tool = False # Flag to clear the tool on an anim loop
294
29e9683055dc Explain horrible hack
Neil Muller <drnlmuller@gmail.com>
parents: 292
diff changeset
121 # pgu's tool widget fiddling happens after the tool action, so calling
29e9683055dc Explain horrible hack
Neil Muller <drnlmuller@gmail.com>
parents: 292
diff changeset
122 # clear_tool in the tool's action doesn't work, so we punt it to
29e9683055dc Explain horrible hack
Neil Muller <drnlmuller@gmail.com>
parents: 292
diff changeset
123 # the anim loop
292
bf271e857157 Clear tool when calling price dialog
Neil Muller <drnlmuller@gmail.com>
parents: 290
diff changeset
124
68
6b8ac424da83 Add button for finishing day. Remove debugging print.
Simon Cross <hodgestar@gmail.com>
parents: 67
diff changeset
125 def day_done(self):
320
9bf0e701a36e Switch between 'Finished Day' and 'Fast Forward' modes
Neil Muller <drnlmuller@gmail.com>
parents: 316
diff changeset
126 if self.gameboard.day:
9bf0e701a36e Switch between 'Finished Day' and 'Fast Forward' modes
Neil Muller <drnlmuller@gmail.com>
parents: 316
diff changeset
127 pygame.event.post(engine.START_NIGHT)
9bf0e701a36e Switch between 'Finished Day' and 'Fast Forward' modes
Neil Muller <drnlmuller@gmail.com>
parents: 316
diff changeset
128 else:
9bf0e701a36e Switch between 'Finished Day' and 'Fast Forward' modes
Neil Muller <drnlmuller@gmail.com>
parents: 316
diff changeset
129 self.anim_clear_tool = True
9bf0e701a36e Switch between 'Finished Day' and 'Fast Forward' modes
Neil Muller <drnlmuller@gmail.com>
parents: 316
diff changeset
130 pygame.event.post(engine.FAST_FORWARD)
9bf0e701a36e Switch between 'Finished Day' and 'Fast Forward' modes
Neil Muller <drnlmuller@gmail.com>
parents: 316
diff changeset
131
9bf0e701a36e Switch between 'Finished Day' and 'Fast Forward' modes
Neil Muller <drnlmuller@gmail.com>
parents: 316
diff changeset
132 def update_fin_tool(self, day):
9bf0e701a36e Switch between 'Finished Day' and 'Fast Forward' modes
Neil Muller <drnlmuller@gmail.com>
parents: 316
diff changeset
133 if day:
9bf0e701a36e Switch between 'Finished Day' and 'Fast Forward' modes
Neil Muller <drnlmuller@gmail.com>
parents: 316
diff changeset
134 self.fin_tool.widget = gui.basic.Label('Finished Day')
9bf0e701a36e Switch between 'Finished Day' and 'Fast Forward' modes
Neil Muller <drnlmuller@gmail.com>
parents: 316
diff changeset
135 self.fin_tool.resize()
9bf0e701a36e Switch between 'Finished Day' and 'Fast Forward' modes
Neil Muller <drnlmuller@gmail.com>
parents: 316
diff changeset
136 else:
9bf0e701a36e Switch between 'Finished Day' and 'Fast Forward' modes
Neil Muller <drnlmuller@gmail.com>
parents: 316
diff changeset
137 self.fin_tool.widget = gui.basic.Label('Fast Forward')
9bf0e701a36e Switch between 'Finished Day' and 'Fast Forward' modes
Neil Muller <drnlmuller@gmail.com>
parents: 316
diff changeset
138 self.fin_tool.resize()
68
6b8ac424da83 Add button for finishing day. Remove debugging print.
Simon Cross <hodgestar@gmail.com>
parents: 67
diff changeset
139
286
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
140 def show_prices(self):
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
141 """Popup dialog of prices"""
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
142 def make_box(text):
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
143 style = {
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
144 'border' : 1
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
145 }
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
146 word = gui.Label(text, style=style)
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
147 return word
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
148
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
149 def fix_widths(doc):
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
150 """Loop through all the widgets in the doc, and set the
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
151 width of the labels to max + 10"""
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
152 # We need to do this because of possible font issues
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
153 max_width = 0
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
154 for thing in doc.widgets:
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
155 if hasattr(thing, 'style'):
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
156 # A label
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
157 if thing.style.width > max_width:
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
158 max_width = thing.style.width
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
159 for thing in doc.widgets:
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
160 if hasattr(thing, 'style'):
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
161 thing.style.width = max_width + 10
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
162
287
21b0c4a99c0a Add close button to price dialog
Neil Muller <drnlmuller@gmail.com>
parents: 286
diff changeset
163 tbl = gui.Table()
21b0c4a99c0a Add close button to price dialog
Neil Muller <drnlmuller@gmail.com>
parents: 286
diff changeset
164 tbl.tr()
378
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
165 doc = gui.Document(width=510)
286
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
166 space = doc.style.font.size(" ")
378
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
167 for header in ['Item', 'Buy Price', 'Sell Price', 'Repair Price']:
286
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
168 doc.add(make_box(header))
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
169 doc.br(space[1])
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
170 for building in buildings.BUILDINGS:
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
171 doc.add(make_box(building.NAME))
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
172 doc.add(make_box('%d' % building.BUY_PRICE))
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
173 doc.add(make_box('%d' % building.SELL_PRICE))
378
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
174 if building.BREAKABLE:
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
175 doc.add(make_box('%d' % building.REPAIR_PRICE))
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
176 else:
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
177 doc.add(make_box('N/A'))
286
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
178 doc.br(space[1])
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
179 for equip in equipment.EQUIPMENT:
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
180 doc.add(make_box(equip.NAME))
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
181 doc.add(make_box('%d' % equip.BUY_PRICE))
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
182 doc.add(make_box('%d' % equip.SELL_PRICE))
378
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
183 doc.add(make_box('N/A'))
286
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
184 doc.br(space[1])
348
e61f95503461 Add fences to price list. Tidying up price list dialog a little.
Simon Cross <hodgestar@gmail.com>
parents: 346
diff changeset
185
286
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
186 fix_widths(doc)
378
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
187 for word in "Damaged equipment or buildings will be sold for" \
348
e61f95503461 Add fences to price list. Tidying up price list dialog a little.
Simon Cross <hodgestar@gmail.com>
parents: 346
diff changeset
188 " less than the sell price.".split():
286
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
189 doc.add(gui.Label(word))
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
190 doc.space(space)
287
21b0c4a99c0a Add close button to price dialog
Neil Muller <drnlmuller@gmail.com>
parents: 286
diff changeset
191 close_button = gui.Button("Close")
348
e61f95503461 Add fences to price list. Tidying up price list dialog a little.
Simon Cross <hodgestar@gmail.com>
parents: 346
diff changeset
192 tbl.td(doc)
287
21b0c4a99c0a Add close button to price dialog
Neil Muller <drnlmuller@gmail.com>
parents: 286
diff changeset
193 tbl.tr()
348
e61f95503461 Add fences to price list. Tidying up price list dialog a little.
Simon Cross <hodgestar@gmail.com>
parents: 346
diff changeset
194 tbl.td(close_button, align=1)
287
21b0c4a99c0a Add close button to price dialog
Neil Muller <drnlmuller@gmail.com>
parents: 286
diff changeset
195 dialog = gui.Dialog(gui.Label('Price Reference'), tbl)
21b0c4a99c0a Add close button to price dialog
Neil Muller <drnlmuller@gmail.com>
parents: 286
diff changeset
196 close_button.connect(gui.CLICK, dialog.close)
286
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
197 dialog.open()
292
bf271e857157 Clear tool when calling price dialog
Neil Muller <drnlmuller@gmail.com>
parents: 290
diff changeset
198 self.anim_clear_tool = True
286
49418fd43748 Price reference dialog - without close button
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
199
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
200 update_cash_counter = mkcountupdate('cash_counter')
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
201 update_fox_counter = mkcountupdate('killed_foxes')
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
202 update_chicken_counter = mkcountupdate('chicken_counter')
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
203 update_egg_counter = mkcountupdate('egg_counter')
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
204 update_day_counter = mkcountupdate('day_counter')
79
8241386a1651 Add chicken counter
Neil Muller <drnlmuller@gmail.com>
parents: 77
diff changeset
205
168
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
206 def add_spacer(self, height):
83
9bd2c22e1746 Cleaned up some toolbar code a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 80
diff changeset
207 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
208 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
209
154
3afdefacb07f Neaten up toolbar.
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
210 def add_heading(self, text):
3afdefacb07f Neaten up toolbar.
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
211 self.tr()
3afdefacb07f Neaten up toolbar.
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
212 self.td(mklabel(text), colspan=2)
3afdefacb07f Neaten up toolbar.
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
213
270
31f5033eac70 Add prices to all tools where is makes sense to do so.
Simon Cross <hodgestar@gmail.com>
parents: 264
diff changeset
214 def add_tool_button(self, text, tool, price=None, cursor=None):
31f5033eac70 Add prices to all tools where is makes sense to do so.
Simon Cross <hodgestar@gmail.com>
parents: 264
diff changeset
215 if price is not None:
31f5033eac70 Add prices to all tools where is makes sense to do so.
Simon Cross <hodgestar@gmail.com>
parents: 264
diff changeset
216 text = "%s (%s)" % (text, price)
245
634491bf37e8 Change toolbar to gui.Toolbar -- gives nicer highlighting.
Simon Cross <hodgestar@gmail.com>
parents: 243
diff changeset
217 self.add_tool(text, lambda: self.gameboard.set_selected_tool(tool,
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
218 cursor))
83
9bd2c22e1746 Cleaned up some toolbar code a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 80
diff changeset
219
245
634491bf37e8 Change toolbar to gui.Toolbar -- gives nicer highlighting.
Simon Cross <hodgestar@gmail.com>
parents: 243
diff changeset
220 def add_tool(self, text, func):
634491bf37e8 Change toolbar to gui.Toolbar -- gives nicer highlighting.
Simon Cross <hodgestar@gmail.com>
parents: 243
diff changeset
221 label = gui.basic.Label(text)
634491bf37e8 Change toolbar to gui.Toolbar -- gives nicer highlighting.
Simon Cross <hodgestar@gmail.com>
parents: 243
diff changeset
222 value = self._next_tool_value
634491bf37e8 Change toolbar to gui.Toolbar -- gives nicer highlighting.
Simon Cross <hodgestar@gmail.com>
parents: 243
diff changeset
223 self._next_tool_value += 1
634491bf37e8 Change toolbar to gui.Toolbar -- gives nicer highlighting.
Simon Cross <hodgestar@gmail.com>
parents: 243
diff changeset
224 tool = gui.Tool(self.group, label, value, width=self.rect.w, style={"padding_left": 0})
634491bf37e8 Change toolbar to gui.Toolbar -- gives nicer highlighting.
Simon Cross <hodgestar@gmail.com>
parents: 243
diff changeset
225 tool.connect(gui.CLICK, func)
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
226 self.tr()
245
634491bf37e8 Change toolbar to gui.Toolbar -- gives nicer highlighting.
Simon Cross <hodgestar@gmail.com>
parents: 243
diff changeset
227 self.td(tool, align=-1, colspan=2)
320
9bf0e701a36e Switch between 'Finished Day' and 'Fast Forward' modes
Neil Muller <drnlmuller@gmail.com>
parents: 316
diff changeset
228 return tool
245
634491bf37e8 Change toolbar to gui.Toolbar -- gives nicer highlighting.
Simon Cross <hodgestar@gmail.com>
parents: 243
diff changeset
229
634491bf37e8 Change toolbar to gui.Toolbar -- gives nicer highlighting.
Simon Cross <hodgestar@gmail.com>
parents: 243
diff changeset
230 def clear_tool(self):
634491bf37e8 Change toolbar to gui.Toolbar -- gives nicer highlighting.
Simon Cross <hodgestar@gmail.com>
parents: 243
diff changeset
231 self.group.value = None
288
5539744cfd40 Clear tool selection status when cancelling a tool
Neil Muller <drnlmuller@gmail.com>
parents: 287
diff changeset
232 for item in self.group.widgets:
5539744cfd40 Clear tool selection status when cancelling a tool
Neil Muller <drnlmuller@gmail.com>
parents: 287
diff changeset
233 item.pcls = ""
292
bf271e857157 Clear tool when calling price dialog
Neil Muller <drnlmuller@gmail.com>
parents: 290
diff changeset
234 self.anim_clear_tool = False
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
235
83
9bd2c22e1746 Cleaned up some toolbar code a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 80
diff changeset
236 def add_counter(self, icon, label):
9bd2c22e1746 Cleaned up some toolbar code a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 80
diff changeset
237 self.tr()
168
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
238 self.td(icon, width=self.rect.w/2)
1014bfcddc4c Fixed label alignment.
Jeremy Thurgood <firxen@gmail.com>
parents: 166
diff changeset
239 self.td(label, width=self.rect.w/2)
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
240
152
702bc0eb2ac3 Fix Toolbar width to TOOLBAR_WIDTH by not allowing it to resize.
Simon Cross <hodgestar@gmail.com>
parents: 151
diff changeset
241 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
242 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
243 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
244 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
245
702bc0eb2ac3 Fix Toolbar width to TOOLBAR_WIDTH by not allowing it to resize.
Simon Cross <hodgestar@gmail.com>
parents: 151
diff changeset
246
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
247 class VidWidget(gui.Widget):
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
248 def __init__(self, gameboard, vid, **params):
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
249 gui.Widget.__init__(self, **params)
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
250 self.gameboard = gameboard
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
251 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
252 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
253
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
254 def paint(self, surface):
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
255 self.vid.paint(surface)
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
256
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
257 def update(self, surface):
380
1586eccdefe4 Ripped out legacy animation infrastructure in favour of layered sprites.
Jeremy Thurgood <firxen@gmail.com>
parents: 379
diff changeset
258 return self.vid.update(surface)
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
259
39
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
260 def move_view(self, x, y):
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
261 self.vid.view.move_ip((x, y))
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
262
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
263 def event(self, e):
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
264 if e.type == MOUSEBUTTONDOWN:
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
265 self.gameboard.use_tool(e)
186
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
266 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
267 self.gameboard.update_sprite_cursor(e)
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
268
9
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
269 class GameBoard(object):
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
270 TILE_DIMENSIONS = (20, 20)
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
271 TOOLBAR_WIDTH = 140
9
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
272
66
edc15ce8fa30 Implement fence selling (a bit hackish, but fine for now).
Simon Cross <hodgestar@gmail.com>
parents: 65
diff changeset
273 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
274 FENCE = tiles.REVERSE_TILE_MAP['fence']
79
8241386a1651 Add chicken counter
Neil Muller <drnlmuller@gmail.com>
parents: 77
diff changeset
275 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
276 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
277
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
278 def __init__(self, main_app, level):
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
279 self.disp = main_app
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
280 self.level = level
24
7584453f4944 Add support for PNG tiles.
Simon Cross <hodgestar@gmail.com>
parents: 17
diff changeset
281 self.tv = tiles.FarmVid()
303
e12d99215b74 Fix up data module unix-to-local path fixing. Fix similar problems in tile importing.
Simon Cross <hodgestar@gmail.com>
parents: 302
diff changeset
282 self.tv.png_folder_load_tiles('tiles')
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
283 self.tv.tga_load_level(level.map)
382
e89e6ad011ac Use code layer to place chickens
Neil Muller <drnlmuller@gmail.com>
parents: 381
diff changeset
284 width, height = self.tv.size
323
978efd39a099 Limit maximum numbe of foxes generated
Neil Muller <drnlmuller@gmail.com>
parents: 320
diff changeset
285 # Ensure we don't every try to create more foxes then is sane
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
286 self.max_foxes = min(2*height+2*width-15, level.max_foxes)
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
287 self.create_display()
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
288
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
289 self.selected_tool = None
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
290 self.animal_to_place = None
186
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
291 self.sprite_cursor = None
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
292 self.chickens = set()
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
293 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
294 self.buildings = []
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
295 self._fox_pos_cache = []
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
296 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
297 self.eggs = 0
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
298 self.days = 0
79
8241386a1651 Add chicken counter
Neil Muller <drnlmuller@gmail.com>
parents: 77
diff changeset
299 self.killed_foxes = 0
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
300 self.add_cash(level.starting_cash)
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
301 self.day, self.night = True, False
17
cbbc5da7708a Interaction with the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 14
diff changeset
302
67
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
303 self.fix_buildings()
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
304
382
e89e6ad011ac Use code layer to place chickens
Neil Muller <drnlmuller@gmail.com>
parents: 381
diff changeset
305 cdata = {
e89e6ad011ac Use code layer to place chickens
Neil Muller <drnlmuller@gmail.com>
parents: 381
diff changeset
306 1 : (self.add_start_chickens, None),
e89e6ad011ac Use code layer to place chickens
Neil Muller <drnlmuller@gmail.com>
parents: 381
diff changeset
307 }
e89e6ad011ac Use code layer to place chickens
Neil Muller <drnlmuller@gmail.com>
parents: 381
diff changeset
308
e89e6ad011ac Use code layer to place chickens
Neil Muller <drnlmuller@gmail.com>
parents: 381
diff changeset
309 self.tv.run_codes(cdata, (0,0,width,height))
118
2c76ed47fc44 Remove chicken respawn at day start. Handle eaten chickens in henhouses better
Neil Muller <drnlmuller@gmail.com>
parents: 116
diff changeset
310
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
311 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
312 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
313
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
314 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
315 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
316 tbl = gui.Table()
5569430fd82e Display cleanup and rationalisation.
Jeremy Thurgood <firxen@gmail.com>
parents: 35
diff changeset
317 tbl.tr()
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
318 self.toolbar = ToolBar(self, self.level, width=self.TOOLBAR_WIDTH)
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
319 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
320 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
321 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
322 self.top_widget = tbl
14
d7f295c06a4b Split gameboard screen.
Jeremy Thurgood <firxen@gmail.com>
parents: 12
diff changeset
323
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
324 def update(self):
37
497b53b69280 Always update the vidwidget.
Jeremy Thurgood <firxen@gmail.com>
parents: 36
diff changeset
325 self.tvw.reupdate()
9
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
326
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
327 def loop(self):
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
328 self.tv.loop()
9
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
329
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
330 def set_selected_tool(self, tool, cursor):
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
331 if not self.day:
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
332 return
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
333 self.selected_tool = tool
213
07b361ebd87f Ensure we clean up highlights, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 212
diff changeset
334 if self.animal_to_place:
07b361ebd87f Ensure we clean up highlights, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 212
diff changeset
335 # Clear any highlights
305
32149b1d9fd2 Capitalised all equipment names.
Jeremy Thurgood <firxen@gmail.com>
parents: 303
diff changeset
336 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
337 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
338 sprite_curs = None
653da96db572 Fixed dangling cursor sprite and did some TODO list maintenance.
Jeremy Thurgood <firxen@gmail.com>
parents: 202
diff changeset
339 if buildings.is_building(tool):
232
0bd214cf9018 Overlay cost on building sprite cursors.
Simon Cross <hodgestar@gmail.com>
parents: 228
diff changeset
340 sprite_curs = sprite_cursor.SpriteCursor(tool.IMAGE, self.tv, tool.BUY_PRICE)
247
5b9cd693fe7c Add sprite cursors for equipment buying.
Simon Cross <hodgestar@gmail.com>
parents: 245
diff changeset
341 elif equipment.is_equipment(tool):
5b9cd693fe7c Add sprite cursors for equipment buying.
Simon Cross <hodgestar@gmail.com>
parents: 245
diff changeset
342 sprite_curs = sprite_cursor.SpriteCursor(tool.CHICKEN_IMAGE_FILE, self.tv)
203
653da96db572 Fixed dangling cursor sprite and did some TODO list maintenance.
Jeremy Thurgood <firxen@gmail.com>
parents: 202
diff changeset
343 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
344
653da96db572 Fixed dangling cursor sprite and did some TODO list maintenance.
Jeremy Thurgood <firxen@gmail.com>
parents: 202
diff changeset
345 def set_cursor(self, cursor=None, sprite_curs=None):
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
346 if cursor:
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
347 pygame.mouse.set_cursor(*cursor)
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
348 else:
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
349 pygame.mouse.set_cursor(*cursors.cursors['arrow'])
379
a8a7ada27fa2 Multilayer sprite ordering. Only used by cursors so far.
Jeremy Thurgood <firxen@gmail.com>
parents: 378
diff changeset
350 if self.sprite_cursor is not None:
a8a7ada27fa2 Multilayer sprite ordering. Only used by cursors so far.
Jeremy Thurgood <firxen@gmail.com>
parents: 378
diff changeset
351 self.tv.sprites.remove(self.sprite_cursor, layer='cursor')
218
5cb0e0b9cd16 Make sprite cursors stay on top by fudging the sprite list. :/
Simon Cross <hodgestar@gmail.com>
parents: 217
diff changeset
352 self.sprite_cursor = sprite_curs
379
a8a7ada27fa2 Multilayer sprite ordering. Only used by cursors so far.
Jeremy Thurgood <firxen@gmail.com>
parents: 378
diff changeset
353 if self.sprite_cursor is not None:
a8a7ada27fa2 Multilayer sprite ordering. Only used by cursors so far.
Jeremy Thurgood <firxen@gmail.com>
parents: 378
diff changeset
354 self.tv.sprites.append(self.sprite_cursor, layer='cursor')
213
07b361ebd87f Ensure we clean up highlights, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 212
diff changeset
355
07b361ebd87f Ensure we clean up highlights, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 212
diff changeset
356 def reset_states(self):
07b361ebd87f Ensure we clean up highlights, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 212
diff changeset
357 """Clear current states (highlights, etc.)"""
245
634491bf37e8 Change toolbar to gui.Toolbar -- gives nicer highlighting.
Simon Cross <hodgestar@gmail.com>
parents: 243
diff changeset
358 self.set_selected_tool(None, None)
634491bf37e8 Change toolbar to gui.Toolbar -- gives nicer highlighting.
Simon Cross <hodgestar@gmail.com>
parents: 243
diff changeset
359 self.toolbar.clear_tool()
17
cbbc5da7708a Interaction with the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 14
diff changeset
360
186
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
361 def update_sprite_cursor(self, e):
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
362 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
363 self.sprite_cursor.set_pos(tile_pos)
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
364
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
365 def start_night(self):
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
366 self.day, self.night = False, True
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
367 self.tv.sun(False)
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
368 self.reset_states()
320
9bf0e701a36e Switch between 'Finished Day' and 'Fast Forward' modes
Neil Muller <drnlmuller@gmail.com>
parents: 316
diff changeset
369 self.toolbar.update_fin_tool(self.day)
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
370 self._cache_fox_positions()
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
371
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
372 def start_day(self):
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
373 self.day, self.night = True, False
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
374 self.tv.sun(True)
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
375 self.reset_states()
320
9bf0e701a36e Switch between 'Finished Day' and 'Fast Forward' modes
Neil Muller <drnlmuller@gmail.com>
parents: 316
diff changeset
376 self.toolbar.update_fin_tool(self.day)
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
377
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
378 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
379 """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
380 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
381 return False
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
382 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
383 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
384 return False
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
385 return True
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
386
17
cbbc5da7708a Interaction with the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 14
diff changeset
387 def use_tool(self, e):
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
388 if not self.day:
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
389 return
189
37af9e5dd292 Use tool with left button, cancel tool with right button.
Jeremy Thurgood <firxen@gmail.com>
parents: 186
diff changeset
390 if e.button == 3: # Right button
275
678be1afc307 Fix minor bug in clearing of tool state on right-click.
Simon Cross <hodgestar@gmail.com>
parents: 272
diff changeset
391 self.set_selected_tool(None, None)
678be1afc307 Fix minor bug in clearing of tool state on right-click.
Simon Cross <hodgestar@gmail.com>
parents: 272
diff changeset
392 self.toolbar.clear_tool()
189
37af9e5dd292 Use tool with left button, cancel tool with right button.
Jeremy Thurgood <firxen@gmail.com>
parents: 186
diff changeset
393 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
394 return
52
0d4799866bcf Sell chickens and buy fences.
Jeremy Thurgood <firxen@gmail.com>
parents: 40
diff changeset
395 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
396 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
397 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
398 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
399 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
400 self.place_animal(self.tv.screen_to_tile(e.pos))
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
401 elif self.selected_tool == constants.TOOL_SELL_BUILDING:
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
402 self.sell_building(self.tv.screen_to_tile(e.pos))
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
403 elif self.selected_tool == constants.TOOL_SELL_EQUIPMENT:
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
404 self.sell_equipment(self.tv.screen_to_tile(e.pos))
378
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
405 elif self.selected_tool == constants.TOOL_REPAIR_BUILDING:
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
406 self.repair_building(self.tv.screen_to_tile(e.pos))
131
4527e09dc620 Add lumberjacks.
Simon Cross <hodgestar@gmail.com>
parents: 128
diff changeset
407 elif self.selected_tool == constants.TOOL_LOGGING:
4527e09dc620 Add lumberjacks.
Simon Cross <hodgestar@gmail.com>
parents: 128
diff changeset
408 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
409 elif buildings.is_building(self.selected_tool):
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
410 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
411 elif equipment.is_equipment(self.selected_tool):
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
412 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
413
166
4aa800354b7c Rename get_chicken to get_outside_chicken.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
414 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
415 for chick in self.chickens:
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
416 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
417 return chick
b8f64db0d39e Cleaned up buying and selling a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 52
diff changeset
418 return None
57
08665fa60345 Implement henhouses and henhouse adding.
Simon Cross <hodgestar@gmail.com>
parents: 54
diff changeset
419
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
420 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
421 for building in self.buildings:
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
422 if building.covers(tile_pos):
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
423 return building
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
424 return None
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
425
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
426 def sell_chicken(self, tile_pos):
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
427
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
428 def do_sell(chicken, update_button=None):
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
429 if not chicken:
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
430 return False # sanity check
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
431 if len(self.chickens) == 1:
326
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
432 msg = "You can't sell your last chicken!"
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
433 TextDialog("Squuaaawwwwwk!", msg).open()
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
434 return False
228
f74de4280e20 Sell chicken's equipment when you sell the chicken.
Simon Cross <hodgestar@gmail.com>
parents: 227
diff changeset
435 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
436 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
437 chicken.unequip(item)
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
438 self.add_cash(self.level.sell_price_chicken)
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
439 sound.play_sound("sell-chicken.ogg")
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
440 if update_button:
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
441 update_button(chicken, empty=True)
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
442 self.remove_chicken(chicken)
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
443 return True
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
444
166
4aa800354b7c Rename get_chicken to get_outside_chicken.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
445 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
446 if chick is None:
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
447 building = self.get_building(tile_pos)
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
448 if building and building.NAME in buildings.HENHOUSES:
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
449 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
450 return
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
451 do_sell(chick)
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
452
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
453 def sell_one_egg(self, chicken):
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
454 if chicken.eggs:
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
455 self.add_cash(self.level.sell_price_egg)
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
456 chicken.remove_one_egg()
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
457 self.eggs -= 1
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
458 self.toolbar.update_egg_counter(self.eggs)
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
459 return True
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
460 return False
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
461
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
462 def sell_egg(self, tile_pos):
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
463 def do_sell(chicken, update_button=None):
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
464 # We try sell and egg
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
465 if self.sell_one_egg(chicken):
193
db246683d5da Selling eggs now works
Neil Muller <drnlmuller@gmail.com>
parents: 192
diff changeset
466 sound.play_sound("sell-chicken.ogg")
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
467 # Force toolbar update
193
db246683d5da Selling eggs now works
Neil Muller <drnlmuller@gmail.com>
parents: 192
diff changeset
468 self.toolbar.chsize()
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
469 if update_button:
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
470 update_button(chicken)
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
471 return False
193
db246683d5da Selling eggs now works
Neil Muller <drnlmuller@gmail.com>
parents: 192
diff changeset
472
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
473 building = self.get_building(tile_pos)
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
474 if building and building.NAME in buildings.HENHOUSES:
193
db246683d5da Selling eggs now works
Neil Muller <drnlmuller@gmail.com>
parents: 192
diff changeset
475 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
476
200
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
477 def select_animal_to_place(self, animal):
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
478 if self.animal_to_place:
305
32149b1d9fd2 Capitalised all equipment names.
Jeremy Thurgood <firxen@gmail.com>
parents: 303
diff changeset
479 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
480 self.animal_to_place = animal
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
481 if self.animal_to_place:
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
482 self.animal_to_place.equip(equipment.Spotlight())
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
483
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
484 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
485 """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
486
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
487 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
488 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
489 """
166
4aa800354b7c Rename get_chicken to get_outside_chicken.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
490 chicken = self.get_outside_chicken(tile_pos)
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
491 if chicken:
108
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 105
diff changeset
492 if chicken is self.animal_to_place:
200
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
493 self.select_animal_to_place(None)
165
c7d496556475 Minor cursor bugfixes
Neil Muller <drnlmuller@gmail.com>
parents: 164
diff changeset
494 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
495 else:
200
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
496 self.select_animal_to_place(chicken)
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
497 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
498 return
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
499 building = self.get_building(tile_pos)
378
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
500 if building and building.ABODE:
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
501 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
502 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
503 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
504 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
505 self.animal_to_place.equip(equipment.Nest())
200
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
506 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
507 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
508 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
509 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
510 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
511 self.open_building_dialog(building)
108
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 105
diff changeset
512 return
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 105
diff changeset
513 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
514 if self.animal_to_place is not None:
305
32149b1d9fd2 Capitalised all equipment names.
Jeremy Thurgood <firxen@gmail.com>
parents: 303
diff changeset
515 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
516 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
517 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
518 self.animal_to_place.remove_eggs()
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
519 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
520
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
521 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
522 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
523 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
524 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
525 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
526 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
527 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
528 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
529 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
530 self.set_visibility(chicken)
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
531
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
532 def set_visibility(self, animal):
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
533 if animal.outside():
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
534 if animal not in self.tv.sprites:
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
535 self.tv.sprites.append(animal)
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
536 else:
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
537 if animal in self.tv.sprites:
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
538 self.tv.sprites.remove(animal)
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
539
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
540 def open_dialog(self, widget, x=None, y=None, 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
541 """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
542 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
543
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
544 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
545 self.disp.close(tbl)
170
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
546 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
547 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
548
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 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
550 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
551
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
552 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
553 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
554 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
555 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
556 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
557 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
558
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
559 if x:
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
560 offset = (self.disp.rect.center[0] + x,
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
561 self.disp.rect.center[1] + y)
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
562 else:
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
563 offset = None
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
564 self.disp.open(tbl, pos=offset)
169
946f09ed37cd Make equipment dialog close after selecting an item to sell.
Simon Cross <hodgestar@gmail.com>
parents: 168
diff changeset
565 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
566
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
567 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
568 """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
569
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
570 place_button_map = {}
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
571
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
572 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
573 """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
574 if animal:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
575 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
576 if button:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
577 if empty:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
578 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
579 else:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
580 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
581
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
582 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
583 """Handle a nest being clicked."""
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
584 if place.occupant:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
585 # 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
586 if not sell_callback:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
587 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
588 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
589 # 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
590 update_button(old_animal)
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
591 # 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
592 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
593 else:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
594 # Attempt to sell the occupant
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
595 sell_callback(place.occupant, update_button)
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
596 else:
208
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
597 # 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
598 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
599 # 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
600 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
601 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
602 # 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
603 update_button(self.animal_to_place)
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
604
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
605 tbl = gui.Table()
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
606 columns = building.max_floor_width()
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
607 kwargs = { 'style': { 'padding_left': 10, 'padding_bottom': 10 }}
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
608 for floor in building.floors():
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
609 tbl.tr()
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
610 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
611 tbl.tr()
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
612 for row in floor.rows():
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
613 tbl.tr()
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
614 for place in row:
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
615 if place.occupant is None:
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
616 button = gui.Button(icons.EMPTY_NEST_ICON)
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
617 else:
201
fe1e9c18d4d7 layering bugfix; indoor chickens now use normal chicken icons
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 200
diff changeset
618 button = gui.Button(icons.animal_icon(place.occupant))
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
619 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
620 button.connect(gui.CLICK, nest_clicked, place, button)
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
621 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
622
170
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
623 building.selected(True)
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
624 def close_callback():
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
625 building.selected(False)
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
626
262
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
627 def evict_callback():
264
812bd4cda8b8 evict button
Neil Muller <drnlmuller@gmail.com>
parents: 262
diff changeset
628 if not self.animal_to_place:
812bd4cda8b8 evict button
Neil Muller <drnlmuller@gmail.com>
parents: 262
diff changeset
629 return
812bd4cda8b8 evict button
Neil Muller <drnlmuller@gmail.com>
parents: 262
diff changeset
630 for tile_pos in building.adjacent_tiles():
812bd4cda8b8 evict button
Neil Muller <drnlmuller@gmail.com>
parents: 262
diff changeset
631 if self.tv.get(tile_pos) != self.GRASSLAND:
812bd4cda8b8 evict button
Neil Muller <drnlmuller@gmail.com>
parents: 262
diff changeset
632 continue
812bd4cda8b8 evict button
Neil Muller <drnlmuller@gmail.com>
parents: 262
diff changeset
633 if self.get_outside_chicken(tile_pos) is None:
812bd4cda8b8 evict button
Neil Muller <drnlmuller@gmail.com>
parents: 262
diff changeset
634 update_button(self.animal_to_place, empty=True)
812bd4cda8b8 evict button
Neil Muller <drnlmuller@gmail.com>
parents: 262
diff changeset
635 self.place_animal(tile_pos)
812bd4cda8b8 evict button
Neil Muller <drnlmuller@gmail.com>
parents: 262
diff changeset
636 break
262
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
637
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
638 if not sell_callback:
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
639 tbl.tr()
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
640 button = gui.Button('Evict')
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
641 button.connect(gui.CLICK, evict_callback)
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
642 tbl.td(button, colspan=2, **kwargs)
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
643
170
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
644 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
645
131
4527e09dc620 Add lumberjacks.
Simon Cross <hodgestar@gmail.com>
parents: 128
diff changeset
646 def logging_forest(self, tile_pos):
4527e09dc620 Add lumberjacks.
Simon Cross <hodgestar@gmail.com>
parents: 128
diff changeset
647 if self.tv.get(tile_pos) != self.WOODLAND:
4527e09dc620 Add lumberjacks.
Simon Cross <hodgestar@gmail.com>
parents: 128
diff changeset
648 return
135
149822fbebeb Check that there is enough cash before logging.
Simon Cross <hodgestar@gmail.com>
parents: 131
diff changeset
649 if self.cash < constants.LOGGING_PRICE:
149822fbebeb Check that there is enough cash before logging.
Simon Cross <hodgestar@gmail.com>
parents: 131
diff changeset
650 return
131
4527e09dc620 Add lumberjacks.
Simon Cross <hodgestar@gmail.com>
parents: 128
diff changeset
651 self.add_cash(-constants.LOGGING_PRICE)
4527e09dc620 Add lumberjacks.
Simon Cross <hodgestar@gmail.com>
parents: 128
diff changeset
652 self.tv.set(tile_pos, self.GRASSLAND)
4527e09dc620 Add lumberjacks.
Simon Cross <hodgestar@gmail.com>
parents: 128
diff changeset
653
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
654 def buy_building(self, tile_pos, building_cls):
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
655 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
656 if self.cash < building.buy_price():
57
08665fa60345 Implement henhouses and henhouse adding.
Simon Cross <hodgestar@gmail.com>
parents: 54
diff changeset
657 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
658 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
659 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
660 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
661 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
662 self.add_building(building)
60
e2631c8e2cd6 Implement guard towers (with temporary sprite PNG).
Simon Cross <hodgestar@gmail.com>
parents: 57
diff changeset
663
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
664 def buy_equipment(self, tile_pos, equipment_cls):
298
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
665
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
666 equipment = equipment_cls()
298
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
667
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
668 def do_equip(chicken, update_button=None):
298
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
669 # Try to equip the chicken
361
d2acf43aba6f Don't go into debt when buying equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 360
diff changeset
670 if self.cash < equipment.buy_price():
d2acf43aba6f Don't go into debt when buying equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 360
diff changeset
671 return False
298
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
672 if equipment.place(chicken):
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
673 self.add_cash(-equipment.buy_price())
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
674 chicken.equip(equipment)
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
675 if update_button:
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
676 update_button(chicken)
298
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
677 return False
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
678
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
679 chicken = self.get_outside_chicken(tile_pos)
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
680 if chicken is None:
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
681 building = self.get_building(tile_pos)
378
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
682 if not (building and building.ABODE):
298
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
683 return
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
684 # Bounce through open dialog once more
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
685 self.open_building_dialog(building, do_equip)
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
686 else:
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
687 do_equip(chicken)
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
688
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
689 def sell_building(self, tile_pos):
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
690 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
691 if building is None:
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
692 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
693 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
694 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
695 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
696 return
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
697 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
698 building.remove(self.tv)
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
699 self.remove_building(building)
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
700
378
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
701 def repair_building(self, tile_pos):
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
702 building = self.get_building(tile_pos)
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
703 if not (building and building.broken()):
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
704 return
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
705 self.add_cash(-building.repair_price())
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
706 building.repair(self.tv)
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
707
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
708 def sell_equipment(self, tile_pos):
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
709 x, y = 0, 0
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
710 def do_sell(chicken, update_button=None):
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
711 if not chicken.equipment:
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
712 return
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
713 elif len(chicken.equipment) == 1:
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
714 item = chicken.equipment[0]
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
715 self.add_cash(item.sell_price())
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
716 chicken.unequip(item)
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
717 if update_button:
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
718 update_button(chicken)
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
719 else:
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
720 self.open_equipment_dialog(chicken, x, y, update_button)
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
721 return False
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
722
166
4aa800354b7c Rename get_chicken to get_outside_chicken.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
723 chicken = self.get_outside_chicken(tile_pos)
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
724 if chicken is not None:
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
725 do_sell(chicken)
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
726 else:
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
727 building = self.get_building(tile_pos)
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
728 if building is None:
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
729 return
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
730 x, y = 50, 0
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
731 self.open_building_dialog(building, do_sell)
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
732
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
733 def open_equipment_dialog(self, chicken, x, y, update_button=None):
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
734 tbl = gui.Table()
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
735
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
736 def sell_item(item, button):
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
737 """Select item of equipment."""
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
738 self.add_cash(item.sell_price())
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
739 chicken.unequip(item)
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
740 if update_button:
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
741 update_button(chicken)
169
946f09ed37cd Make equipment dialog close after selecting an item to sell.
Simon Cross <hodgestar@gmail.com>
parents: 168
diff changeset
742 self.disp.close(dialog)
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
743
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
744 kwargs = { 'style': { 'padding_left': 10, 'padding_bottom': 10 }}
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
745
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
746 tbl.tr()
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
747 tbl.td(gui.Button("Sell ... "), align=-1, **kwargs)
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
748
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
749 for item in chicken.equipment:
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
750 tbl.tr()
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
751 button = gui.Button(item.name().title())
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
752 button.connect(gui.CLICK, sell_item, item, button)
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
753 tbl.td(button, align=1, **kwargs)
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
754
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
755 dialog = self.open_dialog(tbl, x=x, y=y)
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
756
14
d7f295c06a4b Split gameboard screen.
Jeremy Thurgood <firxen@gmail.com>
parents: 12
diff changeset
757 def event(self, e):
262
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
758 if e.type == KEYDOWN and e.key in [K_UP, K_DOWN, K_LEFT, K_RIGHT]:
39
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
759 if e.key == K_UP:
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
760 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
761 if e.key == K_DOWN:
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
762 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
763 if e.key == K_LEFT:
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
764 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
765 if e.key == K_RIGHT:
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
766 self.tvw.move_view(self.TILE_DIMENSIONS[0], 0)
262
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
767 return True
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
768 return False
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
769
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
770 def advance_day(self):
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
771 self.days += 1
392
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
772 if self.level.is_last_day(self.days):
345
279974cc0698 Only set color of days left to red when there is only one day left.
Simon Cross <hodgestar@gmail.com>
parents: 341
diff changeset
773 self.toolbar.day_counter.style.color = (255, 0, 0)
346
6baf8b5beb5c Remove the "constant" constant
Neil Muller <drnlmuller@gmail.com>
parents: 345
diff changeset
774 self.toolbar.update_day_counter("%s/%s" % (self.days,
392
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
775 self.level.get_max_turns()))
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
776
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
777 def clear_foxes(self):
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
778 for fox in self.foxes.copy():
80
ad9d1bc7ef0c Kill foxes that don't reach safety
Neil Muller <drnlmuller@gmail.com>
parents: 79
diff changeset
779 # 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
780 # killed
395
2d0ff46118e2 Basic support for z coordinate
Neil Muller <drnlmuller@gmail.com>
parents: 392
diff changeset
781 if self.in_bounds(fox.pos) and \
2d0ff46118e2 Basic support for z coordinate
Neil Muller <drnlmuller@gmail.com>
parents: 392
diff changeset
782 self.tv.get(fox.pos.to_tile_tuple()) != self.WOODLAND:
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
783 self.kill_fox(fox)
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
784 else:
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
785 self.remove_fox(fox)
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
786 self.foxes = set() # Remove all the foxes
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
787
202
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
788 def run_animations(self):
380
1586eccdefe4 Ripped out legacy animation infrastructure in favour of layered sprites.
Jeremy Thurgood <firxen@gmail.com>
parents: 379
diff changeset
789 # For legacy.
292
bf271e857157 Clear tool when calling price dialog
Neil Muller <drnlmuller@gmail.com>
parents: 290
diff changeset
790 if self.toolbar.anim_clear_tool:
bf271e857157 Clear tool when calling price dialog
Neil Muller <drnlmuller@gmail.com>
parents: 290
diff changeset
791 self.toolbar.clear_tool()
202
3074784c93f4 Animation support
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
792
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
793 def do_night_step(self):
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
794 """Handle the events of the night.
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
795
122
d2b19131d537 Don't continue the night if we're not doing anything anymore
Neil Muller <drnlmuller@gmail.com>
parents: 119
diff changeset
796 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
797 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
798 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
799 return True
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
800 # Move all the foxes
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
801 over = self.foxes_move()
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
802 if not over:
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
803 self.foxes_attack()
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
804 self.chickens_attack()
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
805 return over
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
806
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
807 def _cache_fox_positions(self):
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
808 """Cache the current set of fox positions for the avoiding checks"""
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
809 w, h = self.tv.size
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
810 self._fox_pos_cache = [[[False for z in range(5)] for y in range(h)]
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
811 for x in range(w)] # NB: Assumes z in [0, 4]
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
812 for fox in self.foxes:
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
813 if self.in_bounds(fox.pos):
400
d146b7bb9b99 Fix lurking future bug
Neil Muller <drnlmuller@gmail.com>
parents: 399
diff changeset
814 self._fox_pos_cache[fox.pos.x][fox.pos.y][fox.pos.z] = True
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
815
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
816 def _update_fox_pos_cache(self, old_pos, new_pos):
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
817 if self.is_fox_at_pos(old_pos):
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
818 self._fox_pos_cache[old_pos.x][old_pos.y][old_pos.z] = False
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
819 if new_pos and self.in_bounds(new_pos):
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
820 self._fox_pos_cache[new_pos.x][new_pos.y][new_pos.z] = True
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
821
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
822 def is_fox_at_pos(self, pos):
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
823 if self.in_bounds(pos):
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
824 return self._fox_pos_cache[pos.x][pos.y][pos.z]
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
825 return False
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
826
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
827 def foxes_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
828 over = True
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
829 for fox in self.foxes:
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
830 old_pos = fox.pos
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
831 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
832 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
833 over = False
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
834 if fox.pos != old_pos:
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
835 self._update_fox_pos_cache(old_pos, fox.pos)
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
836 return over
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
837
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
838 def foxes_attack(self):
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
839 for fox in self.foxes:
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
840 fox.attack(self)
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
841
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
842 def chickens_attack(self):
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
843 for chicken in self.chickens:
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
844 chicken.attack(self)
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
845
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
846 def add_chicken(self, chicken):
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
847 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
848 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
849 self.tv.sprites.append(chicken)
79
8241386a1651 Add chicken counter
Neil Muller <drnlmuller@gmail.com>
parents: 77
diff changeset
850 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
851
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
852 def add_fox(self, fox):
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
853 self.foxes.add(fox)
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
854 self.tv.sprites.append(fox)
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
855
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
856 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
857 self.buildings.append(building)
381
7a58dadfd251 little cleanups, every sprite in its proper layer.
Jeremy Thurgood <firxen@gmail.com>
parents: 380
diff changeset
858 self.tv.sprites.append(building, layer='buildings')
60
e2631c8e2cd6 Implement guard towers (with temporary sprite PNG).
Simon Cross <hodgestar@gmail.com>
parents: 57
diff changeset
859
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
860 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
861 self.eggs = 0
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
862 for building in self.buildings:
144
a9b800b4175e Add define for henhouses & egg laying.
Neil Muller <drnlmuller@gmail.com>
parents: 139
diff changeset
863 if building.NAME in buildings.HENHOUSES:
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
864 for chicken in building.occupants():
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
865 chicken.lay()
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
866 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
867 self.toolbar.update_egg_counter(self.eggs)
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
868
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
869 def hatch_eggs(self):
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
870 for building in self.buildings:
144
a9b800b4175e Add define for henhouses & egg laying.
Neil Muller <drnlmuller@gmail.com>
parents: 139
diff changeset
871 if building.NAME in buildings.HENHOUSES:
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
872 for chicken in building.occupants():
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
873 new_chick = chicken.hatch(self)
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
874 if new_chick:
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
875 try:
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
876 building.add_occupant(new_chick)
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
877 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
878 new_chick.equip(equipment.Nest())
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
879 except buildings.BuildingFullError:
224
c279ad59b8e2 Chicks fill hen house, then adjacent spaces, then die.
Simon Cross <hodgestar@gmail.com>
parents: 223
diff changeset
880 # 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
881 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
882 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
883 continue
c279ad59b8e2 Chicks fill hen house, then adjacent spaces, then die.
Simon Cross <hodgestar@gmail.com>
parents: 223
diff changeset
884 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
885 self.add_chicken(new_chick)
c279ad59b8e2 Chicks fill hen house, then adjacent spaces, then die.
Simon Cross <hodgestar@gmail.com>
parents: 223
diff changeset
886 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
887 break
221
d46ae64240a1 Accept that new chicks die if you don't treat them properly.
Simon Cross <hodgestar@gmail.com>
parents: 219
diff changeset
888 # 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
889 # 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
890 # 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
891 self.toolbar.update_egg_counter(self.eggs)
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
892
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
893 def kill_fox(self, fox):
251
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 247
diff changeset
894 self.killed_foxes += 1
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 247
diff changeset
895 self.toolbar.update_fox_counter(self.killed_foxes)
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
896 self.add_cash(self.level.sell_price_dead_fox)
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
897 self._update_fox_pos_cache(fox.pos, None)
251
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 247
diff changeset
898 self.remove_fox(fox)
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
899
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
900 def remove_fox(self, fox):
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
901 self.foxes.discard(fox)
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
902 if fox.building:
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
903 fox.building.remove_predator(fox)
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
904 if fox in self.tv.sprites:
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
905 self.tv.sprites.remove(fox)
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
906
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
907 def remove_chicken(self, chick):
215
85a5299caf4a bugfix: deselect eaten chickens
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 213
diff changeset
908 if chick is self.animal_to_place:
85a5299caf4a bugfix: deselect eaten chickens
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 213
diff changeset
909 self.select_animal_to_place(None)
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
910 self.chickens.discard(chick)
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
911 self.eggs -= chick.get_num_eggs()
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
912 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
913 if chick.abode:
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
914 chick.abode.clear_occupant()
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
915 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
916 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
917 self.tv.sprites.remove(chick)
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
918
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
919 def remove_building(self, building):
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
920 if building in self.buildings:
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
921 self.buildings.remove(building)
381
7a58dadfd251 little cleanups, every sprite in its proper layer.
Jeremy Thurgood <firxen@gmail.com>
parents: 380
diff changeset
922 self.tv.sprites.remove(building, layer='buildings')
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
923
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
924 def add_cash(self, amount):
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
925 self.cash += amount
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
926 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
927
382
e89e6ad011ac Use code layer to place chickens
Neil Muller <drnlmuller@gmail.com>
parents: 381
diff changeset
928 def add_start_chickens(self, _map, tile, _value):
e89e6ad011ac Use code layer to place chickens
Neil Muller <drnlmuller@gmail.com>
parents: 381
diff changeset
929 """Add chickens as specified by the code layer"""
e89e6ad011ac Use code layer to place chickens
Neil Muller <drnlmuller@gmail.com>
parents: 381
diff changeset
930 chick = animal.Chicken((tile.tx, tile.ty))
e89e6ad011ac Use code layer to place chickens
Neil Muller <drnlmuller@gmail.com>
parents: 381
diff changeset
931 self.add_chicken(chick)
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
932
241
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
933 def _choose_fox(self, (x, y)):
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
934 fox_cls = misc.WeightedSelection(self.level.fox_weightings).choose()
241
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
935 return fox_cls((x, y))
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
936
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
937 def spawn_foxes(self):
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
938 """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
939 # 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
940 x, y = 0, 0
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
941 width, height = self.tv.size
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
942 min_foxes = max(self.level.min_foxes, (self.days+3)/2) # always more than one fox
323
978efd39a099 Limit maximum numbe of foxes generated
Neil Muller <drnlmuller@gmail.com>
parents: 320
diff changeset
943 new_foxes = min(random.randint(min_foxes, min_foxes*2), self.max_foxes)
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
944 while len(self.foxes) < new_foxes:
73
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
945 side = random.randint(0, 3)
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
946 if side == 0:
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
947 # top
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
948 y = -1
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
949 x = random.randint(-1, width)
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
950 elif side == 1:
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
951 # bottom
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
952 y = height
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
953 x = random.randint(-1, width)
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
954 elif side == 2:
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
955 # left
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
956 x = -1
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
957 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
958 else:
73
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
959 x = width
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
960 y = random.randint(-1, height)
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
961 skip = False
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
962 for other_fox in self.foxes:
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
963 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
964 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
965 break
73
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
966 if not skip:
241
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
967 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
968
67
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
969 def fix_buildings(self):
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
970 """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
971 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
972
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
973 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
974 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
975 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
976
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
977 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
978 """
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
979 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
980
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
981 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
982 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
983 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
984 tile_pos = (x, y)
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
985 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
986 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
987 continue
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
988
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
989 covered = False
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
990 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
991 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
992 covered = True
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
993 break
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
994
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
995 if covered:
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
996 continue
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
997
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
998 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
999 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
1000 building.remove(self.tv)
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
1001 building.place(self.tv)
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
1002 self.add_building(building)
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
1003
307
bf1df0902883 three game modes: fortnight, quarter, fox extinction
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 305
diff changeset
1004 def trees_left(self):
bf1df0902883 three game modes: fortnight, quarter, fox extinction
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 305
diff changeset
1005 width, height = self.tv.size
bf1df0902883 three game modes: fortnight, quarter, fox extinction
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 305
diff changeset
1006 return len([(x,y) for x in range(width) for y in range(height) if self.tv.get((x,y)) == self.WOODLAND])
bf1df0902883 three game modes: fortnight, quarter, fox extinction
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 305
diff changeset
1007
326
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1008
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1009 class TextDialog(gui.Dialog):
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1010 def __init__(self, title, text, **params):
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1011 title_label = gui.Label(title)
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1012
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1013 doc = gui.Document()
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1014
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1015 space = doc.style.font.size(" ")
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1016
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1017 for paragraph in text.split('\n\n'):
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1018 doc.block(align=-1)
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1019 for word in paragraph.split():
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1020 doc.add(gui.Label(word))
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1021 doc.space(space)
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1022 doc.br(space[1])
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1023 doc.br(space[1])
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1024
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1025 done_button = gui.Button("Close")
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1026 done_button.connect(gui.CLICK, self.close)
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1027
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1028 tbl = gui.Table()
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1029 tbl.tr()
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1030 tbl.td(doc)
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1031 tbl.tr()
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1032 tbl.td(done_button, align=1)
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1033
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1034 gui.Dialog.__init__(self, title_label, tbl, **params)
336
82a18615a0ab Ask 'Are you sure?'
Neil Muller <drnlmuller@gmail.com>
parents: 330
diff changeset
1035
82a18615a0ab Ask 'Are you sure?'
Neil Muller <drnlmuller@gmail.com>
parents: 330
diff changeset
1036