annotate gamelib/gameboard.py @ 479:1689b43ed8be

Use KMOD_SHIFT to allow shift-click selecting of multiple chickens.
author Simon Cross <hodgestar@gmail.com>
date Wed, 25 Nov 2009 18:59:51 +0000
parents 6974048bf04a
children 312120a99181
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, \
479
1689b43ed8be Use KMOD_SHIFT to allow shift-click selecting of multiple chickens.
Simon Cross <hodgestar@gmail.com>
parents: 478
diff changeset
5 K_LEFT, K_RIGHT, KMOD_SHIFT
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
456
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
43
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
44 class AnimalPositionCache(object):
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
45 def __init__(self, gameboard):
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
46 self.gameboard = gameboard
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
47 self.clear()
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
48
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
49 def clear(self):
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
50 self._cache = {'chicken': {}, 'fox': {}}
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
51
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
52 def _in_bounds(self, pos):
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
53 return self.gameboard.in_bounds(pos)
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
54
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
55 def add(self, animal, animal_type):
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
56 if animal and self._in_bounds(animal.pos):
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
57 self._cache[animal_type][animal.pos] = animal
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
58
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
59 def remove(self, pos, animal_type):
457
fc648da2334c Fix position cache removal, slightly optimise chicken range check.
Jeremy Thurgood <firxen@gmail.com>
parents: 456
diff changeset
60 if pos in self._cache[animal_type]:
456
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
61 del self._cache[animal_type][pos]
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
62
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
63 def update(self, old_pos, animal, animal_type):
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
64 self.remove(old_pos, animal_type)
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
65 self.add(animal, animal_type)
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
66
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
67 def get(self, pos, animal_type):
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
68 return self._cache[animal_type].get(pos, None)
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
69
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
70
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
71 class GameBoard(serializer.Simplifiable):
9
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
72
66
edc15ce8fa30 Implement fence selling (a bit hackish, but fine for now).
Simon Cross <hodgestar@gmail.com>
parents: 65
diff changeset
73 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
74 FENCE = tiles.REVERSE_TILE_MAP['fence']
79
8241386a1651 Add chicken counter
Neil Muller <drnlmuller@gmail.com>
parents: 77
diff changeset
75 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
76 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
77
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
78 SIMPLIFY = [
468
d5e4959cfe7a Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents: 463
diff changeset
79 'level',
463
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
80 'tv',
468
d5e4959cfe7a Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents: 463
diff changeset
81 'max_foxes',
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
82 '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
83 '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
84 '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
85 '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
86 '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
87 '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
88 '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
89 '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
90 '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
91 ]
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
92
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
93 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
94 self.disp = main_app
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
95 self.level = level
24
7584453f4944 Add support for PNG tiles.
Simon Cross <hodgestar@gmail.com>
parents: 17
diff changeset
96 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
97 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
98 self.tv.tga_load_level(level.map)
382
e89e6ad011ac Use code layer to place chickens
Neil Muller <drnlmuller@gmail.com>
parents: 381
diff changeset
99 width, height = self.tv.size
323
978efd39a099 Limit maximum numbe of foxes generated
Neil Muller <drnlmuller@gmail.com>
parents: 320
diff changeset
100 # 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
101 self.max_foxes = level.max_foxes
460
7204c16ab64d Wood market!
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 457
diff changeset
102 self.calculate_wood_groat_exchange_rate()
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
103
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
104 self.selected_tool = None
186
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
105 self.sprite_cursor = None
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
106 self.chickens = set()
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
107 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
108 self.buildings = set()
456
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
109 self._pos_cache = AnimalPositionCache(self)
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
110 self.cash = 0
422
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
111 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
112 self.eggs = 0
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
113 self.days = 0
79
8241386a1651 Add chicken counter
Neil Muller <drnlmuller@gmail.com>
parents: 77
diff changeset
114 self.killed_foxes = 0
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
115 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
116 # For the level loading case
fbef17cab632 Use fully rendered map in gameboard choosing screen
Neil Muller <drnlmuller@gmail.com>
parents: 422
diff changeset
117 if self.disp:
447
f04a2490c35f The sub-toolbar rewrite, the finally not crashing version
Neil Muller <drnlmuller@gmail.com>
parents: 444
diff changeset
118 self.toolbar = None
424
fbef17cab632 Use fully rendered map in gameboard choosing screen
Neil Muller <drnlmuller@gmail.com>
parents: 422
diff changeset
119 self.create_display()
fbef17cab632 Use fully rendered map in gameboard choosing screen
Neil Muller <drnlmuller@gmail.com>
parents: 422
diff changeset
120 self.add_cash(level.starting_cash)
428
a356e57529ea buildings cost wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 425
diff changeset
121 self.add_wood(level.starting_wood)
17
cbbc5da7708a Interaction with the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 14
diff changeset
122
67
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
123 self.fix_buildings()
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
124
408
02a6de5629d6 Levels can include starting equipment
Neil Muller <drnlmuller@gmail.com>
parents: 405
diff changeset
125 cdata = {}
02a6de5629d6 Levels can include starting equipment
Neil Muller <drnlmuller@gmail.com>
parents: 405
diff changeset
126 for tn in equipment.EQUIP_MAP:
02a6de5629d6 Levels can include starting equipment
Neil Muller <drnlmuller@gmail.com>
parents: 405
diff changeset
127 cdata[tn] = (self.add_start_chickens, tn)
382
e89e6ad011ac Use code layer to place chickens
Neil Muller <drnlmuller@gmail.com>
parents: 381
diff changeset
128
e89e6ad011ac Use code layer to place chickens
Neil Muller <drnlmuller@gmail.com>
parents: 381
diff changeset
129 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
130
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
131 self.selected_chickens = []
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
132
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
133 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
134 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
135
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
136 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
137 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
138 tbl = gui.Table()
5569430fd82e Display cleanup and rationalisation.
Jeremy Thurgood <firxen@gmail.com>
parents: 35
diff changeset
139 tbl.tr()
447
f04a2490c35f The sub-toolbar rewrite, the finally not crashing version
Neil Muller <drnlmuller@gmail.com>
parents: 444
diff changeset
140 self.toolbar = toolbar.DefaultToolBar(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
141 tbl.td(self.toolbar, valign=-1)
433
8643893635e7 Seperate toolbar and gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 428
diff changeset
142 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
143 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
144 self.top_widget = tbl
14
d7f295c06a4b Split gameboard screen.
Jeremy Thurgood <firxen@gmail.com>
parents: 12
diff changeset
145
447
f04a2490c35f The sub-toolbar rewrite, the finally not crashing version
Neil Muller <drnlmuller@gmail.com>
parents: 444
diff changeset
146 def change_toolbar(self, new_toolbar):
f04a2490c35f The sub-toolbar rewrite, the finally not crashing version
Neil Muller <drnlmuller@gmail.com>
parents: 444
diff changeset
147 """Replace the toolbar"""
f04a2490c35f The sub-toolbar rewrite, the finally not crashing version
Neil Muller <drnlmuller@gmail.com>
parents: 444
diff changeset
148 td = self.toolbar.container
f04a2490c35f The sub-toolbar rewrite, the finally not crashing version
Neil Muller <drnlmuller@gmail.com>
parents: 444
diff changeset
149 td.remove(self.toolbar)
f04a2490c35f The sub-toolbar rewrite, the finally not crashing version
Neil Muller <drnlmuller@gmail.com>
parents: 444
diff changeset
150 td.add(new_toolbar, 0, 0)
f04a2490c35f The sub-toolbar rewrite, the finally not crashing version
Neil Muller <drnlmuller@gmail.com>
parents: 444
diff changeset
151 self.toolbar = new_toolbar
449
938498b8cd03 Fix toolbar alignment
Neil Muller <drnlmuller@gmail.com>
parents: 447
diff changeset
152 self.toolbar.rect.size = self.toolbar.resize()
452
17e07b4cdeb4 Seperate counter redrawing as seperate method
Neil Muller <drnlmuller@gmail.com>
parents: 451
diff changeset
153 self.redraw_counters()
17e07b4cdeb4 Seperate counter redrawing as seperate method
Neil Muller <drnlmuller@gmail.com>
parents: 451
diff changeset
154 td.repaint()
17e07b4cdeb4 Seperate counter redrawing as seperate method
Neil Muller <drnlmuller@gmail.com>
parents: 451
diff changeset
155
17e07b4cdeb4 Seperate counter redrawing as seperate method
Neil Muller <drnlmuller@gmail.com>
parents: 451
diff changeset
156 def redraw_counters(self):
451
d0f586647dfa Redraw counters when changing toolbars
Neil Muller <drnlmuller@gmail.com>
parents: 449
diff changeset
157 self.toolbar.update_egg_counter(self.eggs)
470
fbbd39cfc975 Alter day counter logic a bit to cater for the case when it stops being the last day.
Simon Cross <hodgestar@gmail.com>
parents: 468
diff changeset
158 if self.level.is_last_day(self.days):
fbbd39cfc975 Alter day counter logic a bit to cater for the case when it stops being the last day.
Simon Cross <hodgestar@gmail.com>
parents: 468
diff changeset
159 self.toolbar.day_counter.style.color = (255, 0, 0)
fbbd39cfc975 Alter day counter logic a bit to cater for the case when it stops being the last day.
Simon Cross <hodgestar@gmail.com>
parents: 468
diff changeset
160 else:
fbbd39cfc975 Alter day counter logic a bit to cater for the case when it stops being the last day.
Simon Cross <hodgestar@gmail.com>
parents: 468
diff changeset
161 # can come back from last day when restoring a saved game
fbbd39cfc975 Alter day counter logic a bit to cater for the case when it stops being the last day.
Simon Cross <hodgestar@gmail.com>
parents: 468
diff changeset
162 self.toolbar.day_counter.style.color = (255, 255, 255)
451
d0f586647dfa Redraw counters when changing toolbars
Neil Muller <drnlmuller@gmail.com>
parents: 449
diff changeset
163 self.toolbar.update_day_counter("%s/%s" % (self.days,
d0f586647dfa Redraw counters when changing toolbars
Neil Muller <drnlmuller@gmail.com>
parents: 449
diff changeset
164 self.level.get_max_turns()))
d0f586647dfa Redraw counters when changing toolbars
Neil Muller <drnlmuller@gmail.com>
parents: 449
diff changeset
165 self.toolbar.update_chicken_counter(len(self.chickens))
d0f586647dfa Redraw counters when changing toolbars
Neil Muller <drnlmuller@gmail.com>
parents: 449
diff changeset
166 self.toolbar.update_cash_counter(self.cash)
d0f586647dfa Redraw counters when changing toolbars
Neil Muller <drnlmuller@gmail.com>
parents: 449
diff changeset
167 self.toolbar.update_wood_counter(self.wood)
d0f586647dfa Redraw counters when changing toolbars
Neil Muller <drnlmuller@gmail.com>
parents: 449
diff changeset
168 if self.killed_foxes:
d0f586647dfa Redraw counters when changing toolbars
Neil Muller <drnlmuller@gmail.com>
parents: 449
diff changeset
169 self.toolbar.update_fox_counter(self.killed_foxes)
447
f04a2490c35f The sub-toolbar rewrite, the finally not crashing version
Neil Muller <drnlmuller@gmail.com>
parents: 444
diff changeset
170
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
171 def update(self):
37
497b53b69280 Always update the vidwidget.
Jeremy Thurgood <firxen@gmail.com>
parents: 36
diff changeset
172 self.tvw.reupdate()
9
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
173
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
174 def loop(self):
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
175 self.tv.loop()
9
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
176
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
177 def set_selected_tool(self, tool, cursor):
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
178 if not self.day:
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
179 return False
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
180 if self.apply_tool_to_selected(tool):
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
181 return False # Using the tool on selected chickens is immediate
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
182 self.selected_tool = tool
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
183 if tool in [None, constants.TOOL_SELL_BUILDING,
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
184 constants.TOOL_REPAIR_BUILDING]:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
185 # FIXME - this special casing is sucky
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
186 self.unselect_all()
203
653da96db572 Fixed dangling cursor sprite and did some TODO list maintenance.
Jeremy Thurgood <firxen@gmail.com>
parents: 202
diff changeset
187 sprite_curs = None
653da96db572 Fixed dangling cursor sprite and did some TODO list maintenance.
Jeremy Thurgood <firxen@gmail.com>
parents: 202
diff changeset
188 if buildings.is_building(tool):
232
0bd214cf9018 Overlay cost on building sprite cursors.
Simon Cross <hodgestar@gmail.com>
parents: 228
diff changeset
189 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
190 elif equipment.is_equipment(tool):
5b9cd693fe7c Add sprite cursors for equipment buying.
Simon Cross <hodgestar@gmail.com>
parents: 245
diff changeset
191 sprite_curs = sprite_cursor.SpriteCursor(tool.CHICKEN_IMAGE_FILE, self.tv)
474
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
192 elif tool == constants.TOOL_PLACE_ANIMALS and self.selected_chickens:
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
193 cursor = cursors.cursors['chicken']
203
653da96db572 Fixed dangling cursor sprite and did some TODO list maintenance.
Jeremy Thurgood <firxen@gmail.com>
parents: 202
diff changeset
194 self.set_cursor(cursor, sprite_curs)
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
195 return True
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
196
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
197 def apply_tool_to_selected(self, tool):
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
198 if self.selected_chickens:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
199 # dispatch call to selected chickens if appropriate
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
200 if tool == constants.TOOL_SELL_CHICKEN:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
201 self.sell_chicken(None)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
202 return True
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
203 elif tool == constants.TOOL_SELL_EGG:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
204 self.sell_egg(None)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
205 return True
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
206 elif tool == constants.TOOL_SELL_EQUIPMENT:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
207 self.sell_equipment(None)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
208 return True
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
209 elif equipment.is_equipment(tool):
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
210 self.buy_equipment(None, tool)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
211 return True
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
212 return False
203
653da96db572 Fixed dangling cursor sprite and did some TODO list maintenance.
Jeremy Thurgood <firxen@gmail.com>
parents: 202
diff changeset
213
653da96db572 Fixed dangling cursor sprite and did some TODO list maintenance.
Jeremy Thurgood <firxen@gmail.com>
parents: 202
diff changeset
214 def set_cursor(self, cursor=None, sprite_curs=None):
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
215 if cursor:
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
216 pygame.mouse.set_cursor(*cursor)
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
217 else:
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
218 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
219 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
220 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
221 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
222 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
223 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
224
07b361ebd87f Ensure we clean up highlights, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 212
diff changeset
225 def reset_states(self):
07b361ebd87f Ensure we clean up highlights, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 212
diff changeset
226 """Clear current states (highlights, etc.)"""
245
634491bf37e8 Change toolbar to gui.Toolbar -- gives nicer highlighting.
Simon Cross <hodgestar@gmail.com>
parents: 243
diff changeset
227 self.set_selected_tool(None, None)
634491bf37e8 Change toolbar to gui.Toolbar -- gives nicer highlighting.
Simon Cross <hodgestar@gmail.com>
parents: 243
diff changeset
228 self.toolbar.clear_tool()
17
cbbc5da7708a Interaction with the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 14
diff changeset
229
186
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
230 def update_sprite_cursor(self, e):
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
231 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
232 self.sprite_cursor.set_pos(tile_pos)
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
233
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
234 def start_night(self):
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
235 self.day, self.night = False, True
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
236 self.tv.sun(False)
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
237 self.reset_states()
434
f2a55e5e24db Disable non-selectable toolbar widgets at night
Neil Muller <drnlmuller@gmail.com>
parents: 433
diff changeset
238 self.toolbar.start_night()
413
bdc4757e0497 Add Sniper Rifle and give guns limited ammunition.
Jeremy Thurgood <firxen@gmail.com>
parents: 408
diff changeset
239 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
240 self.eggs = 0
419
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
241 for chicken in self.chickens.copy():
476
3dae0fc14009 Animals have their own gameboard references instead of lugging them around in params all the time.
Jeremy Thurgood <firxen@gmail.com>
parents: 475
diff changeset
242 chicken.start_night()
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
243 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
244 self._cache_animal_positions()
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
245
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
246 def start_day(self):
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
247 self.day, self.night = True, False
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
248 self.tv.sun(True)
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
249 self.reset_states()
434
f2a55e5e24db Disable non-selectable toolbar widgets at night
Neil Muller <drnlmuller@gmail.com>
parents: 433
diff changeset
250 self.toolbar.start_day()
456
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
251 self._pos_cache.clear()
413
bdc4757e0497 Add Sniper Rifle and give guns limited ammunition.
Jeremy Thurgood <firxen@gmail.com>
parents: 408
diff changeset
252 self.advance_day()
bdc4757e0497 Add Sniper Rifle and give guns limited ammunition.
Jeremy Thurgood <firxen@gmail.com>
parents: 408
diff changeset
253 self.clear_foxes()
419
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
254 for chicken in self.chickens.copy():
476
3dae0fc14009 Animals have their own gameboard references instead of lugging them around in params all the time.
Jeremy Thurgood <firxen@gmail.com>
parents: 475
diff changeset
255 chicken.start_day()
470
fbbd39cfc975 Alter day counter logic a bit to cater for the case when it stops being the last day.
Simon Cross <hodgestar@gmail.com>
parents: 468
diff changeset
256 self.redraw_counters()
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
257
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
258 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
259 """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
260 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
261 return False
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
262 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
263 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
264 return False
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
265 return True
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
266
17
cbbc5da7708a Interaction with the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 14
diff changeset
267 def use_tool(self, e):
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
268 if not self.day:
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
269 return
189
37af9e5dd292 Use tool with left button, cancel tool with right button.
Jeremy Thurgood <firxen@gmail.com>
parents: 186
diff changeset
270 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
271 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
272 self.toolbar.clear_tool()
478
6974048bf04a middle-click deselects chickens but not the tool.
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 476
diff changeset
273 elif e.button == 2: # Middle button
6974048bf04a middle-click deselects chickens but not the tool.
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 476
diff changeset
274 self.unselect_all()
189
37af9e5dd292 Use tool with left button, cancel tool with right button.
Jeremy Thurgood <firxen@gmail.com>
parents: 186
diff changeset
275 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
276 return
479
1689b43ed8be Use KMOD_SHIFT to allow shift-click selecting of multiple chickens.
Simon Cross <hodgestar@gmail.com>
parents: 478
diff changeset
277 mods = pygame.key.get_mods()
52
0d4799866bcf Sell chickens and buy fences.
Jeremy Thurgood <firxen@gmail.com>
parents: 40
diff changeset
278 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
279 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
280 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
281 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
282 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
283 self.place_animal(self.tv.screen_to_tile(e.pos))
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
284 elif self.selected_tool == constants.TOOL_SELECT_CHICKENS:
479
1689b43ed8be Use KMOD_SHIFT to allow shift-click selecting of multiple chickens.
Simon Cross <hodgestar@gmail.com>
parents: 478
diff changeset
285 if not (mods & KMOD_SHIFT):
1689b43ed8be Use KMOD_SHIFT to allow shift-click selecting of multiple chickens.
Simon Cross <hodgestar@gmail.com>
parents: 478
diff changeset
286 self.unselect_all()
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
287 self.select_chicken(self.tv.screen_to_tile(e.pos))
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
288 elif self.selected_tool == constants.TOOL_SELL_BUILDING:
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
289 self.sell_building(self.tv.screen_to_tile(e.pos))
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
290 elif self.selected_tool == constants.TOOL_SELL_EQUIPMENT:
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
291 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
292 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
293 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
294 elif buildings.is_building(self.selected_tool):
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
295 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
296 elif equipment.is_equipment(self.selected_tool):
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
297 if not self.selected_chickens:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
298 # old selection behaviour
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
299 self.buy_equipment(self.tv.screen_to_tile(e.pos),
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
300 self.selected_tool)
17
cbbc5da7708a Interaction with the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 14
diff changeset
301
166
4aa800354b7c Rename get_chicken to get_outside_chicken.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
302 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
303 for chick in self.chickens:
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
304 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
305 return chick
b8f64db0d39e Cleaned up buying and selling a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 52
diff changeset
306 return None
57
08665fa60345 Implement henhouses and henhouse adding.
Simon Cross <hodgestar@gmail.com>
parents: 54
diff changeset
307
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
308 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
309 for building in self.buildings:
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
310 if building.covers(tile_pos):
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
311 return building
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
312 return None
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
313
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
314 def sell_chicken(self, tile_pos):
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
315
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
316 def do_sell(chicken, update_button=None):
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
317 if not chicken:
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
318 return False # sanity check
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
319 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
320 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
321 TextDialog("Squuaaawwwwwk!", msg).open()
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
322 return False
228
f74de4280e20 Sell chicken's equipment when you sell the chicken.
Simon Cross <hodgestar@gmail.com>
parents: 227
diff changeset
323 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
324 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
325 chicken.unequip(item)
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
326 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
327 sound.play_sound("sell-chicken.ogg")
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
328 if update_button:
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
329 update_button(chicken, empty=True)
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
330 self.remove_chicken(chicken)
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
331 return True
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
332
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
333 if tile_pos:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
334 chick = self.get_outside_chicken(tile_pos)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
335 if chick is None:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
336 building = self.get_building(tile_pos)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
337 if building and building.HENHOUSE:
474
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
338 self.open_building_dialog(building, False, do_sell)
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
339 return
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
340 do_sell(chick)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
341 else:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
342 for chick in self.selected_chickens[:]:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
343 do_sell(chick)
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
344
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
345 def sell_one_egg(self, chicken):
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
346 if chicken.eggs:
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
347 self.add_cash(self.level.sell_price_egg)
476
3dae0fc14009 Animals have their own gameboard references instead of lugging them around in params all the time.
Jeremy Thurgood <firxen@gmail.com>
parents: 475
diff changeset
348 chicken.remove_one_egg()
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
349 return True
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
350 return False
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
351
475
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 474
diff changeset
352 def remove_eggs(self, num):
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 474
diff changeset
353 self.eggs -= num
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 474
diff changeset
354 self.toolbar.update_egg_counter(self.eggs)
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 474
diff changeset
355
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
356 def sell_egg(self, tile_pos):
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
357 def do_sell(chicken, update_button=None):
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
358 # We try sell and egg
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
359 if self.sell_one_egg(chicken):
193
db246683d5da Selling eggs now works
Neil Muller <drnlmuller@gmail.com>
parents: 192
diff changeset
360 sound.play_sound("sell-chicken.ogg")
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
361 # Force toolbar update
193
db246683d5da Selling eggs now works
Neil Muller <drnlmuller@gmail.com>
parents: 192
diff changeset
362 self.toolbar.chsize()
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
363 if update_button:
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
364 update_button(chicken)
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
365 return False
193
db246683d5da Selling eggs now works
Neil Muller <drnlmuller@gmail.com>
parents: 192
diff changeset
366
473
4b8ca482ea08 don't crash when selling eggs from selected chickens
Neil Muller <drnlmuller@gmail.com>
parents: 472
diff changeset
367 if tile_pos:
4b8ca482ea08 don't crash when selling eggs from selected chickens
Neil Muller <drnlmuller@gmail.com>
parents: 472
diff changeset
368 building = self.get_building(tile_pos)
4b8ca482ea08 don't crash when selling eggs from selected chickens
Neil Muller <drnlmuller@gmail.com>
parents: 472
diff changeset
369 if building and building.HENHOUSE:
474
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
370 self.open_building_dialog(building, False, do_sell)
473
4b8ca482ea08 don't crash when selling eggs from selected chickens
Neil Muller <drnlmuller@gmail.com>
parents: 472
diff changeset
371 else:
4b8ca482ea08 don't crash when selling eggs from selected chickens
Neil Muller <drnlmuller@gmail.com>
parents: 472
diff changeset
372 for chicken in self.selected_chickens:
4b8ca482ea08 don't crash when selling eggs from selected chickens
Neil Muller <drnlmuller@gmail.com>
parents: 472
diff changeset
373 do_sell(chicken)
54
b8f64db0d39e Cleaned up buying and selling a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 52
diff changeset
374
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
375 def select_animal(self, animal, extend=True):
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
376 if extend:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
377 self.selected_chickens.append(animal)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
378 animal.equip(equipment.Spotlight())
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
379 else:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
380 self.unselect_all()
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
381 self.selected_chickens.append(animal)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
382 animal.equip(equipment.Spotlight())
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
383
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
384 def unselect_all(self):
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
385 # Clear any highlights
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
386 for chick in self.selected_chickens:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
387 chick.unequip_by_name("Spotlight")
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
388 self.selected_chickens = []
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
389
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
390 def unselect_animal(self, animal):
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
391 if animal in self.selected_chickens:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
392 self.selected_chickens.remove(animal)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
393 animal.unequip_by_name("Spotlight")
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
394
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
395 def get_chicken_at_pos(self, tile_pos):
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
396 chicken = self.get_outside_chicken(tile_pos)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
397 if chicken:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
398 return chicken
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
399 building = self.get_building(tile_pos)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
400 if building:
474
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
401 self.open_building_dialog(building, False)
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
402
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
403 def select_chicken(self, tile_pos):
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
404 """Handle a select chicken event"""
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
405 # Get the chicken at this position
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
406 chicken = self.get_chicken_at_pos(tile_pos)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
407 if not chicken:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
408 return # do nothing
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
409 elif chicken in self.selected_chickens:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
410 self.unselect_animal(chicken)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
411 else:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
412 self.select_animal(chicken)
200
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
413
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
414 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
415 """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
416
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
417 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
418 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
419 """
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
420 if tile_pos and not self.selected_chickens:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
421 # Old behaviour
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
422 chicken = self.get_chicken_at_pos(tile_pos)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
423 if chicken:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
424 self.select_animal(chicken)
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
425 pygame.mouse.set_cursor(*cursors.cursors['chicken'])
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
426 return
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
427 elif tile_pos:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
428 building = self.get_building(tile_pos)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
429 if building and building.ABODE:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
430 for chicken in self.selected_chickens:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
431 try:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
432 place = building.first_empty_place()
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
433 self.relocate_animal(chicken, place=place)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
434 chicken.equip(equipment.Nest())
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
435 pygame.mouse.set_cursor(*cursors.cursors['select'])
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
436 except buildings.BuildingFullError:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
437 pass
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
438 else:
474
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
439 self.open_building_dialog(building, True)
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
440 return
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
441 if self.tv.get(tile_pos) == self.GRASSLAND:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
442 for chicken in self.selected_chickens:
474
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
443 try_pos = tile_pos
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
444 if self.get_outside_chicken(try_pos):
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
445 try_pos = None
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
446 # find a free square nearby
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
447 poss = [(tile_pos[0] + x, tile_pos[1] + y)
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
448 for x in range(-1, 2) for y in range(-1, 2)
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
449 if (x, y) != (0, 0)]
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
450 poss.extend([(tile_pos[0] + x, tile_pos[1] + y)
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
451 for x in range(-2, 3, 2) for y in range(-2, 3)
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
452 if (x, y) != (0, 0)])
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
453 for cand in poss:
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
454 if self.tv.get(cand) == self.GRASSLAND and \
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
455 not self.get_outside_chicken(cand):
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
456 try_pos = cand
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
457 break
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
458 if try_pos:
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
459 chicken.unequip_by_name("Nest")
474
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
460 self.relocate_animal(chicken, tile_pos=try_pos)
476
3dae0fc14009 Animals have their own gameboard references instead of lugging them around in params all the time.
Jeremy Thurgood <firxen@gmail.com>
parents: 475
diff changeset
461 chicken.remove_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
462
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
463 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
464 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
465 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
466 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
467 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
468 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
469 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
470 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
471 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
472 self.set_visibility(chicken)
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
473
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
474 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
475 if animal.outside():
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
476 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
477 self.tv.sprites.append(animal)
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
478 else:
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
479 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
480 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
481
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
482 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
483 """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
484 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
485
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
486 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
487 self.disp.close(tbl)
170
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
488 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
489 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
490
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
491 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
492 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
493
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
494 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
495 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
496 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
497 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
498 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
499 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
500
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
501 if x:
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
502 offset = (self.disp.rect.center[0] + x,
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
503 self.disp.rect.center[1] + y)
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
504 else:
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
505 offset = None
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
506 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
507 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
508
474
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
509 def open_building_dialog(self, building, fill_empty, 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
510 """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
511
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
512 place_button_map = {}
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
513
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
514 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
515 """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
516 if animal:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
517 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
518 if button:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
519 if empty:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
520 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
521 else:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
522 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
523
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
524 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
525 """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
526 if place.occupant:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
527 # 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
528 if not sell_callback:
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
529 self.select_animal(place.occupant)
208
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
530 # select new animal (on button)
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
531 update_button(place.occupant)
208
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
532 else:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
533 # Attempt to sell the occupant
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
534 sell_callback(place.occupant, update_button)
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
535 else:
208
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
536 # there is no occupant, attempt to fill the space
474
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
537 if self.selected_chickens and fill_empty:
208
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
538 # empty old nest (on button)
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
539 update_button(self.selected_chickens[0], empty=True)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
540 self.relocate_animal(self.selected_chickens[0], place=place)
208
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
541 # populate the new nest (on button)
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
542 update_button(self.selected_chickens[0])
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
543
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
544 tbl = gui.Table()
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
545 columns = building.max_floor_width()
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
546 kwargs = { 'style': { 'padding_left': 10, 'padding_bottom': 10 }}
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
547 for floor in building.floors():
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
548 tbl.tr()
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
549 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
550 tbl.tr()
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
551 for row in floor.rows():
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
552 tbl.tr()
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
553 for place in row:
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
554 if place.occupant is None:
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
555 button = gui.Button(icons.EMPTY_NEST_ICON)
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
556 else:
201
fe1e9c18d4d7 layering bugfix; indoor chickens now use normal chicken icons
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 200
diff changeset
557 button = gui.Button(icons.animal_icon(place.occupant))
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
558 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
559 button.connect(gui.CLICK, nest_clicked, place, button)
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
560 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
561
170
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
562 building.selected(True)
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
563 def close_callback():
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
564 building.selected(False)
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
565
262
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
566 def evict_callback():
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
567 if not self.selected_chickens:
264
812bd4cda8b8 evict button
Neil Muller <drnlmuller@gmail.com>
parents: 262
diff changeset
568 return
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
569 for chicken in self.selected_chickens:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
570 for tile_pos in building.adjacent_tiles():
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
571 if self.tv.get(tile_pos) != self.GRASSLAND:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
572 continue
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
573 if self.get_outside_chicken(tile_pos) is None:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
574 update_button(chicken, empty=True)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
575 self.place_animal(tile_pos)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
576 break
262
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
577
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
578 if not sell_callback:
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
579 tbl.tr()
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
580 button = gui.Button('Evict')
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
581 button.connect(gui.CLICK, evict_callback)
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
582 tbl.td(button, colspan=2, **kwargs)
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
583
170
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
584 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
585
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
586 def buy_building(self, tile_pos, building_cls):
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
587 building = building_cls(tile_pos)
428
a356e57529ea buildings cost wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 425
diff changeset
588 if self.wood < building.buy_price():
57
08665fa60345 Implement henhouses and henhouse adding.
Simon Cross <hodgestar@gmail.com>
parents: 54
diff changeset
589 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
590 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
591 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
592 if building.place(self.tv):
428
a356e57529ea buildings cost wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 425
diff changeset
593 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
594 self.add_building(building)
60
e2631c8e2cd6 Implement guard towers (with temporary sprite PNG).
Simon Cross <hodgestar@gmail.com>
parents: 57
diff changeset
595
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
596 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
597
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
598 equipment = equipment_cls()
298
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
599
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
600 def do_equip(chicken, update_button=None):
298
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
601 # 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
602 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
603 return False
298
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
604 if equipment.place(chicken):
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
605 self.add_cash(-equipment.buy_price())
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
606 chicken.equip(equipment)
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
607 if update_button:
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
608 update_button(chicken)
298
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
609 return False
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
610
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
611 if tile_pos:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
612 chicken = self.get_outside_chicken(tile_pos)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
613 if chicken is None:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
614 building = self.get_building(tile_pos)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
615 if not (building and building.ABODE):
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
616 return
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
617 # Bounce through open dialog once more
474
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
618 self.open_building_dialog(building, False, do_equip)
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
619 else:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
620 do_equip(chicken)
298
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
621 else:
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
622 for chicken in self.selected_chickens:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
623 do_equip(chicken)
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
624
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
625 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
626 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
627 if building is None:
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
628 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
629 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
630 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
631 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
632 return
428
a356e57529ea buildings cost wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 425
diff changeset
633 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
634 building.remove(self.tv)
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
635 self.remove_building(building)
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
636
378
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
637 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
638 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
639 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
640 return
428
a356e57529ea buildings cost wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 425
diff changeset
641 if self.wood < building.repair_price():
a356e57529ea buildings cost wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 425
diff changeset
642 return
a356e57529ea buildings cost wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 425
diff changeset
643 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
644 building.repair(self.tv)
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
645
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
646 def sell_equipment(self, tile_pos):
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
647 x, y = 0, 0
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
648 def do_sell(chicken, update_button=None):
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
649 if not chicken.equipment:
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
650 return
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
651 elif len(chicken.equipment) == 1:
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
652 item = chicken.equipment[0]
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
653 self.add_cash(item.sell_price())
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
654 chicken.unequip(item)
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
655 if update_button:
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
656 update_button(chicken)
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
657 else:
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
658 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
659 return False
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
660
166
4aa800354b7c Rename get_chicken to get_outside_chicken.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
661 chicken = self.get_outside_chicken(tile_pos)
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
662 if chicken is not None:
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
663 do_sell(chicken)
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
664 else:
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
665 building = self.get_building(tile_pos)
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
666 if building is None:
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
667 return
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
668 x, y = 50, 0
474
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
669 self.open_building_dialog(building, False, do_sell)
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
670
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
671 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
672 tbl = gui.Table()
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
673
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
674 def sell_item(item, button):
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
675 """Select item of equipment."""
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
676 self.add_cash(item.sell_price())
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
677 chicken.unequip(item)
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
678 if update_button:
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
679 update_button(chicken)
169
946f09ed37cd Make equipment dialog close after selecting an item to sell.
Simon Cross <hodgestar@gmail.com>
parents: 168
diff changeset
680 self.disp.close(dialog)
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
681
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
682 kwargs = { 'style': { 'padding_left': 10, 'padding_bottom': 10 }}
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
683
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
684 tbl.tr()
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
685 tbl.td(gui.Button("Sell ... "), align=-1, **kwargs)
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
686
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
687 for item in chicken.equipment:
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
688 tbl.tr()
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
689 button = gui.Button(item.name().title())
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
690 button.connect(gui.CLICK, sell_item, item, button)
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
691 tbl.td(button, align=1, **kwargs)
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
692
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
693 dialog = self.open_dialog(tbl, x=x, y=y)
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
694
14
d7f295c06a4b Split gameboard screen.
Jeremy Thurgood <firxen@gmail.com>
parents: 12
diff changeset
695 def event(self, e):
262
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
696 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
697 if e.key == K_UP:
433
8643893635e7 Seperate toolbar and gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 428
diff changeset
698 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
699 if e.key == K_DOWN:
433
8643893635e7 Seperate toolbar and gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 428
diff changeset
700 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
701 if e.key == K_LEFT:
433
8643893635e7 Seperate toolbar and gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 428
diff changeset
702 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
703 if e.key == K_RIGHT:
433
8643893635e7 Seperate toolbar and gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 428
diff changeset
704 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
705 return True
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
706 return False
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
707
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
708 def advance_day(self):
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
709 self.days += 1
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
710
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
711 def clear_foxes(self):
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
712 for fox in self.foxes.copy():
80
ad9d1bc7ef0c Kill foxes that don't reach safety
Neil Muller <drnlmuller@gmail.com>
parents: 79
diff changeset
713 # 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
714 # killed
395
2d0ff46118e2 Basic support for z coordinate
Neil Muller <drnlmuller@gmail.com>
parents: 392
diff changeset
715 if self.in_bounds(fox.pos) and \
2d0ff46118e2 Basic support for z coordinate
Neil Muller <drnlmuller@gmail.com>
parents: 392
diff changeset
716 self.tv.get(fox.pos.to_tile_tuple()) != self.WOODLAND:
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
717 self.kill_fox(fox)
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
718 else:
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
719 self.remove_fox(fox)
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
720 self.foxes = set() # Remove all the foxes
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
721
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
722 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
723 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
724 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
725
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 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
727 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
728 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
729
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
730 def do_night_step(self):
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
731 """Handle the events of the night.
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
732
122
d2b19131d537 Don't continue the night if we're not doing anything anymore
Neil Muller <drnlmuller@gmail.com>
parents: 119
diff changeset
733 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
734 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
735 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
736 return True
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
737 # Move all the foxes
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
738 over = self.foxes_move()
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
739 if not over:
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
740 self.foxes_attack()
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
741 self.chickens_attack()
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
742 return over
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
743
401
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
744 def _cache_animal_positions(self):
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
745 """Cache the current set of fox positions for the avoiding checks"""
456
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
746 self._pos_cache.clear()
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
747 for fox in self.foxes:
456
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
748 self._pos_cache.add(fox, '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
749 for chick in self.chickens:
456
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
750 self._pos_cache.add(chick, 'chicken')
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
751
456
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
752 def get_animal_at_pos(self, pos, animal_type):
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
753 return self._pos_cache.get(pos, animal_type)
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
754
422
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
755 def chickens_scatter(self):
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
756 """Chickens outside move around randomly a bit"""
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
757 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
758 old_pos = chicken.pos
476
3dae0fc14009 Animals have their own gameboard references instead of lugging them around in params all the time.
Jeremy Thurgood <firxen@gmail.com>
parents: 475
diff changeset
759 chicken.move()
456
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
760 self._pos_cache.update(old_pos, chicken, 'chicken')
422
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
761
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
762 def chickens_chop_wood(self):
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
763 """Chickens with axes chop down trees near them"""
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
764 for chicken in [chick for chick in self.chickens if chick.outside()]:
476
3dae0fc14009 Animals have their own gameboard references instead of lugging them around in params all the time.
Jeremy Thurgood <firxen@gmail.com>
parents: 475
diff changeset
765 chicken.chop()
460
7204c16ab64d Wood market!
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 457
diff changeset
766 self.calculate_wood_groat_exchange_rate()
422
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
767
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
768 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
769 over = True
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
770 for fox in self.foxes:
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
771 old_pos = fox.pos
476
3dae0fc14009 Animals have their own gameboard references instead of lugging them around in params all the time.
Jeremy Thurgood <firxen@gmail.com>
parents: 475
diff changeset
772 fox.move()
122
d2b19131d537 Don't continue the night if we're not doing anything anymore
Neil Muller <drnlmuller@gmail.com>
parents: 119
diff changeset
773 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
774 over = False
456
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
775 self._pos_cache.update(old_pos, fox, 'fox')
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
776 return over
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
777
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
778 def foxes_attack(self):
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
779 for fox in self.foxes:
476
3dae0fc14009 Animals have their own gameboard references instead of lugging them around in params all the time.
Jeremy Thurgood <firxen@gmail.com>
parents: 475
diff changeset
780 fox.attack()
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
781
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
782 def chickens_attack(self):
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
783 for chicken in self.chickens:
476
3dae0fc14009 Animals have their own gameboard references instead of lugging them around in params all the time.
Jeremy Thurgood <firxen@gmail.com>
parents: 475
diff changeset
784 chicken.attack()
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
785
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
786 def add_chicken(self, chicken):
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
787 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
788 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
789 self.tv.sprites.append(chicken)
424
fbef17cab632 Use fully rendered map in gameboard choosing screen
Neil Muller <drnlmuller@gmail.com>
parents: 422
diff changeset
790 if self.disp:
fbef17cab632 Use fully rendered map in gameboard choosing screen
Neil Muller <drnlmuller@gmail.com>
parents: 422
diff changeset
791 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
792
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
793 def add_fox(self, fox):
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
794 self.foxes.add(fox)
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
795 self.tv.sprites.append(fox)
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
796
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
797 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
798 self.buildings.add(building)
381
7a58dadfd251 little cleanups, every sprite in its proper layer.
Jeremy Thurgood <firxen@gmail.com>
parents: 380
diff changeset
799 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
800
419
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
801 def place_hatched_chicken(self, new_chick, building):
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
802 try:
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
803 building.add_occupant(new_chick)
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
804 self.add_chicken(new_chick)
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
805 new_chick.equip(equipment.Nest())
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
806 except buildings.BuildingFullError:
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
807 # No space in the hen house, look nearby
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
808 for tile_pos in building.adjacent_tiles():
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
809 if self.tv.get(tile_pos) != self.GRASSLAND:
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
810 continue
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
811 if self.get_outside_chicken(tile_pos) is None:
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
812 self.add_chicken(new_chick)
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
813 self.relocate_animal(new_chick, tile_pos=tile_pos)
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
814 break
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
815 # if there isn't a space for the
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
816 # new chick it dies. :/ Farm life
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
817 # is cruel.
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
818
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
819 def kill_fox(self, fox):
251
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 247
diff changeset
820 self.killed_foxes += 1
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 247
diff changeset
821 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
822 self.add_cash(self.level.sell_price_dead_fox)
251
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 247
diff changeset
823 self.remove_fox(fox)
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
824
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
825 def remove_fox(self, fox):
456
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
826 self._pos_cache.remove(fox.pos, 'fox')
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
827 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
828 if fox.building:
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
829 fox.building.remove_predator(fox)
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
830 if fox in self.tv.sprites:
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
831 self.tv.sprites.remove(fox)
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
832
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
833 def remove_chicken(self, chick):
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
834 if chick in self.selected_chickens:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
835 self.unselect_animal(chick)
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
836 self.chickens.discard(chick)
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
837 self.eggs -= chick.get_num_eggs()
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
838 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
839 if chick.abode:
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
840 chick.abode.clear_occupant()
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
841 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
842 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
843 self.tv.sprites.remove(chick)
456
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
844 self._pos_cache.remove(chick.pos, 'chicken')
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
845
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
846 def remove_building(self, building):
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
847 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
848 self.buildings.discard(building)
381
7a58dadfd251 little cleanups, every sprite in its proper layer.
Jeremy Thurgood <firxen@gmail.com>
parents: 380
diff changeset
849 self.tv.sprites.remove(building, layer='buildings')
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
850
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
851 def add_cash(self, amount):
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
852 self.cash += amount
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
853 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
854
422
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
855 def add_wood(self, planks):
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
856 self.wood += planks
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
857 self.toolbar.update_wood_counter(self.wood)
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
858
408
02a6de5629d6 Levels can include starting equipment
Neil Muller <drnlmuller@gmail.com>
parents: 405
diff changeset
859 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
860 """Add chickens as specified by the code layer"""
476
3dae0fc14009 Animals have their own gameboard references instead of lugging them around in params all the time.
Jeremy Thurgood <firxen@gmail.com>
parents: 475
diff changeset
861 chick = animal.Chicken((tile.tx, tile.ty), self)
408
02a6de5629d6 Levels can include starting equipment
Neil Muller <drnlmuller@gmail.com>
parents: 405
diff changeset
862 for equip_cls in equipment.EQUIP_MAP[value]:
02a6de5629d6 Levels can include starting equipment
Neil Muller <drnlmuller@gmail.com>
parents: 405
diff changeset
863 item = equip_cls()
02a6de5629d6 Levels can include starting equipment
Neil Muller <drnlmuller@gmail.com>
parents: 405
diff changeset
864 chick.equip(item)
382
e89e6ad011ac Use code layer to place chickens
Neil Muller <drnlmuller@gmail.com>
parents: 381
diff changeset
865 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
866
241
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
867 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
868 fox_cls = misc.WeightedSelection(self.level.fox_weightings).choose()
476
3dae0fc14009 Animals have their own gameboard references instead of lugging them around in params all the time.
Jeremy Thurgood <firxen@gmail.com>
parents: 475
diff changeset
869 return fox_cls((x, y), self)
241
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
870
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
871 def spawn_foxes(self):
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
872 """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
873 # 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
874 x, y = 0, 0
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
875 width, height = self.tv.size
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
876 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
877 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
878 while len(self.foxes) < new_foxes:
73
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
879 side = random.randint(0, 3)
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
880 if side == 0:
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
881 # top
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
882 y = -1
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
883 x = random.randint(-1, width)
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
884 elif side == 1:
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
885 # bottom
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
886 y = height
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
887 x = random.randint(-1, width)
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
888 elif side == 2:
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
889 # left
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
890 x = -1
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
891 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
892 else:
73
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
893 x = width
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
894 y = random.randint(-1, height)
403
c7cfa230f5d4 Remove board size restriction on number of foxes
Neil Muller <drnlmuller@gmail.com>
parents: 401
diff changeset
895 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
896
67
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
897 def fix_buildings(self):
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
898 """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
899 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
900
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
901 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
902 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
903 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
904
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
905 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
906 """
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
907 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
908
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
909 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
910 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
911 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
912 tile_pos = (x, y)
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
913 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
914 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
915 continue
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
916
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
917 covered = False
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
918 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
919 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
920 covered = True
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
921 break
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
922
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
923 if covered:
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
924 continue
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
925
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
926 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
927 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
928 building.remove(self.tv)
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
929 building.place(self.tv)
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
930 self.add_building(building)
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
931
307
bf1df0902883 three game modes: fortnight, quarter, fox extinction
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 305
diff changeset
932 def trees_left(self):
bf1df0902883 three game modes: fortnight, quarter, fox extinction
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 305
diff changeset
933 width, height = self.tv.size
bf1df0902883 three game modes: fortnight, quarter, fox extinction
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 305
diff changeset
934 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
935
460
7204c16ab64d Wood market!
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 457
diff changeset
936 def calculate_wood_groat_exchange_rate(self):
461
279caa00f3fa exchange rate should be per tree, not per plank
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 460
diff changeset
937 # per five planks
460
7204c16ab64d Wood market!
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 457
diff changeset
938 width, height = self.tv.size
462
aba7f1439571 avoid division by zero
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 461
diff changeset
939 treesleft = max(1, self.trees_left())
aba7f1439571 avoid division by zero
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 461
diff changeset
940 sell_price = float(10*width*height)/treesleft
460
7204c16ab64d Wood market!
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 457
diff changeset
941 buy_price = sell_price*(1.1)
7204c16ab64d Wood market!
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 457
diff changeset
942 self.wood_sell_price, self.wood_buy_price = int(sell_price), int(buy_price)
7204c16ab64d Wood market!
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 457
diff changeset
943
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
944 def save_game(self):
463
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
945 # clear selected animals and tool states before saving
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
946 self.reset_states()
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
947 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
948
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
949 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
950 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
951 raise ValueError("Invalid save game.")
463
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
952
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
953 # clear old state
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
954 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
955 self.clear_buildings()
463
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
956
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
957 # set new state
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
958 newself = serializer.unsimplify(data)
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
959
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
960 #import pdb
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
961 #pdb.set_trace()
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
962
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
963 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
964 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
965 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
966 setattr(self, attr, getattr(newself, attr))
463
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
967
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
968 self.tv.png_folder_load_tiles('tiles')
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
969 self.tvw.vid = self.tv
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
970 self.tvw.vid.bounds = pygame.Rect((0, 0), self.tv.tile_to_view(self.tv.size))
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
971
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
972 for chicken in newself.chickens:
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
973 self.add_chicken(chicken)
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
974
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
975 for building in newself.buildings:
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
976 self.add_building(building)
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
977
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
978 self.reset_states()
453
4bce845fbe6c Redraw counters after restoring game.
Simon Cross <hodgestar@gmail.com>
parents: 452
diff changeset
979 self.redraw_counters()
463
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
980 self.update()
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
981
326
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
982
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
983 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
984 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
985 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
986
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
987 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
988
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
989 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
990
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
991 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
992 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
993 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
994 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
995 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
996 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
997 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
998
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
999 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
1000 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
1001
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1002 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
1003 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
1004 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
1005 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
1006 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
1007
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1008 gui.Dialog.__init__(self, title_label, tbl, **params)
336
82a18615a0ab Ask 'Are you sure?'
Neil Muller <drnlmuller@gmail.com>
parents: 330
diff changeset
1009
82a18615a0ab Ask 'Are you sure?'
Neil Muller <drnlmuller@gmail.com>
parents: 330
diff changeset
1010