comparison gamelib/animal.py @ 475:d4f04d81fe54

Rinkhals eats eggs, along with associated changes.
author Jeremy Thurgood <firxen@gmail.com>
date Wed, 25 Nov 2009 17:08:17 +0000
parents fc648da2334c
children 3dae0fc14009
comparison
equal deleted inserted replaced
474:a50b53983389 475:d4f04d81fe54
220 for x in range(random.randint(1, 4)): 220 for x in range(random.randint(1, 4)):
221 self.eggs.append(Egg(self.pos)) 221 self.eggs.append(Egg(self.pos))
222 self.equip(equipment.NestEgg()) 222 self.equip(equipment.NestEgg())
223 gameboard.eggs += self.get_num_eggs() 223 gameboard.eggs += self.get_num_eggs()
224 224
225 def remove_eggs(self): 225 def remove_eggs(self, gameboard):
226 """Clean up the egg state""" 226 """Clean up the egg state"""
227 gameboard.remove_eggs(len(self.eggs))
227 self.eggs = [] 228 self.eggs = []
228 self.unequip_by_name("Nestegg") 229 self.unequip_by_name("Nestegg")
229 230
230 def remove_one_egg(self): 231 def remove_one_egg(self, gameboard):
231 """Clean up the egg state""" 232 """Clean up the egg state"""
232 self.eggs.pop() 233 self.eggs.pop()
234 gameboard.remove_eggs(1)
233 if not self.eggs: 235 if not self.eggs:
234 self.unequip_by_name("Nestegg") 236 self.unequip_by_name("Nestegg")
235 237
236 def get_num_eggs(self): 238 def get_num_eggs(self):
237 return len(self.eggs) 239 return len(self.eggs)
246 self.eggs.pop() 248 self.eggs.pop()
247 gameboard.eggs -= 1 249 gameboard.eggs -= 1
248 # Sell other eggs 250 # Sell other eggs
249 for egg in self.eggs[:]: 251 for egg in self.eggs[:]:
250 gameboard.sell_one_egg(self) 252 gameboard.sell_one_egg(self)
251 self.remove_eggs() # clean up stale images, etc. 253 self.remove_eggs(gameboard) # clean up stale images, etc.
252 gameboard.place_hatched_chicken(chick, self.abode.building) 254 gameboard.place_hatched_chicken(chick, self.abode.building)
253 255
254 def _find_killable_fox(self, weapon, gameboard): 256 def _find_killable_fox(self, weapon, gameboard):
255 """Choose a random fox within range of this weapon.""" 257 """Choose a random fox within range of this weapon."""
256 killable_foxes = [] 258 killable_foxes = []
428 # Safely out of sight 430 # Safely out of sight
429 self.safe = True 431 self.safe = True
430 return self.pos 432 return self.pos
431 return self._find_best_path_step(self.landmarks[-1], gameboard) 433 return self._find_best_path_step(self.landmarks[-1], gameboard)
432 434
435 def _select_target(self, gameboard):
436 min_dist = 999
437 self.closest = None
438 for chicken in gameboard.chickens:
439 dist = chicken.pos.dist(self.pos)
440 if chicken.abode:
441 dist += 5 # Prefer free-ranging chickens
442 if len(chicken.weapons()) > 0:
443 dist += 5 # Prefer unarmed chickens
444 if dist < min_dist:
445 min_dist = dist
446 self.closest = chicken
447
433 def _find_path_to_chicken(self, gameboard): 448 def _find_path_to_chicken(self, gameboard):
434 """Find the path to the closest chicken""" 449 """Find the path to the closest chicken"""
435 # Find the closest chicken 450 # Find the closest chicken
436 min_dist = 999
437 if self.closest not in gameboard.chickens: 451 if self.closest not in gameboard.chickens:
438 # Either no target, or someone ate it 452 # Either no target, or someone ate it
439 self.closest = None 453 self._select_target(gameboard)
440 for chicken in gameboard.chickens:
441 dist = chicken.pos.dist(self.pos)
442 if chicken.abode:
443 dist += 5 # Prefer free-ranging chickens
444 if len(chicken.weapons()) > 0:
445 dist += 5 # Prefer unarmed chickens
446 if dist < min_dist:
447 min_dist = dist
448 self.closest = chicken
449 if not self.closest: 454 if not self.closest:
450 # No more chickens, so leave 455 # No more chickens, so leave
451 self.hunting = False 456 self.hunting = False
452 return self.pos 457 return self.pos
453 if self.closest.pos == self.pos: 458 if self.closest.pos == self.pos:
519 this_tile = tiles.REVERSE_TILE_MAP['woodland'] 524 this_tile = tiles.REVERSE_TILE_MAP['woodland']
520 if tiles.TILE_MAP[this_tile] == 'broken fence' and self.hunting: 525 if tiles.TILE_MAP[this_tile] == 'broken fence' and self.hunting:
521 # We'll head back towards the holes we make/find 526 # We'll head back towards the holes we make/find
522 self.landmarks.append(final_pos) 527 self.landmarks.append(final_pos)
523 elif tiles.TILE_MAP[this_tile] == 'fence' and not self.dig_pos: 528 elif tiles.TILE_MAP[this_tile] == 'fence' and not self.dig_pos:
524 self._dig(gameboard, final_pos) 529 return self._dig(gameboard, final_pos)
525 return self.pos
526 self.last_steps.append(final_pos) 530 self.last_steps.append(final_pos)
527 if len(self.last_steps) > 3: 531 if len(self.last_steps) > 3:
528 self.last_steps.pop(0) 532 self.last_steps.pop(0)
529 return final_pos 533 return final_pos
530 534
531 def _dig(self, gameboard, dig_pos): 535 def _dig(self, gameboard, dig_pos):
532 """Setup dig parameters, to be overridden if needed""" 536 """Setup dig parameters, to be overridden if needed"""
533 self.tick = 5 537 self.tick = 5
534 self.dig_pos = dig_pos 538 self.dig_pos = dig_pos
539 return self.pos
535 540
536 def _make_hole(self, gameboard): 541 def _make_hole(self, gameboard):
537 """Make a hole in the fence""" 542 """Make a hole in the fence"""
538 fence = gameboard.get_building(self.dig_pos.to_tile_tuple()) 543 fence = gameboard.get_building(self.dig_pos.to_tile_tuple())
539 # Another fox could have made the same hole this turn 544 # Another fox could have made the same hole this turn
553 # We're still digging through the fence 558 # We're still digging through the fence
554 # Check the another fox hasn't dug a hole for us 559 # Check the another fox hasn't dug a hole for us
555 # We're too busy digging to notice if a hole appears nearby, 560 # We're too busy digging to notice if a hole appears nearby,
556 # but we'll notice if the fence we're digging vanishes 561 # but we'll notice if the fence we're digging vanishes
557 this_tile = gameboard.tv.get(self.dig_pos.to_tile_tuple()) 562 this_tile = gameboard.tv.get(self.dig_pos.to_tile_tuple())
558 if tiles.TILE_MAP[this_tile] == 'broken fence': 563 if tiles.TILE_MAP[this_tile] != 'fence':
559 self.tick = 0 564 self.tick = 0
560 else: 565 else:
561 # We've dug through the fence, so make a hole 566 # We've dug through the fence, so make a hole
562 self._make_hole(gameboard) 567 self._make_hole(gameboard)
563 return 568 return
614 """Setup dig parameters, to be overridden if needed""" 619 """Setup dig parameters, to be overridden if needed"""
615 self.tick = 0 # Costs us nothing to go through a fence. 620 self.tick = 0 # Costs us nothing to go through a fence.
616 self.dig_pos = dig_pos 621 self.dig_pos = dig_pos
617 self.DIG_ANIMATION(gameboard.tv, dig_pos.to_tile_tuple()) 622 self.DIG_ANIMATION(gameboard.tv, dig_pos.to_tile_tuple())
618 self._make_hole(gameboard) 623 self._make_hole(gameboard)
624 return self.pos
619 625
620 class GreedyFox(Fox): 626 class GreedyFox(Fox):
621 """Greedy foxes eat more chickens""" 627 """Greedy foxes eat more chickens"""
622 CONFIG_NAME = 'greedy fox' 628 CONFIG_NAME = 'greedy fox'
623 629
637 """The Rinkhals has eclectic tastes""" 643 """The Rinkhals has eclectic tastes"""
638 STEALTH = 80 644 STEALTH = 80
639 IMAGE_FILE = 'sprites/rinkhals.png' 645 IMAGE_FILE = 'sprites/rinkhals.png'
640 CONFIG_NAME = 'rinkhals' 646 CONFIG_NAME = 'rinkhals'
641 647
648 def _select_target(self, gameboard):
649 """The Rinkhals eats eggs"""
650 min_dist = 999
651 self.closest = None
652 for chicken in gameboard.chickens:
653 dist = chicken.pos.dist(self.pos)
654 if not chicken.eggs:
655 dist += 100 # The closest eggs have to be *far* away to be safe
656 if dist < min_dist:
657 min_dist = dist
658 self.closest = chicken
659
642 def _catch_chicken(self, chicken, gameboard): 660 def _catch_chicken(self, chicken, gameboard):
643 """The Rinkhals hunts for sport, catch and release style""" 661 """The Rinkhals eats eggs, but does not harm chickens"""
662 chicken.remove_eggs(gameboard)
644 self.closest = None 663 self.closest = None
645 self.hunting = False 664 self.hunting = False
646 self.last_steps = [] 665 self.last_steps = []
647 666
648 def _make_hole(self, gameboard): 667 def _dig(self, gameboard, dig_pos):
649 """The Rinkhals eats fences""" 668 """Snakes ignore fences"""
650 fence = gameboard.get_building(self.dig_pos.to_tile_tuple()) 669 return dig_pos
651 if fence:
652 fence.remove(gameboard.tv)
653 gameboard.remove_building(fence)
654 self.dig_pos = None
655 670
656 def damage(self, gameboard): 671 def damage(self, gameboard):
657 """The Rinkhals is invincible!""" 672 """The Rinkhals is invincible!"""
658 return True 673 return True
659 674