annotate gamelib/animal.py @ 158:baf857805867

armour works now
author Adrianna Pińska <adrianna.pinska@gmail.com>
date Thu, 03 Sep 2009 21:50:49 +0000
parents 2a1064fae608
children 9b4213f6ea7f
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
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
6 from pgu.algo import getline
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
7
44
7e884084e7b1 Move animal sprites to imagecache.
Simon Cross <hodgestar@gmail.com>
parents: 38
diff changeset
8 import imagecache
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
9 import tiles
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
10 from misc import Position
98
725b292ca07b Added sounds killing foxes and chickens, and nightfall
David Fraser <davidf@sjsoft.com>
parents: 92
diff changeset
11 import sound
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
12 import equipment
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
13
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
14 class Animal(Sprite):
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
15 """Base class for animals"""
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
16
114
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
17 STEALTH = 0
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
18
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
19 def __init__(self, image_left, image_right, tile_pos):
38
03121c89d5fd Make the secret foxes really secret
Neil Muller <drnlmuller@gmail.com>
parents: 32
diff changeset
20 # Create the animal somewhere far off screen
53
f20dd3dcb118 foxes don't run backwards
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 47
diff changeset
21 Sprite.__init__(self, image_left, (-1000, -1000))
146
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
22 self._image_left = image_left
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
23 self.image_left = image_left.copy()
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
24 self._image_right = image_right
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
25 self.image_right = image_right.copy()
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
26 self.pos = Position(tile_pos[0], tile_pos[1])
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
27 self.equipment = []
108
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 104
diff changeset
28 self.abode = None
146
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
29 self.facing = 'left'
158
baf857805867 armour works now
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 149
diff changeset
30 self.lives = 1
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
31
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
32 def loop(self, tv, _sprite):
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
33 ppos = tv.tile_to_view(self.pos.to_tuple())
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
34 self.rect.x = ppos[0]
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
35 self.rect.y = ppos[1]
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
36
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
37 def move(self, state):
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
38 """Given the game state, return a new position for the object"""
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
39 # Default is not to move
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
40 pass
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
41
108
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 104
diff changeset
42 def set_pos(self, tile_pos):
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 104
diff changeset
43 """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
44 new_pos = Position(*tile_pos)
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 104
diff changeset
45 self._fix_face(new_pos)
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 104
diff changeset
46 self.pos = new_pos
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 104
diff changeset
47
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
48 def _fix_face(self, final_pos):
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
49 """Set the face correctly"""
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
50 if final_pos.left_of(self.pos):
146
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
51 self._set_image_facing('left')
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
52 elif final_pos.right_of(self.pos):
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
53 self._set_image_facing('right')
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
54
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
55 def _set_image_facing(self, facing):
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
56 self.facing = facing
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
57 if self.facing == 'left':
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
58 self.setimage(self.image_left)
146
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
59 elif self.facing == 'right':
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
60 self.setimage(self.image_right)
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
61
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
62 def equip(self, item):
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
63 self.equipment.append(item)
158
baf857805867 armour works now
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 149
diff changeset
64 self.draw_equipment(item)
baf857805867 armour works now
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 149
diff changeset
65 if not equipment.is_weapon(item):
baf857805867 armour works now
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 149
diff changeset
66 # redraw weapons on top
baf857805867 armour works now
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 149
diff changeset
67 for weapon in self.weapons():
baf857805867 armour works now
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 149
diff changeset
68 self.draw_equipment(weapon)
baf857805867 armour works now
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 149
diff changeset
69
baf857805867 armour works now
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 149
diff changeset
70 def draw_equipment(self, item):
146
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
71 if not hasattr(self, 'EQUIPMENT_IMAGE_ATTRIBUTE'):
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
72 return
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
73 eq_image_attr = getattr(item, self.EQUIPMENT_IMAGE_ATTRIBUTE, 'None')
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
74 if not eq_image_attr:
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
75 return
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
76 eq_image_left = imagecache.load_image(eq_image_attr)
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
77 eq_image_right = imagecache.load_image(eq_image_attr, ("right_facing",))
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
78 self.image_left.blit(eq_image_left, (0, 0))
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
79 self.image_right.blit(eq_image_right, (0, 0))
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
80 self._set_image_facing(self.facing)
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
81
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
82 def weapons(self):
109
48019afde338 Equipment purchasing and some toolbar tweaks.
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
83 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
84
104
d17375586866 Add .covers(tile_pos) to animals (to match similar function on buildings).
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
85 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
86 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
87
125
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 122
diff changeset
88 def outside(self):
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 122
diff changeset
89 return self.abode is None
2e3a05b9594d Chickens in buildings\!
Simon Cross <hodgestar@gmail.com>
parents: 122
diff changeset
90
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
91 class Chicken(Animal):
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
92 """A chicken"""
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
93
146
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
94 EQUIPMENT_IMAGE_ATTRIBUTE = 'CHICKEN_IMAGE_FILE'
423050ec188b Equipment images.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
95
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
96 def __init__(self, pos):
53
f20dd3dcb118 foxes don't run backwards
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 47
diff changeset
97 image_left = imagecache.load_image('sprites/chkn.png')
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
98 image_right = imagecache.load_image('sprites/chkn.png',
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
99 ("right_facing",))
53
f20dd3dcb118 foxes don't run backwards
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 47
diff changeset
100 Animal.__init__(self, image_left, image_right, pos)
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
101 self.egg = False
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
102 self.egg_counter = 0
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
103
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
104 def move(self, gameboard):
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
105 """A free chicken will move away from other free chickens"""
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
106 pass
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
107
116
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
108 def lay(self):
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
109 """See if the chicken lays an egg"""
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
110 if not self.egg:
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
111 self.egg = True
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
112 self.egg_counter = 2
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
113
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
114 def hatch(self):
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
115 """See if we have an egg to hatch"""
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
116 if self.egg:
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
117 self.egg_counter -= 1
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
118 if self.egg_counter == 0:
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
119 # Egg hatches
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
120 self.egg = False
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
121 return Chicken(self.pos.to_tuple())
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
122 return None
d539ef5a3333 Add basic chicken->egg cycle
Neil Muller <drnlmuller@gmail.com>
parents: 115
diff changeset
123
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
124 def _find_killable_fox(self, weapon, gameboard):
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
125 """Choose a random fox within range of this weapon."""
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
126 killable_foxes = []
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
127 for fox in gameboard.foxes:
114
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
128 if not visible(self, fox):
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
129 continue
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
130 if weapon.in_range(gameboard, self, fox):
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
131 killable_foxes.append(fox)
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
132 if not killable_foxes:
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
133 return None
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
134 return random.choice(killable_foxes)
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
135
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
136 def attack(self, gameboard):
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
137 """An armed chicken will attack a fox within range."""
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
138 if not self.weapons():
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
139 # Not going to take on a fox bare-winged.
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
140 return
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
141 # Choose the first weapon equipped.
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
142 weapon = self.weapons()[0]
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
143 fox = self._find_killable_fox(weapon, gameboard)
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
144 if not fox:
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
145 return
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
146 if weapon.hit(gameboard, self, fox):
98
725b292ca07b Added sounds killing foxes and chickens, and nightfall
David Fraser <davidf@sjsoft.com>
parents: 92
diff changeset
147 sound.play_sound("kill-fox.ogg")
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
148 gameboard.kill_fox(fox)
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
149
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
150 class Egg(Animal):
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
151 """An egg"""
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
152
47
be2496df2368 Add egg image to egg sprite.
Simon Cross <hodgestar@gmail.com>
parents: 44
diff changeset
153 def __init__(self, pos):
be2496df2368 Add egg image to egg sprite.
Simon Cross <hodgestar@gmail.com>
parents: 44
diff changeset
154 image = imagecache.load_image('sprites/egg.png')
53
f20dd3dcb118 foxes don't run backwards
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 47
diff changeset
155 Animal.__init__(self, image, image, pos)
47
be2496df2368 Add egg image to egg sprite.
Simon Cross <hodgestar@gmail.com>
parents: 44
diff changeset
156
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
157 # Eggs don't move
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
158
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
159 class Fox(Animal):
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
160 """A fox"""
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
161
114
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
162 STEALTH = 20
130
96c5ef7613b5 NINJA FOXES!
Jeremy Thurgood <firxen@gmail.com>
parents: 125
diff changeset
163 IMAGE_FILE = 'sprites/fox.png'
114
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
164
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
165 costs = {
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
166 # weighting for movement calculation
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
167 'grassland' : 2,
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
168 'woodland' : 1, # Try to keep to the woods if possible
72
aa4bd93575d9 Fix some bound checking and tweak movement costs
Neil Muller <drnlmuller@gmail.com>
parents: 71
diff changeset
169 'broken fence' : 2,
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
170 'fence' : 10,
72
aa4bd93575d9 Fix some bound checking and tweak movement costs
Neil Muller <drnlmuller@gmail.com>
parents: 71
diff changeset
171 '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
172 '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
173 # 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
174 'hendominium' : 30,
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
175 }
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
176
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
177 def __init__(self, pos):
130
96c5ef7613b5 NINJA FOXES!
Jeremy Thurgood <firxen@gmail.com>
parents: 125
diff changeset
178 image_left = imagecache.load_image(self.IMAGE_FILE)
96c5ef7613b5 NINJA FOXES!
Jeremy Thurgood <firxen@gmail.com>
parents: 125
diff changeset
179 image_right = imagecache.load_image(self.IMAGE_FILE, ("right_facing",))
53
f20dd3dcb118 foxes don't run backwards
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 47
diff changeset
180 Animal.__init__(self, image_left, image_right, pos)
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
181 self.landmarks = [self.pos]
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
182 self.hunting = True
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
183 self.dig_pos = None
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
184 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
185 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
186 self.closest = None
149
2a1064fae608 More memory for the foxes, to ensure we avoid short loops
Neil Muller <drnlmuller@gmail.com>
parents: 146
diff changeset
187 self.last_steps = []
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
188
82
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
189 def _cost_tile(self, pos, gameboard):
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
190 if gameboard.in_bounds(pos):
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
191 this_tile = gameboard.tv.get(pos.to_tuple())
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
192 cost = self.costs.get(tiles.TILE_MAP[this_tile], 100)
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
193 else:
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
194 cost = 100 # Out of bounds is expensive
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
195 return cost
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
196
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
197 def _cost_path(self, path, gameboard):
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
198 """Calculate the cost of a path"""
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
199 total = 0
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
200 for pos in path:
82
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
201 total += self._cost_tile(pos, gameboard)
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
202 return total
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
203
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
204 def _gen_path(self, start_pos, final_pos):
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
205 """Construct a direct path from start_pos to final_pos,
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
206 excluding start_pos"""
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
207 if abs(start_pos.x - final_pos.x) < 2 and \
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
208 abs(start_pos.y - final_pos.y) < 2:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
209 # pgu gets this case wrong on occasion.
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
210 return [final_pos]
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
211 start = start_pos.to_tuple()
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
212 end = final_pos.to_tuple()
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
213 points = getline(start, end)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
214 points.remove(start) # exclude start_pos
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
215 if end not in points:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
216 # Rounding errors in getline cause this
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
217 points.append(end)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
218 return [Position(x[0], x[1]) for x in points]
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
219
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
220 def _find_best_path_step(self, final_pos, gameboard):
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
221 """Find the cheapest path to final_pos, and return the next step
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
222 along the path."""
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
223 # We calculate the cost of the direct path
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
224 direct_path = self._gen_path(self.pos, final_pos)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
225 min_cost = self._cost_path(direct_path, gameboard)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
226 min_path = direct_path
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
227 # is there a point nearby that gives us a cheaper direct path?
71
00cf9d7f22dc Expand comment
Neil Muller <drnlmuller@gmail.com>
parents: 70
diff changeset
228 # This is delibrately not finding the optimal path, as I don't
00cf9d7f22dc Expand comment
Neil Muller <drnlmuller@gmail.com>
parents: 70
diff changeset
229 # want the foxes to be too intelligent, although the implementation
00cf9d7f22dc Expand comment
Neil Muller <drnlmuller@gmail.com>
parents: 70
diff changeset
230 # isn't well optimised yet
82
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
231 poss = [Position(x, y) for x in range(self.pos.x - 3, self.pos.x + 4)
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
232 for y in range(self.pos.y - 3, self.pos.y + 4)
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
233 if (x, y) != (0,0)]
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
234 for start in poss:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
235 cand_path = self._gen_path(self.pos, start) + \
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
236 self._gen_path(start, final_pos)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
237 cost = self._cost_path(cand_path, gameboard)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
238 if cost < min_cost:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
239 min_cost = cost
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
240 min_path = cand_path
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
241 if not min_path:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
242 return final_pos
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
243 return min_path[0]
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
244
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
245 def _find_path_to_woodland(self, gameboard):
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
246 """Dive back to woodland through the landmarks"""
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
247 # find the closest point to our current location in walked path
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
248 if self.pos == self.landmarks[-1]:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
249 if len(self.landmarks) > 1:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
250 self.landmarks.pop() # Moving to the next landmark
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
251 else:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
252 # Safely back at the start
122
d2b19131d537 Don't continue the night if we're not doing anything anymore
Neil Muller <drnlmuller@gmail.com>
parents: 116
diff changeset
253 self.safe = True
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
254 return self.pos
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
255 return self._find_best_path_step(self.landmarks[-1], gameboard)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
256
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
257 def _find_path_to_chicken(self, gameboard):
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
258 """Find the path to the closest chicken"""
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
259 # Find the closest chicken
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
260 min_dist = 999
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
261 if self.closest not in gameboard.chickens:
490ede177f50 Tweak fox behaviour around henhouses. Add some memory to avoid the indecisive fox loop
Neil Muller <drnlmuller@gmail.com>
parents: 130
diff changeset
262 # Either no target, or someone ate it
490ede177f50 Tweak fox behaviour around henhouses. Add some memory to avoid the indecisive fox loop
Neil Muller <drnlmuller@gmail.com>
parents: 130
diff changeset
263 for chicken in gameboard.chickens:
490ede177f50 Tweak fox behaviour around henhouses. Add some memory to avoid the indecisive fox loop
Neil Muller <drnlmuller@gmail.com>
parents: 130
diff changeset
264 dist = chicken.pos.dist(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
265 if chicken.abode:
490ede177f50 Tweak fox behaviour around henhouses. Add some memory to avoid the indecisive fox loop
Neil Muller <drnlmuller@gmail.com>
parents: 130
diff changeset
266 dist += 10 # Prefer free-ranging chickens
490ede177f50 Tweak fox behaviour around henhouses. Add some memory to avoid the indecisive fox loop
Neil Muller <drnlmuller@gmail.com>
parents: 130
diff changeset
267 if dist < min_dist:
490ede177f50 Tweak fox behaviour around henhouses. Add some memory to avoid the indecisive fox loop
Neil Muller <drnlmuller@gmail.com>
parents: 130
diff changeset
268 min_dist = dist
490ede177f50 Tweak fox behaviour around henhouses. Add some memory to avoid the indecisive fox loop
Neil Muller <drnlmuller@gmail.com>
parents: 130
diff changeset
269 self.closest = chicken
490ede177f50 Tweak fox behaviour around henhouses. Add some memory to avoid the indecisive fox loop
Neil Muller <drnlmuller@gmail.com>
parents: 130
diff changeset
270 if not self.closest:
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
271 # No more chickens, so leave
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
272 self.hunting = False
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
273 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
274 if self.closest.pos == self.pos:
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
275 # Caught a chicken
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
276 self._catch_chicken(self.closest, gameboard)
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
277 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
278 return self._find_best_path_step(self.closest.pos, gameboard)
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
279
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
280 def _catch_chicken(self, chicken, gameboard):
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
281 """Catch a chicken"""
158
baf857805867 armour works now
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 149
diff changeset
282 chicken.lives -= 1
baf857805867 armour works now
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 149
diff changeset
283 if not chicken.lives > 0:
baf857805867 armour works now
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 149
diff changeset
284 sound.play_sound("kill-chicken.ogg")
baf857805867 armour works now
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 149
diff changeset
285 gameboard.remove_chicken(chicken)
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
286 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
287 self.hunting = False
149
2a1064fae608 More memory for the foxes, to ensure we avoid short loops
Neil Muller <drnlmuller@gmail.com>
parents: 146
diff changeset
288 self.last_steps = [] # Forget history here
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
289
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
290 def _update_pos(self, gameboard, new_pos):
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
291 """Update the position, making sure we don't step on other foxes"""
145
490ede177f50 Tweak fox behaviour around henhouses. Add some memory to avoid the indecisive fox loop
Neil Muller <drnlmuller@gmail.com>
parents: 130
diff changeset
292 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
293 # 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
294 return new_pos
2a1064fae608 More memory for the foxes, to ensure we avoid short loops
Neil Muller <drnlmuller@gmail.com>
parents: 146
diff changeset
295 final_pos = new_pos
2a1064fae608 More memory for the foxes, to ensure we avoid short loops
Neil Muller <drnlmuller@gmail.com>
parents: 146
diff changeset
296 blocked = final_pos in self.last_steps
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
297 moves = [Position(x, y) for x in range(self.pos.x-1, self.pos.x + 2)
82
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
298 for y in range(self.pos.y-1, self.pos.y + 2)
149
2a1064fae608 More memory for the foxes, to ensure we avoid short loops
Neil Muller <drnlmuller@gmail.com>
parents: 146
diff changeset
299 if Position(x,y) != self.pos and \
2a1064fae608 More memory for the foxes, to ensure we avoid short loops
Neil Muller <drnlmuller@gmail.com>
parents: 146
diff changeset
300 Position(x, y) not in self.last_steps]
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
301 for fox in gameboard.foxes:
149
2a1064fae608 More memory for the foxes, to ensure we avoid short loops
Neil Muller <drnlmuller@gmail.com>
parents: 146
diff changeset
302 if fox is not self and fox.pos == final_pos:
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
303 blocked = True
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
304 if fox.pos in moves:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
305 moves.remove(fox.pos)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
306 if blocked:
82
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
307 # find the cheapest point in moves to new_pos that's not blocked
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
308 final_pos = None
82
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
309 min_cost = 1000
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
310 for poss in moves:
82
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
311 cost = self._cost_tile(poss, gameboard)
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
312 if cost < min_cost:
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
313 min_cost = cost
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
314 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
315 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
316 # 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
317 return self.pos
72
aa4bd93575d9 Fix some bound checking and tweak movement costs
Neil Muller <drnlmuller@gmail.com>
parents: 71
diff changeset
318 if gameboard.in_bounds(final_pos):
aa4bd93575d9 Fix some bound checking and tweak movement costs
Neil Muller <drnlmuller@gmail.com>
parents: 71
diff changeset
319 this_tile = gameboard.tv.get(final_pos.to_tuple())
aa4bd93575d9 Fix some bound checking and tweak movement costs
Neil Muller <drnlmuller@gmail.com>
parents: 71
diff changeset
320 else:
aa4bd93575d9 Fix some bound checking and tweak movement costs
Neil Muller <drnlmuller@gmail.com>
parents: 71
diff changeset
321 this_tile = tiles.REVERSE_TILE_MAP['woodland']
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
322 if tiles.TILE_MAP[this_tile] == 'broken fence' and self.hunting:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
323 # We'll head back towards the holes we make/find
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
324 self.landmarks.append(final_pos)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
325 elif tiles.TILE_MAP[this_tile] == 'fence' and not 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
326 self._dig(final_pos)
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
327 return self.pos
149
2a1064fae608 More memory for the foxes, to ensure we avoid short loops
Neil Muller <drnlmuller@gmail.com>
parents: 146
diff changeset
328 self.last_steps.append(final_pos)
2a1064fae608 More memory for the foxes, to ensure we avoid short loops
Neil Muller <drnlmuller@gmail.com>
parents: 146
diff changeset
329 if len(self.last_steps) > 3:
2a1064fae608 More memory for the foxes, to ensure we avoid short loops
Neil Muller <drnlmuller@gmail.com>
parents: 146
diff changeset
330 self.last_steps.pop(0)
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
331 return final_pos
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
332
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
333 def _dig(self, dig_pos):
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
334 """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
335 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
336 self.dig_pos = dig_pos
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
337
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
338 def _make_hole(self, gameboard):
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
339 """Make a hole in the fence"""
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
340 gameboard.tv.set(self.dig_pos.to_tuple(),
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
341 tiles.REVERSE_TILE_MAP['broken fence'])
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
342 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
343
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
344 def move(self, gameboard):
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
345 """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
346 chicken"""
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
347 if self.dig_pos:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
348 if self.tick:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
349 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
350 # 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
351 # 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
352 # 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
353 # but we'll notice if the fence we're digging vanishes
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
354 this_tile = gameboard.tv.get(self.dig_pos.to_tuple())
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
355 if tiles.TILE_MAP[this_tile] == 'broken fence':
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
356 self.tick = 0
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
357 return
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
358 else:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
359 # We've dug through the fence, so make a hole
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
360 self._make_hole(gameboard)
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
361 return
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
362 if self.hunting:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
363 desired_pos = self._find_path_to_chicken(gameboard)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
364 else:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
365 desired_pos = self._find_path_to_woodland(gameboard)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
366 final_pos = self._update_pos(gameboard, desired_pos)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
367 self._fix_face(final_pos)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
368 self.pos = final_pos
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
369
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
370 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
371 """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
372
114
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
373 STEALTH = 60
130
96c5ef7613b5 NINJA FOXES!
Jeremy Thurgood <firxen@gmail.com>
parents: 125
diff changeset
374 IMAGE_FILE = 'sprites/ninja_fox.png'
114
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
375
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
376 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
377 """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
378
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
379 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
380 """Greedy foxes eat more chickens"""
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
381
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
382 def __init__(self, pos):
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
383 Fox.__init__(self, pos)
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
384 self.chickens_eaten = 0
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
385
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
386 def _catch_chicken(self, chicken, gameboard):
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
387 gameboard.remove_chicken(chicken)
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
388 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
389 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
390 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
391 self.hunting = False
149
2a1064fae608 More memory for the foxes, to ensure we avoid short loops
Neil Muller <drnlmuller@gmail.com>
parents: 146
diff changeset
392 self.last_steps = []
114
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
393
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
394 def visible(watcher, watchee):
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
395 roll = random.randint(1, 100)
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
396 distance = watcher.pos.dist(watchee.pos) - 1
4c2fbab20abe Foxes are stealthy now.
Jeremy Thurgood <firxen@gmail.com>
parents: 109
diff changeset
397 return roll > watchee.STEALTH + 10*distance