annotate gamelib/gameboard.py @ 444:feb9b7a23ef2

Support for saving and loading games (toolbar entries commented out for lack of space).
author Simon Cross <hodgestar@gmail.com>
date Sat, 21 Nov 2009 19:08:22 +0000
parents f2a55e5e24db
children f04a2490c35f
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
24
7584453f4944 Add support for PNG tiles.
Simon Cross <hodgestar@gmail.com>
parents: 17
diff changeset
8 import tiles
79
8241386a1651 Add chicken counter
Neil Muller <drnlmuller@gmail.com>
parents: 77
diff changeset
9 import icons
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
10 import constants
57
08665fa60345 Implement henhouses and henhouse adding.
Simon Cross <hodgestar@gmail.com>
parents: 54
diff changeset
11 import buildings
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
12 import animal
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
13 import equipment
94
fa8d8fc1bf5b Added some sounds
David Fraser <davidf@sjsoft.com>
parents: 92
diff changeset
14 import sound
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
15 import cursors
186
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
16 import sprite_cursor
241
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
17 import misc
433
8643893635e7 Seperate toolbar and gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 428
diff changeset
18 import toolbar
444
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
19 import serializer
152
702bc0eb2ac3 Fix Toolbar width to TOOLBAR_WIDTH by not allowing it to resize.
Simon Cross <hodgestar@gmail.com>
parents: 151
diff changeset
20
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
21 class VidWidget(gui.Widget):
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
22 def __init__(self, gameboard, vid, **params):
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
23 gui.Widget.__init__(self, **params)
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
24 self.gameboard = gameboard
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
25 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
26 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
27
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
28 def paint(self, surface):
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
29 self.vid.paint(surface)
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
30
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
31 def update(self, surface):
380
1586eccdefe4 Ripped out legacy animation infrastructure in favour of layered sprites.
Jeremy Thurgood <firxen@gmail.com>
parents: 379
diff changeset
32 return self.vid.update(surface)
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
33
39
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
34 def move_view(self, x, y):
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
35 self.vid.view.move_ip((x, y))
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
36
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
37 def event(self, e):
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
38 if e.type == MOUSEBUTTONDOWN:
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
39 self.gameboard.use_tool(e)
186
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
40 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
41 self.gameboard.update_sprite_cursor(e)
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
42
444
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
43 class GameBoard(serializer.Simplifiable):
9
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
44
66
edc15ce8fa30 Implement fence selling (a bit hackish, but fine for now).
Simon Cross <hodgestar@gmail.com>
parents: 65
diff changeset
45 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
46 FENCE = tiles.REVERSE_TILE_MAP['fence']
79
8241386a1651 Add chicken counter
Neil Muller <drnlmuller@gmail.com>
parents: 77
diff changeset
47 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
48 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
49
444
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
50 SIMPLIFY = [
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
51 'chickens',
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
52 'buildings',
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
53 'foxes',
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
54 'cash',
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
55 'wood',
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
56 'eggs',
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
57 'days',
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
58 'killed_foxes',
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
59 'day', 'night',
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
60 ]
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
61
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
62 def __init__(self, main_app, level):
151
082868bea873 Refactor UI so that only a single gui.App is used. Pass all UI events via main_app. Change Toolbar table to use .td() everywhere. Move toolbar to top.
Simon Cross <hodgestar@gmail.com>
parents: 148
diff changeset
63 self.disp = main_app
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
64 self.level = level
24
7584453f4944 Add support for PNG tiles.
Simon Cross <hodgestar@gmail.com>
parents: 17
diff changeset
65 self.tv = tiles.FarmVid()
303
e12d99215b74 Fix up data module unix-to-local path fixing. Fix similar problems in tile importing.
Simon Cross <hodgestar@gmail.com>
parents: 302
diff changeset
66 self.tv.png_folder_load_tiles('tiles')
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
67 self.tv.tga_load_level(level.map)
382
e89e6ad011ac Use code layer to place chickens
Neil Muller <drnlmuller@gmail.com>
parents: 381
diff changeset
68 width, height = self.tv.size
323
978efd39a099 Limit maximum numbe of foxes generated
Neil Muller <drnlmuller@gmail.com>
parents: 320
diff changeset
69 # Ensure we don't every try to create more foxes then is sane
403
c7cfa230f5d4 Remove board size restriction on number of foxes
Neil Muller <drnlmuller@gmail.com>
parents: 401
diff changeset
70 self.max_foxes = level.max_foxes
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
71
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
72 self.selected_tool = None
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
73 self.animal_to_place = None
186
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
74 self.sprite_cursor = None
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
75 self.chickens = set()
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
76 self.foxes = set()
444
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
77 self.buildings = set()
401
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
78 self._pos_cache = { 'fox' : [], 'chicken' : []}
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
79 self.cash = 0
422
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
80 self.wood = 0
118
2c76ed47fc44 Remove chicken respawn at day start. Handle eaten chickens in henhouses better
Neil Muller <drnlmuller@gmail.com>
parents: 116
diff changeset
81 self.eggs = 0
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
82 self.days = 0
79
8241386a1651 Add chicken counter
Neil Muller <drnlmuller@gmail.com>
parents: 77
diff changeset
83 self.killed_foxes = 0
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
84 self.day, self.night = True, False
424
fbef17cab632 Use fully rendered map in gameboard choosing screen
Neil Muller <drnlmuller@gmail.com>
parents: 422
diff changeset
85 # For the level loading case
fbef17cab632 Use fully rendered map in gameboard choosing screen
Neil Muller <drnlmuller@gmail.com>
parents: 422
diff changeset
86 if self.disp:
fbef17cab632 Use fully rendered map in gameboard choosing screen
Neil Muller <drnlmuller@gmail.com>
parents: 422
diff changeset
87 self.create_display()
fbef17cab632 Use fully rendered map in gameboard choosing screen
Neil Muller <drnlmuller@gmail.com>
parents: 422
diff changeset
88 self.add_cash(level.starting_cash)
428
a356e57529ea buildings cost wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 425
diff changeset
89 self.add_wood(level.starting_wood)
17
cbbc5da7708a Interaction with the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 14
diff changeset
90
67
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
91 self.fix_buildings()
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
92
408
02a6de5629d6 Levels can include starting equipment
Neil Muller <drnlmuller@gmail.com>
parents: 405
diff changeset
93 cdata = {}
02a6de5629d6 Levels can include starting equipment
Neil Muller <drnlmuller@gmail.com>
parents: 405
diff changeset
94 for tn in equipment.EQUIP_MAP:
02a6de5629d6 Levels can include starting equipment
Neil Muller <drnlmuller@gmail.com>
parents: 405
diff changeset
95 cdata[tn] = (self.add_start_chickens, tn)
382
e89e6ad011ac Use code layer to place chickens
Neil Muller <drnlmuller@gmail.com>
parents: 381
diff changeset
96
e89e6ad011ac Use code layer to place chickens
Neil Muller <drnlmuller@gmail.com>
parents: 381
diff changeset
97 self.tv.run_codes(cdata, (0,0,width,height))
118
2c76ed47fc44 Remove chicken respawn at day start. Handle eaten chickens in henhouses better
Neil Muller <drnlmuller@gmail.com>
parents: 116
diff changeset
98
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
99 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
100 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
101
082868bea873 Refactor UI so that only a single gui.App is used. Pass all UI events via main_app. Change Toolbar table to use .td() everywhere. Move toolbar to top.
Simon Cross <hodgestar@gmail.com>
parents: 148
diff changeset
102 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
103 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
104 tbl = gui.Table()
5569430fd82e Display cleanup and rationalisation.
Jeremy Thurgood <firxen@gmail.com>
parents: 35
diff changeset
105 tbl.tr()
434
f2a55e5e24db Disable non-selectable toolbar widgets at night
Neil Muller <drnlmuller@gmail.com>
parents: 433
diff changeset
106 self.toolbar = toolbar.ToolBar(self, width=constants.TOOLBAR_WIDTH)
151
082868bea873 Refactor UI so that only a single gui.App is used. Pass all UI events via main_app. Change Toolbar table to use .td() everywhere. Move toolbar to top.
Simon Cross <hodgestar@gmail.com>
parents: 148
diff changeset
107 tbl.td(self.toolbar, valign=-1)
433
8643893635e7 Seperate toolbar and gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 428
diff changeset
108 self.tvw = VidWidget(self, self.tv, width=width-constants.TOOLBAR_WIDTH, height=height)
37
497b53b69280 Always update the vidwidget.
Jeremy Thurgood <firxen@gmail.com>
parents: 36
diff changeset
109 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
110 self.top_widget = tbl
14
d7f295c06a4b Split gameboard screen.
Jeremy Thurgood <firxen@gmail.com>
parents: 12
diff changeset
111
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
112 def update(self):
37
497b53b69280 Always update the vidwidget.
Jeremy Thurgood <firxen@gmail.com>
parents: 36
diff changeset
113 self.tvw.reupdate()
9
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
114
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
115 def loop(self):
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
116 self.tv.loop()
9
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
117
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
118 def set_selected_tool(self, tool, cursor):
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
119 if not self.day:
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
120 return
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
121 self.selected_tool = tool
213
07b361ebd87f Ensure we clean up highlights, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 212
diff changeset
122 if self.animal_to_place:
07b361ebd87f Ensure we clean up highlights, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 212
diff changeset
123 # Clear any highlights
305
32149b1d9fd2 Capitalised all equipment names.
Jeremy Thurgood <firxen@gmail.com>
parents: 303
diff changeset
124 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
125 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
126 sprite_curs = None
653da96db572 Fixed dangling cursor sprite and did some TODO list maintenance.
Jeremy Thurgood <firxen@gmail.com>
parents: 202
diff changeset
127 if buildings.is_building(tool):
232
0bd214cf9018 Overlay cost on building sprite cursors.
Simon Cross <hodgestar@gmail.com>
parents: 228
diff changeset
128 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
129 elif equipment.is_equipment(tool):
5b9cd693fe7c Add sprite cursors for equipment buying.
Simon Cross <hodgestar@gmail.com>
parents: 245
diff changeset
130 sprite_curs = sprite_cursor.SpriteCursor(tool.CHICKEN_IMAGE_FILE, self.tv)
203
653da96db572 Fixed dangling cursor sprite and did some TODO list maintenance.
Jeremy Thurgood <firxen@gmail.com>
parents: 202
diff changeset
131 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
132
653da96db572 Fixed dangling cursor sprite and did some TODO list maintenance.
Jeremy Thurgood <firxen@gmail.com>
parents: 202
diff changeset
133 def set_cursor(self, cursor=None, sprite_curs=None):
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
134 if cursor:
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
135 pygame.mouse.set_cursor(*cursor)
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
136 else:
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
137 pygame.mouse.set_cursor(*cursors.cursors['arrow'])
379
a8a7ada27fa2 Multilayer sprite ordering. Only used by cursors so far.
Jeremy Thurgood <firxen@gmail.com>
parents: 378
diff changeset
138 if self.sprite_cursor is not None:
a8a7ada27fa2 Multilayer sprite ordering. Only used by cursors so far.
Jeremy Thurgood <firxen@gmail.com>
parents: 378
diff changeset
139 self.tv.sprites.remove(self.sprite_cursor, layer='cursor')
218
5cb0e0b9cd16 Make sprite cursors stay on top by fudging the sprite list. :/
Simon Cross <hodgestar@gmail.com>
parents: 217
diff changeset
140 self.sprite_cursor = sprite_curs
379
a8a7ada27fa2 Multilayer sprite ordering. Only used by cursors so far.
Jeremy Thurgood <firxen@gmail.com>
parents: 378
diff changeset
141 if self.sprite_cursor is not None:
a8a7ada27fa2 Multilayer sprite ordering. Only used by cursors so far.
Jeremy Thurgood <firxen@gmail.com>
parents: 378
diff changeset
142 self.tv.sprites.append(self.sprite_cursor, layer='cursor')
213
07b361ebd87f Ensure we clean up highlights, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 212
diff changeset
143
07b361ebd87f Ensure we clean up highlights, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 212
diff changeset
144 def reset_states(self):
07b361ebd87f Ensure we clean up highlights, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 212
diff changeset
145 """Clear current states (highlights, etc.)"""
245
634491bf37e8 Change toolbar to gui.Toolbar -- gives nicer highlighting.
Simon Cross <hodgestar@gmail.com>
parents: 243
diff changeset
146 self.set_selected_tool(None, None)
634491bf37e8 Change toolbar to gui.Toolbar -- gives nicer highlighting.
Simon Cross <hodgestar@gmail.com>
parents: 243
diff changeset
147 self.toolbar.clear_tool()
17
cbbc5da7708a Interaction with the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 14
diff changeset
148
186
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
149 def update_sprite_cursor(self, e):
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
150 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
151 self.sprite_cursor.set_pos(tile_pos)
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
152
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
153 def start_night(self):
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
154 self.day, self.night = False, True
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
155 self.tv.sun(False)
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
156 self.reset_states()
434
f2a55e5e24db Disable non-selectable toolbar widgets at night
Neil Muller <drnlmuller@gmail.com>
parents: 433
diff changeset
157 self.toolbar.start_night()
413
bdc4757e0497 Add Sniper Rifle and give guns limited ammunition.
Jeremy Thurgood <firxen@gmail.com>
parents: 408
diff changeset
158 self.spawn_foxes()
414
9096c237928c Dear most illustrious brother, I seek your cooperation with the refactoring of egg layerings and the reloading of guns. Please to provide bank details.
Jeremy Thurgood <firxen@gmail.com>
parents: 413
diff changeset
159 self.eggs = 0
419
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
160 for chicken in self.chickens.copy():
414
9096c237928c Dear most illustrious brother, I seek your cooperation with the refactoring of egg layerings and the reloading of guns. Please to provide bank details.
Jeremy Thurgood <firxen@gmail.com>
parents: 413
diff changeset
161 chicken.start_night(self)
9096c237928c Dear most illustrious brother, I seek your cooperation with the refactoring of egg layerings and the reloading of guns. Please to provide bank details.
Jeremy Thurgood <firxen@gmail.com>
parents: 413
diff changeset
162 self.toolbar.update_egg_counter(self.eggs)
425
1d0cc37b4e14 Add method for clearing all chickens (will be useful later). Cache animal positions only just before night starts. Range-check position before adding it to the cache.
Simon Cross <hodgestar@gmail.com>
parents: 424
diff changeset
163 self._cache_animal_positions()
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
164
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
165 def start_day(self):
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
166 self.day, self.night = True, False
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
167 self.tv.sun(True)
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
168 self.reset_states()
434
f2a55e5e24db Disable non-selectable toolbar widgets at night
Neil Muller <drnlmuller@gmail.com>
parents: 433
diff changeset
169 self.toolbar.start_day()
401
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
170 self._pos_cache = { 'fox' : [], 'chicken' : []}
413
bdc4757e0497 Add Sniper Rifle and give guns limited ammunition.
Jeremy Thurgood <firxen@gmail.com>
parents: 408
diff changeset
171 self.advance_day()
bdc4757e0497 Add Sniper Rifle and give guns limited ammunition.
Jeremy Thurgood <firxen@gmail.com>
parents: 408
diff changeset
172 self.clear_foxes()
419
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
173 for chicken in self.chickens.copy():
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
174 chicken.start_day(self)
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
175 self.toolbar.update_egg_counter(self.eggs)
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
176
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
177 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
178 """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
179 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
180 return False
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
181 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
182 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
183 return False
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
184 return True
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
185
17
cbbc5da7708a Interaction with the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 14
diff changeset
186 def use_tool(self, e):
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
187 if not self.day:
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
188 return
189
37af9e5dd292 Use tool with left button, cancel tool with right button.
Jeremy Thurgood <firxen@gmail.com>
parents: 186
diff changeset
189 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
190 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
191 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
192 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
193 return
52
0d4799866bcf Sell chickens and buy fences.
Jeremy Thurgood <firxen@gmail.com>
parents: 40
diff changeset
194 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
195 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
196 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
197 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
198 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
199 self.place_animal(self.tv.screen_to_tile(e.pos))
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
200 elif self.selected_tool == constants.TOOL_SELL_BUILDING:
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
201 self.sell_building(self.tv.screen_to_tile(e.pos))
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
202 elif self.selected_tool == constants.TOOL_SELL_EQUIPMENT:
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
203 self.sell_equipment(self.tv.screen_to_tile(e.pos))
378
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
204 elif self.selected_tool == constants.TOOL_REPAIR_BUILDING:
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
205 self.repair_building(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
206 elif buildings.is_building(self.selected_tool):
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
207 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
208 elif equipment.is_equipment(self.selected_tool):
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
209 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
210
166
4aa800354b7c Rename get_chicken to get_outside_chicken.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
211 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
212 for chick in self.chickens:
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
213 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
214 return chick
b8f64db0d39e Cleaned up buying and selling a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 52
diff changeset
215 return None
57
08665fa60345 Implement henhouses and henhouse adding.
Simon Cross <hodgestar@gmail.com>
parents: 54
diff changeset
216
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
217 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
218 for building in self.buildings:
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
219 if building.covers(tile_pos):
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
220 return building
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
221 return None
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
222
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
223 def sell_chicken(self, tile_pos):
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
224
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
225 def do_sell(chicken, update_button=None):
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
226 if not chicken:
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
227 return False # sanity check
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
228 if len(self.chickens) == 1:
326
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
229 msg = "You can't sell your last chicken!"
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
230 TextDialog("Squuaaawwwwwk!", msg).open()
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
231 return False
228
f74de4280e20 Sell chicken's equipment when you sell the chicken.
Simon Cross <hodgestar@gmail.com>
parents: 227
diff changeset
232 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
233 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
234 chicken.unequip(item)
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
235 self.add_cash(self.level.sell_price_chicken)
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
236 sound.play_sound("sell-chicken.ogg")
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
237 if update_button:
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
238 update_button(chicken, empty=True)
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
239 self.remove_chicken(chicken)
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
240 return True
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
241
166
4aa800354b7c Rename get_chicken to get_outside_chicken.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
242 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
243 if chick is None:
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
244 building = self.get_building(tile_pos)
414
9096c237928c Dear most illustrious brother, I seek your cooperation with the refactoring of egg layerings and the reloading of guns. Please to provide bank details.
Jeremy Thurgood <firxen@gmail.com>
parents: 413
diff changeset
245 if building and building.HENHOUSE:
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
246 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
247 return
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
248 do_sell(chick)
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
249
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
250 def sell_one_egg(self, chicken):
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
251 if chicken.eggs:
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
252 self.add_cash(self.level.sell_price_egg)
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
253 chicken.remove_one_egg()
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
254 self.eggs -= 1
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
255 self.toolbar.update_egg_counter(self.eggs)
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
256 return True
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
257 return False
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
258
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
259 def sell_egg(self, tile_pos):
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
260 def do_sell(chicken, update_button=None):
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
261 # We try sell and egg
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
262 if self.sell_one_egg(chicken):
193
db246683d5da Selling eggs now works
Neil Muller <drnlmuller@gmail.com>
parents: 192
diff changeset
263 sound.play_sound("sell-chicken.ogg")
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
264 # Force toolbar update
193
db246683d5da Selling eggs now works
Neil Muller <drnlmuller@gmail.com>
parents: 192
diff changeset
265 self.toolbar.chsize()
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
266 if update_button:
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
267 update_button(chicken)
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
268 return False
193
db246683d5da Selling eggs now works
Neil Muller <drnlmuller@gmail.com>
parents: 192
diff changeset
269
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
270 building = self.get_building(tile_pos)
414
9096c237928c Dear most illustrious brother, I seek your cooperation with the refactoring of egg layerings and the reloading of guns. Please to provide bank details.
Jeremy Thurgood <firxen@gmail.com>
parents: 413
diff changeset
271 if building and building.HENHOUSE:
193
db246683d5da Selling eggs now works
Neil Muller <drnlmuller@gmail.com>
parents: 192
diff changeset
272 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
273
200
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
274 def select_animal_to_place(self, animal):
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
275 if self.animal_to_place:
305
32149b1d9fd2 Capitalised all equipment names.
Jeremy Thurgood <firxen@gmail.com>
parents: 303
diff changeset
276 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
277 self.animal_to_place = animal
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
278 if self.animal_to_place:
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
279 self.animal_to_place.equip(equipment.Spotlight())
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
280
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
281 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
282 """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
283
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
284 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
285 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
286 """
166
4aa800354b7c Rename get_chicken to get_outside_chicken.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
287 chicken = self.get_outside_chicken(tile_pos)
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
288 if chicken:
108
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 105
diff changeset
289 if chicken is self.animal_to_place:
200
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
290 self.select_animal_to_place(None)
165
c7d496556475 Minor cursor bugfixes
Neil Muller <drnlmuller@gmail.com>
parents: 164
diff changeset
291 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
292 else:
200
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
293 self.select_animal_to_place(chicken)
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
294 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
295 return
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
296 building = self.get_building(tile_pos)
378
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
297 if building and building.ABODE:
197
d74693555b86 Put chickens into first empty space in buildings to make it easier to add lots of chickens.
Simon Cross <hodgestar@gmail.com>
parents: 194
diff changeset
298 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
299 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
300 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
301 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
302 self.animal_to_place.equip(equipment.Nest())
200
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
303 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
304 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
305 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
306 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
307 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
308 self.open_building_dialog(building)
108
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 105
diff changeset
309 return
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 105
diff changeset
310 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
311 if self.animal_to_place is not None:
305
32149b1d9fd2 Capitalised all equipment names.
Jeremy Thurgood <firxen@gmail.com>
parents: 303
diff changeset
312 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
313 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
314 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
315 self.animal_to_place.remove_eggs()
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
316 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
317
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
318 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
319 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
320 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
321 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
322 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
323 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
324 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
325 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
326 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
327 self.set_visibility(chicken)
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
328
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
329 def set_visibility(self, animal):
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
330 if animal.outside():
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
331 if animal not in self.tv.sprites:
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
332 self.tv.sprites.append(animal)
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
333 else:
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
334 if animal in self.tv.sprites:
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
335 self.tv.sprites.remove(animal)
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
336
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
337 def open_dialog(self, widget, x=None, y=None, close_callback=None):
115
2b2007e231da Start of dialog for placing chickens in buildings. Remove chicken in hen house bug by not allowing chickens in hen houses.
Simon Cross <hodgestar@gmail.com>
parents: 109
diff changeset
338 """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
339 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
340
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
341 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
342 self.disp.close(tbl)
170
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
343 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
344 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
345
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
346 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
347 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
348
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
349 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
350 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
351 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
352 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
353 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
354 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
355
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
356 if x:
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
357 offset = (self.disp.rect.center[0] + x,
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
358 self.disp.rect.center[1] + y)
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
359 else:
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
360 offset = None
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
361 self.disp.open(tbl, pos=offset)
169
946f09ed37cd Make equipment dialog close after selecting an item to sell.
Simon Cross <hodgestar@gmail.com>
parents: 168
diff changeset
362 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
363
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
364 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
365 """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
366
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
367 place_button_map = {}
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
368
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
369 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
370 """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
371 if animal:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
372 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
373 if button:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
374 if empty:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
375 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
376 else:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
377 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
378
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
379 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
380 """Handle a nest being clicked."""
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
381 if place.occupant:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
382 # 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
383 if not sell_callback:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
384 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
385 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
386 # 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
387 update_button(old_animal)
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
388 # 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
389 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
390 else:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
391 # Attempt to sell the occupant
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
392 sell_callback(place.occupant, update_button)
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
393 else:
208
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
394 # 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
395 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
396 # 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
397 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
398 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
399 # 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
400 update_button(self.animal_to_place)
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
401
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
402 tbl = gui.Table()
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
403 columns = building.max_floor_width()
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
404 kwargs = { 'style': { 'padding_left': 10, 'padding_bottom': 10 }}
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
405 for floor in building.floors():
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
406 tbl.tr()
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
407 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
408 tbl.tr()
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
409 for row in floor.rows():
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
410 tbl.tr()
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
411 for place in row:
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
412 if place.occupant is None:
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
413 button = gui.Button(icons.EMPTY_NEST_ICON)
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
414 else:
201
fe1e9c18d4d7 layering bugfix; indoor chickens now use normal chicken icons
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 200
diff changeset
415 button = gui.Button(icons.animal_icon(place.occupant))
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
416 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
417 button.connect(gui.CLICK, nest_clicked, place, button)
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
418 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
419
170
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
420 building.selected(True)
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
421 def close_callback():
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
422 building.selected(False)
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
423
262
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
424 def evict_callback():
264
812bd4cda8b8 evict button
Neil Muller <drnlmuller@gmail.com>
parents: 262
diff changeset
425 if not self.animal_to_place:
812bd4cda8b8 evict button
Neil Muller <drnlmuller@gmail.com>
parents: 262
diff changeset
426 return
812bd4cda8b8 evict button
Neil Muller <drnlmuller@gmail.com>
parents: 262
diff changeset
427 for tile_pos in building.adjacent_tiles():
812bd4cda8b8 evict button
Neil Muller <drnlmuller@gmail.com>
parents: 262
diff changeset
428 if self.tv.get(tile_pos) != self.GRASSLAND:
812bd4cda8b8 evict button
Neil Muller <drnlmuller@gmail.com>
parents: 262
diff changeset
429 continue
812bd4cda8b8 evict button
Neil Muller <drnlmuller@gmail.com>
parents: 262
diff changeset
430 if self.get_outside_chicken(tile_pos) is None:
812bd4cda8b8 evict button
Neil Muller <drnlmuller@gmail.com>
parents: 262
diff changeset
431 update_button(self.animal_to_place, empty=True)
812bd4cda8b8 evict button
Neil Muller <drnlmuller@gmail.com>
parents: 262
diff changeset
432 self.place_animal(tile_pos)
812bd4cda8b8 evict button
Neil Muller <drnlmuller@gmail.com>
parents: 262
diff changeset
433 break
262
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
434
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
435 if not sell_callback:
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
436 tbl.tr()
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
437 button = gui.Button('Evict')
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
438 button.connect(gui.CLICK, evict_callback)
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
439 tbl.td(button, colspan=2, **kwargs)
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
440
170
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
441 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
442
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
443 def buy_building(self, tile_pos, building_cls):
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
444 building = building_cls(tile_pos)
428
a356e57529ea buildings cost wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 425
diff changeset
445 if self.wood < building.buy_price():
57
08665fa60345 Implement henhouses and henhouse adding.
Simon Cross <hodgestar@gmail.com>
parents: 54
diff changeset
446 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
447 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
448 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
449 if building.place(self.tv):
428
a356e57529ea buildings cost wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 425
diff changeset
450 self.add_wood(-building.buy_price())
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
451 self.add_building(building)
60
e2631c8e2cd6 Implement guard towers (with temporary sprite PNG).
Simon Cross <hodgestar@gmail.com>
parents: 57
diff changeset
452
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
453 def buy_equipment(self, tile_pos, equipment_cls):
298
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
454
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
455 equipment = equipment_cls()
298
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
456
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
457 def do_equip(chicken, update_button=None):
298
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
458 # Try to equip the chicken
361
d2acf43aba6f Don't go into debt when buying equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 360
diff changeset
459 if self.cash < equipment.buy_price():
d2acf43aba6f Don't go into debt when buying equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 360
diff changeset
460 return False
298
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
461 if equipment.place(chicken):
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
462 self.add_cash(-equipment.buy_price())
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
463 chicken.equip(equipment)
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
464 if update_button:
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
465 update_button(chicken)
298
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
466 return False
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
467
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
468 chicken = self.get_outside_chicken(tile_pos)
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
469 if chicken is None:
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
470 building = self.get_building(tile_pos)
378
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
471 if not (building and building.ABODE):
298
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
472 return
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
473 # Bounce through open dialog once more
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
474 self.open_building_dialog(building, do_equip)
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
475 else:
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
476 do_equip(chicken)
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
477
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
478 def sell_building(self, tile_pos):
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
479 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
480 if building is None:
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
481 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
482 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
483 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
484 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
485 return
428
a356e57529ea buildings cost wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 425
diff changeset
486 self.add_wood(building.sell_price())
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
487 building.remove(self.tv)
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
488 self.remove_building(building)
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
489
378
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
490 def repair_building(self, tile_pos):
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
491 building = self.get_building(tile_pos)
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
492 if not (building and building.broken()):
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
493 return
428
a356e57529ea buildings cost wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 425
diff changeset
494 if self.wood < building.repair_price():
a356e57529ea buildings cost wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 425
diff changeset
495 return
a356e57529ea buildings cost wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 425
diff changeset
496 self.add_wood(-building.repair_price())
378
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
497 building.repair(self.tv)
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
498
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
499 def sell_equipment(self, tile_pos):
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
500 x, y = 0, 0
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
501 def do_sell(chicken, update_button=None):
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
502 if not chicken.equipment:
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
503 return
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
504 elif len(chicken.equipment) == 1:
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
505 item = chicken.equipment[0]
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
506 self.add_cash(item.sell_price())
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
507 chicken.unequip(item)
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
508 if update_button:
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
509 update_button(chicken)
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
510 else:
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
511 self.open_equipment_dialog(chicken, x, y, update_button)
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
512 return False
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
513
166
4aa800354b7c Rename get_chicken to get_outside_chicken.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
514 chicken = self.get_outside_chicken(tile_pos)
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
515 if chicken is not None:
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
516 do_sell(chicken)
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
517 else:
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
518 building = self.get_building(tile_pos)
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
519 if building is None:
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
520 return
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
521 x, y = 50, 0
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
522 self.open_building_dialog(building, do_sell)
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
523
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
524 def open_equipment_dialog(self, chicken, x, y, update_button=None):
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
525 tbl = gui.Table()
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
526
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
527 def sell_item(item, button):
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
528 """Select item of equipment."""
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
529 self.add_cash(item.sell_price())
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
530 chicken.unequip(item)
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
531 if update_button:
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
532 update_button(chicken)
169
946f09ed37cd Make equipment dialog close after selecting an item to sell.
Simon Cross <hodgestar@gmail.com>
parents: 168
diff changeset
533 self.disp.close(dialog)
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
534
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
535 kwargs = { 'style': { 'padding_left': 10, 'padding_bottom': 10 }}
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
536
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
537 tbl.tr()
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
538 tbl.td(gui.Button("Sell ... "), align=-1, **kwargs)
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
539
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
540 for item in chicken.equipment:
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
541 tbl.tr()
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
542 button = gui.Button(item.name().title())
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
543 button.connect(gui.CLICK, sell_item, item, button)
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
544 tbl.td(button, align=1, **kwargs)
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
545
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
546 dialog = self.open_dialog(tbl, x=x, y=y)
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
547
14
d7f295c06a4b Split gameboard screen.
Jeremy Thurgood <firxen@gmail.com>
parents: 12
diff changeset
548 def event(self, e):
262
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
549 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
550 if e.key == K_UP:
433
8643893635e7 Seperate toolbar and gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 428
diff changeset
551 self.tvw.move_view(0, -constants.TILE_DIMENSIONS[1])
39
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
552 if e.key == K_DOWN:
433
8643893635e7 Seperate toolbar and gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 428
diff changeset
553 self.tvw.move_view(0, constants.TILE_DIMENSIONS[1])
39
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
554 if e.key == K_LEFT:
433
8643893635e7 Seperate toolbar and gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 428
diff changeset
555 self.tvw.move_view(-constants.TILE_DIMENSIONS[0], 0)
39
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
556 if e.key == K_RIGHT:
433
8643893635e7 Seperate toolbar and gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 428
diff changeset
557 self.tvw.move_view(constants.TILE_DIMENSIONS[0], 0)
262
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
558 return True
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
559 return False
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
560
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
561 def advance_day(self):
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
562 self.days += 1
392
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
563 if self.level.is_last_day(self.days):
345
279974cc0698 Only set color of days left to red when there is only one day left.
Simon Cross <hodgestar@gmail.com>
parents: 341
diff changeset
564 self.toolbar.day_counter.style.color = (255, 0, 0)
346
6baf8b5beb5c Remove the "constant" constant
Neil Muller <drnlmuller@gmail.com>
parents: 345
diff changeset
565 self.toolbar.update_day_counter("%s/%s" % (self.days,
392
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
566 self.level.get_max_turns()))
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
567
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
568 def clear_foxes(self):
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
569 for fox in self.foxes.copy():
80
ad9d1bc7ef0c Kill foxes that don't reach safety
Neil Muller <drnlmuller@gmail.com>
parents: 79
diff changeset
570 # 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
571 # killed
395
2d0ff46118e2 Basic support for z coordinate
Neil Muller <drnlmuller@gmail.com>
parents: 392
diff changeset
572 if self.in_bounds(fox.pos) and \
2d0ff46118e2 Basic support for z coordinate
Neil Muller <drnlmuller@gmail.com>
parents: 392
diff changeset
573 self.tv.get(fox.pos.to_tile_tuple()) != self.WOODLAND:
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
574 self.kill_fox(fox)
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
575 else:
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
576 self.remove_fox(fox)
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
577 self.foxes = set() # Remove all the foxes
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
578
425
1d0cc37b4e14 Add method for clearing all chickens (will be useful later). Cache animal positions only just before night starts. Range-check position before adding it to the cache.
Simon Cross <hodgestar@gmail.com>
parents: 424
diff changeset
579 def clear_chickens(self):
1d0cc37b4e14 Add method for clearing all chickens (will be useful later). Cache animal positions only just before night starts. Range-check position before adding it to the cache.
Simon Cross <hodgestar@gmail.com>
parents: 424
diff changeset
580 for chicken in self.chickens.copy():
1d0cc37b4e14 Add method for clearing all chickens (will be useful later). Cache animal positions only just before night starts. Range-check position before adding it to the cache.
Simon Cross <hodgestar@gmail.com>
parents: 424
diff changeset
581 self.remove_chicken(chicken)
1d0cc37b4e14 Add method for clearing all chickens (will be useful later). Cache animal positions only just before night starts. Range-check position before adding it to the cache.
Simon Cross <hodgestar@gmail.com>
parents: 424
diff changeset
582
444
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
583 def clear_buildings(self):
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
584 for building in self.buildings.copy():
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
585 self.remove_building(building)
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
586
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
587 def do_night_step(self):
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
588 """Handle the events of the night.
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
589
122
d2b19131d537 Don't continue the night if we're not doing anything anymore
Neil Muller <drnlmuller@gmail.com>
parents: 119
diff changeset
590 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
591 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
592 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
593 return True
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
594 # Move all the foxes
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
595 over = self.foxes_move()
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
596 if not over:
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
597 self.foxes_attack()
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
598 self.chickens_attack()
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
599 return over
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
600
401
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
601 def _cache_animal_positions(self):
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
602 """Cache the current set of fox positions for the avoiding checks"""
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
603 w, h = self.tv.size
401
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
604 self._pos_cache['fox'] = [[[None for z in range(5)] for y in range(h)]
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
605 for x in range(w)] # NB: Assumes z in [0, 4]
401
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
606 self._pos_cache['chicken'] = [[[None for z in range(5)] for y in range(h)]
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
607 for x in range(w)]
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
608 for fox in self.foxes:
401
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
609 self._add_to_pos_cache(fox, 'fox')
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
610 for chick in self.chickens:
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
611 self._add_to_pos_cache(chick, 'chicken')
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
612
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
613 def _add_to_pos_cache(self, animal, cache_type):
425
1d0cc37b4e14 Add method for clearing all chickens (will be useful later). Cache animal positions only just before night starts. Range-check position before adding it to the cache.
Simon Cross <hodgestar@gmail.com>
parents: 424
diff changeset
614 if self.in_bounds(animal.pos):
1d0cc37b4e14 Add method for clearing all chickens (will be useful later). Cache animal positions only just before night starts. Range-check position before adding it to the cache.
Simon Cross <hodgestar@gmail.com>
parents: 424
diff changeset
615 self._pos_cache[cache_type][animal.pos.x][animal.pos.y][animal.pos.z] = animal
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
616
401
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
617 def _update_pos_cache(self, old_pos, animal, cache_type):
405
ae3cee7a1337 Fix crash due to invalid cache
Neil Muller <drnlmuller@gmail.com>
parents: 403
diff changeset
618 if self.in_bounds(old_pos) and self._pos_cache[cache_type]:
401
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
619 self._pos_cache[cache_type][old_pos.x][old_pos.y][old_pos.z] = None
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
620 if animal:
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
621 pos = animal.pos
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
622 if self.in_bounds(pos):
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
623 self._pos_cache[cache_type][pos.x][pos.y][pos.z] = animal
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
624
401
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
625 def get_animal_at_pos(self, pos, cache_type):
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
626 if not self._pos_cache[cache_type]:
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
627 return None # We don't maintain the cache during the day
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
628 if self.in_bounds(pos):
401
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
629 return self._pos_cache[cache_type][pos.x][pos.y][pos.z]
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
630 return None
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
631
422
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
632 def chickens_scatter(self):
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
633 """Chickens outside move around randomly a bit"""
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
634 for chicken in [chick for chick in self.chickens if chick.outside()]:
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
635 old_pos = chicken.pos
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
636 chicken.move(self)
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
637 if chicken.pos != old_pos:
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
638 self._update_pos_cache(old_pos, chicken, 'chicken')
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
639
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
640 def chickens_chop_wood(self):
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
641 """Chickens with axes chop down trees near them"""
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
642 for chicken in [chick for chick in self.chickens if chick.outside()]:
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
643 chicken.chop(self)
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
644
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
645 def foxes_move(self):
122
d2b19131d537 Don't continue the night if we're not doing anything anymore
Neil Muller <drnlmuller@gmail.com>
parents: 119
diff changeset
646 over = True
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
647 for fox in self.foxes:
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
648 old_pos = fox.pos
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
649 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
650 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
651 over = False
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
652 if fox.pos != old_pos:
401
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
653 self._update_pos_cache(old_pos, fox, 'fox')
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
654 return over
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
655
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
656 def foxes_attack(self):
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
657 for fox in self.foxes:
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
658 fox.attack(self)
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
659
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
660 def chickens_attack(self):
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
661 for chicken in self.chickens:
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
662 chicken.attack(self)
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
663
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
664 def add_chicken(self, chicken):
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
665 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
666 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
667 self.tv.sprites.append(chicken)
424
fbef17cab632 Use fully rendered map in gameboard choosing screen
Neil Muller <drnlmuller@gmail.com>
parents: 422
diff changeset
668 if self.disp:
fbef17cab632 Use fully rendered map in gameboard choosing screen
Neil Muller <drnlmuller@gmail.com>
parents: 422
diff changeset
669 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
670
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
671 def add_fox(self, fox):
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
672 self.foxes.add(fox)
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
673 self.tv.sprites.append(fox)
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
674
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
675 def add_building(self, building):
444
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
676 self.buildings.add(building)
381
7a58dadfd251 little cleanups, every sprite in its proper layer.
Jeremy Thurgood <firxen@gmail.com>
parents: 380
diff changeset
677 self.tv.sprites.append(building, layer='buildings')
60
e2631c8e2cd6 Implement guard towers (with temporary sprite PNG).
Simon Cross <hodgestar@gmail.com>
parents: 57
diff changeset
678
419
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
679 def place_hatched_chicken(self, new_chick, building):
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
680 try:
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
681 building.add_occupant(new_chick)
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
682 self.add_chicken(new_chick)
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
683 new_chick.equip(equipment.Nest())
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
684 except buildings.BuildingFullError:
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
685 # No space in the hen house, look nearby
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
686 for tile_pos in building.adjacent_tiles():
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
687 if self.tv.get(tile_pos) != self.GRASSLAND:
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
688 continue
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
689 if self.get_outside_chicken(tile_pos) is None:
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
690 self.add_chicken(new_chick)
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
691 self.relocate_animal(new_chick, tile_pos=tile_pos)
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
692 break
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
693 # if there isn't a space for the
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
694 # new chick it dies. :/ Farm life
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
695 # is cruel.
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
696
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
697 def kill_fox(self, fox):
251
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 247
diff changeset
698 self.killed_foxes += 1
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 247
diff changeset
699 self.toolbar.update_fox_counter(self.killed_foxes)
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
700 self.add_cash(self.level.sell_price_dead_fox)
401
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
701 self._update_pos_cache(fox.pos, None, 'fox')
251
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 247
diff changeset
702 self.remove_fox(fox)
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
703
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
704 def remove_fox(self, fox):
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
705 self.foxes.discard(fox)
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
706 if fox.building:
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
707 fox.building.remove_predator(fox)
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
708 if fox in self.tv.sprites:
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
709 self.tv.sprites.remove(fox)
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
710
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
711 def remove_chicken(self, chick):
215
85a5299caf4a bugfix: deselect eaten chickens
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 213
diff changeset
712 if chick is self.animal_to_place:
85a5299caf4a bugfix: deselect eaten chickens
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 213
diff changeset
713 self.select_animal_to_place(None)
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
714 self.chickens.discard(chick)
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
715 self.eggs -= chick.get_num_eggs()
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
716 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
717 if chick.abode:
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
718 chick.abode.clear_occupant()
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
719 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
720 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
721 self.tv.sprites.remove(chick)
401
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
722 self._update_pos_cache(chick.pos, None, 'chicken')
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
723
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
724 def remove_building(self, building):
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
725 if building in self.buildings:
444
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
726 self.buildings.discard(building)
381
7a58dadfd251 little cleanups, every sprite in its proper layer.
Jeremy Thurgood <firxen@gmail.com>
parents: 380
diff changeset
727 self.tv.sprites.remove(building, layer='buildings')
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
728
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
729 def add_cash(self, amount):
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
730 self.cash += amount
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
731 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
732
422
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
733 def add_wood(self, planks):
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
734 self.wood += planks
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
735 self.toolbar.update_wood_counter(self.wood)
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
736
408
02a6de5629d6 Levels can include starting equipment
Neil Muller <drnlmuller@gmail.com>
parents: 405
diff changeset
737 def add_start_chickens(self, _map, tile, value):
382
e89e6ad011ac Use code layer to place chickens
Neil Muller <drnlmuller@gmail.com>
parents: 381
diff changeset
738 """Add chickens as specified by the code layer"""
e89e6ad011ac Use code layer to place chickens
Neil Muller <drnlmuller@gmail.com>
parents: 381
diff changeset
739 chick = animal.Chicken((tile.tx, tile.ty))
408
02a6de5629d6 Levels can include starting equipment
Neil Muller <drnlmuller@gmail.com>
parents: 405
diff changeset
740 for equip_cls in equipment.EQUIP_MAP[value]:
02a6de5629d6 Levels can include starting equipment
Neil Muller <drnlmuller@gmail.com>
parents: 405
diff changeset
741 item = equip_cls()
02a6de5629d6 Levels can include starting equipment
Neil Muller <drnlmuller@gmail.com>
parents: 405
diff changeset
742 chick.equip(item)
382
e89e6ad011ac Use code layer to place chickens
Neil Muller <drnlmuller@gmail.com>
parents: 381
diff changeset
743 self.add_chicken(chick)
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
744
241
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
745 def _choose_fox(self, (x, y)):
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
746 fox_cls = misc.WeightedSelection(self.level.fox_weightings).choose()
241
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
747 return fox_cls((x, y))
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
748
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
749 def spawn_foxes(self):
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
750 """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
751 # 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
752 x, y = 0, 0
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
753 width, height = self.tv.size
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
754 min_foxes = max(self.level.min_foxes, (self.days+3)/2) # always more than one fox
323
978efd39a099 Limit maximum numbe of foxes generated
Neil Muller <drnlmuller@gmail.com>
parents: 320
diff changeset
755 new_foxes = min(random.randint(min_foxes, min_foxes*2), self.max_foxes)
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
756 while len(self.foxes) < new_foxes:
73
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
757 side = random.randint(0, 3)
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
758 if side == 0:
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
759 # top
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
760 y = -1
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
761 x = random.randint(-1, width)
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
762 elif side == 1:
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
763 # bottom
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
764 y = height
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
765 x = random.randint(-1, width)
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
766 elif side == 2:
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
767 # left
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
768 x = -1
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
769 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
770 else:
73
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
771 x = width
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
772 y = random.randint(-1, height)
403
c7cfa230f5d4 Remove board size restriction on number of foxes
Neil Muller <drnlmuller@gmail.com>
parents: 401
diff changeset
773 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
774
67
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
775 def fix_buildings(self):
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
776 """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
777 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
778
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
779 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
780 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
781 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
782
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
783 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
784 """
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
785 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
786
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
787 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
788 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
789 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
790 tile_pos = (x, y)
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
791 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
792 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
793 continue
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
794
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
795 covered = False
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
796 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
797 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
798 covered = True
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
799 break
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
800
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
801 if covered:
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
802 continue
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
803
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
804 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
805 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
806 building.remove(self.tv)
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
807 building.place(self.tv)
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
808 self.add_building(building)
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
809
307
bf1df0902883 three game modes: fortnight, quarter, fox extinction
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 305
diff changeset
810 def trees_left(self):
bf1df0902883 three game modes: fortnight, quarter, fox extinction
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 305
diff changeset
811 width, height = self.tv.size
bf1df0902883 three game modes: fortnight, quarter, fox extinction
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 305
diff changeset
812 return len([(x,y) for x in range(width) for y in range(height) if self.tv.get((x,y)) == self.WOODLAND])
bf1df0902883 three game modes: fortnight, quarter, fox extinction
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 305
diff changeset
813
444
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
814 def save_game(self):
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
815 return serializer.simplify(self)
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
816
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
817 def restore_game(self, data):
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
818 if 'refid' not in data or 'class' not in data or data['class'] != self.__class__.__name__:
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
819 import pprint
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
820 pprint.pprint(data)
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
821 print self.__class__.__name__
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
822 raise ValueError("Invalid save game.")
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
823 newself = serializer.unsimplify(data)
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
824 self.clear_chickens()
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
825 self.clear_buildings()
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
826 for chicken in newself.chickens:
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
827 self.add_chicken(chicken)
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
828 for building in newself.buildings:
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
829 self.add_building(building)
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
830 for attr in self.SIMPLIFY:
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
831 if attr in ('chickens', 'buildings'):
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
832 continue
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
833 setattr(self, attr, getattr(newself, attr))
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
834
326
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
835
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
836 class TextDialog(gui.Dialog):
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
837 def __init__(self, title, text, **params):
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
838 title_label = gui.Label(title)
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
839
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
840 doc = gui.Document()
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
841
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
842 space = doc.style.font.size(" ")
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
843
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
844 for paragraph in text.split('\n\n'):
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
845 doc.block(align=-1)
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
846 for word in paragraph.split():
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
847 doc.add(gui.Label(word))
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
848 doc.space(space)
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
849 doc.br(space[1])
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
850 doc.br(space[1])
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
851
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
852 done_button = gui.Button("Close")
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
853 done_button.connect(gui.CLICK, self.close)
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
854
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
855 tbl = gui.Table()
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
856 tbl.tr()
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
857 tbl.td(doc)
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
858 tbl.tr()
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
859 tbl.td(done_button, align=1)
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
860
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
861 gui.Dialog.__init__(self, title_label, tbl, **params)
336
82a18615a0ab Ask 'Are you sure?'
Neil Muller <drnlmuller@gmail.com>
parents: 330
diff changeset
862
82a18615a0ab Ask 'Are you sure?'
Neil Muller <drnlmuller@gmail.com>
parents: 330
diff changeset
863