annotate gamelib/animal.py @ 552:11c4cebfe4c5

Preparatory work for woodland biodiversity.
author Jeremy Thurgood <firxen@gmail.com>
date Sat, 28 Nov 2009 17:37:13 +0000
parents 7addf41b6abb
children 50d6c68ce267
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
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
16
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
17 NEIGHBOUR_4 = [Position(-1, 0), Position(1, 0), Position(0, 1), Position(0, -1)]
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
18
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
19
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
20 NEIGHBOUR_8 = [Position(-1, 0), Position(1, 0), Position(0, 1), Position(0, -1),
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
21 Position(1, 1), Position(1, -1), Position(-1, 1), Position(-1, -1)]
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
22
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
23
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
24 TILE_FENCE = tiles.REVERSE_TILE_MAP['fence']
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
25
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents: 414
diff changeset
26 class Animal(Sprite, serializer.Simplifiable):
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
27 """Base class for animals"""
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
28
114
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
29 STEALTH = 0
199
696936621a93 Buildings can affect visual acuity.
Jeremy Thurgood <firxen@gmail.com>
parents: 196
diff changeset
30 VISION_BONUS = 0
696936621a93 Buildings can affect visual acuity.
Jeremy Thurgood <firxen@gmail.com>
parents: 196
diff changeset
31 VISION_RANGE_PENALTY = 10
114
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
32
420
f20ccd43a282 Rework Animal.__init__ to make it easier to unsimplify them.
Simon Cross <hodgestar@gmail.com>
parents: 419
diff changeset
33 # 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
34 # file
f20ccd43a282 Rework Animal.__init__ to make it easier to unsimplify them.
Simon Cross <hodgestar@gmail.com>
parents: 419
diff changeset
35 IMAGE_FILE = None
f20ccd43a282 Rework Animal.__init__ to make it easier to unsimplify them.
Simon Cross <hodgestar@gmail.com>
parents: 419
diff changeset
36
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents: 414
diff changeset
37 SIMPLIFY = [
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents: 414
diff changeset
38 'pos',
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents: 414
diff changeset
39 'equipment',
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents: 414
diff changeset
40 'accoutrements',
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents: 414
diff changeset
41 'abode',
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents: 414
diff changeset
42 'facing',
477
c1439f6705a2 Start of fix for save/restore after animals gained gameboards.
Simon Cross <hodgestar@gmail.com>
parents: 476
diff changeset
43 'gameboard',
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents: 414
diff changeset
44 ]
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents: 414
diff changeset
45
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
46 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
47 # load images
f20ccd43a282 Rework Animal.__init__ to make it easier to unsimplify them.
Simon Cross <hodgestar@gmail.com>
parents: 419
diff changeset
48 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
49 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
50 # 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
51 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
52 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
53 self.image_right = self._image_right.copy()
395
2d0ff46118e2 Basic support for z coordinate
Neil Muller <drnlmuller@gmail.com>
parents: 394
diff changeset
54 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
55 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
56 else:
395
2d0ff46118e2 Basic support for z coordinate
Neil Muller <drnlmuller@gmail.com>
parents: 394
diff changeset
57 self.pos = Position(tile_pos[0], tile_pos[1], 0)
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
58 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
59 self.accoutrements = []
108
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 104
diff changeset
60 self.abode = None
146
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
61 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
62 self.gameboard = gameboard
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
63
505
3ed6c011106d Switch to classmethod decorators.
Simon Cross <hodgestar@gmail.com>
parents: 477
diff changeset
64 @classmethod
423
97dd557504a2 Override make methods for simplifiable objects.
Simon Cross <hodgestar@gmail.com>
parents: 422
diff changeset
65 def make(cls):
97dd557504a2 Override make methods for simplifiable objects.
Simon Cross <hodgestar@gmail.com>
parents: 422
diff changeset
66 """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
67 return cls((0, 0), None)
423
97dd557504a2 Override make methods for simplifiable objects.
Simon Cross <hodgestar@gmail.com>
parents: 422
diff changeset
68
505
3ed6c011106d Switch to classmethod decorators.
Simon Cross <hodgestar@gmail.com>
parents: 477
diff changeset
69 @classmethod
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 438
diff changeset
70 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
71 """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
72 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
73 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
74 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
75
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
76 def loop(self, tv, _sprite):
395
2d0ff46118e2 Basic support for z coordinate
Neil Muller <drnlmuller@gmail.com>
parents: 394
diff changeset
77 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
78 self.rect.x = ppos[0]
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
79 self.rect.y = ppos[1]
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
80
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
81 def die(self):
251
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
82 """Play death animation, noises, whatever."""
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
83 if hasattr(self, 'DEATH_SOUND'):
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
84 sound.play_sound(self.DEATH_SOUND)
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
85 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
86 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
87 self._game_death()
251
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
88
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
89 def _game_death(self):
251
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
90 # Call appropriate gameboard cleanup here.
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
91 pass
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
92
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
93 def move(self):
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
94 """Return a new position for the object"""
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
95 # Default is not to move
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
96 pass
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
97
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
98 def attack(self):
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
99 """Given the game state, attack a suitable target"""
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
100 # Default is not to attack
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
101 pass
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
102
108
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 104
diff changeset
103 def set_pos(self, tile_pos):
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 104
diff changeset
104 """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
105 new_pos = Position(*tile_pos)
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 104
diff changeset
106 self._fix_face(new_pos)
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 104
diff changeset
107 self.pos = new_pos
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 104
diff changeset
108
236
9a6ac9c9ff46 chickens turn to face target foxes
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 216
diff changeset
109 def _fix_face(self, facing_pos):
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
110 """Set the face correctly"""
236
9a6ac9c9ff46 chickens turn to face target foxes
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 216
diff changeset
111 if facing_pos.left_of(self.pos):
146
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
112 self._set_image_facing('left')
236
9a6ac9c9ff46 chickens turn to face target foxes
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 216
diff changeset
113 elif facing_pos.right_of(self.pos):
146
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
114 self._set_image_facing('right')
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
115
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
116 def _set_image_facing(self, facing):
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
117 self.facing = facing
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
118 if self.facing == 'left':
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
119 self.setimage(self.image_left)
146
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
120 elif self.facing == 'right':
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
121 self.setimage(self.image_right)
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
122
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
123 def equip(self, item):
200
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
124 if equipment.is_equipment(item):
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
125 self.equipment.append(item)
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
126 elif equipment.is_accoutrement(item):
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
127 self.accoutrements.append(item)
163
0d6e23dcd3af fixed redrawing
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 161
diff changeset
128 self.redraw()
161
9b4213f6ea7f improved equipment layers; unequip method on animal
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 158
diff changeset
129
9b4213f6ea7f improved equipment layers; unequip method on animal
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 158
diff changeset
130 def unequip(self, item):
200
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
131 if equipment.is_equipment(item):
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
132 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
133 elif equipment.is_accoutrement(item):
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
134 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
135 self.redraw()
161
9b4213f6ea7f improved equipment layers; unequip method on animal
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 158
diff changeset
136
200
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
137 def unequip_by_name(self, item_name):
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
138 # only remove first match
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
139 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
140 if matches:
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
141 self.unequip(matches[0])
67d10f7e0159 selected chickens are selected
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
142
163
0d6e23dcd3af fixed redrawing
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 161
diff changeset
143 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
144 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
145 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
146 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
147 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
148 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
149 layers.append(images)
158
baf857805867 armour works now
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 149
diff changeset
150
195
9d31cfc3afde refactor of layers drawn on chicken, to allow for extended functionality
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 187
diff changeset
151 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
152
201
fe1e9c18d4d7 layering bugfix; indoor chickens now use normal chicken icons
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 200
diff changeset
153 # 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
154 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
155 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
156 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
157 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
158 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
159
9d31cfc3afde refactor of layers drawn on chicken, to allow for extended functionality
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 187
diff changeset
160 self._set_image_facing(self.facing)
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
161
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
162 def weapons(self):
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
163 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
164
174
ff168162974e armour gets damaged
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 171
diff changeset
165 def armour(self):
ff168162974e armour gets damaged
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 171
diff changeset
166 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
167
104
d17375586866 Add .covers(tile_pos) to animals (to match similar function on buildings).
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
168 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
169 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
170
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 122
diff changeset
171 def outside(self):
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 122
diff changeset
172 return self.abode is None
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 122
diff changeset
173
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
174 def damage(self):
174
ff168162974e armour gets damaged
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 171
diff changeset
175 for a in self.armour():
ff168162974e armour gets damaged
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 171
diff changeset
176 if not a.survive_damage():
ff168162974e armour gets damaged
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 171
diff changeset
177 self.unequip(a)
ff168162974e armour gets damaged
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 171
diff changeset
178 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
179 self.die()
174
ff168162974e armour gets damaged
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 171
diff changeset
180 return False
ff168162974e armour gets damaged
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 171
diff changeset
181
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
182 class Chicken(Animal):
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
183 """A chicken"""
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
184
146
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
185 EQUIPMENT_IMAGE_ATTRIBUTE = 'CHICKEN_IMAGE_FILE'
251
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
186 DEATH_ANIMATION = animations.ChickenDeath
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
187 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
188 IMAGE_FILE = 'sprites/chkn.png'
146
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
189
426
d34be925b9fc Fix SIMPLIFY for chickens and eggs. Clean-up greedy fox cost overriding.
Simon Cross <hodgestar@gmail.com>
parents: 423
diff changeset
190 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
191
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
192 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
193 Animal.__init__(self, pos, gameboard)
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
194 self.eggs = []
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
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 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
197 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
198 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
199
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 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
201 self.hatch()
419
d110d55c8449 Move hatching logic into chickens.
Jeremy Thurgood <firxen@gmail.com>
parents: 415
diff changeset
202
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
203 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
204 self.gameboard.remove_chicken(self)
251
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
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 move(self):
422
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 420
diff changeset
207 """A free chicken will wander around aimlessly"""
ab4fc3fe0f96 chickens scatter; chop wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 420
diff changeset
208 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
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 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
211 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
212
441
7b5e4b6dd889 fixed unarmed logging bug
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 439
diff changeset
213 def has_axe(self):
445
af2482444945 Fix check for axes.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
214 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
215
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
216 def chop(self):
441
7b5e4b6dd889 fixed unarmed logging bug
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 439
diff changeset
217 if self.has_axe():
7b5e4b6dd889 fixed unarmed logging bug
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 439
diff changeset
218 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
219 surrounds = [Position(pos_x + dx, pos_y + dy) for dx in [-1, 0, 1] for dy in [-1, 0, 1]]
552
11c4cebfe4c5 Preparatory work for woodland biodiversity.
Jeremy Thurgood <firxen@gmail.com>
parents: 533
diff changeset
220 tree_options = [pos for pos in surrounds if self.gameboard.in_bounds(pos) and self.gameboard.is_woodland_tile(pos)]
441
7b5e4b6dd889 fixed unarmed logging bug
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 439
diff changeset
221 if tree_options:
7b5e4b6dd889 fixed unarmed logging bug
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 439
diff changeset
222 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
223 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
224 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
225 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
226 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
227
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
228 def lay(self):
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
229 """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
230 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
231 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
232 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
233 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
234 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
235 self.gameboard.eggs += self.get_num_eggs()
216
962934b8c7dc Implement UI part of egg selling
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
236
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
237 def remove_eggs(self):
216
962934b8c7dc Implement UI part of egg selling
Neil Muller <drnlmuller@gmail.com>
parents: 201
diff changeset
238 """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
239 self.gameboard.remove_eggs(len(self.eggs))
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
240 self.eggs = []
305
32149b1d9fd2 Capitalised all equipment names.
Jeremy Thurgood <firxen@gmail.com>
parents: 293
diff changeset
241 self.unequip_by_name("Nestegg")
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
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 remove_one_egg(self):
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
244 """Clean up the egg state"""
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
245 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
246 self.gameboard.remove_eggs(1)
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
247 if not self.eggs:
305
32149b1d9fd2 Capitalised all equipment names.
Jeremy Thurgood <firxen@gmail.com>
parents: 293
diff changeset
248 self.unequip_by_name("Nestegg")
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
249
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
250 def get_num_eggs(self):
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
251 return len(self.eggs)
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
252
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 def hatch(self):
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
254 """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
255 if self.eggs:
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
256 chick = self.eggs[0].hatch()
187
6854e706dcdf Remove hatched eggs
Neil Muller <drnlmuller@gmail.com>
parents: 174
diff changeset
257 if chick:
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
258 # sell the remaining eggs
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
259 # 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
260 self.remove_one_egg()
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
261 # Sell other eggs
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
262 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
263 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
264 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
265 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
266
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
267 def _find_killable_fox(self, weapon):
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
268 """Choose a random fox within range of this weapon."""
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
269 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
270 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
271 if not weapon.in_range(self.gameboard, self, fox):
114
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
272 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
273 if visible(self, fox, self.gameboard):
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
274 killable_foxes.append(fox)
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
275 if not killable_foxes:
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
276 return None
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
277 return random.choice(killable_foxes)
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
278
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
279 def attack(self):
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
280 """An armed chicken will attack a fox within range."""
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
281 if not self.weapons():
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
282 # Not going to take on a fox bare-winged.
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
283 return
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
284 # Choose the first weapon equipped.
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
285 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
286 fox = self._find_killable_fox(weapon)
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
287 if not fox:
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
288 return
236
9a6ac9c9ff46 chickens turn to face target foxes
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 216
diff changeset
289 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
290 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
291 fox.damage()
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
292
413
bdc4757e0497 Add Sniper Rifle and give guns limited ammunition.
Jeremy Thurgood <firxen@gmail.com>
parents: 407
diff changeset
293 def reload_weapon(self):
bdc4757e0497 Add Sniper Rifle and give guns limited ammunition.
Jeremy Thurgood <firxen@gmail.com>
parents: 407
diff changeset
294 """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
295 for weapon in self.weapons():
429
42777630956a Add ammo to things serialized and deserialized.
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
296 weapon.refresh_ammo()
413
bdc4757e0497 Add Sniper Rifle and give guns limited ammunition.
Jeremy Thurgood <firxen@gmail.com>
parents: 407
diff changeset
297
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
298 class Egg(Animal):
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
299 """An egg"""
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
300
420
f20ccd43a282 Rework Animal.__init__ to make it easier to unsimplify them.
Simon Cross <hodgestar@gmail.com>
parents: 419
diff changeset
301 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
302
426
d34be925b9fc Fix SIMPLIFY for chickens and eggs. Clean-up greedy fox cost overriding.
Simon Cross <hodgestar@gmail.com>
parents: 423
diff changeset
303 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
304
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
305 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
306 Animal.__init__(self, pos, gameboard)
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
307 self.timer = 2
47
be2496df2368 Add egg image to egg sprite.
Simon Cross <hodgestar@gmail.com>
parents: 44
diff changeset
308
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
309 # Eggs don't move
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
310
171
9ea53eb919cf Make Animals accept Positions when created. move hatch watching from Chicken to Egg
Neil Muller <drnlmuller@gmail.com>
parents: 163
diff changeset
311 def hatch(self):
243
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
312 self.timer -= 1
4f86c2616cdf Variable number of eggs for chickens
Neil Muller <drnlmuller@gmail.com>
parents: 241
diff changeset
313 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
314 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
315 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
316
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
317 class Fox(Animal):
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
318 """A fox"""
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
319
114
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
320 STEALTH = 20
130
96c5ef7613b5 NINJA FOXES!
Jeremy Thurgood <firxen@gmail.com>
parents: 125
diff changeset
321 IMAGE_FILE = 'sprites/fox.png'
251
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
322 DEATH_ANIMATION = animations.FoxDeath
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
323 DEATH_SOUND = 'kill-fox.ogg'
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
324 CONFIG_NAME = 'fox'
114
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
325
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
326 costs = {
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
327 # weighting for movement calculation
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
328 'grassland' : 2,
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
329 'woodland' : 1, # Try to keep to the woods if possible
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
330 'broken fence' : 1,
404
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
331 'fence' : 25,
72
aa4bd93575d9 Fix some bound checking and tweak movement costs
Neil Muller <drnlmuller@gmail.com>
parents: 71
diff changeset
332 '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
333 '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
334 # 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
335 'hendominium' : 30,
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
336 }
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
337
476
3dae0fc14009 Animals have their own gameboard references instead of lugging them around in params all the time.
Jeremy Thurgood <firxen@gmail.com>
parents: 475
diff changeset
338 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
339 Animal.__init__(self, pos, gameboard)
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
340 self.start_pos = self.pos
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
341 self.target = None
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
342 self.hunting = True
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
343 self.dig_pos = None
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
344 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
345 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
346 self.closest = None
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
347 # 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
348 # can still be inside
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
349 self.building = None
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
350 self._last_steps = []
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
351 self.path = []
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
352
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
353 def outside(self):
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
354 return self.building is None
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
355
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
356 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
357 self.gameboard.kill_fox(self)
251
844bfb23d4b6 Refactored animal death and added death animations.
Jeremy Thurgood <firxen@gmail.com>
parents: 243
diff changeset
358
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 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
360 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
361 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
362 cost = self.costs.get(tiles.TILE_MAP[this_tile], 100)
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
363 else:
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
364 cost = 100 # Out of bounds is expensive
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
365 return cost
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
366
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
367 def _is_fence(self, pos):
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
368 if self.gameboard.in_bounds(pos):
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
369 this_tile = self.gameboard.tv.get(pos.to_tile_tuple())
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
370 return this_tile == TILE_FENCE
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
371 return False
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
372
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
373 def _check_steps(self, step, border_func, end_func, max_steps):
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
374 steps = 0
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
375 cur_pos = self.pos
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
376 path = []
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
377 while steps < max_steps:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
378 if not border_func(cur_pos):
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
379 # Not walking the edge
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
380 return None
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
381 path.append(cur_pos)
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
382 if end_func(cur_pos):
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
383 # is there an 8-NEIGHBOUR that also satisfies end_func and is
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
384 # closer to target
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
385 dist = self.target.dist(cur_pos)
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
386 fin_pos = None
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
387 for pos in [cur_pos + x for x in NEIGHBOUR_8]:
511
57f9077fb7fb Remove some left-over code.
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
388 if pos in path:
57f9077fb7fb Remove some left-over code.
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
389 continue
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
390 if end_func(pos) and self.target.dist(pos) < dist:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
391 fin_pos = pos
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
392 dist = self.target.dist(pos)
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
393 if fin_pos:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
394 path.append(fin_pos)
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
395 return path
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
396 steps += 1
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
397 cur_pos = cur_pos + step
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
398 return None
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
399
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
400 def _search_for_path(self, border_func, end_func, max_steps):
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
401 paths = [None] * 4
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
402 paths[0] = self._check_steps(Position(-1, 0), border_func, end_func, max_steps)
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
403 paths[1] = self._check_steps(Position(0, -1), border_func, end_func, max_steps)
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
404 paths[2] = self._check_steps(Position(1, 0), border_func, end_func, max_steps)
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
405 paths[3] = self._check_steps(Position(0, 1), border_func, end_func, max_steps)
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
406 cands = [x for x in paths if x is not None]
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
407 if not cands:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
408 return None
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
409 elif len(cands) == 1:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
410 return cands[0][1:]
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
411 # take the end point closest to our target
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
412 final_path = cands[0]
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
413 min_dist = final_path[-1].dist(self.target)
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
414 for this_path in cands[1:]:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
415 dist = this_path[-1].dist(self.target)
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
416 if dist < min_dist:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
417 min_dist = dist
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
418 final_path = this_path
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
419 elif dist == min_dist and random.randint(0, 1) == 0:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
420 final_path = this_path
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
421 return final_path[1:] # path's include self.pos
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
422
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
423 def _find_nearest_corner(self):
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
424 """Find the nearest corner of the bulding"""
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
425 COST_MARGIN = 25
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
426 def border(pos):
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
427 cost = self._cost_tile(pos)
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
428 if cost >= COST_MARGIN:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
429 return False # in building isn't border
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
430 for tpos in [pos + step for step in NEIGHBOUR_8]:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
431 if self.gameboard.in_bounds(tpos):
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
432 cost = self._cost_tile(tpos)
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
433 if cost >= COST_MARGIN:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
434 return True
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
435 return False
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
436
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
437 def corner(pos):
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
438 # A corner is not 4-connected to a building
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
439 if not border(pos):
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
440 return False
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
441 for tpos in [pos + step for step in NEIGHBOUR_4]:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
442 if self.gameboard.in_bounds(tpos):
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
443 cost = self._cost_tile(tpos)
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
444 if cost >= COST_MARGIN:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
445 return False
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
446 return True
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
447
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
448 return self._search_for_path(border, corner, 6)
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
449
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
450 def _find_fence_gap(self):
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
451 # We search for a gap in the fence
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
452 # we know we are next to fence. A gap in the fence is
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
453 # a point that borders the fence where the fence is not
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
454 # 4-connected
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
455
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
456 COST_MARGIN = 25
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
457
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
458 def border(pos):
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
459 if self._is_fence(pos) or self._cost_tile(pos) >= COST_MARGIN:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
460 return False
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
461 for tpos in [pos + step for step in NEIGHBOUR_8]:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
462 if self._is_fence(tpos) or self._cost_tile(tpos) >= COST_MARGIN:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
463 return True
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
464 return False
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
465
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
466 def is_gap(pos):
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
467 # A gap neighbours only fence tiles which has < 2 4-neighbours
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
468 if self._is_fence(pos):
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
469 return False
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
470 fence_neighbours = [0]
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
471 for tpos in [pos + step for step in NEIGHBOUR_8]:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
472 if self._is_fence(tpos):
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
473 connections = 0
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
474 for fpos in [tpos + step for step in NEIGHBOUR_4]:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
475 if self.gameboard.in_bounds(fpos):
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
476 if self._is_fence(fpos) or self._cost_tile(tpos) >= COST_MARGIN:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
477 # Expensive building is considered fence
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
478 connections += 1
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
479 else:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
480 # Fence connecting to out of bounds counts as fence
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
481 connections += 1
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
482 fence_neighbours.append(connections)
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
483 return max(fence_neighbours) < 2
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
484
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
485 return self._search_for_path(border, is_gap, 7)
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
486
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
487 def _find_min_cost_neighbour(self, target):
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
488 """Find the minimum cost neighbour that's closer to target"""
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
489 cur_dist = target.dist(self.pos)
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
490 neighbours = [self.pos + step for step in NEIGHBOUR_8]
404
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
491 min_cost = 1000
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
492 min_dist = cur_dist
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
493 best = self.pos
404
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
494 for point in neighbours:
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
495 if point in self._last_steps:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
496 continue
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
497 dist = point.dist(target)
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
498 if dist <= min_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
499 cost = self._cost_tile(point)
404
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
500 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
501 # Prefer closest of equal cost points
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
502 min_dist = dist
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
503 min_cost = cost
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
504 best = point
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
505 elif min_cost == cost and random.randint(0, 1) == 0:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
506 # Be slightly non-deterministic when presented with
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
507 # equal choices
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
508 best = point
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
509 return best, min_cost
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
510
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
511 def _find_best_path_step(self):
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
512 """Find the cheapest path to final_pos, and return the next step
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
513 along the path."""
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
514 if self.path:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
515 next_step = self.path.pop(0)
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
516 if next_step.dist(self.pos) < 2:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
517 return next_step
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
518 else:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
519 # Been bounced off the path
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
520 self.path = []
533
7addf41b6abb Allow backtracking on ladders
Neil Muller <drnlmuller@gmail.com>
parents: 531
diff changeset
521 new_pos = None
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
522 if self.target.z < self.pos.z:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
523 # We need to try heading down.
533
7addf41b6abb Allow backtracking on ladders
Neil Muller <drnlmuller@gmail.com>
parents: 531
diff changeset
524 new_pos = Position(self.pos.x, self.pos.y, self.pos.z - 1)
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
525 if self.target.x == self.pos.x and self.target.y == self.pos.y and \
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
526 self.target.z > self.pos.z:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
527 # We try heading up
533
7addf41b6abb Allow backtracking on ladders
Neil Muller <drnlmuller@gmail.com>
parents: 531
diff changeset
528 new_pos = Position(self.pos.x, self.pos.y, self.pos.z + 1)
7addf41b6abb Allow backtracking on ladders
Neil Muller <drnlmuller@gmail.com>
parents: 531
diff changeset
529 if new_pos:
7addf41b6abb Allow backtracking on ladders
Neil Muller <drnlmuller@gmail.com>
parents: 531
diff changeset
530 if new_pos in self._last_steps:
7addf41b6abb Allow backtracking on ladders
Neil Muller <drnlmuller@gmail.com>
parents: 531
diff changeset
531 # ladder, so we allow backtracking
7addf41b6abb Allow backtracking on ladders
Neil Muller <drnlmuller@gmail.com>
parents: 531
diff changeset
532 self._last_steps.remove(new_pos)
7addf41b6abb Allow backtracking on ladders
Neil Muller <drnlmuller@gmail.com>
parents: 531
diff changeset
533 return new_pos
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
534 cur_dist = self.target.dist(self.pos)
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
535 if cur_dist < 2:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
536 # We're right ontop of our target, so just go there
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
537 return self.target
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
538 # Find the cheapest spot close to us that moves us closer to the target
531
452cde9af2a2 Fix order of checks to avoid unneeded work
Neil Muller <drnlmuller@gmail.com>
parents: 518
diff changeset
539 best, min_cost = self._find_min_cost_neighbour(self.target)
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
540 if min_cost < 20 or not self.gameboard.in_bounds(self.pos) \
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
541 or not self.gameboard.in_bounds(best):
407
bdc8bc78a796 Handle corner case aroudn entering the map
Neil Muller <drnlmuller@gmail.com>
parents: 406
diff changeset
542 # 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
543 # for an optimal path.
404
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
544 return best
e5247ec76f24 The new faster deciding (but somewhat dumber) fox
Neil Muller <drnlmuller@gmail.com>
parents: 402
diff changeset
545 # Else expensive step, so think further
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
546 if self._is_fence(best):
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
547 path = self._find_fence_gap()
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
548 elif min_cost == 30:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
549 # building
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
550 path = self._find_nearest_corner()
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
551 else:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
552 # We're looping
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
553 self._last_steps = []
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
554 return self.pos
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
555 if path:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
556 self.path = path[1:] # exclude 1st step
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
557 return path[0]
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
558 return best
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
559
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
560 def _calc_next_move(self):
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
561 """Find the path to the target"""
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
562 if self.hunting:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
563 # Check if we need to update our idea of a target
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
564 if not self.closest or self.closest not in self.gameboard.chickens:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
565 # Either no target, or someone ate it
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
566 self._select_prey()
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
567 elif not self.target:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
568 self.target = self.closest.pos
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
569 if not self.target:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
570 self.target = self.start_pos
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
571 self._last_steps = []
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
572 if self.target == self.pos:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
573 # No need to move, but we will need to update the target
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
574 self.target = None
402
3a469d46b820 Tweak safe logic to avoid some corner cases
Neil Muller <drnlmuller@gmail.com>
parents: 401
diff changeset
575 return self.pos
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
576 if self.target.to_tile_tuple() == self.pos.to_tile_tuple():
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
577 # Only differ in z, so next step is in z
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
578 if self.target.z < self.pos.z:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
579 new_z = self.pos.z - 1
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
580 else:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
581 new_z = self.pos.z + 1
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
582 return Position(self.pos.x, self.pos.y, new_z)
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
583 return self._find_best_path_step()
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
584
518
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
585 def _calculate_dist(self, chicken):
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
586 """Calculate the distance to the chicken"""
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
587 dist = chicken.pos.dist(self.pos)
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
588 if chicken.abode:
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
589 dist += 5 # Prefer free-ranging chickens
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
590 if len(chicken.weapons()) > 0:
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
591 dist += 5 # Prefer unarmed chickens
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
592 return dist
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
593
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
594 def _select_prey(self):
475
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
595 min_dist = 999
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
596 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
597 for chicken in self.gameboard.chickens:
518
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
598 dist = self._calculate_dist(chicken)
475
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
599 if dist < min_dist:
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
600 min_dist = dist
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
601 self.closest = chicken
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
602 self.target = chicken.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
603 if not self.closest:
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
604 # No more chickens, so leave
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
605 self.hunting = False
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
606 self.target = self.start_pos
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
607 return self.pos
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
608
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
609 def attack(self):
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
610 """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
611 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
612 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
613 # 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
614 self._catch_chicken(chicken)
396
19e583e5cdc0 Refactor for further move work
Neil Muller <drnlmuller@gmail.com>
parents: 395
diff changeset
615
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
616 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
617 """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
618 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
619 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
620 self.hunting = False
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
621 self.target = self.start_pos
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
622 self._last_steps = []
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
623
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
624 def _update_pos(self, new_pos):
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
625 """Update the position, making sure we don't step on other foxes"""
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
626 if not self.hunting and not self.gameboard.in_bounds(self.pos):
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
627 self.safe = True
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
628 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
629 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
630 # 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
631 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
632 blocked = self.gameboard.get_animal_at_pos(new_pos, 'fox') is not None
149
2a1064fae608 More memory for the foxes, to ensure we avoid short loops
Neil Muller <drnlmuller@gmail.com>
parents: 146
diff changeset
633 final_pos = new_pos
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
634 if blocked:
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
635 if new_pos.z != self.pos.z or self.pos.z != 0:
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 398
diff changeset
636 # 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
637 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
638 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
639 else:
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
640 moves = [self.pos + step for step in NEIGHBOUR_8]
399
3294929223bd Cache fox positions to avoid a repeated loop
Neil Muller <drnlmuller@gmail.com>
parents: 398
diff changeset
641 # 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
642 final_pos = None
82
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
643 min_cost = 1000
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
644 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
645 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
646 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
647 cost = self._cost_tile(poss)
82
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
648 if cost < min_cost:
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
649 min_cost = cost
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
650 final_pos = poss
257
fcaae2cfe3cd Make foxes less determistic when avoiding other foxes
Neil Muller <drnlmuller@gmail.com>
parents: 251
diff changeset
651 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
652 # Add some randomness in this case
fcaae2cfe3cd Make foxes less determistic when avoiding other foxes
Neil Muller <drnlmuller@gmail.com>
parents: 251
diff changeset
653 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
654 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
655 # 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
656 return self.pos
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
657 if self._is_fence(final_pos) 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
658 return self._dig(final_pos)
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
659 self._last_steps.append(final_pos)
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
660 if len(self._last_steps) > 6:
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
661 self._last_steps.pop(0)
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
662 return final_pos
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
663
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
664 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
665 """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
666 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
667 self.dig_pos = dig_pos
475
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
668 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
669
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
670 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
671 """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
672 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
673 # 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
674 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
675 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
676 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
677
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
678 def move(self):
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
679 """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
680 chicken"""
398
082b1ea5f98d Regain time lost when adding foxes to buildings
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
681 if self.safe:
082b1ea5f98d Regain time lost when adding foxes to buildings
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
682 # We're safe, so do nothing
082b1ea5f98d Regain time lost when adding foxes to buildings
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
683 return
082b1ea5f98d Regain time lost when adding foxes to buildings
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
684 elif self.dig_pos:
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
685 if self.tick:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
686 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
687 # 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
688 # 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
689 # 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
690 # but we'll notice if the fence we're digging vanishes
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
691 if not self._is_fence(self.dig_pos):
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
692 self.tick = 0
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
693 else:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
694 # 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
695 self._make_hole()
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
696 return
533
7addf41b6abb Allow backtracking on ladders
Neil Muller <drnlmuller@gmail.com>
parents: 531
diff changeset
697 desired_pos = self._calc_next_move()
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
698 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
699 self._fix_face(final_pos)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
700 self.pos = final_pos
398
082b1ea5f98d Regain time lost when adding foxes to buildings
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
701 change_visible = False
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
702 # 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
703 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
704 if building and self.outside():
398
082b1ea5f98d Regain time lost when adding foxes to buildings
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
705 # Check if we need to enter
082b1ea5f98d Regain time lost when adding foxes to buildings
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
706 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
707 self.closest.abode.building is building:
082b1ea5f98d Regain time lost when adding foxes to buildings
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
708 building.add_predator(self)
082b1ea5f98d Regain time lost when adding foxes to buildings
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
709 change_visible = True
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
710 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
711 # 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
712 if building == self.building:
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
713 # Check if we need to leave the building
515
88bda6db953a Fix buggy test
Neil Muller <drnlmuller@gmail.com>
parents: 511
diff changeset
714 if not self.hunting or (self.closest and self.closest.abode
88bda6db953a Fix buggy test
Neil Muller <drnlmuller@gmail.com>
parents: 511
diff changeset
715 and self.closest.abode.building is not building):
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
716 self.building.remove_predator(self)
398
082b1ea5f98d Regain time lost when adding foxes to buildings
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
717 change_visible = True
397
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
718 else:
532f1ea476ff Make foxes enter buildings, with a seperate count for them
Neil Muller <drnlmuller@gmail.com>
parents: 396
diff changeset
719 # 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
720 self.building.remove_predator(self)
398
082b1ea5f98d Regain time lost when adding foxes to buildings
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
721 change_visible = True
082b1ea5f98d Regain time lost when adding foxes to buildings
Neil Muller <drnlmuller@gmail.com>
parents: 397
diff changeset
722 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
723 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
724
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
725
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
726 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
727 """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
728
114
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
729 STEALTH = 60
130
96c5ef7613b5 NINJA FOXES!
Jeremy Thurgood <firxen@gmail.com>
parents: 125
diff changeset
730 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
731 CONFIG_NAME = 'ninja fox'
114
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
732
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
733 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
734 """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
735
241
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 236
diff changeset
736 DIG_ANIMATION = animations.FenceExplosion
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 236
diff changeset
737 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
738 CONFIG_NAME = 'sapper fox'
241
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 236
diff changeset
739
406
f8072b2d6dd1 Fix bug where sapper foxes overwrite costs for all foxes
Neil Muller <drnlmuller@gmail.com>
parents: 404
diff changeset
740 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
741 costs['fence'] = 2
269
445f746449fa Tweak sapper fox path weighting
Neil Muller <drnlmuller@gmail.com>
parents: 257
diff changeset
742
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
743 def _dig(self, dig_pos):
241
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 236
diff changeset
744 """Setup dig parameters, to be overridden if needed"""
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 236
diff changeset
745 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
746 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
747 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
748 self._make_hole()
475
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
749 return self.pos
241
1a7000c8211c Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents: 236
diff changeset
750
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
751 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
752 """Greedy foxes eat more chickens"""
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
753 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
754
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
755 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
756 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
757 self.chickens_eaten = 0
518
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
758 self.last_chicken = None
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
759
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
760 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
761 chicken.damage()
518
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
762 self.last_chicken = self.closest
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
763 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
764 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
765 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
766 self.hunting = False
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
767 self.target = self.start_pos
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
768 self._last_steps = []
518
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
769 else:
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
770 self._select_prey() # select new target
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
771
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
772 def _calculate_dist(self, chicken):
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
773 """Calculate the distance to the chicken"""
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
774 dist = super(GreedyFox, self)._calculate_dist(chicken)
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
775 if self.last_chicken and self.last_chicken is chicken:
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
776 # We hurt our teeth, only attack the same chicken if it's the
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
777 # only one nearby
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
778 dist += 15
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
779 return dist
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
780
114
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
781
290
664bba9be40a Fences are eclectic.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
782 class Rinkhals(Fox):
664bba9be40a Fences are eclectic.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
783 """The Rinkhals has eclectic tastes"""
664bba9be40a Fences are eclectic.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
784 STEALTH = 80
664bba9be40a Fences are eclectic.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
785 IMAGE_FILE = 'sprites/rinkhals.png'
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
786 CONFIG_NAME = 'rinkhals'
290
664bba9be40a Fences are eclectic.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
787
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
788 costs = Fox.costs.copy()
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
789 costs['fence'] = 2
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
790
518
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
791 def _calculate_dist(self, chicken):
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
792 """The Rinkhals eats eggs, so tweak distance accordingly"""
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
793 dist = chicken.pos.dist(self.pos)
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
794 if not chicken.eggs:
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
795 dist += 100 # The closest eggs have to be *far* away to be safe
a42852e50df1 Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
Neil Muller <drnlmuller@gmail.com>
parents: 515
diff changeset
796 return dist
475
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
797
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
798 def _catch_chicken(self, chicken):
475
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
799 """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
800 chicken.remove_eggs()
290
664bba9be40a Fences are eclectic.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
801 self.closest = None
664bba9be40a Fences are eclectic.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
802 self.hunting = False
507
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
803 self.target = self.start_pos
d3ceb9e9c48e The fox move rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 505
diff changeset
804 self._last_steps = []
290
664bba9be40a Fences are eclectic.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
805
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
806 def _dig(self, dig_pos):
475
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
807 """Snakes ignore fences"""
d4f04d81fe54 Rinkhals eats eggs, along with associated changes.
Jeremy Thurgood <firxen@gmail.com>
parents: 457
diff changeset
808 return dig_pos
290
664bba9be40a Fences are eclectic.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
809
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
810 def damage(self):
290
664bba9be40a Fences are eclectic.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
811 """The Rinkhals is invincible!"""
664bba9be40a Fences are eclectic.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
812 return True
664bba9be40a Fences are eclectic.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
813
199
696936621a93 Buildings can affect visual acuity.
Jeremy Thurgood <firxen@gmail.com>
parents: 196
diff changeset
814 def _get_vision_param(parameter, watcher):
696936621a93 Buildings can affect visual acuity.
Jeremy Thurgood <firxen@gmail.com>
parents: 196
diff changeset
815 param = getattr(watcher, parameter)
696936621a93 Buildings can affect visual acuity.
Jeremy Thurgood <firxen@gmail.com>
parents: 196
diff changeset
816 if watcher.abode:
696936621a93 Buildings can affect visual acuity.
Jeremy Thurgood <firxen@gmail.com>
parents: 196
diff changeset
817 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
818 param = modifier(param)
696936621a93 Buildings can affect visual acuity.
Jeremy Thurgood <firxen@gmail.com>
parents: 196
diff changeset
819 return param
696936621a93 Buildings can affect visual acuity.
Jeremy Thurgood <firxen@gmail.com>
parents: 196
diff changeset
820
437
95b81e917399 Buildings block line-of-sight, except for occupants.
Jeremy Thurgood <firxen@gmail.com>
parents: 431
diff changeset
821 def visible(watcher, watchee, gameboard):
443
4efe57fcc1d7 Anything off the board is invisible.
Jeremy Thurgood <firxen@gmail.com>
parents: 441
diff changeset
822 if not gameboard.in_bounds(watchee.pos):
4efe57fcc1d7 Anything off the board is invisible.
Jeremy Thurgood <firxen@gmail.com>
parents: 441
diff changeset
823 # 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
824 return False
199
696936621a93 Buildings can affect visual acuity.
Jeremy Thurgood <firxen@gmail.com>
parents: 196
diff changeset
825 vision_bonus = _get_vision_param('VISION_BONUS', watcher)
696936621a93 Buildings can affect visual acuity.
Jeremy Thurgood <firxen@gmail.com>
parents: 196
diff changeset
826 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
827 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
828 for pos in positions:
95b81e917399 Buildings block line-of-sight, except for occupants.
Jeremy Thurgood <firxen@gmail.com>
parents: 431
diff changeset
829 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
830 # 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
831 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
832 return False
199
696936621a93 Buildings can affect visual acuity.
Jeremy Thurgood <firxen@gmail.com>
parents: 196
diff changeset
833 distance = watcher.pos.dist(watchee.pos) - 1
438
16437cf4a2b8 Trees provide a modicum of cover.
Jeremy Thurgood <firxen@gmail.com>
parents: 437
diff changeset
834 # Intervening forests get in the way a bit.
552
11c4cebfe4c5 Preparatory work for woodland biodiversity.
Jeremy Thurgood <firxen@gmail.com>
parents: 533
diff changeset
835 woods = len([pos for pos in positions if gameboard.is_woodland_tile(pos)])
114
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
836 roll = random.randint(1, 100)
438
16437cf4a2b8 Trees provide a modicum of cover.
Jeremy Thurgood <firxen@gmail.com>
parents: 437
diff changeset
837 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
838
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
839 # 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
840 # about them if they do.
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
841 DEFAULT_FOX_WEIGHTINGS = (
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
842 (Fox, 59),
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
843 (GreedyFox, 30),
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
844 (NinjaFox, 5),
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
845 (DemoFox, 5),
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
846 (Rinkhals, 1),
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
847 )
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents: 380
diff changeset
848