annotate gamelib/animal.py @ 477:c1439f6705a2

Start of fix for save/restore after animals gained gameboards.
author Simon Cross <hodgestar@gmail.com>
date Wed, 25 Nov 2009 18:44:23 +0000
parents 3dae0fc14009
children 3ed6c011106d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
1 """Class for the various animals in the game"""
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
2
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
3 import random
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
4
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
5 from pgu.vid import Sprite
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
6
44
7e884084e7b1 Move animal sprites to imagecache.
Simon Cross <hodgestar@gmail.com>
parents: 38
diff changeset
7 import imagecache
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
8 import tiles
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
9 from misc import Position
98
725b292ca07b Added sounds killing foxes and chickens, and nightfall
David Fraser <davidf@sjsoft.com>
parents: 92
diff changeset
10 import sound
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
11 import equipment
241
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 236
diff changeset
12 import animations
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents: 414
diff changeset
13 import serializer
438
16437cf4a2b8 Trees provide a modicum of cover.
Jeremy Thurgood <firxen@gmail.com>
parents: 437
diff changeset
14 import constants
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
15
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents: 414
diff changeset
16 class Animal(Sprite, serializer.Simplifiable):
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
17 """Base class for animals"""
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
18
114
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
19 STEALTH = 0
199
696936621a93 Buildings can affect visual acuity.
Jeremy Thurgood <firxen@gmail.com>
parents: 196
diff changeset
20 VISION_BONUS = 0
696936621a93 Buildings can affect visual acuity.
Jeremy Thurgood <firxen@gmail.com>
parents: 196
diff changeset
21 VISION_RANGE_PENALTY = 10
114
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
22
420
f20ccd43a282 Rework Animal.__init__ to make it easier to unsimplify them.
Simon Cross <hodgestar@gmail.com>
parents: 419
diff changeset
23 # sub-class must set this to the name of an image
f20ccd43a282 Rework Animal.__init__ to make it easier to unsimplify them.
Simon Cross <hodgestar@gmail.com>
parents: 419
diff changeset
24 # file
f20ccd43a282 Rework Animal.__init__ to make it easier to unsimplify them.
Simon Cross <hodgestar@gmail.com>
parents: 419
diff changeset
25 IMAGE_FILE = None
f20ccd43a282 Rework Animal.__init__ to make it easier to unsimplify them.
Simon Cross <hodgestar@gmail.com>
parents: 419
diff changeset
26
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents: 414
diff changeset
27 SIMPLIFY = [
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents: 414
diff changeset
28 'pos',
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents: 414
diff changeset
29 'equipment',
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents: 414
diff changeset
30 'accoutrements',
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents: 414
diff changeset
31 'abode',
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents: 414
diff changeset
32 'facing',
477
c1439f6705a2 Start of fix for save/restore after animals gained gameboards.
Simon Cross <hodgestar@gmail.com>
parents: 476
diff changeset
33 'gameboard',
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents: 414
diff changeset
34 ]
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents: 414
diff changeset
35
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
36 def __init__(self, tile_pos, gameboard):
420
f20ccd43a282 Rework Animal.__init__ to make it easier to unsimplify them.
Simon Cross <hodgestar@gmail.com>
parents: 419
diff changeset
37 # load images
f20ccd43a282 Rework Animal.__init__ to make it easier to unsimplify them.
Simon Cross <hodgestar@gmail.com>
parents: 419
diff changeset
38 self._image_left = imagecache.load_image(self.IMAGE_FILE)
f20ccd43a282 Rework Animal.__init__ to make it easier to unsimplify them.
Simon Cross <hodgestar@gmail.com>
parents: 419
diff changeset
39 self._image_right = imagecache.load_image(self.IMAGE_FILE, ("right_facing",))
38
03121c89d5fd Make the secret foxes really secret
Neil Muller <drnlmuller@gmail.com>
parents: 32
diff changeset
40 # Create the animal somewhere far off screen
420
f20ccd43a282 Rework Animal.__init__ to make it easier to unsimplify them.
Simon Cross <hodgestar@gmail.com>
parents: 419
diff changeset
41 Sprite.__init__(self, self._image_left, (-1000, -1000))
f20ccd43a282 Rework Animal.__init__ to make it easier to unsimplify them.
Simon Cross <hodgestar@gmail.com>
parents: 419
diff changeset
42 self.image_left = self._image_left.copy()
f20ccd43a282 Rework Animal.__init__ to make it easier to unsimplify them.
Simon Cross <hodgestar@gmail.com>
parents: 419
diff changeset
43 self.image_right = self._image_right.copy()
395
2d0ff46118e2 Basic support for z coordinate
Neil Muller <drnlmuller@gmail.com>
parents: 394
diff changeset
44 if hasattr(tile_pos, 'to_tile_tuple'):
171
9ea53eb919cf Make Animals accept Positions when created. move hatch watching from Chicken to Egg
Neil Muller <drnlmuller@gmail.com>
parents: 163
diff changeset
45 self.pos = tile_pos
9ea53eb919cf Make Animals accept Positions when created. move hatch watching from Chicken to Egg
Neil Muller <drnlmuller@gmail.com>
parents: 163
diff changeset
46 else:
395
2d0ff46118e2 Basic support for z coordinate
Neil Muller <drnlmuller@gmail.com>
parents: 394
diff changeset
47 self.pos = Position(tile_pos[0], tile_pos[1], 0)
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
48 self.equipment = []
195
9d31cfc3afde refactor of layers drawn on chicken, to allow for extended functionality
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 187
diff changeset
49 self.accoutrements = []
108
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 104
diff changeset
50 self.abode = None
146
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
51 self.facing = 'left'
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
52 self.gameboard = gameboard
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
53
423
97dd557504a2 Override make methods for simplifiable objects.
Simon Cross <hodgestar@gmail.com>
parents: 422
diff changeset
54 def make(cls):
97dd557504a2 Override make methods for simplifiable objects.
Simon Cross <hodgestar@gmail.com>
parents: 422
diff changeset
55 """Override default Simplifiable object creation."""
477
c1439f6705a2 Start of fix for save/restore after animals gained gameboards.
Simon Cross <hodgestar@gmail.com>
parents: 476
diff changeset
56 return cls((0, 0), None)
423
97dd557504a2 Override make methods for simplifiable objects.
Simon Cross <hodgestar@gmail.com>
parents: 422
diff changeset
57 make = classmethod(make)
97dd557504a2 Override make methods for simplifiable objects.
Simon Cross <hodgestar@gmail.com>
parents: 422
diff changeset
58
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 438
diff changeset
59 def unsimplify(cls, *args, **kwargs):
427
e89a1afe4e84 Make Position simplifiable. Override unsimplify for animals to update their image after recreating.
Simon Cross <hodgestar@gmail.com>
parents: 426
diff changeset
60 """Override default Simplifiable unsimplification."""
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 438
diff changeset
61 obj = super(Animal, cls).unsimplify(*args, **kwargs)
427
e89a1afe4e84 Make Position simplifiable. Override unsimplify for animals to update their image after recreating.
Simon Cross <hodgestar@gmail.com>
parents: 426
diff changeset
62 obj.redraw()
e89a1afe4e84 Make Position simplifiable. Override unsimplify for animals to update their image after recreating.
Simon Cross <hodgestar@gmail.com>
parents: 426
diff changeset
63 return obj
e89a1afe4e84 Make Position simplifiable. Override unsimplify for animals to update their image after recreating.
Simon Cross <hodgestar@gmail.com>
parents: 426
diff changeset
64 unsimplify = classmethod(unsimplify)
e89a1afe4e84 Make Position simplifiable. Override unsimplify for animals to update their image after recreating.
Simon Cross <hodgestar@gmail.com>
parents: 426
diff changeset
65
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
66 def loop(self, tv, _sprite):
395
2d0ff46118e2 Basic support for z coordinate
Neil Muller <drnlmuller@gmail.com>
parents: 394
diff changeset
67 ppos = tv.tile_to_view(self.pos.to_tile_tuple())
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
68 self.rect.x = ppos[0]
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
69 self.rect.y = ppos[1]
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
70
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
71 def die(self):
251
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
72 """Play death animation, noises, whatever."""
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
73 if hasattr(self, 'DEATH_SOUND'):
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
74 sound.play_sound(self.DEATH_SOUND)
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
75 if hasattr(self, 'DEATH_ANIMATION'):
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
76 self.DEATH_ANIMATION(self.gameboard.tv, self.pos.to_tile_tuple())
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
77 self._game_death()
251
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
78
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
79 def _game_death(self):
251
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
80 # Call appropriate gameboard cleanup here.
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
81 pass
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
82
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
83 def move(self, state):
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
84 """Given the game state, return a new position for the object"""
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
85 # Default is not to move
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
86 pass
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
87
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
88 def attack(self):
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
89 """Given the game state, attack a suitable target"""
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
90 # Default is not to attack
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
91 pass
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
92
108
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 104
diff changeset
93 def set_pos(self, tile_pos):
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 104
diff changeset
94 """Move an animal to the given tile_pos."""
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 104
diff changeset
95 new_pos = Position(*tile_pos)
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 104
diff changeset
96 self._fix_face(new_pos)
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 104
diff changeset
97 self.pos = new_pos
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 104
diff changeset
98
236
9a6ac9c9ff46 chickens turn to face target foxes
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 216
diff changeset
99 def _fix_face(self, facing_pos):
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
100 """Set the face correctly"""
236
9a6ac9c9ff46 chickens turn to face target foxes
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 216
diff changeset
101 if facing_pos.left_of(self.pos):
146
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
102 self._set_image_facing('left')
236
9a6ac9c9ff46 chickens turn to face target foxes
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 216
diff changeset
103 elif facing_pos.right_of(self.pos):
146
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
104 self._set_image_facing('right')
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
105
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
106 def _set_image_facing(self, facing):
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
107 self.facing = facing
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
108 if self.facing == 'left':
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
109 self.setimage(self.image_left)
146
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
110 elif self.facing == 'right':
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
111 self.setimage(self.image_right)
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
112
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
113 def equip(self, item):
200
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
114 if equipment.is_equipment(item):
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
115 self.equipment.append(item)
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
116 elif equipment.is_accoutrement(item):
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
117 self.accoutrements.append(item)
163
0d6e23dcd3af fixed redrawing
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 161
diff changeset
118 self.redraw()
161
9b4213f6ea7f improved equipment layers; unequip method on animal
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 158
diff changeset
119
9b4213f6ea7f improved equipment layers; unequip method on animal
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 158
diff changeset
120 def unequip(self, item):
200
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
121 if equipment.is_equipment(item):
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
122 self.equipment = [e for e in self.equipment if e != item]
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
123 elif equipment.is_accoutrement(item):
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
124 self.accoutrements = [e for e in self.accoutrements if e != item]
163
0d6e23dcd3af fixed redrawing
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 161
diff changeset
125 self.redraw()
161
9b4213f6ea7f improved equipment layers; unequip method on animal
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 158
diff changeset
126
200
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
127 def unequip_by_name(self, item_name):
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
128 # only remove first match
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
129 matches = [item for item in self.equipment + self.accoutrements if item.NAME == item_name]
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
130 if matches:
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
131 self.unequip(matches[0])
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
132
163
0d6e23dcd3af fixed redrawing
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 161
diff changeset
133 def redraw(self):
195
9d31cfc3afde refactor of layers drawn on chicken, to allow for extended functionality
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 187
diff changeset
134 layers = [(self._image_left.copy(), self._image_right.copy(), 0)]
9d31cfc3afde refactor of layers drawn on chicken, to allow for extended functionality
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 187
diff changeset
135 if hasattr(self, 'EQUIPMENT_IMAGE_ATTRIBUTE'):
9d31cfc3afde refactor of layers drawn on chicken, to allow for extended functionality
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 187
diff changeset
136 for item in self.accoutrements + self.equipment:
9d31cfc3afde refactor of layers drawn on chicken, to allow for extended functionality
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 187
diff changeset
137 images = item.images(self.EQUIPMENT_IMAGE_ATTRIBUTE)
9d31cfc3afde refactor of layers drawn on chicken, to allow for extended functionality
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 187
diff changeset
138 if images:
9d31cfc3afde refactor of layers drawn on chicken, to allow for extended functionality
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 187
diff changeset
139 layers.append(images)
158
baf857805867 armour works now
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 149
diff changeset
140
195
9d31cfc3afde refactor of layers drawn on chicken, to allow for extended functionality
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 187
diff changeset
141 layers.sort(key=lambda l: l[2])
9d31cfc3afde refactor of layers drawn on chicken, to allow for extended functionality
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 187
diff changeset
142
201
fe1e9c18d4d7 layering bugfix; indoor chickens now use normal chicken icons
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 200
diff changeset
143 # these always go on the bottom so that other layers don't get overwritten
fe1e9c18d4d7 layering bugfix; indoor chickens now use normal chicken icons
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 200
diff changeset
144 self.image_left = self._image_left.copy()
fe1e9c18d4d7 layering bugfix; indoor chickens now use normal chicken icons
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 200
diff changeset
145 self.image_right = self._image_right.copy()
fe1e9c18d4d7 layering bugfix; indoor chickens now use normal chicken icons
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 200
diff changeset
146 for l in layers:
195
9d31cfc3afde refactor of layers drawn on chicken, to allow for extended functionality
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 187
diff changeset
147 self.image_left.blit(l[0], (0,0))
9d31cfc3afde refactor of layers drawn on chicken, to allow for extended functionality
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 187
diff changeset
148 self.image_right.blit(l[1], (0,0))
9d31cfc3afde refactor of layers drawn on chicken, to allow for extended functionality
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 187
diff changeset
149
9d31cfc3afde refactor of layers drawn on chicken, to allow for extended functionality
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 187
diff changeset
150 self._set_image_facing(self.facing)
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
151
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
152 def weapons(self):
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
153 return [e for e in self.equipment if equipment.is_weapon(e)]
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
154
174
ff168162974e armour gets damaged
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 171
diff changeset
155 def armour(self):
ff168162974e armour gets damaged
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 171
diff changeset
156 return [e for e in self.equipment if equipment.is_armour(e)]
ff168162974e armour gets damaged
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 171
diff changeset
157
104
d17375586866 Add .covers(tile_pos) to animals (to match similar function on buildings).
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
158 def covers(self, tile_pos):
d17375586866 Add .covers(tile_pos) to animals (to match similar function on buildings).
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
159 return tile_pos[0] == self.pos.x and tile_pos[1] == self.pos.y
d17375586866 Add .covers(tile_pos) to animals (to match similar function on buildings).
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
160
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 122
diff changeset
161 def outside(self):
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 122
diff changeset
162 return self.abode is None
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 122
diff changeset
163
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
164 def damage(self):
174
ff168162974e armour gets damaged
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 171
diff changeset
165 for a in self.armour():
ff168162974e armour gets damaged
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 171
diff changeset
166 if not a.survive_damage():
ff168162974e armour gets damaged
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 171
diff changeset
167 self.unequip(a)
ff168162974e armour gets damaged
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 171
diff changeset
168 return True
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
169 self.die()
174
ff168162974e armour gets damaged
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 171
diff changeset
170 return False
ff168162974e armour gets damaged
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 171
diff changeset
171
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
172 class Chicken(Animal):
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
173 """A chicken"""
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
174
146
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
175 EQUIPMENT_IMAGE_ATTRIBUTE = 'CHICKEN_IMAGE_FILE'
251
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
176 DEATH_ANIMATION = animations.ChickenDeath
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
177 DEATH_SOUND = 'kill-chicken.ogg'
420
f20ccd43a282 Rework Animal.__init__ to make it easier to unsimplify them.
Simon Cross <hodgestar@gmail.com>
parents: 419
diff changeset
178 IMAGE_FILE = 'sprites/chkn.png'
146
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
179
426
d34be925b9fc Fix SIMPLIFY for chickens and eggs. Clean-up greedy fox cost overriding.
Simon Cross <hodgestar@gmail.com>
parents: 423
diff changeset
180 SIMPLIFY = Animal.SIMPLIFY + ['eggs']
d34be925b9fc Fix SIMPLIFY for chickens and eggs. Clean-up greedy fox cost overriding.
Simon Cross <hodgestar@gmail.com>
parents: 423
diff changeset
181
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
182 def __init__(self, pos, gameboard):
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
183 Animal.__init__(self, pos, gameboard)
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
184 self.eggs = []
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
185
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
186 def start_night(self):
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
187 self.lay()
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
188 self.reload_weapon()
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
189
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
190 def start_day(self):
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
191 self.hatch()
419
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 415
diff changeset
192
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
193 def _game_death(self):
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
194 self.gameboard.remove_chicken(self)
251
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
195
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
196 def move(self):
422
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 420
diff changeset
197 """A free chicken will wander around aimlessly"""
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 420
diff changeset
198 pos_x, pos_y = self.pos.to_tile_tuple()
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 420
diff changeset
199 surrounds = [Position(pos_x + dx, pos_y + dy) for dx in [-1, 0, 1] for dy in [-1, 0, 1]]
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
200 pos_options = [pos for pos in surrounds if self.gameboard.in_bounds(pos) and self.gameboard.tv.get(pos.to_tile_tuple()) == self.gameboard.GRASSLAND and not self.gameboard.get_outside_chicken(pos.to_tile_tuple())] + [self.pos]
422
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 420
diff changeset
201 self.pos = pos_options[random.randint(0, len(pos_options)-1)]
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 420
diff changeset
202
441
7b5e4b6dd889 fixed unarmed logging bug
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 439
diff changeset
203 def has_axe(self):
445
af2482444945 Fix check for axes.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
204 return bool([e for e in self.weapons() if e.TYPE == "AXE"])
441
7b5e4b6dd889 fixed unarmed logging bug
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 439
diff changeset
205
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
206 def chop(self):
441
7b5e4b6dd889 fixed unarmed logging bug
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 439
diff changeset
207 if self.has_axe():
7b5e4b6dd889 fixed unarmed logging bug
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 439
diff changeset
208 pos_x, pos_y = self.pos.to_tile_tuple()
7b5e4b6dd889 fixed unarmed logging bug
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 439
diff changeset
209 surrounds = [Position(pos_x + dx, pos_y + dy) for dx in [-1, 0, 1] for dy in [-1, 0, 1]]
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
210 tree_options = [pos for pos in surrounds if self.gameboard.in_bounds(pos) and self.gameboard.tv.get(pos.to_tile_tuple()) == self.gameboard.WOODLAND]
441
7b5e4b6dd889 fixed unarmed logging bug
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 439
diff changeset
211 if tree_options:
7b5e4b6dd889 fixed unarmed logging bug
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 439
diff changeset
212 num_trees_to_cut = random.randint(1, len(tree_options))
7b5e4b6dd889 fixed unarmed logging bug
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 439
diff changeset
213 trees_to_cut = random.sample(tree_options, num_trees_to_cut)
7b5e4b6dd889 fixed unarmed logging bug
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 439
diff changeset
214 for tree_pos in trees_to_cut:
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
215 self.gameboard.add_wood(5)
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
216 self.gameboard.tv.set(tree_pos.to_tile_tuple(), self.gameboard.GRASSLAND)
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
217
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
218 def lay(self):
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
219 """See if the chicken lays an egg"""
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
220 if self.abode and self.abode.building.HENHOUSE:
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
221 if not self.eggs:
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
222 for x in range(random.randint(1, 4)):
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
223 self.eggs.append(Egg(self.pos, self.gameboard))
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
224 self.equip(equipment.NestEgg())
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
225 self.gameboard.eggs += self.get_num_eggs()
216
962934b8c7dc Implement UI part of egg selling
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
226
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
227 def remove_eggs(self):
216
962934b8c7dc Implement UI part of egg selling
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
228 """Clean up the egg state"""
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
229 self.gameboard.remove_eggs(len(self.eggs))
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
230 self.eggs = []
305
32149b1d9fd2 Capitalised all equipment names.
Jeremy Thurgood <firxen@gmail.com>
parents: 293
diff changeset
231 self.unequip_by_name("Nestegg")
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
232
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
233 def remove_one_egg(self):
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
234 """Clean up the egg state"""
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
235 self.eggs.pop()
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
236 self.gameboard.remove_eggs(1)
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
237 if not self.eggs:
305
32149b1d9fd2 Capitalised all equipment names.
Jeremy Thurgood <firxen@gmail.com>
parents: 293
diff changeset
238 self.unequip_by_name("Nestegg")
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
239
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
240 def get_num_eggs(self):
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
241 return len(self.eggs)
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
242
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
243 def hatch(self):
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
244 """See if we have an egg to hatch"""
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
245 if self.eggs:
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
246 chick = self.eggs[0].hatch()
187
6854e706dcdf Remove hatched eggs
Neil Muller <drnlmuller@gmail.com>
parents: 174
diff changeset
247 if chick:
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
248 # sell the remaining eggs
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
249 # Remove hatched 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
250 self.remove_one_egg()
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
251 # Sell other eggs
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
252 for egg in self.eggs[:]:
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
253 self.gameboard.sell_one_egg(self)
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
254 self.remove_eggs() # clean up stale images, etc.
3dae0fc14009 Animals have their own gameboard references instead of lugging them around in params all the time.
Jeremy Thurgood <firxen@gmail.com>
parents: 475
diff changeset
255 self.gameboard.place_hatched_chicken(chick, self.abode.building)
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
256
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
257 def _find_killable_fox(self, weapon):
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
258 """Choose a random fox within range of this weapon."""
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
259 killable_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
260 for fox in self.gameboard.foxes:
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
261 if not weapon.in_range(self.gameboard, self, fox):
114
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
262 continue
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
263 if visible(self, fox, self.gameboard):
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
264 killable_foxes.append(fox)
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
265 if not killable_foxes:
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
266 return None
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
267 return random.choice(killable_foxes)
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
268
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
269 def attack(self):
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
270 """An armed chicken will attack a fox within range."""
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
271 if not self.weapons():
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
272 # Not going to take on a fox bare-winged.
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
273 return
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
274 # Choose the first weapon equipped.
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
275 weapon = self.weapons()[0]
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
276 fox = self._find_killable_fox(weapon)
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
277 if not fox:
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
278 return
236
9a6ac9c9ff46 chickens turn to face target foxes
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 216
diff changeset
279 self._fix_face(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
280 if weapon.hit(self.gameboard, self, fox):
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
281 fox.damage()
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
282
413
bdc4757e0497 Add Sniper Rifle and give guns limited ammunition.
Jeremy Thurgood <firxen@gmail.com>
parents: 407
diff changeset
283 def reload_weapon(self):
bdc4757e0497 Add Sniper Rifle and give guns limited ammunition.
Jeremy Thurgood <firxen@gmail.com>
parents: 407
diff changeset
284 """If we have a weapon that takes ammunition, reload it."""
bdc4757e0497 Add Sniper Rifle and give guns limited ammunition.
Jeremy Thurgood <firxen@gmail.com>
parents: 407
diff changeset
285 for weapon in self.weapons():
429
42777630956a Add ammo to things serialized and deserialized.
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
286 weapon.refresh_ammo()
413
bdc4757e0497 Add Sniper Rifle and give guns limited ammunition.
Jeremy Thurgood <firxen@gmail.com>
parents: 407
diff changeset
287
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
288 class Egg(Animal):
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
289 """An egg"""
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
290
420
f20ccd43a282 Rework Animal.__init__ to make it easier to unsimplify them.
Simon Cross <hodgestar@gmail.com>
parents: 419
diff changeset
291 IMAGE_FILE = 'sprites/equip_egg.png'
f20ccd43a282 Rework Animal.__init__ to make it easier to unsimplify them.
Simon Cross <hodgestar@gmail.com>
parents: 419
diff changeset
292
426
d34be925b9fc Fix SIMPLIFY for chickens and eggs. Clean-up greedy fox cost overriding.
Simon Cross <hodgestar@gmail.com>
parents: 423
diff changeset
293 SIMPLIFY = Animal.SIMPLIFY + ['timer']
d34be925b9fc Fix SIMPLIFY for chickens and eggs. Clean-up greedy fox cost overriding.
Simon Cross <hodgestar@gmail.com>
parents: 423
diff changeset
294
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
295 def __init__(self, pos, gameboard):
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
296 Animal.__init__(self, pos, gameboard)
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
297 self.timer = 2
47
be2496df2368 Add egg image to egg sprite.
Simon Cross <hodgestar@gmail.com>
parents: 44
diff changeset
298
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
299 # Eggs don't move
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
300
171
9ea53eb919cf Make Animals accept Positions when created. move hatch watching from Chicken to Egg
Neil Muller <drnlmuller@gmail.com>
parents: 163
diff changeset
301 def hatch(self):
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
302 self.timer -= 1
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
303 if self.timer == 0:
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
304 return Chicken(self.pos, self.gameboard)
171
9ea53eb919cf Make Animals accept Positions when created. move hatch watching from Chicken to Egg
Neil Muller <drnlmuller@gmail.com>
parents: 163
diff changeset
305 return None
9ea53eb919cf Make Animals accept Positions when created. move hatch watching from Chicken to Egg
Neil Muller <drnlmuller@gmail.com>
parents: 163
diff changeset
306
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
307 class Fox(Animal):
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
308 """A fox"""
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
309
114
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
310 STEALTH = 20
130
96c5ef7613b5 NINJA FOXES!
Jeremy Thurgood <firxen@gmail.com>
parents: 125
diff changeset
311 IMAGE_FILE = 'sprites/fox.png'
251
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
312 DEATH_ANIMATION = animations.FoxDeath
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
313 DEATH_SOUND = 'kill-fox.ogg'
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
314 CONFIG_NAME = 'fox'
114
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
315
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
316 costs = {
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
317 # weighting for movement calculation
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
318 'grassland' : 2,
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
319 'woodland' : 1, # Try to keep to the woods if possible
72
aa4bd93575d9 Fix some bound checking and tweak movement costs
Neil Muller <drnlmuller@gmail.com>
parents: 71
diff changeset
320 'broken fence' : 2,
404
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
321 'fence' : 25,
72
aa4bd93575d9 Fix some bound checking and tweak movement costs
Neil Muller <drnlmuller@gmail.com>
parents: 71
diff changeset
322 'guardtower' : 2, # We can pass under towers
145
490ede177f50 Tweak fox behaviour around henhouses. Add some memory to avoid the indecisive fox loop
Neil Muller <drnlmuller@gmail.com>
parents: 130
diff changeset
323 'henhouse' : 30, # Don't go into a henhouse unless we're going to
490ede177f50 Tweak fox behaviour around henhouses. Add some memory to avoid the indecisive fox loop
Neil Muller <drnlmuller@gmail.com>
parents: 130
diff changeset
324 # catch a chicken there
490ede177f50 Tweak fox behaviour around henhouses. Add some memory to avoid the indecisive fox loop
Neil Muller <drnlmuller@gmail.com>
parents: 130
diff changeset
325 'hendominium' : 30,
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
326 }
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
327
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
328 def __init__(self, pos, gameboard):
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
329 Animal.__init__(self, pos, gameboard)
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
330 self.landmarks = [self.pos]
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
331 self.hunting = True
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
332 self.dig_pos = None
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
333 self.tick = 0
122
d2b19131d537 Don't continue the night if we're not doing anything anymore
Neil Muller <drnlmuller@gmail.com>
parents: 116
diff changeset
334 self.safe = False
145
490ede177f50 Tweak fox behaviour around henhouses. Add some memory to avoid the indecisive fox loop
Neil Muller <drnlmuller@gmail.com>
parents: 130
diff changeset
335 self.closest = None
149
2a1064fae608 More memory for the foxes, to ensure we avoid short loops
Neil Muller <drnlmuller@gmail.com>
parents: 146
diff changeset
336 self.last_steps = []
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
337 # Foxes don't occupy places in the same way chickens do, but they
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
338 # can still be inside
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
339 self.building = None
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
340
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
341 def outside(self):
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
342 return self.building is None
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
343
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
344 def _game_death(self):
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
345 self.gameboard.kill_fox(self)
251
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
346
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
347 def _cost_tile(self, pos):
3dae0fc14009 Animals have their own gameboard references instead of lugging them around in params all the time.
Jeremy Thurgood <firxen@gmail.com>
parents: 475
diff changeset
348 if self.gameboard.in_bounds(pos):
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
349 this_tile = self.gameboard.tv.get(pos.to_tile_tuple())
82
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
350 cost = self.costs.get(tiles.TILE_MAP[this_tile], 100)
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
351 else:
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
352 cost = 100 # Out of bounds is expensive
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
353 return cost
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
354
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
355 def _cost_path(self, path):
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
356 """Calculate the cost of a path"""
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
357 total = 0
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
358 for pos in path:
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
359 total += self._cost_tile(pos)
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
360 return total
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
361
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
362 def _gen_path(self, start_pos, final_pos):
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
363 """Construct a direct path from start_pos to final_pos,
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
364 excluding start_pos"""
431
129de5883524 Moved intermediate position generation to a more suitable location.
Jeremy Thurgood <firxen@gmail.com>
parents: 429
diff changeset
365 return start_pos.intermediate_positions(final_pos)
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
366
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
367 def _find_best_path_step(self, final_pos):
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
368 """Find the cheapest path to final_pos, and return the next step
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
369 along the path."""
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
370 # We calculate the cost of the direct path
395
2d0ff46118e2 Basic support for z coordinate
Neil Muller <drnlmuller@gmail.com>
parents: 394
diff changeset
371 if final_pos.z < self.pos.z:
2d0ff46118e2 Basic support for z coordinate
Neil Muller <drnlmuller@gmail.com>
parents: 394
diff changeset
372 # We need to try heading down.
2d0ff46118e2 Basic support for z coordinate
Neil Muller <drnlmuller@gmail.com>
parents: 394
diff changeset
373 return Position(self.pos.x, self.pos.y, self.pos.z - 1)
404
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
374 if final_pos.x == self.pos.x and final_pos.y == self.pos.y and \
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
375 final_pos.z > self.pos.z:
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
376 # We try heading up
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
377 return Position(self.pos.x, self.pos.y, self.pos.z + 1)
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
378 cur_dist = final_pos.dist(self.pos)
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
379 if cur_dist < 2:
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
380 # We're right ontop of our target, so just go there
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
381 return final_pos
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
382 # Find the cheapest spot close to us that moves us closer to the target
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
383 neighbours = [Position(self.pos.x + x, self.pos.y + y, self.pos.z) for
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
384 x in range(-1, 2) for y in range(-1, 2) if (x, y) != (0, 0)]
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
385 best_pos = self.pos
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
386 min_cost = 1000
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
387 min_dist = cur_dist
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
388 for point in neighbours:
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
389 dist = point.dist(final_pos)
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
390 if dist < cur_dist:
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
391 cost = self._cost_tile(point)
404
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
392 if cost < min_cost or (min_cost == cost and dist < min_dist):
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
393 # Prefer closest of equal cost points
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
394 min_dist = dist
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
395 min_cost = cost
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
396 best = point
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
397 if min_cost < 20 or not self.gameboard.in_bounds(self.pos):
407
bdc8bc78a796 Handle corner case aroudn entering the map
Neil Muller <drnlmuller@gmail.com>
parents: 406
diff changeset
398 # If we're not on the gameboard yet, there's no point in looking
bdc8bc78a796 Handle corner case aroudn entering the map
Neil Muller <drnlmuller@gmail.com>
parents: 406
diff changeset
399 # for an optimal path.
404
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
400 return best
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
401 # Else expensive step, so think further
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
402 direct_path = self._gen_path(self.pos, final_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
403 min_cost = self._cost_path(direct_path)
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
404 min_path = direct_path
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
405 # is there a point nearby that gives us a cheaper direct path?
71
00cf9d7f22dc Expand comment
Neil Muller <drnlmuller@gmail.com>
parents: 70
diff changeset
406 # This is delibrately not finding the optimal path, as I don't
00cf9d7f22dc Expand comment
Neil Muller <drnlmuller@gmail.com>
parents: 70
diff changeset
407 # want the foxes to be too intelligent, although the implementation
00cf9d7f22dc Expand comment
Neil Muller <drnlmuller@gmail.com>
parents: 70
diff changeset
408 # isn't well optimised yet
404
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
409 # FIXME: Currently, this introduces loops, but the memory kind
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
410 # avoids that. Fixing this is the next goal.
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
411 poss = [Position(self.pos.x + x, self.pos.y + y, self.pos.z) for
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
412 x in range(-3, 4) for y in range(-3, 4) if (x, y) != (0, 0)]
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
413 for start in poss:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
414 cand_path = self._gen_path(self.pos, start) + \
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
415 self._gen_path(start, final_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
416 cost = self._cost_path(cand_path)
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
417 if cost < min_cost:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
418 min_cost = cost
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
419 min_path = cand_path
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
420 if not min_path:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
421 return final_pos
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
422 return min_path[0]
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
423
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
424 def _find_path_to_woodland(self):
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
425 """Dive back to woodland through the landmarks"""
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
426 # find the closest point to our current location in walked path
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
427 if self.pos == self.landmarks[-1]:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
428 if len(self.landmarks) > 1:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
429 self.landmarks.pop() # Moving to the next landmark
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
430 if not self.gameboard.in_bounds(self.pos) and not self.hunting:
402
3a469d46b820 Tweak safe logic to avoid some corner cases
Neil Muller <drnlmuller@gmail.com>
parents: 401
diff changeset
431 # Safely out of sight
3a469d46b820 Tweak safe logic to avoid some corner cases
Neil Muller <drnlmuller@gmail.com>
parents: 401
diff changeset
432 self.safe = True
3a469d46b820 Tweak safe logic to avoid some corner cases
Neil Muller <drnlmuller@gmail.com>
parents: 401
diff changeset
433 return self.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
434 return self._find_best_path_step(self.landmarks[-1])
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
435
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
436 def _select_target(self):
475
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
437 min_dist = 999
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
438 self.closest = None
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
439 for chicken in self.gameboard.chickens:
475
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
440 dist = chicken.pos.dist(self.pos)
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
441 if chicken.abode:
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
442 dist += 5 # Prefer free-ranging chickens
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
443 if len(chicken.weapons()) > 0:
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
444 dist += 5 # Prefer unarmed chickens
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
445 if dist < min_dist:
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
446 min_dist = dist
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
447 self.closest = chicken
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
448
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
449 def _find_path_to_chicken(self):
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
450 """Find the path to the closest chicken"""
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
451 # Find the closest chicken
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
452 if self.closest not in self.gameboard.chickens:
145
490ede177f50 Tweak fox behaviour around henhouses. Add some memory to avoid the indecisive fox loop
Neil Muller <drnlmuller@gmail.com>
parents: 130
diff changeset
453 # Either no target, or someone ate it
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
454 self._select_target()
145
490ede177f50 Tweak fox behaviour around henhouses. Add some memory to avoid the indecisive fox loop
Neil Muller <drnlmuller@gmail.com>
parents: 130
diff changeset
455 if not self.closest:
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
456 # No more chickens, so leave
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
457 self.hunting = False
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
458 return self.pos
145
490ede177f50 Tweak fox behaviour around henhouses. Add some memory to avoid the indecisive fox loop
Neil Muller <drnlmuller@gmail.com>
parents: 130
diff changeset
459 if self.closest.pos == self.pos:
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
460 # No need to move
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
461 return self.pos
395
2d0ff46118e2 Basic support for z coordinate
Neil Muller <drnlmuller@gmail.com>
parents: 394
diff changeset
462 if self.closest.pos.to_tile_tuple() == self.pos.to_tile_tuple():
2d0ff46118e2 Basic support for z coordinate
Neil Muller <drnlmuller@gmail.com>
parents: 394
diff changeset
463 # Only differ in z, so next step is in z
2d0ff46118e2 Basic support for z coordinate
Neil Muller <drnlmuller@gmail.com>
parents: 394
diff changeset
464 if self.closest.pos.z < self.pos.z:
2d0ff46118e2 Basic support for z coordinate
Neil Muller <drnlmuller@gmail.com>
parents: 394
diff changeset
465 new_z = self.pos.z - 1
2d0ff46118e2 Basic support for z coordinate
Neil Muller <drnlmuller@gmail.com>
parents: 394
diff changeset
466 else:
2d0ff46118e2 Basic support for z coordinate
Neil Muller <drnlmuller@gmail.com>
parents: 394
diff changeset
467 new_z = self.pos.z + 1
2d0ff46118e2 Basic support for z coordinate
Neil Muller <drnlmuller@gmail.com>
parents: 394
diff changeset
468 return Position(self.pos.x, self.pos.y, new_z)
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
469 return self._find_best_path_step(self.closest.pos)
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
470
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
471 def attack(self):
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
472 """Attack a chicken"""
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
473 chicken = self.gameboard.get_animal_at_pos(self.pos, 'chicken')
401
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 399
diff changeset
474 if chicken:
7405f7db469f Tweak fox attack logic - we no longer ignore chickens we accidently step on
Neil Muller <drnlmuller@gmail.com>
parents: 399
diff changeset
475 # Always attack a chicken we step on, even if not hunting
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
476 self._catch_chicken(chicken)
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
477
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
478 def _catch_chicken(self, chicken):
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
479 """Catch a chicken"""
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
480 chicken.damage()
145
490ede177f50 Tweak fox behaviour around henhouses. Add some memory to avoid the indecisive fox loop
Neil Muller <drnlmuller@gmail.com>
parents: 130
diff changeset
481 self.closest = None
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
482 self.hunting = False
149
2a1064fae608 More memory for the foxes, to ensure we avoid short loops
Neil Muller <drnlmuller@gmail.com>
parents: 146
diff changeset
483 self.last_steps = [] # Forget history here
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
484
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
485 def _update_pos(self, new_pos):
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
486 """Update the position, making sure we don't step on other foxes"""
145
490ede177f50 Tweak fox behaviour around henhouses. Add some memory to avoid the indecisive fox loop
Neil Muller <drnlmuller@gmail.com>
parents: 130
diff changeset
487 if new_pos == self.pos:
490ede177f50 Tweak fox behaviour around henhouses. Add some memory to avoid the indecisive fox loop
Neil Muller <drnlmuller@gmail.com>
parents: 130
diff changeset
488 # We're not moving, so we can skip all the checks
149
2a1064fae608 More memory for the foxes, to ensure we avoid short loops
Neil Muller <drnlmuller@gmail.com>
parents: 146
diff changeset
489 return new_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
490 blocked = self.gameboard.get_animal_at_pos(new_pos, 'fox') is not None
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 398
diff changeset
491 if not blocked and new_pos.z == self.pos.z:
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 398
diff changeset
492 # We're only worried about loops when not on a ladder
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 398
diff changeset
493 blocked = new_pos in self.last_steps
149
2a1064fae608 More memory for the foxes, to ensure we avoid short loops
Neil Muller <drnlmuller@gmail.com>
parents: 146
diff changeset
494 final_pos = new_pos
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
495 if blocked:
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 398
diff changeset
496 if new_pos.z != self.pos.z:
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 398
diff changeset
497 # We can only move up and down a ladder
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 398
diff changeset
498 moves = [Position(self.pos.x, self.pos.y, z) for z
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 398
diff changeset
499 in range(self.pos.z-1, self.pos.z + 2) if z >= 0]
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 398
diff changeset
500 else:
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 398
diff changeset
501 moves = [Position(x, y) for x in range(self.pos.x-1, self.pos.x + 2)
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 398
diff changeset
502 for y in range(self.pos.y-1, self.pos.y + 2)
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 398
diff changeset
503 if Position(x,y) != self.pos and
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 398
diff changeset
504 Position(x, y) not in self.last_steps and
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 398
diff changeset
505 self.pos.z == 0]
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 398
diff changeset
506 # find the cheapest point in moves that's not blocked
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
507 final_pos = None
82
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
508 min_cost = 1000
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
509 for poss in moves:
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
510 if self.gameboard.get_animal_at_pos(poss, 'fox'):
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 398
diff changeset
511 continue # blocked
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
512 cost = self._cost_tile(poss)
82
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
513 if cost < min_cost:
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
514 min_cost = cost
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
515 final_pos = poss
257
fcaae2cfe3cd Make foxes less determistic when avoiding other foxes
Neil Muller <drnlmuller@gmail.com>
parents: 251
diff changeset
516 if cost == min_cost and random.randint(0, 1) > 0:
fcaae2cfe3cd Make foxes less determistic when avoiding other foxes
Neil Muller <drnlmuller@gmail.com>
parents: 251
diff changeset
517 # Add some randomness in this case
fcaae2cfe3cd Make foxes less determistic when avoiding other foxes
Neil Muller <drnlmuller@gmail.com>
parents: 251
diff changeset
518 final_pos = poss
149
2a1064fae608 More memory for the foxes, to ensure we avoid short loops
Neil Muller <drnlmuller@gmail.com>
parents: 146
diff changeset
519 if not final_pos:
2a1064fae608 More memory for the foxes, to ensure we avoid short loops
Neil Muller <drnlmuller@gmail.com>
parents: 146
diff changeset
520 # No good choice, so stay put
2a1064fae608 More memory for the foxes, to ensure we avoid short loops
Neil Muller <drnlmuller@gmail.com>
parents: 146
diff changeset
521 return self.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
522 if self.gameboard.in_bounds(final_pos):
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
523 this_tile = self.gameboard.tv.get(final_pos.to_tile_tuple())
72
aa4bd93575d9 Fix some bound checking and tweak movement costs
Neil Muller <drnlmuller@gmail.com>
parents: 71
diff changeset
524 else:
aa4bd93575d9 Fix some bound checking and tweak movement costs
Neil Muller <drnlmuller@gmail.com>
parents: 71
diff changeset
525 this_tile = tiles.REVERSE_TILE_MAP['woodland']
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
526 if tiles.TILE_MAP[this_tile] == 'broken fence' and self.hunting:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
527 # We'll head back towards the holes we make/find
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
528 self.landmarks.append(final_pos)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
529 elif tiles.TILE_MAP[this_tile] == 'fence' and not self.dig_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
530 return self._dig(final_pos)
149
2a1064fae608 More memory for the foxes, to ensure we avoid short loops
Neil Muller <drnlmuller@gmail.com>
parents: 146
diff changeset
531 self.last_steps.append(final_pos)
2a1064fae608 More memory for the foxes, to ensure we avoid short loops
Neil Muller <drnlmuller@gmail.com>
parents: 146
diff changeset
532 if len(self.last_steps) > 3:
2a1064fae608 More memory for the foxes, to ensure we avoid short loops
Neil Muller <drnlmuller@gmail.com>
parents: 146
diff changeset
533 self.last_steps.pop(0)
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
534 return final_pos
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
535
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
536 def _dig(self, dig_pos):
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
537 """Setup dig parameters, to be overridden if needed"""
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
538 self.tick = 5
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
539 self.dig_pos = dig_pos
475
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
540 return self.pos
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
541
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
542 def _make_hole(self):
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
543 """Make a hole in the fence"""
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
544 fence = self.gameboard.get_building(self.dig_pos.to_tile_tuple())
394
ad77b3b71b08 Fix crash when multiple foxes finish digging at the same time
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
545 # Another fox could have made the same hole this turn
ad77b3b71b08 Fix crash when multiple foxes finish digging at the same time
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
546 if fence:
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
547 fence.damage(self.gameboard.tv)
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
548 self.dig_pos = None
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
549
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
550 def move(self):
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
551 """Foxes will aim to move towards the closest henhouse or free
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
552 chicken"""
398
082b1ea5f98d Regain time lost when adding foxes to buildings
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
553 if self.safe:
082b1ea5f98d Regain time lost when adding foxes to buildings
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
554 # We're safe, so do nothing
082b1ea5f98d Regain time lost when adding foxes to buildings
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
555 return
082b1ea5f98d Regain time lost when adding foxes to buildings
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
556 elif self.dig_pos:
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
557 if self.tick:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
558 self.tick -= 1
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
559 # We're still digging through the fence
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
560 # Check the another fox hasn't dug a hole for us
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
561 # We're too busy digging to notice if a hole appears nearby,
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
562 # but we'll notice if the fence we're digging vanishes
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
563 this_tile = self.gameboard.tv.get(self.dig_pos.to_tile_tuple())
475
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
564 if tiles.TILE_MAP[this_tile] != 'fence':
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
565 self.tick = 0
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
566 else:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
567 # We've dug through the fence, so make a hole
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
568 self._make_hole()
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
569 return
398
082b1ea5f98d Regain time lost when adding foxes to buildings
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
570 elif self.hunting:
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
571 desired_pos = self._find_path_to_chicken()
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
572 else:
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
573 desired_pos = self._find_path_to_woodland()
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
574 final_pos = self._update_pos(desired_pos)
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
575 self._fix_face(final_pos)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
576 self.pos = final_pos
398
082b1ea5f98d Regain time lost when adding foxes to buildings
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
577 change_visible = False
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
578 # See if we're entering/leaving a building
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
579 building = self.gameboard.get_building(final_pos.to_tile_tuple())
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
580 if building and self.outside():
398
082b1ea5f98d Regain time lost when adding foxes to buildings
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
581 # Check if we need to enter
082b1ea5f98d Regain time lost when adding foxes to buildings
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
582 if self.closest and not self.closest.outside() and \
082b1ea5f98d Regain time lost when adding foxes to buildings
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
583 self.closest.abode.building is building:
082b1ea5f98d Regain time lost when adding foxes to buildings
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
584 building.add_predator(self)
082b1ea5f98d Regain time lost when adding foxes to buildings
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
585 change_visible = True
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
586 elif self.building and final_pos.z == 0:
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
587 # can only leave from the ground floor
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
588 if building == self.building:
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
589 # Check if we need to leave the building
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
590 if not self.hunting or (self.closest and
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
591 self.closest.abode.building is not building):
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
592 self.building.remove_predator(self)
398
082b1ea5f98d Regain time lost when adding foxes to buildings
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
593 change_visible = True
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
594 else:
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
595 # we've moved away from the building we were in
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
596 self.building.remove_predator(self)
398
082b1ea5f98d Regain time lost when adding foxes to buildings
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
597 change_visible = True
082b1ea5f98d Regain time lost when adding foxes to buildings
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
598 if change_visible:
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
599 self.gameboard.set_visibility(self)
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
600
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
601
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
602 class NinjaFox(Fox):
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
603 """Ninja foxes are hard to see"""
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
604
114
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
605 STEALTH = 60
130
96c5ef7613b5 NINJA FOXES!
Jeremy Thurgood <firxen@gmail.com>
parents: 125
diff changeset
606 IMAGE_FILE = 'sprites/ninja_fox.png'
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
607 CONFIG_NAME = 'ninja fox'
114
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
608
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
609 class DemoFox(Fox):
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
610 """Demolition Foxes destroy fences easily"""
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
611
241
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 236
diff changeset
612 DIG_ANIMATION = animations.FenceExplosion
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 236
diff changeset
613 IMAGE_FILE = 'sprites/sapper_fox.png'
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
614 CONFIG_NAME = 'sapper fox'
241
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 236
diff changeset
615
406
f8072b2d6dd1 Fix bug where sapper foxes overwrite costs for all foxes
Neil Muller <drnlmuller@gmail.com>
parents: 404
diff changeset
616 costs = Fox.costs.copy()
426
d34be925b9fc Fix SIMPLIFY for chickens and eggs. Clean-up greedy fox cost overriding.
Simon Cross <hodgestar@gmail.com>
parents: 423
diff changeset
617 costs['fence'] = 2
269
445f746449fa Tweak sapper fox path weighting
Neil Muller <drnlmuller@gmail.com>
parents: 257
diff changeset
618
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
619 def _dig(self, dig_pos):
241
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 236
diff changeset
620 """Setup dig parameters, to be overridden if needed"""
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 236
diff changeset
621 self.tick = 0 # Costs us nothing to go through a fence.
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 236
diff changeset
622 self.dig_pos = dig_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
623 self.DIG_ANIMATION(self.gameboard.tv, dig_pos.to_tile_tuple())
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
624 self._make_hole()
475
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
625 return self.pos
241
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 236
diff changeset
626
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
627 class GreedyFox(Fox):
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
628 """Greedy foxes eat more chickens"""
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
629 CONFIG_NAME = 'greedy fox'
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
630
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
631 def __init__(self, pos, gameboard):
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
632 Fox.__init__(self, pos, gameboard)
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
633 self.chickens_eaten = 0
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
634
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
635 def _catch_chicken(self, chicken):
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
636 chicken.damage()
145
490ede177f50 Tweak fox behaviour around henhouses. Add some memory to avoid the indecisive fox loop
Neil Muller <drnlmuller@gmail.com>
parents: 130
diff changeset
637 self.closest = None
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
638 self.chickens_eaten += 1
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
639 if self.chickens_eaten > 2:
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
640 self.hunting = False
149
2a1064fae608 More memory for the foxes, to ensure we avoid short loops
Neil Muller <drnlmuller@gmail.com>
parents: 146
diff changeset
641 self.last_steps = []
114
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
642
290
664bba9be40a Fences are eclectic.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
643 class Rinkhals(Fox):
664bba9be40a Fences are eclectic.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
644 """The Rinkhals has eclectic tastes"""
664bba9be40a Fences are eclectic.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
645 STEALTH = 80
664bba9be40a Fences are eclectic.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
646 IMAGE_FILE = 'sprites/rinkhals.png'
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
647 CONFIG_NAME = 'rinkhals'
290
664bba9be40a Fences are eclectic.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
648
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
649 def _select_target(self):
475
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
650 """The Rinkhals eats eggs"""
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
651 min_dist = 999
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
652 self.closest = None
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
653 for chicken in self.gameboard.chickens:
475
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
654 dist = chicken.pos.dist(self.pos)
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
655 if not chicken.eggs:
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
656 dist += 100 # The closest eggs have to be *far* away to be safe
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
657 if dist < min_dist:
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
658 min_dist = dist
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
659 self.closest = chicken
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
660
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
661 def _catch_chicken(self, chicken):
475
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
662 """The Rinkhals eats eggs, but does not harm 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
663 chicken.remove_eggs()
290
664bba9be40a Fences are eclectic.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
664 self.closest = None
664bba9be40a Fences are eclectic.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
665 self.hunting = False
664bba9be40a Fences are eclectic.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
666 self.last_steps = []
664bba9be40a Fences are eclectic.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
667
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
668 def _dig(self, dig_pos):
475
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
669 """Snakes ignore fences"""
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
670 return dig_pos
290
664bba9be40a Fences are eclectic.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
671
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
672 def damage(self):
290
664bba9be40a Fences are eclectic.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
673 """The Rinkhals is invincible!"""
664bba9be40a Fences are eclectic.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
674 return True
664bba9be40a Fences are eclectic.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
675
199
696936621a93 Buildings can affect visual acuity.
Jeremy Thurgood <firxen@gmail.com>
parents: 196
diff changeset
676 def _get_vision_param(parameter, watcher):
696936621a93 Buildings can affect visual acuity.
Jeremy Thurgood <firxen@gmail.com>
parents: 196
diff changeset
677 param = getattr(watcher, parameter)
696936621a93 Buildings can affect visual acuity.
Jeremy Thurgood <firxen@gmail.com>
parents: 196
diff changeset
678 if watcher.abode:
696936621a93 Buildings can affect visual acuity.
Jeremy Thurgood <firxen@gmail.com>
parents: 196
diff changeset
679 modifier = getattr(watcher.abode.building, 'MODIFY_'+parameter, lambda r: r)
696936621a93 Buildings can affect visual acuity.
Jeremy Thurgood <firxen@gmail.com>
parents: 196
diff changeset
680 param = modifier(param)
696936621a93 Buildings can affect visual acuity.
Jeremy Thurgood <firxen@gmail.com>
parents: 196
diff changeset
681 return param
696936621a93 Buildings can affect visual acuity.
Jeremy Thurgood <firxen@gmail.com>
parents: 196
diff changeset
682
437
95b81e917399 Buildings block line-of-sight, except for occupants.
Jeremy Thurgood <firxen@gmail.com>
parents: 431
diff changeset
683 def visible(watcher, watchee, gameboard):
443
4efe57fcc1d7 Anything off the board is invisible.
Jeremy Thurgood <firxen@gmail.com>
parents: 441
diff changeset
684 if not gameboard.in_bounds(watchee.pos):
4efe57fcc1d7 Anything off the board is invisible.
Jeremy Thurgood <firxen@gmail.com>
parents: 441
diff changeset
685 # We can't see anything off the edge of the board.
4efe57fcc1d7 Anything off the board is invisible.
Jeremy Thurgood <firxen@gmail.com>
parents: 441
diff changeset
686 return False
199
696936621a93 Buildings can affect visual acuity.
Jeremy Thurgood <firxen@gmail.com>
parents: 196
diff changeset
687 vision_bonus = _get_vision_param('VISION_BONUS', watcher)
696936621a93 Buildings can affect visual acuity.
Jeremy Thurgood <firxen@gmail.com>
parents: 196
diff changeset
688 range_penalty = _get_vision_param('VISION_RANGE_PENALTY', watcher)
437
95b81e917399 Buildings block line-of-sight, except for occupants.
Jeremy Thurgood <firxen@gmail.com>
parents: 431
diff changeset
689 positions = watcher.pos.intermediate_positions(watchee.pos)
95b81e917399 Buildings block line-of-sight, except for occupants.
Jeremy Thurgood <firxen@gmail.com>
parents: 431
diff changeset
690 for pos in positions:
95b81e917399 Buildings block line-of-sight, except for occupants.
Jeremy Thurgood <firxen@gmail.com>
parents: 431
diff changeset
691 building = gameboard.get_building(pos.to_tile_tuple())
95b81e917399 Buildings block line-of-sight, except for occupants.
Jeremy Thurgood <firxen@gmail.com>
parents: 431
diff changeset
692 # This allows chickens to fire across GuardTowers and Fences.
95b81e917399 Buildings block line-of-sight, except for occupants.
Jeremy Thurgood <firxen@gmail.com>
parents: 431
diff changeset
693 if building and building.BLOCKS_VISION and not (watcher in building.occupants()):
95b81e917399 Buildings block line-of-sight, except for occupants.
Jeremy Thurgood <firxen@gmail.com>
parents: 431
diff changeset
694 return False
199
696936621a93 Buildings can affect visual acuity.
Jeremy Thurgood <firxen@gmail.com>
parents: 196
diff changeset
695 distance = watcher.pos.dist(watchee.pos) - 1
438
16437cf4a2b8 Trees provide a modicum of cover.
Jeremy Thurgood <firxen@gmail.com>
parents: 437
diff changeset
696 # Intervening forests get in the way a bit.
16437cf4a2b8 Trees provide a modicum of cover.
Jeremy Thurgood <firxen@gmail.com>
parents: 437
diff changeset
697 woods = len([pos for pos in positions if gameboard.tv.get(pos.to_tile_tuple()) == gameboard.WOODLAND])
114
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
698 roll = random.randint(1, 100)
438
16437cf4a2b8 Trees provide a modicum of cover.
Jeremy Thurgood <firxen@gmail.com>
parents: 437
diff changeset
699 return roll > watchee.STEALTH - vision_bonus + range_penalty*distance + constants.WOODLAND_CONCEALMENT*woods
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
700
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
701 # These don't have to add up to 100, but it's easier to think
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
702 # about them if they do.
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
703 DEFAULT_FOX_WEIGHTINGS = (
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
704 (Fox, 59),
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
705 (GreedyFox, 30),
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
706 (NinjaFox, 5),
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
707 (DemoFox, 5),
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
708 (Rinkhals, 1),
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
709 )
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
710