annotate gamelib/gameboard.py @ 569:3ec614e6fd4a

Replace monolithic sell equipment tool with a tool for each type of equipment.
author Simon Cross <hodgestar@gmail.com>
date Sat, 28 Nov 2009 19:59:46 +0000
parents 37f7454518d5
children be47830a56b1
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, \
489
3c9c664ccb85 selection groups
Neil Muller <drnlmuller@gmail.com>
parents: 488
diff changeset
5 K_LEFT, K_RIGHT, KMOD_SHIFT, K_0, K_1, K_2, K_3, K_4, K_5, K_6, K_7, \
548
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 544
diff changeset
6 K_8, K_9, K_ESCAPE, K_n, K_d, KMOD_CTRL, KMOD_ALT, KEYUP
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
7 from pgu import gui
9
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
8
24
7584453f4944 Add support for PNG tiles.
Simon Cross <hodgestar@gmail.com>
parents: 17
diff changeset
9 import tiles
79
8241386a1651 Add chicken counter
Neil Muller <drnlmuller@gmail.com>
parents: 77
diff changeset
10 import icons
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
11 import constants
57
08665fa60345 Implement henhouses and henhouse adding.
Simon Cross <hodgestar@gmail.com>
parents: 54
diff changeset
12 import buildings
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
13 import animal
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
14 import equipment
94
fa8d8fc1bf5b Added some sounds
David Fraser <davidf@sjsoft.com>
parents: 92
diff changeset
15 import sound
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
16 import cursors
186
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
17 import sprite_cursor
241
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
18 import misc
433
8643893635e7 Seperate toolbar and gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 428
diff changeset
19 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
20 import serializer
566
a8dde729000a Add 'Save and Quit' option to quit dialog. Move game events from engine to constants to ease 'import engine' fun
Neil Muller <drnlmuller@gmail.com>
parents: 565
diff changeset
21 import savegame
152
702bc0eb2ac3 Fix Toolbar width to TOOLBAR_WIDTH by not allowing it to resize.
Simon Cross <hodgestar@gmail.com>
parents: 151
diff changeset
22
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
23 class VidWidget(gui.Widget):
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
24 def __init__(self, gameboard, vid, **params):
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
25 gui.Widget.__init__(self, **params)
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
26 self.gameboard = gameboard
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
27 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
28 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
29
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
30 def paint(self, surface):
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
31 self.vid.paint(surface)
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
32
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
33 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
34 return self.vid.update(surface)
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
35
39
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
36 def move_view(self, x, y):
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
37 self.vid.view.move_ip((x, y))
ec79aabe2bf1 Scroll game window with arrow keys.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
38
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
39 def event(self, e):
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
40 if e.type == MOUSEBUTTONDOWN:
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
41 self.gameboard.use_tool(e)
186
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
42 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
43 self.gameboard.update_sprite_cursor(e)
565
32b6b66e114a Cursors change.
Jeremy Thurgood <firxen@gmail.com>
parents: 561
diff changeset
44 elif e.type == gui.ENTER:
32b6b66e114a Cursors change.
Jeremy Thurgood <firxen@gmail.com>
parents: 561
diff changeset
45 self.gameboard.set_tool_cursor()
32b6b66e114a Cursors change.
Jeremy Thurgood <firxen@gmail.com>
parents: 561
diff changeset
46 elif e.type == gui.EXIT:
32b6b66e114a Cursors change.
Jeremy Thurgood <firxen@gmail.com>
parents: 561
diff changeset
47 self.gameboard.set_menu_cursor()
541
450de9dfa106 Move gameboard event prodding into the widgets - better matches pgu internals
Neil Muller <drnlmuller@gmail.com>
parents: 539
diff changeset
48 else:
548
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 544
diff changeset
49 return False
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
50
456
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 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
53 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
54 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
55 self.clear()
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
56
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
57 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
58 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
59
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
60 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
61 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
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 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
64 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
65 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
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 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
68 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
69 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
70
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
71 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
72 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
73 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
74
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
75 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
76 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
77
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
78
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
79 class GameBoard(serializer.Simplifiable):
9
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
80
66
edc15ce8fa30 Implement fence selling (a bit hackish, but fine for now).
Simon Cross <hodgestar@gmail.com>
parents: 65
diff changeset
81 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
82 FENCE = tiles.REVERSE_TILE_MAP['fence']
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
83 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
84
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
85 SIMPLIFY = [
468
d5e4959cfe7a Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents: 463
diff changeset
86 'level',
463
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
87 'tv',
468
d5e4959cfe7a Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents: 463
diff changeset
88 'max_foxes',
504
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
89 #'selected_tool',
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
90 #'sprite_cursor',
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
91 'selected_chickens',
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
92 'stored_selections',
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
93 'chickens',
504
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
94 '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
95 'buildings',
504
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
96 #'_pos_cache',
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
97 '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
98 '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
99 '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
100 '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
101 '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
102 '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
103 ]
feb9b7a23ef2 Support for saving and loading games (toolbar entries commented out for lack of space).
Simon Cross <hodgestar@gmail.com>
parents: 434
diff changeset
104
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
105 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
106 self.disp = main_app
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
107 self.level = level
24
7584453f4944 Add support for PNG tiles.
Simon Cross <hodgestar@gmail.com>
parents: 17
diff changeset
108 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
109 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
110 self.tv.tga_load_level(level.map)
382
e89e6ad011ac Use code layer to place chickens
Neil Muller <drnlmuller@gmail.com>
parents: 381
diff changeset
111 width, height = self.tv.size
323
978efd39a099 Limit maximum numbe of foxes generated
Neil Muller <drnlmuller@gmail.com>
parents: 320
diff changeset
112 # 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
113 self.max_foxes = level.max_foxes
460
7204c16ab64d Wood market!
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 457
diff changeset
114 self.calculate_wood_groat_exchange_rate()
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
115
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
116 self.selected_tool = None
186
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
117 self.sprite_cursor = None
487
a5dc09881aa1 rationalised when tools are reset; e.g. you can trade wood without losing selection / move tool. Default toolbar shows correct tool when reloaded (select/move only; other tools reset)
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 485
diff changeset
118 self.selected_chickens = []
489
3c9c664ccb85 selection groups
Neil Muller <drnlmuller@gmail.com>
parents: 488
diff changeset
119 self.stored_selections = {}
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
120 self.chickens = set()
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
121 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
122 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
123 self._pos_cache = AnimalPositionCache(self)
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
124 self.cash = 0
422
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
125 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
126 self.eggs = 0
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
127 self.days = 0
79
8241386a1651 Add chicken counter
Neil Muller <drnlmuller@gmail.com>
parents: 77
diff changeset
128 self.killed_foxes = 0
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
129 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
130 # For the level loading case
fbef17cab632 Use fully rendered map in gameboard choosing screen
Neil Muller <drnlmuller@gmail.com>
parents: 422
diff changeset
131 if self.disp:
447
f04a2490c35f The sub-toolbar rewrite, the finally not crashing version
Neil Muller <drnlmuller@gmail.com>
parents: 444
diff changeset
132 self.toolbar = None
424
fbef17cab632 Use fully rendered map in gameboard choosing screen
Neil Muller <drnlmuller@gmail.com>
parents: 422
diff changeset
133 self.create_display()
fbef17cab632 Use fully rendered map in gameboard choosing screen
Neil Muller <drnlmuller@gmail.com>
parents: 422
diff changeset
134 self.add_cash(level.starting_cash)
428
a356e57529ea buildings cost wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 425
diff changeset
135 self.add_wood(level.starting_wood)
17
cbbc5da7708a Interaction with the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 14
diff changeset
136
67
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
137 self.fix_buildings()
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
138
408
02a6de5629d6 Levels can include starting equipment
Neil Muller <drnlmuller@gmail.com>
parents: 405
diff changeset
139 cdata = {}
02a6de5629d6 Levels can include starting equipment
Neil Muller <drnlmuller@gmail.com>
parents: 405
diff changeset
140 for tn in equipment.EQUIP_MAP:
02a6de5629d6 Levels can include starting equipment
Neil Muller <drnlmuller@gmail.com>
parents: 405
diff changeset
141 cdata[tn] = (self.add_start_chickens, tn)
382
e89e6ad011ac Use code layer to place chickens
Neil Muller <drnlmuller@gmail.com>
parents: 381
diff changeset
142
e89e6ad011ac Use code layer to place chickens
Neil Muller <drnlmuller@gmail.com>
parents: 381
diff changeset
143 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
144
504
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
145 @classmethod
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
146 def unsimplify(cls, *args, **kwargs):
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
147 """Override default Simplifiable unsimplification."""
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
148 obj = super(GameBoard, cls).unsimplify(*args, **kwargs)
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
149
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
150 obj.tv.png_folder_load_tiles('tiles')
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
151 obj.calculate_wood_groat_exchange_rate()
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
152
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
153 obj._pos_cache = AnimalPositionCache(obj)
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
154 obj._cache_animal_positions()
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
155
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
156 obj.sprite_cursor = None
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
157 obj.set_selected_tool(None, None)
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
158
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
159 obj.disp = None
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
160
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
161 # put chickens, foxes and buildings into sprite list
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
162
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
163 existing_chickens = obj.chickens
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
164 obj.chickens = set()
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
165 for chicken in existing_chickens:
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
166 obj.add_chicken(chicken)
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
167
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
168 existing_foxes = obj.foxes
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
169 obj.foxes = set()
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
170 for fox in existing_foxes:
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
171 obj.add_fox(fox)
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
172
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
173 existing_buildings = obj.buildings
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
174 obj.buildings = set()
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
175 for building in existing_buildings:
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
176 obj.add_building(building)
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
177
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
178 # self.disp is not set properly here
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
179 # whoever unsimplifies the gameboard needs to arrange for it to be
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
180 # set and then call .create_display() and so create:
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
181 # - .toolbar
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
182 # - .tvw
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
183 # - .top_widget
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
184
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
185 return obj
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
186
151
082868bea873 Refactor UI so that only a single gui.App is used. Pass all UI events via main_app. Change Toolbar table to use .td() everywhere. Move toolbar to top.
Simon Cross <hodgestar@gmail.com>
parents: 148
diff changeset
187 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
188 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
189
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
190 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
191 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
192 tbl = gui.Table()
5569430fd82e Display cleanup and rationalisation.
Jeremy Thurgood <firxen@gmail.com>
parents: 35
diff changeset
193 tbl.tr()
447
f04a2490c35f The sub-toolbar rewrite, the finally not crashing version
Neil Muller <drnlmuller@gmail.com>
parents: 444
diff changeset
194 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
195 tbl.td(self.toolbar, valign=-1)
433
8643893635e7 Seperate toolbar and gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 428
diff changeset
196 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
197 tbl.td(self.tvw)
548
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 544
diff changeset
198
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 544
diff changeset
199 # we should probably create a custom widget to be the top widget
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 544
diff changeset
200 # if we want to flow some events to the gameboard
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 544
diff changeset
201 def event(e):
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 544
diff changeset
202 if gui.Table.event(tbl, e):
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 544
diff changeset
203 return True
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 544
diff changeset
204 return self.event(e)
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 544
diff changeset
205 tbl.event = event
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 544
diff changeset
206
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
207 self.top_widget = tbl
504
393e30ea0165 Save game loading working again.
Simon Cross <hodgestar@gmail.com>
parents: 500
diff changeset
208 self.redraw_counters()
14
d7f295c06a4b Split gameboard screen.
Jeremy Thurgood <firxen@gmail.com>
parents: 12
diff changeset
209
447
f04a2490c35f The sub-toolbar rewrite, the finally not crashing version
Neil Muller <drnlmuller@gmail.com>
parents: 444
diff changeset
210 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
211 """Replace the toolbar"""
f04a2490c35f The sub-toolbar rewrite, the finally not crashing version
Neil Muller <drnlmuller@gmail.com>
parents: 444
diff changeset
212 td = self.toolbar.container
f04a2490c35f The sub-toolbar rewrite, the finally not crashing version
Neil Muller <drnlmuller@gmail.com>
parents: 444
diff changeset
213 td.remove(self.toolbar)
f04a2490c35f The sub-toolbar rewrite, the finally not crashing version
Neil Muller <drnlmuller@gmail.com>
parents: 444
diff changeset
214 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
215 self.toolbar = new_toolbar
449
938498b8cd03 Fix toolbar alignment
Neil Muller <drnlmuller@gmail.com>
parents: 447
diff changeset
216 self.toolbar.rect.size = self.toolbar.resize()
452
17e07b4cdeb4 Seperate counter redrawing as seperate method
Neil Muller <drnlmuller@gmail.com>
parents: 451
diff changeset
217 self.redraw_counters()
17e07b4cdeb4 Seperate counter redrawing as seperate method
Neil Muller <drnlmuller@gmail.com>
parents: 451
diff changeset
218 td.repaint()
17e07b4cdeb4 Seperate counter redrawing as seperate method
Neil Muller <drnlmuller@gmail.com>
parents: 451
diff changeset
219
493
ee883d390ff0 cleaned up tool reset / preservation on toolbar change so that it all happens in one place
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 492
diff changeset
220 if new_toolbar.MOVE_SELECT_PERMITTED:
ee883d390ff0 cleaned up tool reset / preservation on toolbar change so that it all happens in one place
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 492
diff changeset
221 if self.selected_tool not in [constants.TOOL_SELECT_CHICKENS, constants.TOOL_PLACE_ANIMALS]:
ee883d390ff0 cleaned up tool reset / preservation on toolbar change so that it all happens in one place
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 492
diff changeset
222 self.set_selected_tool(None, None)
ee883d390ff0 cleaned up tool reset / preservation on toolbar change so that it all happens in one place
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 492
diff changeset
223 else:
ee883d390ff0 cleaned up tool reset / preservation on toolbar change so that it all happens in one place
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 492
diff changeset
224 self.set_selected_tool(None, None)
ee883d390ff0 cleaned up tool reset / preservation on toolbar change so that it all happens in one place
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 492
diff changeset
225 self.unselect_all()
ee883d390ff0 cleaned up tool reset / preservation on toolbar change so that it all happens in one place
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 492
diff changeset
226
452
17e07b4cdeb4 Seperate counter redrawing as seperate method
Neil Muller <drnlmuller@gmail.com>
parents: 451
diff changeset
227 def redraw_counters(self):
451
d0f586647dfa Redraw counters when changing toolbars
Neil Muller <drnlmuller@gmail.com>
parents: 449
diff changeset
228 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
229 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
230 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
231 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
232 # 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
233 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
234 self.toolbar.update_day_counter("%s/%s" % (self.days,
d0f586647dfa Redraw counters when changing toolbars
Neil Muller <drnlmuller@gmail.com>
parents: 449
diff changeset
235 self.level.get_max_turns()))
d0f586647dfa Redraw counters when changing toolbars
Neil Muller <drnlmuller@gmail.com>
parents: 449
diff changeset
236 self.toolbar.update_chicken_counter(len(self.chickens))
d0f586647dfa Redraw counters when changing toolbars
Neil Muller <drnlmuller@gmail.com>
parents: 449
diff changeset
237 self.toolbar.update_cash_counter(self.cash)
d0f586647dfa Redraw counters when changing toolbars
Neil Muller <drnlmuller@gmail.com>
parents: 449
diff changeset
238 self.toolbar.update_wood_counter(self.wood)
544
84964077626a Counter display more compact, although not as pretty as it should be.
Jeremy Thurgood <firxen@gmail.com>
parents: 542
diff changeset
239 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
240
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
241 def update(self):
37
497b53b69280 Always update the vidwidget.
Jeremy Thurgood <firxen@gmail.com>
parents: 36
diff changeset
242 self.tvw.reupdate()
9
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
243
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
244 def loop(self):
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
245 self.tv.loop()
9
3b045083631e Basic game board logic.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
246
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
247 def set_selected_tool(self, tool, cursor):
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
248 if not self.day:
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
249 return False
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
250 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
251 return False # Using the tool on selected chickens is immediate
35
8f6c6a54a099 Fixed gameboard display.
Jeremy Thurgood <firxen@gmail.com>
parents: 29
diff changeset
252 self.selected_tool = tool
203
653da96db572 Fixed dangling cursor sprite and did some TODO list maintenance.
Jeremy Thurgood <firxen@gmail.com>
parents: 202
diff changeset
253 sprite_curs = None
653da96db572 Fixed dangling cursor sprite and did some TODO list maintenance.
Jeremy Thurgood <firxen@gmail.com>
parents: 202
diff changeset
254 if buildings.is_building(tool):
232
0bd214cf9018 Overlay cost on building sprite cursors.
Simon Cross <hodgestar@gmail.com>
parents: 228
diff changeset
255 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
256 elif equipment.is_equipment(tool):
5b9cd693fe7c Add sprite cursors for equipment buying.
Simon Cross <hodgestar@gmail.com>
parents: 245
diff changeset
257 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
258 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
259 cursor = cursors.cursors['chicken']
565
32b6b66e114a Cursors change.
Jeremy Thurgood <firxen@gmail.com>
parents: 561
diff changeset
260 self.current_cursor = (cursor, sprite_curs)
32b6b66e114a Cursors change.
Jeremy Thurgood <firxen@gmail.com>
parents: 561
diff changeset
261 self.set_tool_cursor((cursor, sprite_curs))
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
262 return True
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
263
565
32b6b66e114a Cursors change.
Jeremy Thurgood <firxen@gmail.com>
parents: 561
diff changeset
264 def set_tool_cursor(self, current_cursor=None):
32b6b66e114a Cursors change.
Jeremy Thurgood <firxen@gmail.com>
parents: 561
diff changeset
265 if current_cursor:
32b6b66e114a Cursors change.
Jeremy Thurgood <firxen@gmail.com>
parents: 561
diff changeset
266 self.current_cursor = current_cursor
32b6b66e114a Cursors change.
Jeremy Thurgood <firxen@gmail.com>
parents: 561
diff changeset
267 if pygame.mouse.get_pos()[0] >= constants.TOOLBAR_WIDTH:
32b6b66e114a Cursors change.
Jeremy Thurgood <firxen@gmail.com>
parents: 561
diff changeset
268 self.set_cursor(*self.current_cursor)
32b6b66e114a Cursors change.
Jeremy Thurgood <firxen@gmail.com>
parents: 561
diff changeset
269
32b6b66e114a Cursors change.
Jeremy Thurgood <firxen@gmail.com>
parents: 561
diff changeset
270 def set_menu_cursor(self):
32b6b66e114a Cursors change.
Jeremy Thurgood <firxen@gmail.com>
parents: 561
diff changeset
271 self.set_cursor()
32b6b66e114a Cursors change.
Jeremy Thurgood <firxen@gmail.com>
parents: 561
diff changeset
272
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
273 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
274 if self.selected_chickens:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
275 # 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
276 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
277 self.sell_chicken(None)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
278 return True
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
279 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
280 self.sell_egg(None)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
281 return True
569
3ec614e6fd4a Replace monolithic sell equipment tool with a tool for each type of equipment.
Simon Cross <hodgestar@gmail.com>
parents: 567
diff changeset
282 elif toolbar.SellToolBar.is_equip_tool(tool):
3ec614e6fd4a Replace monolithic sell equipment tool with a tool for each type of equipment.
Simon Cross <hodgestar@gmail.com>
parents: 567
diff changeset
283 equipment_cls = toolbar.SellToolBar.get_equip_cls(tool)
3ec614e6fd4a Replace monolithic sell equipment tool with a tool for each type of equipment.
Simon Cross <hodgestar@gmail.com>
parents: 567
diff changeset
284 self.sell_equipment(None, equipment_cls)
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
285 return True
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
286 elif equipment.is_equipment(tool):
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
287 self.buy_equipment(None, tool)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
288 return True
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
289 return False
203
653da96db572 Fixed dangling cursor sprite and did some TODO list maintenance.
Jeremy Thurgood <firxen@gmail.com>
parents: 202
diff changeset
290
653da96db572 Fixed dangling cursor sprite and did some TODO list maintenance.
Jeremy Thurgood <firxen@gmail.com>
parents: 202
diff changeset
291 def set_cursor(self, cursor=None, sprite_curs=None):
162
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
292 if cursor:
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
293 pygame.mouse.set_cursor(*cursor)
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
294 else:
fa57868123d7 Basic cursor support
Neil Muller <drnlmuller@gmail.com>
parents: 158
diff changeset
295 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
296 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
297 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
298 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
299 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
300 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
301
07b361ebd87f Ensure we clean up highlights, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 212
diff changeset
302 def reset_states(self):
07b361ebd87f Ensure we clean up highlights, etc.
Neil Muller <drnlmuller@gmail.com>
parents: 212
diff changeset
303 """Clear current states (highlights, etc.)"""
245
634491bf37e8 Change toolbar to gui.Toolbar -- gives nicer highlighting.
Simon Cross <hodgestar@gmail.com>
parents: 243
diff changeset
304 self.set_selected_tool(None, None)
634491bf37e8 Change toolbar to gui.Toolbar -- gives nicer highlighting.
Simon Cross <hodgestar@gmail.com>
parents: 243
diff changeset
305 self.toolbar.clear_tool()
17
cbbc5da7708a Interaction with the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 14
diff changeset
306
186
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
307 def update_sprite_cursor(self, e):
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
308 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
309 self.sprite_cursor.set_pos(tile_pos)
f06010d34cd3 Add sprite cursors for building placement.
Simon Cross <hodgestar@gmail.com>
parents: 183
diff changeset
310
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
311 def start_night(self):
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
312 self.day, self.night = False, True
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
313 self.tv.sun(False)
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
314 self.reset_states()
500
4d980444ebfb deselect chickens at night
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 498
diff changeset
315 self.unselect_all()
434
f2a55e5e24db Disable non-selectable toolbar widgets at night
Neil Muller <drnlmuller@gmail.com>
parents: 433
diff changeset
316 self.toolbar.start_night()
413
bdc4757e0497 Add Sniper Rifle and give guns limited ammunition.
Jeremy Thurgood <firxen@gmail.com>
parents: 408
diff changeset
317 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
318 self.eggs = 0
419
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
319 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
320 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
321 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
322 self._cache_animal_positions()
539
f4d1b9ff9558 Lumberjacks only wander off when their work is done.
Jeremy Thurgood <firxen@gmail.com>
parents: 538
diff changeset
323 self.chickens_chop_wood()
f4d1b9ff9558 Lumberjacks only wander off when their work is done.
Jeremy Thurgood <firxen@gmail.com>
parents: 538
diff changeset
324 self.chickens_scatter()
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
325
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
326 def start_day(self):
512
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 506
diff changeset
327 if hasattr(self, '_skip_start_day'):
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 506
diff changeset
328 del self._skip_start_day
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 506
diff changeset
329 return
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
330 self.day, self.night = True, False
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
331 self.tv.sun(True)
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
332 self.reset_states()
434
f2a55e5e24db Disable non-selectable toolbar widgets at night
Neil Muller <drnlmuller@gmail.com>
parents: 433
diff changeset
333 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
334 self._pos_cache.clear()
413
bdc4757e0497 Add Sniper Rifle and give guns limited ammunition.
Jeremy Thurgood <firxen@gmail.com>
parents: 408
diff changeset
335 self.advance_day()
bdc4757e0497 Add Sniper Rifle and give guns limited ammunition.
Jeremy Thurgood <firxen@gmail.com>
parents: 408
diff changeset
336 self.clear_foxes()
419
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
337 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
338 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
339 self.redraw_counters()
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
340
512
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 506
diff changeset
341 def skip_next_start_day(self):
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 506
diff changeset
342 # used to skip the start of the day triggered after
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 506
diff changeset
343 # reloading a save game
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 506
diff changeset
344 self._skip_start_day = True
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 506
diff changeset
345
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
346 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
347 """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
348 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
349 return False
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
350 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
351 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
352 return False
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
353 return True
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
354
17
cbbc5da7708a Interaction with the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 14
diff changeset
355 def use_tool(self, e):
223
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
356 if not self.day:
527a5d4e3fa3 Disable tools at night.
Simon Cross <hodgestar@gmail.com>
parents: 221
diff changeset
357 return
189
37af9e5dd292 Use tool with left button, cancel tool with right button.
Jeremy Thurgood <firxen@gmail.com>
parents: 186
diff changeset
358 if e.button == 3: # Right button
492
e8430f93b23a toggling select/move can now be initiated from no selected tool and in any toolbar where select/move is allowed
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 490
diff changeset
359 if self.toolbar.MOVE_SELECT_PERMITTED:
e8430f93b23a toggling select/move can now be initiated from no selected tool and in any toolbar where select/move is allowed
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 490
diff changeset
360 if self.selected_tool != constants.TOOL_SELECT_CHICKENS:
e8430f93b23a toggling select/move can now be initiated from no selected tool and in any toolbar where select/move is allowed
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 490
diff changeset
361 self.set_selected_tool(constants.TOOL_SELECT_CHICKENS, cursors.cursors["select"])
e8430f93b23a toggling select/move can now be initiated from no selected tool and in any toolbar where select/move is allowed
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 490
diff changeset
362 elif self.selected_tool == constants.TOOL_SELECT_CHICKENS:
e8430f93b23a toggling select/move can now be initiated from no selected tool and in any toolbar where select/move is allowed
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 490
diff changeset
363 self.set_selected_tool(constants.TOOL_PLACE_ANIMALS, cursors.cursors["chicken"])
538
ec5276cfe98b put back code to highlight move/select button appropriately
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 536
diff changeset
364 if self.toolbar.IS_DEFAULT:
ec5276cfe98b put back code to highlight move/select button appropriately
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 536
diff changeset
365 self.toolbar.highlight_move_select_button()
480
312120a99181 right-click now toggles select and move tool
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 479
diff changeset
366 return
488
a9f6c32c8ea9 put back deselect tool + chickens under middleclick, so that you can fall back to old equip behaviour while in equipment menu
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 487
diff changeset
367 elif e.button == 2: # Middle button
490
8308bef91864 fixed so that tool highlight also cleared.
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 489
diff changeset
368 self.reset_states()
488
a9f6c32c8ea9 put back deselect tool + chickens under middleclick, so that you can fall back to old equip behaviour while in equipment menu
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 487
diff changeset
369 self.unselect_all()
189
37af9e5dd292 Use tool with left button, cancel tool with right button.
Jeremy Thurgood <firxen@gmail.com>
parents: 186
diff changeset
370 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
371 return
479
1689b43ed8be Use KMOD_SHIFT to allow shift-click selecting of multiple chickens.
Simon Cross <hodgestar@gmail.com>
parents: 478
diff changeset
372 mods = pygame.key.get_mods()
52
0d4799866bcf Sell chickens and buy fences.
Jeremy Thurgood <firxen@gmail.com>
parents: 40
diff changeset
373 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
374 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
375 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
376 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
377 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
378 self.place_animal(self.tv.screen_to_tile(e.pos))
516
4166a0051bb6 Reset cursor as well when changing tool. Avoid crash with non-default toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 514
diff changeset
379 self.set_selected_tool(constants.TOOL_SELECT_CHICKENS, cursors.cursors["select"])
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
380 elif self.selected_tool == constants.TOOL_SELECT_CHICKENS:
514
55b95bb25ced On move, revert to the select tool - why would you want to move the same chicken twice?
David Fraser <davidf@sjsoft.com>
parents: 512
diff changeset
381 # ctrl moves current selection without having to select move tool
55b95bb25ced On move, revert to the select tool - why would you want to move the same chicken twice?
David Fraser <davidf@sjsoft.com>
parents: 512
diff changeset
382 if (mods & KMOD_CTRL):
55b95bb25ced On move, revert to the select tool - why would you want to move the same chicken twice?
David Fraser <davidf@sjsoft.com>
parents: 512
diff changeset
383 self.place_animal(self.tv.screen_to_tile(e.pos))
55b95bb25ced On move, revert to the select tool - why would you want to move the same chicken twice?
David Fraser <davidf@sjsoft.com>
parents: 512
diff changeset
384 else:
55b95bb25ced On move, revert to the select tool - why would you want to move the same chicken twice?
David Fraser <davidf@sjsoft.com>
parents: 512
diff changeset
385 if not (mods & KMOD_SHIFT):
55b95bb25ced On move, revert to the select tool - why would you want to move the same chicken twice?
David Fraser <davidf@sjsoft.com>
parents: 512
diff changeset
386 self.unselect_all()
55b95bb25ced On move, revert to the select tool - why would you want to move the same chicken twice?
David Fraser <davidf@sjsoft.com>
parents: 512
diff changeset
387 self.select_chicken(self.tv.screen_to_tile(e.pos))
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
388 elif self.selected_tool == constants.TOOL_SELL_BUILDING:
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
389 self.sell_building(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
390 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
391 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
392 elif buildings.is_building(self.selected_tool):
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
393 self.buy_building(self.tv.screen_to_tile(e.pos), self.selected_tool)
569
3ec614e6fd4a Replace monolithic sell equipment tool with a tool for each type of equipment.
Simon Cross <hodgestar@gmail.com>
parents: 567
diff changeset
394 elif toolbar.SellToolBar.is_equip_tool(self.selected_tool):
3ec614e6fd4a Replace monolithic sell equipment tool with a tool for each type of equipment.
Simon Cross <hodgestar@gmail.com>
parents: 567
diff changeset
395 equipment_cls = toolbar.SellToolBar.get_equip_cls(self.selected_tool)
3ec614e6fd4a Replace monolithic sell equipment tool with a tool for each type of equipment.
Simon Cross <hodgestar@gmail.com>
parents: 567
diff changeset
396 self.sell_equipment(self.tv.screen_to_tile(e.pos), equipment_cls)
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
397 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
398 if not self.selected_chickens:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
399 # old selection behaviour
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
400 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
401 self.selected_tool)
17
cbbc5da7708a Interaction with the game board.
Jeremy Thurgood <firxen@gmail.com>
parents: 14
diff changeset
402
166
4aa800354b7c Rename get_chicken to get_outside_chicken.
Simon Cross <hodgestar@gmail.com>
parents: 165
diff changeset
403 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
404 for chick in self.chickens:
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
405 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
406 return chick
b8f64db0d39e Cleaned up buying and selling a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 52
diff changeset
407 return None
57
08665fa60345 Implement henhouses and henhouse adding.
Simon Cross <hodgestar@gmail.com>
parents: 54
diff changeset
408
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
409 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
410 for building in self.buildings:
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
411 if building.covers(tile_pos):
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
412 return building
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
413 return None
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
414
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
415 def sell_chicken(self, tile_pos):
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
416
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
417 def do_sell(chicken, update_button=None):
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
418 if not chicken:
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
419 return False # sanity check
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
420 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
421 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
422 TextDialog("Squuaaawwwwwk!", msg).open()
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
423 return False
228
f74de4280e20 Sell chicken's equipment when you sell the chicken.
Simon Cross <hodgestar@gmail.com>
parents: 227
diff changeset
424 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
425 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
426 chicken.unequip(item)
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
427 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
428 sound.play_sound("sell-chicken.ogg")
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
429 if update_button:
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
430 update_button(chicken, empty=True)
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
431 self.remove_chicken(chicken)
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
432 return True
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
433
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
434 if tile_pos:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
435 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
436 if chick is None:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
437 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
438 if building and building.HENHOUSE:
474
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
439 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
440 return
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
441 do_sell(chick)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
442 else:
556
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
443 def sure(val):
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
444 if val:
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
445 for chick in self.selected_chickens[:]:
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
446 do_sell(chick)
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
447 if self._check_dangerous_sale():
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
448 dialog = misc.CheckDialog(sure,
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
449 "These chickens have equipment or eggs. Do you want to sell?",
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
450 "Yes, Sell Them", "No, Don't Sell", None)
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
451 self.disp.open(dialog)
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
452 else:
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
453 sure(1)
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
454
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
455 def sell_one_egg(self, chicken):
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
456 if chicken.eggs:
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
457 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
458 chicken.remove_one_egg()
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
459 return True
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
460 return False
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
461
475
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 474
diff changeset
462 def remove_eggs(self, num):
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 474
diff changeset
463 self.eggs -= num
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 474
diff changeset
464 self.toolbar.update_egg_counter(self.eggs)
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 474
diff changeset
465
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
466 def sell_egg(self, tile_pos):
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
467 def do_sell(chicken, update_button=None):
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
468 # We try sell and egg
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
469 if self.sell_one_egg(chicken):
193
db246683d5da Selling eggs now works
Neil Muller <drnlmuller@gmail.com>
parents: 192
diff changeset
470 sound.play_sound("sell-chicken.ogg")
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
471 # Force toolbar update
193
db246683d5da Selling eggs now works
Neil Muller <drnlmuller@gmail.com>
parents: 192
diff changeset
472 self.toolbar.chsize()
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
473 if update_button:
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
474 update_button(chicken)
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
475 return False
193
db246683d5da Selling eggs now works
Neil Muller <drnlmuller@gmail.com>
parents: 192
diff changeset
476
473
4b8ca482ea08 don't crash when selling eggs from selected chickens
Neil Muller <drnlmuller@gmail.com>
parents: 472
diff changeset
477 if tile_pos:
4b8ca482ea08 don't crash when selling eggs from selected chickens
Neil Muller <drnlmuller@gmail.com>
parents: 472
diff changeset
478 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
479 if building and building.HENHOUSE:
523
103b0fc36722 Apply action to all selected chickens in building dialog
Neil Muller <drnlmuller@gmail.com>
parents: 522
diff changeset
480 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
481 else:
4b8ca482ea08 don't crash when selling eggs from selected chickens
Neil Muller <drnlmuller@gmail.com>
parents: 472
diff changeset
482 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
483 do_sell(chicken)
54
b8f64db0d39e Cleaned up buying and selling a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 52
diff changeset
484
556
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
485 def _check_dangerous_sale(self):
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
486 # Dangerous sales are: selling chickens with equipment & selling
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
487 # chickens with eggs
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
488 for chick in self.selected_chickens:
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
489 if chick.eggs or chick.weapons() or chick.armour():
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
490 return True
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
491 return False
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
492
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
493 def _check_dangerous_move(self, building=None):
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
494 # Dangerous move involves moving chickens WITH eggs out of their
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
495 # current building
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
496 for chick in self.selected_chickens:
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
497 if chick.eggs and chick.abode and \
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
498 chick.abode.building is not building:
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
499 return True
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
500 return False # safe move
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
501
489
3c9c664ccb85 selection groups
Neil Muller <drnlmuller@gmail.com>
parents: 488
diff changeset
502 def select_animal(self, animal):
3c9c664ccb85 selection groups
Neil Muller <drnlmuller@gmail.com>
parents: 488
diff changeset
503 self.selected_chickens.append(animal)
561
7f037ee2a6c8 Show count of selected chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 557
diff changeset
504 if animal.abode:
7f037ee2a6c8 Show count of selected chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 557
diff changeset
505 animal.abode.building.update_occupant_count()
489
3c9c664ccb85 selection groups
Neil Muller <drnlmuller@gmail.com>
parents: 488
diff changeset
506 animal.equip(equipment.Spotlight())
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
507
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
508 def unselect_all(self):
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
509 # Clear any highlights
561
7f037ee2a6c8 Show count of selected chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 557
diff changeset
510 old_sel = self.selected_chickens
7f037ee2a6c8 Show count of selected chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 557
diff changeset
511 self.selected_chickens = []
7f037ee2a6c8 Show count of selected chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 557
diff changeset
512 for chick in old_sel:
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
513 chick.unequip_by_name("Spotlight")
561
7f037ee2a6c8 Show count of selected chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 557
diff changeset
514 if chick.abode:
7f037ee2a6c8 Show count of selected chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 557
diff changeset
515 chick.abode.building.update_occupant_count()
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
516
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
517 def unselect_animal(self, animal):
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
518 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
519 self.selected_chickens.remove(animal)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
520 animal.unequip_by_name("Spotlight")
561
7f037ee2a6c8 Show count of selected chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 557
diff changeset
521 if animal.abode:
7f037ee2a6c8 Show count of selected chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 557
diff changeset
522 animal.abode.building.update_occupant_count()
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
523
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
524 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
525 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
526 if chicken:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
527 return chicken
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
528 building = self.get_building(tile_pos)
481
fac63919a972 Don't look for chickens in fences
Neil Muller <drnlmuller@gmail.com>
parents: 480
diff changeset
529 if building and building.ABODE:
498
62b9a4e21f1a chickens in closed buildings deselected. building opens if you put in chickens and it's not full. opening building with move or select tool allows rearrangement of chickens in building. fixed multiselect in buildings.
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 497
diff changeset
530 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
531
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
532 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
533 """Handle a select chicken event"""
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
534 # 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
535 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
536 if not chicken:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
537 return # do nothing
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
538 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
539 self.unselect_animal(chicken)
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
540 else:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
541 self.select_animal(chicken)
200
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 197
diff changeset
542
556
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
543 def _do_move_selected(self, building, tile_pos):
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
544 """Internal helper function for place_animal"""
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
545 if building and building.ABODE:
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
546 for chicken in self.selected_chickens[:]:
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
547 try:
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
548 place = building.first_empty_place()
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
549 self.relocate_animal(chicken, place=place)
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
550 chicken.equip(equipment.Nest())
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
551 self.unselect_animal(chicken)
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
552 except buildings.BuildingFullError:
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
553 pass
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
554 try:
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
555 # if there's a space left, open the building
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
556 building.first_empty_place()
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
557 self.open_building_dialog(building, True)
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
558 except buildings.BuildingFullError:
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
559 pass
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
560 if not self.selected_chickens:
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
561 # if we placed all the chickens, switch to select cursor
565
32b6b66e114a Cursors change.
Jeremy Thurgood <firxen@gmail.com>
parents: 561
diff changeset
562 self.set_tool_cursor((cursors.cursors['select'],))
556
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
563 elif self.tv.get(tile_pos) == self.GRASSLAND:
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
564 for chicken in self.selected_chickens:
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
565 try_pos = tile_pos
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
566 cur_chick = self.get_outside_chicken(try_pos)
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
567 if cur_chick == chicken:
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
568 continue
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
569 if cur_chick:
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
570 try_pos = None
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
571 # find a free square nearby
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
572 poss = [(tile_pos[0] + x, tile_pos[1] + y)
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
573 for x in range(-1, 2) for y in range(-1, 2)
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
574 if (x, y) != (0, 0)]
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
575 poss.extend([(tile_pos[0] + x, tile_pos[1] + y)
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
576 for x in range(-2, 3, 2) for y in range(-2, 3)
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
577 if (x, y) != (0, 0)])
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
578 for cand in poss:
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
579 if self.tv.get(cand) == self.GRASSLAND and \
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
580 not self.get_outside_chicken(cand):
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
581 try_pos = cand
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
582 break
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
583 if try_pos:
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
584 chicken.unequip_by_name("Nest")
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
585 self.relocate_animal(chicken, tile_pos=try_pos)
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
586 chicken.remove_eggs()
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
587
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
588
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
589 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
590 """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
591
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
592 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
593 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
594 """
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
595 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
596 # Old behaviour
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
597 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
598 if chicken:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
599 self.select_animal(chicken)
565
32b6b66e114a Cursors change.
Jeremy Thurgood <firxen@gmail.com>
parents: 561
diff changeset
600 self.set_tool_cursor((cursors.cursors['chicken'],))
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
601 return
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
602 elif tile_pos:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
603 building = self.get_building(tile_pos)
556
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
604 def sure(val):
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
605 if val:
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
606 self._do_move_selected(building, tile_pos)
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
607
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
608 if self._check_dangerous_move(building):
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
609 dialog = misc.CheckDialog(sure,
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
610 "These chickens have eggs. Do you want to move them?",
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
611 "Yes, Move Them", "No, Don't Move", None)
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
612 self.disp.open(dialog)
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
613 else:
46f6f1a98f3f Add warning dialogs for dangerous operations
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
614 sure(1)
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
615
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
616 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
617 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
618 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
619 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
620 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
621 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
622 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
623 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
624 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
625 self.set_visibility(chicken)
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
626
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
627 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
628 if animal.outside():
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
629 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
630 self.tv.sprites.append(animal)
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
631 else:
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
632 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
633 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
634
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
635 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
636 """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
637 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
638
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
639 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
640 self.disp.close(tbl)
170
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
641 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
642 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
643
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
644 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
645 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
646
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
647 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
648 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
649 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
650 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
651 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
652 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
653
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
654 if x:
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
655 offset = (self.disp.rect.center[0] + x,
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
656 self.disp.rect.center[1] + y)
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
657 else:
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
658 offset = None
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
659 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
660 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
661
474
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
662 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
663 """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
664
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
665 place_button_map = {}
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
666
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
667 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
668 """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
669 if animal:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
670 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
671 if button:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
672 if empty:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
673 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
674 else:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
675 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
676
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
677 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
678 """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
679 if place.occupant:
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
680 # 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
681 if not sell_callback:
498
62b9a4e21f1a chickens in closed buildings deselected. building opens if you put in chickens and it's not full. opening building with move or select tool allows rearrangement of chickens in building. fixed multiselect in buildings.
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 497
diff changeset
682 mods = pygame.key.get_mods()
62b9a4e21f1a chickens in closed buildings deselected. building opens if you put in chickens and it's not full. opening building with move or select tool allows rearrangement of chickens in building. fixed multiselect in buildings.
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 497
diff changeset
683 if not (mods & KMOD_SHIFT):
62b9a4e21f1a chickens in closed buildings deselected. building opens if you put in chickens and it's not full. opening building with move or select tool allows rearrangement of chickens in building. fixed multiselect in buildings.
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 497
diff changeset
684 chkns = self.selected_chickens
62b9a4e21f1a chickens in closed buildings deselected. building opens if you put in chickens and it's not full. opening building with move or select tool allows rearrangement of chickens in building. fixed multiselect in buildings.
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 497
diff changeset
685 self.unselect_all()
62b9a4e21f1a chickens in closed buildings deselected. building opens if you put in chickens and it's not full. opening building with move or select tool allows rearrangement of chickens in building. fixed multiselect in buildings.
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 497
diff changeset
686 for chkn in chkns:
62b9a4e21f1a chickens in closed buildings deselected. building opens if you put in chickens and it's not full. opening building with move or select tool allows rearrangement of chickens in building. fixed multiselect in buildings.
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 497
diff changeset
687 update_button(chkn)
62b9a4e21f1a chickens in closed buildings deselected. building opens if you put in chickens and it's not full. opening building with move or select tool allows rearrangement of chickens in building. fixed multiselect in buildings.
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 497
diff changeset
688 if place.occupant in self.selected_chickens:
62b9a4e21f1a chickens in closed buildings deselected. building opens if you put in chickens and it's not full. opening building with move or select tool allows rearrangement of chickens in building. fixed multiselect in buildings.
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 497
diff changeset
689 self.unselect_animal(place.occupant)
62b9a4e21f1a chickens in closed buildings deselected. building opens if you put in chickens and it's not full. opening building with move or select tool allows rearrangement of chickens in building. fixed multiselect in buildings.
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 497
diff changeset
690 else:
62b9a4e21f1a chickens in closed buildings deselected. building opens if you put in chickens and it's not full. opening building with move or select tool allows rearrangement of chickens in building. fixed multiselect in buildings.
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 497
diff changeset
691 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
692 # 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
693 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
694 else:
523
103b0fc36722 Apply action to all selected chickens in building dialog
Neil Muller <drnlmuller@gmail.com>
parents: 522
diff changeset
695 # FIXME: This should really match the behaviour for
103b0fc36722 Apply action to all selected chickens in building dialog
Neil Muller <drnlmuller@gmail.com>
parents: 522
diff changeset
696 # outside buildings, but that requires using the toolbar
103b0fc36722 Apply action to all selected chickens in building dialog
Neil Muller <drnlmuller@gmail.com>
parents: 522
diff changeset
697 # while the dialog is open.
103b0fc36722 Apply action to all selected chickens in building dialog
Neil Muller <drnlmuller@gmail.com>
parents: 522
diff changeset
698 to_process = [place.occupant]
103b0fc36722 Apply action to all selected chickens in building dialog
Neil Muller <drnlmuller@gmail.com>
parents: 522
diff changeset
699 if place.occupant in self.selected_chickens:
103b0fc36722 Apply action to all selected chickens in building dialog
Neil Muller <drnlmuller@gmail.com>
parents: 522
diff changeset
700 # We do the same action for all the selected chickens
103b0fc36722 Apply action to all selected chickens in building dialog
Neil Muller <drnlmuller@gmail.com>
parents: 522
diff changeset
701 to_process = self.selected_chickens
103b0fc36722 Apply action to all selected chickens in building dialog
Neil Muller <drnlmuller@gmail.com>
parents: 522
diff changeset
702 for chick in to_process[:]:
103b0fc36722 Apply action to all selected chickens in building dialog
Neil Muller <drnlmuller@gmail.com>
parents: 522
diff changeset
703 sell_callback(chick, update_button)
192
a490ee2ef446 Allow selling of chickens in henhouses
Neil Muller <drnlmuller@gmail.com>
parents: 191
diff changeset
704 else:
208
f82d17f99882 Fix bugs in clicking around inside buildings while moving chickens.
Simon Cross <hodgestar@gmail.com>
parents: 203
diff changeset
705 # 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
706 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
707 # 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
708 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
709 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
710 # 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
711 update_button(self.selected_chickens[0])
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
712
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
713 tbl = gui.Table()
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
714 columns = building.max_floor_width()
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
715 kwargs = { 'style': { 'padding_left': 10, 'padding_bottom': 10 }}
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
716 for floor in building.floors():
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
717 tbl.tr()
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
718 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
719 tbl.tr()
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
720 for row in floor.rows():
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
721 tbl.tr()
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
722 for place in row:
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
723 if place.occupant is None:
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
724 button = gui.Button(icons.EMPTY_NEST_ICON)
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
725 else:
201
fe1e9c18d4d7 layering bugfix; indoor chickens now use normal chicken icons
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 200
diff changeset
726 button = gui.Button(icons.animal_icon(place.occupant))
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
727 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
728 button.connect(gui.CLICK, nest_clicked, place, button)
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
729 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
730
170
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
731 building.selected(True)
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
732 def close_callback():
498
62b9a4e21f1a chickens in closed buildings deselected. building opens if you put in chickens and it's not full. opening building with move or select tool allows rearrangement of chickens in building. fixed multiselect in buildings.
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 497
diff changeset
733 for floor in building.floors():
62b9a4e21f1a chickens in closed buildings deselected. building opens if you put in chickens and it's not full. opening building with move or select tool allows rearrangement of chickens in building. fixed multiselect in buildings.
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 497
diff changeset
734 for row in floor.rows():
62b9a4e21f1a chickens in closed buildings deselected. building opens if you put in chickens and it's not full. opening building with move or select tool allows rearrangement of chickens in building. fixed multiselect in buildings.
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 497
diff changeset
735 for place in row:
62b9a4e21f1a chickens in closed buildings deselected. building opens if you put in chickens and it's not full. opening building with move or select tool allows rearrangement of chickens in building. fixed multiselect in buildings.
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 497
diff changeset
736 if place.occupant is not None:
62b9a4e21f1a chickens in closed buildings deselected. building opens if you put in chickens and it's not full. opening building with move or select tool allows rearrangement of chickens in building. fixed multiselect in buildings.
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 497
diff changeset
737 self.unselect_animal(place.occupant)
170
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
738 building.selected(False)
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
739
522
6f41a565e910 Add 'select all' button
Neil Muller <drnlmuller@gmail.com>
parents: 521
diff changeset
740 def select_all_callback():
6f41a565e910 Add 'select all' button
Neil Muller <drnlmuller@gmail.com>
parents: 521
diff changeset
741 self.unselect_all()
6f41a565e910 Add 'select all' button
Neil Muller <drnlmuller@gmail.com>
parents: 521
diff changeset
742 for chicken in building.occupants():
6f41a565e910 Add 'select all' button
Neil Muller <drnlmuller@gmail.com>
parents: 521
diff changeset
743 self.select_animal(chicken)
6f41a565e910 Add 'select all' button
Neil Muller <drnlmuller@gmail.com>
parents: 521
diff changeset
744 update_button(chicken)
6f41a565e910 Add 'select all' button
Neil Muller <drnlmuller@gmail.com>
parents: 521
diff changeset
745
262
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
746 def evict_callback():
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
747 if not self.selected_chickens:
264
812bd4cda8b8 evict button
Neil Muller <drnlmuller@gmail.com>
parents: 262
diff changeset
748 return
495
d2ca4af92c79 fixed multiple chicken eviction bug
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 493
diff changeset
749 for tile_pos in building.adjacent_tiles():
d2ca4af92c79 fixed multiple chicken eviction bug
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 493
diff changeset
750 if self.tv.get(tile_pos) != self.GRASSLAND:
d2ca4af92c79 fixed multiple chicken eviction bug
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 493
diff changeset
751 continue
d2ca4af92c79 fixed multiple chicken eviction bug
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 493
diff changeset
752 if self.get_outside_chicken(tile_pos) is None:
d2ca4af92c79 fixed multiple chicken eviction bug
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 493
diff changeset
753 for chicken in self.selected_chickens:
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
754 update_button(chicken, empty=True)
495
d2ca4af92c79 fixed multiple chicken eviction bug
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 493
diff changeset
755 # this will place all the chickens
d2ca4af92c79 fixed multiple chicken eviction bug
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 493
diff changeset
756 self.place_animal(tile_pos)
d2ca4af92c79 fixed multiple chicken eviction bug
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 493
diff changeset
757 break
262
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
758
525
d9886377b6a2 Hack middle-click clearing selection into the building_dialog
Neil Muller <drnlmuller@gmail.com>
parents: 524
diff changeset
759 def dlg_event(e):
d9886377b6a2 Hack middle-click clearing selection into the building_dialog
Neil Muller <drnlmuller@gmail.com>
parents: 524
diff changeset
760 if e.type == MOUSEBUTTONDOWN and e.button == 2: # Middle
d9886377b6a2 Hack middle-click clearing selection into the building_dialog
Neil Muller <drnlmuller@gmail.com>
parents: 524
diff changeset
761 self.unselect_all()
d9886377b6a2 Hack middle-click clearing selection into the building_dialog
Neil Muller <drnlmuller@gmail.com>
parents: 524
diff changeset
762 for chicken in building.occupants():
d9886377b6a2 Hack middle-click clearing selection into the building_dialog
Neil Muller <drnlmuller@gmail.com>
parents: 524
diff changeset
763 update_button(chicken)
d9886377b6a2 Hack middle-click clearing selection into the building_dialog
Neil Muller <drnlmuller@gmail.com>
parents: 524
diff changeset
764 return False
d9886377b6a2 Hack middle-click clearing selection into the building_dialog
Neil Muller <drnlmuller@gmail.com>
parents: 524
diff changeset
765 return gui.Table.event(tbl, e)
d9886377b6a2 Hack middle-click clearing selection into the building_dialog
Neil Muller <drnlmuller@gmail.com>
parents: 524
diff changeset
766
d9886377b6a2 Hack middle-click clearing selection into the building_dialog
Neil Muller <drnlmuller@gmail.com>
parents: 524
diff changeset
767
522
6f41a565e910 Add 'select all' button
Neil Muller <drnlmuller@gmail.com>
parents: 521
diff changeset
768 tbl.tr()
6f41a565e910 Add 'select all' button
Neil Muller <drnlmuller@gmail.com>
parents: 521
diff changeset
769 select_button = gui.Button('Select All')
6f41a565e910 Add 'select all' button
Neil Muller <drnlmuller@gmail.com>
parents: 521
diff changeset
770 select_button.connect(gui.CLICK, select_all_callback)
6f41a565e910 Add 'select all' button
Neil Muller <drnlmuller@gmail.com>
parents: 521
diff changeset
771 tbl.td(select_button, colspan=2, **kwargs)
262
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
772 if not sell_callback:
522
6f41a565e910 Add 'select all' button
Neil Muller <drnlmuller@gmail.com>
parents: 521
diff changeset
773 evict_button = gui.Button('Evict')
6f41a565e910 Add 'select all' button
Neil Muller <drnlmuller@gmail.com>
parents: 521
diff changeset
774 evict_button.connect(gui.CLICK, evict_callback)
6f41a565e910 Add 'select all' button
Neil Muller <drnlmuller@gmail.com>
parents: 521
diff changeset
775 tbl.td(evict_button, colspan=2, **kwargs)
262
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
776
525
d9886377b6a2 Hack middle-click clearing selection into the building_dialog
Neil Muller <drnlmuller@gmail.com>
parents: 524
diff changeset
777 tbl.event = dlg_event
d9886377b6a2 Hack middle-click clearing selection into the building_dialog
Neil Muller <drnlmuller@gmail.com>
parents: 524
diff changeset
778
170
92d11e0544bc Switch building to selected image when building is selected.
Simon Cross <hodgestar@gmail.com>
parents: 169
diff changeset
779 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
780
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
781 def buy_building(self, tile_pos, building_cls):
557
50d6c68ce267 Add gameboard to buildings. Update save version as this breaks old save games
Neil Muller <drnlmuller@gmail.com>
parents: 556
diff changeset
782 building = building_cls(tile_pos, self)
428
a356e57529ea buildings cost wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 425
diff changeset
783 if self.wood < building.buy_price():
57
08665fa60345 Implement henhouses and henhouse adding.
Simon Cross <hodgestar@gmail.com>
parents: 54
diff changeset
784 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
785 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
786 return
557
50d6c68ce267 Add gameboard to buildings. Update save version as this breaks old save games
Neil Muller <drnlmuller@gmail.com>
parents: 556
diff changeset
787 if building.place():
428
a356e57529ea buildings cost wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 425
diff changeset
788 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
789 self.add_building(building)
60
e2631c8e2cd6 Implement guard towers (with temporary sprite PNG).
Simon Cross <hodgestar@gmail.com>
parents: 57
diff changeset
790
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
791 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
792
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
793 equipment = equipment_cls()
298
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
794
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
795 def do_equip(chicken, update_button=None):
298
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
796 # 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
797 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
798 return False
298
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
799 if equipment.place(chicken):
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
800 self.add_cash(-equipment.buy_price())
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
801 chicken.equip(equipment)
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
802 if update_button:
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
803 update_button(chicken)
298
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
804 return False
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
805
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
806 if tile_pos:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
807 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
808 if chicken is None:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
809 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
810 if not (building and building.ABODE):
524
1eed8c861580 Fix some indentation weirdnesses that have crept in
Neil Muller <drnlmuller@gmail.com>
parents: 523
diff changeset
811 return
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
812 # Bounce through open dialog once more
474
a50b53983389 Allow moving multiple animals more easily
Neil Muller <drnlmuller@gmail.com>
parents: 473
diff changeset
813 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
814 else:
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
815 do_equip(chicken)
298
88a626202591 Buy equipment for chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 294
diff changeset
816 else:
472
67574723427e Partially working (but much less crashy) multiple select support
Neil Muller <drnlmuller@gmail.com>
parents: 470
diff changeset
817 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
818 do_equip(chicken)
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
819
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
820 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
821 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
822 if building is None:
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
823 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
824 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
825 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
826 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
827 return
428
a356e57529ea buildings cost wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 425
diff changeset
828 self.add_wood(building.sell_price())
557
50d6c68ce267 Add gameboard to buildings. Update save version as this breaks old save games
Neil Muller <drnlmuller@gmail.com>
parents: 556
diff changeset
829 building.remove()
105
7910b4e01dba Add chicken moving tool and start of animal placement.
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
830 self.remove_building(building)
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
831
378
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
832 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
833 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
834 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
835 return
428
a356e57529ea buildings cost wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 425
diff changeset
836 if self.wood < building.repair_price():
a356e57529ea buildings cost wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 425
diff changeset
837 return
a356e57529ea buildings cost wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 425
diff changeset
838 self.add_wood(-building.repair_price())
557
50d6c68ce267 Add gameboard to buildings. Update save version as this breaks old save games
Neil Muller <drnlmuller@gmail.com>
parents: 556
diff changeset
839 building.repair()
378
71f5897ac5ef Fences are now buildings, with appropriate (but ugly) UI changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
840
569
3ec614e6fd4a Replace monolithic sell equipment tool with a tool for each type of equipment.
Simon Cross <hodgestar@gmail.com>
parents: 567
diff changeset
841 def sell_equipment(self, tile_pos, equipment_cls):
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
842 x, y = 0, 0
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
843 def do_sell(chicken, update_button=None):
569
3ec614e6fd4a Replace monolithic sell equipment tool with a tool for each type of equipment.
Simon Cross <hodgestar@gmail.com>
parents: 567
diff changeset
844 items = [item for item in chicken.equipment
3ec614e6fd4a Replace monolithic sell equipment tool with a tool for each type of equipment.
Simon Cross <hodgestar@gmail.com>
parents: 567
diff changeset
845 if isinstance(item, equipment_cls)]
3ec614e6fd4a Replace monolithic sell equipment tool with a tool for each type of equipment.
Simon Cross <hodgestar@gmail.com>
parents: 567
diff changeset
846 for item in items:
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
847 self.add_cash(item.sell_price())
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
848 chicken.unequip(item)
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
849 if update_button:
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
850 update_button(chicken)
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
851 return False
506
3b5717d742b2 fixed selling of equipment from selected chickens
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 504
diff changeset
852 if tile_pos:
3b5717d742b2 fixed selling of equipment from selected chickens
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 504
diff changeset
853 chicken = self.get_outside_chicken(tile_pos)
3b5717d742b2 fixed selling of equipment from selected chickens
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 504
diff changeset
854 if chicken is not None:
3b5717d742b2 fixed selling of equipment from selected chickens
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 504
diff changeset
855 do_sell(chicken)
3b5717d742b2 fixed selling of equipment from selected chickens
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 504
diff changeset
856 else:
3b5717d742b2 fixed selling of equipment from selected chickens
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 504
diff changeset
857 building = self.get_building(tile_pos)
527
f59cb047d08f Don't try to open non-abodes.
Simon Cross <hodgestar@gmail.com>
parents: 526
diff changeset
858 if building is None or not building.ABODE:
506
3b5717d742b2 fixed selling of equipment from selected chickens
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 504
diff changeset
859 return
3b5717d742b2 fixed selling of equipment from selected chickens
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 504
diff changeset
860 x, y = 50, 0
3b5717d742b2 fixed selling of equipment from selected chickens
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 504
diff changeset
861 self.open_building_dialog(building, False, do_sell)
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
862 else:
506
3b5717d742b2 fixed selling of equipment from selected chickens
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 504
diff changeset
863 for chicken in self.selected_chickens[:]:
3b5717d742b2 fixed selling of equipment from selected chickens
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 504
diff changeset
864 do_sell(chicken)
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
865
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
866 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
867 tbl = gui.Table()
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
868
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
869 def sell_item(item, button):
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
870 """Select item of equipment."""
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
871 self.add_cash(item.sell_price())
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
872 chicken.unequip(item)
310
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
873 if update_button:
49c58dda8ac2 Refactor sell_callback, so sell_equipment work
Neil Muller <drnlmuller@gmail.com>
parents: 307
diff changeset
874 update_button(chicken)
169
946f09ed37cd Make equipment dialog close after selecting an item to sell.
Simon Cross <hodgestar@gmail.com>
parents: 168
diff changeset
875 self.disp.close(dialog)
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
876
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
877 kwargs = { 'style': { 'padding_left': 10, 'padding_bottom': 10 }}
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
878
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
879 tbl.tr()
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
880 tbl.td(gui.Button("Sell ... "), align=-1, **kwargs)
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
881
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
882 for item in chicken.equipment:
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
883 tbl.tr()
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
884 button = gui.Button(item.name().title())
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
885 button.connect(gui.CLICK, sell_item, item, button)
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
886 tbl.td(button, align=1, **kwargs)
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
887
302
01c1682dc250 Mostly working selling equipment in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 298
diff changeset
888 dialog = self.open_dialog(tbl, x=x, y=y)
164
ab90040013a7 Implement equipment selling.
Simon Cross <hodgestar@gmail.com>
parents: 162
diff changeset
889
567
37f7454518d5 Move quit stuff into seperate function
Neil Muller <drnlmuller@gmail.com>
parents: 566
diff changeset
890 def _do_quit(self):
37f7454518d5 Move quit stuff into seperate function
Neil Muller <drnlmuller@gmail.com>
parents: 566
diff changeset
891
37f7454518d5 Move quit stuff into seperate function
Neil Muller <drnlmuller@gmail.com>
parents: 566
diff changeset
892 def check_saved(_widget):
37f7454518d5 Move quit stuff into seperate function
Neil Muller <drnlmuller@gmail.com>
parents: 566
diff changeset
893 if _widget.value:
37f7454518d5 Move quit stuff into seperate function
Neil Muller <drnlmuller@gmail.com>
parents: 566
diff changeset
894 # OK to quit, rely on pgu ordering that this happens in
37f7454518d5 Move quit stuff into seperate function
Neil Muller <drnlmuller@gmail.com>
parents: 566
diff changeset
895 # the right order
37f7454518d5 Move quit stuff into seperate function
Neil Muller <drnlmuller@gmail.com>
parents: 566
diff changeset
896 pygame.event.post(constants.GO_GAME_OVER)
37f7454518d5 Move quit stuff into seperate function
Neil Muller <drnlmuller@gmail.com>
parents: 566
diff changeset
897
37f7454518d5 Move quit stuff into seperate function
Neil Muller <drnlmuller@gmail.com>
parents: 566
diff changeset
898 def sure(val):
37f7454518d5 Move quit stuff into seperate function
Neil Muller <drnlmuller@gmail.com>
parents: 566
diff changeset
899 if val == 2:
37f7454518d5 Move quit stuff into seperate function
Neil Muller <drnlmuller@gmail.com>
parents: 566
diff changeset
900 savedialog = savegame.SaveDialog(self)
37f7454518d5 Move quit stuff into seperate function
Neil Muller <drnlmuller@gmail.com>
parents: 566
diff changeset
901 savedialog.connect(gui.CHANGE, check_saved)
37f7454518d5 Move quit stuff into seperate function
Neil Muller <drnlmuller@gmail.com>
parents: 566
diff changeset
902 savedialog.open()
37f7454518d5 Move quit stuff into seperate function
Neil Muller <drnlmuller@gmail.com>
parents: 566
diff changeset
903 elif val:
37f7454518d5 Move quit stuff into seperate function
Neil Muller <drnlmuller@gmail.com>
parents: 566
diff changeset
904 pygame.event.post(constants.GO_GAME_OVER)
37f7454518d5 Move quit stuff into seperate function
Neil Muller <drnlmuller@gmail.com>
parents: 566
diff changeset
905
37f7454518d5 Move quit stuff into seperate function
Neil Muller <drnlmuller@gmail.com>
parents: 566
diff changeset
906 dialog = misc.CheckDialog(sure,
37f7454518d5 Move quit stuff into seperate function
Neil Muller <drnlmuller@gmail.com>
parents: 566
diff changeset
907 "Do you REALLY want to exit this game?",
37f7454518d5 Move quit stuff into seperate function
Neil Muller <drnlmuller@gmail.com>
parents: 566
diff changeset
908 "Yes, Quit", "No, Don't Quit", "Save & Quit")
37f7454518d5 Move quit stuff into seperate function
Neil Muller <drnlmuller@gmail.com>
parents: 566
diff changeset
909 self.disp.open(dialog)
37f7454518d5 Move quit stuff into seperate function
Neil Muller <drnlmuller@gmail.com>
parents: 566
diff changeset
910
14
d7f295c06a4b Split gameboard screen.
Jeremy Thurgood <firxen@gmail.com>
parents: 12
diff changeset
911 def event(self, e):
548
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 544
diff changeset
912 if e.type == KEYDOWN and e.key == K_ESCAPE:
567
37f7454518d5 Move quit stuff into seperate function
Neil Muller <drnlmuller@gmail.com>
parents: 566
diff changeset
913 self._do_quit()
548
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 544
diff changeset
914 return True
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 544
diff changeset
915 elif e.type == KEYDOWN and e.key == K_n and self.day:
566
a8dde729000a Add 'Save and Quit' option to quit dialog. Move game events from engine to constants to ease 'import engine' fun
Neil Muller <drnlmuller@gmail.com>
parents: 565
diff changeset
916 pygame.event.post(constants.START_NIGHT)
548
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 544
diff changeset
917 return True
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 544
diff changeset
918 elif e.type == KEYDOWN and e.key == K_d and self.night:
566
a8dde729000a Add 'Save and Quit' option to quit dialog. Move game events from engine to constants to ease 'import engine' fun
Neil Muller <drnlmuller@gmail.com>
parents: 565
diff changeset
919 pygame.event.post(constants.FAST_FORWARD)
548
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 544
diff changeset
920 return True
27c09c58d89d Remove gameboard and dialog event flow hacks.
Simon Cross <hodgestar@gmail.com>
parents: 544
diff changeset
921 elif 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
922 if e.key == K_UP:
433
8643893635e7 Seperate toolbar and gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 428
diff changeset
923 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
924 if e.key == K_DOWN:
433
8643893635e7 Seperate toolbar and gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 428
diff changeset
925 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
926 if e.key == K_LEFT:
433
8643893635e7 Seperate toolbar and gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 428
diff changeset
927 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
928 if e.key == K_RIGHT:
433
8643893635e7 Seperate toolbar and gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 428
diff changeset
929 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
930 return True
489
3c9c664ccb85 selection groups
Neil Muller <drnlmuller@gmail.com>
parents: 488
diff changeset
931 elif e.type == KEYDOWN and e.key in \
3c9c664ccb85 selection groups
Neil Muller <drnlmuller@gmail.com>
parents: 488
diff changeset
932 [K_0, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9]:
524
1eed8c861580 Fix some indentation weirdnesses that have crept in
Neil Muller <drnlmuller@gmail.com>
parents: 523
diff changeset
933 mods = pygame.key.get_mods()
528
04975aa3ec70 Alt also sets groups, because jerith has a weird OS setup.
Jeremy Thurgood <firxen@gmail.com>
parents: 527
diff changeset
934 if (mods & KMOD_CTRL) or (mods & KMOD_ALT):
524
1eed8c861580 Fix some indentation weirdnesses that have crept in
Neil Muller <drnlmuller@gmail.com>
parents: 523
diff changeset
935 # store current selection
1eed8c861580 Fix some indentation weirdnesses that have crept in
Neil Muller <drnlmuller@gmail.com>
parents: 523
diff changeset
936 self.stored_selections[e.key] = self.selected_chickens[:]
1eed8c861580 Fix some indentation weirdnesses that have crept in
Neil Muller <drnlmuller@gmail.com>
parents: 523
diff changeset
937 else:
542
baf75d5ee50d Shift+group to add to current selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 541
diff changeset
938 additive = (mods & KMOD_SHIFT)
baf75d5ee50d Shift+group to add to current selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 541
diff changeset
939 self.restore_selection(self.stored_selections.get(e.key, []), additive)
541
450de9dfa106 Move gameboard event prodding into the widgets - better matches pgu internals
Neil Muller <drnlmuller@gmail.com>
parents: 539
diff changeset
940 return True
521
787eb032bf8a Cursor hint for Ctrl-click move
Neil Muller <drnlmuller@gmail.com>
parents: 519
diff changeset
941 elif e.type == KEYDOWN:
524
1eed8c861580 Fix some indentation weirdnesses that have crept in
Neil Muller <drnlmuller@gmail.com>
parents: 523
diff changeset
942 mods = pygame.key.get_mods()
1eed8c861580 Fix some indentation weirdnesses that have crept in
Neil Muller <drnlmuller@gmail.com>
parents: 523
diff changeset
943 if mods & KMOD_CTRL and self.selected_tool == constants.TOOL_SELECT_CHICKENS and self.selected_chickens:
565
32b6b66e114a Cursors change.
Jeremy Thurgood <firxen@gmail.com>
parents: 561
diff changeset
944 self.set_tool_cursor((cursors.cursors['chicken'],))
521
787eb032bf8a Cursor hint for Ctrl-click move
Neil Muller <drnlmuller@gmail.com>
parents: 519
diff changeset
945 elif e.type == KEYUP:
524
1eed8c861580 Fix some indentation weirdnesses that have crept in
Neil Muller <drnlmuller@gmail.com>
parents: 523
diff changeset
946 mods = pygame.key.get_mods()
1eed8c861580 Fix some indentation weirdnesses that have crept in
Neil Muller <drnlmuller@gmail.com>
parents: 523
diff changeset
947 if not (mods & KMOD_CTRL) and self.selected_tool == constants.TOOL_SELECT_CHICKENS:
565
32b6b66e114a Cursors change.
Jeremy Thurgood <firxen@gmail.com>
parents: 561
diff changeset
948 self.set_tool_cursor((cursors.cursors['select'],))
262
d508248041ff avoid passing events in twice
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
949 return False
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
950
542
baf75d5ee50d Shift+group to add to current selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 541
diff changeset
951 def restore_selection(self, selection, additive=False):
baf75d5ee50d Shift+group to add to current selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 541
diff changeset
952 if not additive:
baf75d5ee50d Shift+group to add to current selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 541
diff changeset
953 self.unselect_all()
489
3c9c664ccb85 selection groups
Neil Muller <drnlmuller@gmail.com>
parents: 488
diff changeset
954 for chick in selection[:]:
3c9c664ccb85 selection groups
Neil Muller <drnlmuller@gmail.com>
parents: 488
diff changeset
955 if chick in self.chickens:
3c9c664ccb85 selection groups
Neil Muller <drnlmuller@gmail.com>
parents: 488
diff changeset
956 self.select_animal(chick)
3c9c664ccb85 selection groups
Neil Muller <drnlmuller@gmail.com>
parents: 488
diff changeset
957 else:
3c9c664ccb85 selection groups
Neil Muller <drnlmuller@gmail.com>
parents: 488
diff changeset
958 # Update stored selection
3c9c664ccb85 selection groups
Neil Muller <drnlmuller@gmail.com>
parents: 488
diff changeset
959 selection.remove(chick)
3c9c664ccb85 selection groups
Neil Muller <drnlmuller@gmail.com>
parents: 488
diff changeset
960
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
961 def advance_day(self):
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
962 self.days += 1
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
963
552
11c4cebfe4c5 Preparatory work for woodland biodiversity.
Jeremy Thurgood <firxen@gmail.com>
parents: 548
diff changeset
964 def is_woodland_tile(self, pos):
11c4cebfe4c5 Preparatory work for woodland biodiversity.
Jeremy Thurgood <firxen@gmail.com>
parents: 548
diff changeset
965 return tiles.TILE_MAP[self.tv.get(pos.to_tile_tuple())] == 'woodland'
11c4cebfe4c5 Preparatory work for woodland biodiversity.
Jeremy Thurgood <firxen@gmail.com>
parents: 548
diff changeset
966
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
967 def clear_foxes(self):
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
968 for fox in self.foxes.copy():
80
ad9d1bc7ef0c Kill foxes that don't reach safety
Neil Muller <drnlmuller@gmail.com>
parents: 79
diff changeset
969 # 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
970 # killed
552
11c4cebfe4c5 Preparatory work for woodland biodiversity.
Jeremy Thurgood <firxen@gmail.com>
parents: 548
diff changeset
971 if self.in_bounds(fox.pos) and not self.is_woodland_tile(fox.pos):
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
972 self.kill_fox(fox)
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
973 else:
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
974 self.remove_fox(fox)
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
975 self.foxes = set() # Remove all the foxes
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
976
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
977 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
978 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
979 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
980
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 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
982 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
983 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
984
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
985 def do_night_step(self):
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
986 """Handle the events of the night.
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
987
122
d2b19131d537 Don't continue the night if we're not doing anything anymore
Neil Muller <drnlmuller@gmail.com>
parents: 119
diff changeset
988 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
989 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
990 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
991 return True
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
992 # Move all the foxes
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
993 over = self.foxes_move()
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
994 if not over:
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
995 self.foxes_attack()
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
996 self.chickens_attack()
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
997 return over
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
998
401
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 400
diff changeset
999 def _cache_animal_positions(self):
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
1000 """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
1001 self._pos_cache.clear()
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
1002 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
1003 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
1004 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
1005 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
1006
456
96dbf2c8506e Factor position cache out into its own class, make Position more useful.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
1007 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
1008 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
1009
422
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
1010 def chickens_scatter(self):
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
1011 """Chickens outside move around randomly a bit"""
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
1012 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
1013 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
1014 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
1015 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
1016
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
1017 def chickens_chop_wood(self):
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
1018 """Chickens with axes chop down trees near them"""
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
1019 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
1020 chicken.chop()
460
7204c16ab64d Wood market!
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 457
diff changeset
1021 self.calculate_wood_groat_exchange_rate()
422
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
1022
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
1023 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
1024 over = True
530
c1f14fa35d30 Avoid buglet where sprite isn't properly removed for a safe fox
Neil Muller <drnlmuller@gmail.com>
parents: 528
diff changeset
1025 for fox in self.foxes.copy():
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
1026 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
1027 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
1028 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
1029 over = False
530
c1f14fa35d30 Avoid buglet where sprite isn't properly removed for a safe fox
Neil Muller <drnlmuller@gmail.com>
parents: 528
diff changeset
1030 self._pos_cache.update(old_pos, fox, 'fox')
c1f14fa35d30 Avoid buglet where sprite isn't properly removed for a safe fox
Neil Muller <drnlmuller@gmail.com>
parents: 528
diff changeset
1031 else:
c1f14fa35d30 Avoid buglet where sprite isn't properly removed for a safe fox
Neil Muller <drnlmuller@gmail.com>
parents: 528
diff changeset
1032 # Avoid stale fox on board edge
c1f14fa35d30 Avoid buglet where sprite isn't properly removed for a safe fox
Neil Muller <drnlmuller@gmail.com>
parents: 528
diff changeset
1033 self.remove_fox(fox)
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
1034 return over
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
1035
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
1036 def foxes_attack(self):
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
1037 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
1038 fox.attack()
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
1039
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
1040 def chickens_attack(self):
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
1041 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
1042 chicken.attack()
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
1043
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
1044 def add_chicken(self, chicken):
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
1045 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
1046 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
1047 self.tv.sprites.append(chicken)
424
fbef17cab632 Use fully rendered map in gameboard choosing screen
Neil Muller <drnlmuller@gmail.com>
parents: 422
diff changeset
1048 if self.disp:
fbef17cab632 Use fully rendered map in gameboard choosing screen
Neil Muller <drnlmuller@gmail.com>
parents: 422
diff changeset
1049 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
1050
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
1051 def add_fox(self, fox):
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
1052 self.foxes.add(fox)
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents: 24
diff changeset
1053 self.tv.sprites.append(fox)
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
1054
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
1055 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
1056 self.buildings.add(building)
381
7a58dadfd251 little cleanups, every sprite in its proper layer.
Jeremy Thurgood <firxen@gmail.com>
parents: 380
diff changeset
1057 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
1058
419
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
1059 def place_hatched_chicken(self, new_chick, building):
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
1060 try:
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
1061 building.add_occupant(new_chick)
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
1062 self.add_chicken(new_chick)
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
1063 new_chick.equip(equipment.Nest())
536
1a224ba50edf Correctly set the position of newly hatched chickens in buildings
Neil Muller <drnlmuller@gmail.com>
parents: 530
diff changeset
1064 new_chick.set_pos(new_chick.abode.get_pos())
419
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
1065 except buildings.BuildingFullError:
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
1066 # No space in the hen house, look nearby
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
1067 for tile_pos in building.adjacent_tiles():
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
1068 if self.tv.get(tile_pos) != self.GRASSLAND:
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
1069 continue
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
1070 if self.get_outside_chicken(tile_pos) is None:
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
1071 self.add_chicken(new_chick)
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
1072 self.relocate_animal(new_chick, tile_pos=tile_pos)
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
1073 break
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
1074 # if there isn't a space for the
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
1075 # new chick it dies. :/ Farm life
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 414
diff changeset
1076 # is cruel.
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
1077
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
1078 def kill_fox(self, fox):
251
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 247
diff changeset
1079 self.killed_foxes += 1
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 247
diff changeset
1080 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
1081 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
1082 self.remove_fox(fox)
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
1083
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
1084 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
1085 self._pos_cache.remove(fox.pos, 'fox')
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
1086 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
1087 if fox.building:
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
1088 fox.building.remove_predator(fox)
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
1089 if fox in self.tv.sprites:
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
1090 self.tv.sprites.remove(fox)
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
1091
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 25
diff changeset
1092 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
1093 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
1094 self.unselect_animal(chick)
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
1095 self.chickens.discard(chick)
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
1096 self.eggs -= chick.get_num_eggs()
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
1097 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
1098 if chick.abode:
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 124
diff changeset
1099 chick.abode.clear_occupant()
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
1100 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
1101 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
1102 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
1103 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
1104
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
1105 def remove_building(self, building):
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
1106 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
1107 self.buildings.discard(building)
381
7a58dadfd251 little cleanups, every sprite in its proper layer.
Jeremy Thurgood <firxen@gmail.com>
parents: 380
diff changeset
1108 self.tv.sprites.remove(building, layer='buildings')
65
7e9c8ad06d32 Implement building selling.
Simon Cross <hodgestar@gmail.com>
parents: 64
diff changeset
1109
40
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
1110 def add_cash(self, amount):
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
1111 self.cash += amount
678421bd58ee Money counter with very ugly display hack.
Jeremy Thurgood <firxen@gmail.com>
parents: 39
diff changeset
1112 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
1113
422
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
1114 def add_wood(self, planks):
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
1115 self.wood += planks
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
1116 self.toolbar.update_wood_counter(self.wood)
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 421
diff changeset
1117
408
02a6de5629d6 Levels can include starting equipment
Neil Muller <drnlmuller@gmail.com>
parents: 405
diff changeset
1118 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
1119 """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
1120 chick = animal.Chicken((tile.tx, tile.ty), self)
408
02a6de5629d6 Levels can include starting equipment
Neil Muller <drnlmuller@gmail.com>
parents: 405
diff changeset
1121 for equip_cls in equipment.EQUIP_MAP[value]:
02a6de5629d6 Levels can include starting equipment
Neil Muller <drnlmuller@gmail.com>
parents: 405
diff changeset
1122 item = equip_cls()
02a6de5629d6 Levels can include starting equipment
Neil Muller <drnlmuller@gmail.com>
parents: 405
diff changeset
1123 chick.equip(item)
382
e89e6ad011ac Use code layer to place chickens
Neil Muller <drnlmuller@gmail.com>
parents: 381
diff changeset
1124 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
1125
241
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
1126 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
1127 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
1128 return fox_cls((x, y), self)
241
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 239
diff changeset
1129
69
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
1130 def spawn_foxes(self):
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
1131 """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
1132 # 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
1133 x, y = 0, 0
18db99fda6bd Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents: 68
diff changeset
1134 width, height = self.tv.size
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 382
diff changeset
1135 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
1136 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
1137 while len(self.foxes) < new_foxes:
73
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
1138 side = random.randint(0, 3)
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
1139 if side == 0:
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
1140 # top
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
1141 y = -1
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
1142 x = random.randint(-1, width)
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
1143 elif side == 1:
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
1144 # bottom
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
1145 y = height
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
1146 x = random.randint(-1, width)
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
1147 elif side == 2:
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
1148 # left
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
1149 x = -1
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
1150 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
1151 else:
73
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
1152 x = width
f3ce3346e25e Spawn foxes jsut outside the map
Neil Muller <drnlmuller@gmail.com>
parents: 69
diff changeset
1153 y = random.randint(-1, height)
403
c7cfa230f5d4 Remove board size restriction on number of foxes
Neil Muller <drnlmuller@gmail.com>
parents: 401
diff changeset
1154 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
1155
67
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
1156 def fix_buildings(self):
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
1157 """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
1158 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
1159
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
1160 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
1161 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
1162 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
1163
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
1164 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
1165 """
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
1166 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
1167
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
1168 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
1169 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
1170 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
1171 tile_pos = (x, y)
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
1172 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
1173 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
1174 continue
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
1175
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
1176 covered = False
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
1177 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
1178 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
1179 covered = True
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
1180 break
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
1181
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
1182 if covered:
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
1183 continue
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
1184
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
1185 building_cls = tile_to_building[tile_no]
557
50d6c68ce267 Add gameboard to buildings. Update save version as this breaks old save games
Neil Muller <drnlmuller@gmail.com>
parents: 556
diff changeset
1186 building = building_cls(tile_pos, self)
50d6c68ce267 Add gameboard to buildings. Update save version as this breaks old save games
Neil Muller <drnlmuller@gmail.com>
parents: 556
diff changeset
1187 building.remove()
50d6c68ce267 Add gameboard to buildings. Update save version as this breaks old save games
Neil Muller <drnlmuller@gmail.com>
parents: 556
diff changeset
1188 building.place()
67
9171d9b9ab35 Sanity check and fix up buildings on map after loading.
Simon Cross <hodgestar@gmail.com>
parents: 66
diff changeset
1189 self.add_building(building)
139
1d73de63bd71 Add basic game over screen
Neil Muller <drnlmuller@gmail.com>
parents: 135
diff changeset
1190
307
bf1df0902883 three game modes: fortnight, quarter, fox extinction
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 305
diff changeset
1191 def trees_left(self):
bf1df0902883 three game modes: fortnight, quarter, fox extinction
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 305
diff changeset
1192 width, height = self.tv.size
552
11c4cebfe4c5 Preparatory work for woodland biodiversity.
Jeremy Thurgood <firxen@gmail.com>
parents: 548
diff changeset
1193 return len([(x,y) for x in range(width) for y in range(height) if self.is_woodland_tile(misc.Position(x,y))])
307
bf1df0902883 three game modes: fortnight, quarter, fox extinction
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 305
diff changeset
1194
460
7204c16ab64d Wood market!
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 457
diff changeset
1195 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
1196 # per five planks
460
7204c16ab64d Wood market!
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 457
diff changeset
1197 width, height = self.tv.size
462
aba7f1439571 avoid division by zero
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 461
diff changeset
1198 treesleft = max(1, self.trees_left())
aba7f1439571 avoid division by zero
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 461
diff changeset
1199 sell_price = float(10*width*height)/treesleft
460
7204c16ab64d Wood market!
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 457
diff changeset
1200 buy_price = sell_price*(1.1)
7204c16ab64d Wood market!
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 457
diff changeset
1201 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
1202
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 495
diff changeset
1203 def snapshot(self, scale=0.25):
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 495
diff changeset
1204 """Return a snapshot of the gameboard."""
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 495
diff changeset
1205 w, h = self.disp.screen.get_size()
497
a2824eb2474e Only include top widget when creating snapshot.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
1206 snap_w, snap_h = int(w * scale), int(h * scale)
a2824eb2474e Only include top widget when creating snapshot.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
1207 dummy_screen = pygame.surface.Surface((w, h), 0, self.disp.screen)
a2824eb2474e Only include top widget when creating snapshot.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
1208 top_widget = self.get_top_widget()
a2824eb2474e Only include top widget when creating snapshot.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
1209
a2824eb2474e Only include top widget when creating snapshot.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
1210 top_widget.paint(dummy_screen)
a2824eb2474e Only include top widget when creating snapshot.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
1211 snapshot = pygame.transform.smoothscale(dummy_screen, (snap_w, snap_h))
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 495
diff changeset
1212 return snapshot
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 495
diff changeset
1213
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
1214 def save_game(self):
463
e3408c803b12 Save and restore tilevid when loading / saving games.
Simon Cross <hodgestar@gmail.com>
parents: 462
diff changeset
1215 # 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
1216 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
1217 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
1218
512
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 506
diff changeset
1219 @staticmethod
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 506
diff changeset
1220 def restore_game(gameboard):
566
a8dde729000a Add 'Save and Quit' option to quit dialog. Move game events from engine to constants to ease 'import engine' fun
Neil Muller <drnlmuller@gmail.com>
parents: 565
diff changeset
1221 pygame.event.post(pygame.event.Event(constants.DO_LOAD_SAVEGAME, gameboard=gameboard))
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
1222
326
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1223
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1224 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
1225 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
1226 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
1227
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1228 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
1229
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1230 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
1231
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1232 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
1233 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
1234 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
1235 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
1236 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
1237 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
1238 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
1239
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1240 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
1241 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
1242
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1243 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
1244 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
1245 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
1246 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
1247 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
1248
89f51d513606 Add TextDialog class and use it to warn about selling your last chicken.
Simon Cross <hodgestar@gmail.com>
parents: 325
diff changeset
1249 gui.Dialog.__init__(self, title_label, tbl, **params)
336
82a18615a0ab Ask 'Are you sure?'
Neil Muller <drnlmuller@gmail.com>
parents: 330
diff changeset
1250
82a18615a0ab Ask 'Are you sure?'
Neil Muller <drnlmuller@gmail.com>
parents: 330
diff changeset
1251