Mercurial > rinkhals
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 |