annotate gamelib/gameboard.py @ 290:664bba9be40a

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