Exemple #1
0
    def _CanDefeatEnemies(self, room: Room) -> bool:
        enemy = room.GetEnemy()
        if enemy.HasNoEnemiesToKill():
            return True
        if enemy == Enemy.THE_BEAST and not self.inventory.HasBowSilverArrowsAndSword(
        ):
            return False
        if enemy.IsDigdogger(
        ) and not self.inventory.HasRecorderAndReusableWeapon():
            return False
        if enemy.IsGohma() and not self.inventory.HasBowAndArrows():
            return False
        if enemy.HasWizzrobes() and not self.inventory.HasSword():
            return False
        if enemy.HasSwordOrWandRequiredEnemies(
        ) and not self.inventory.HasSwordOrWand():
            return False
        if enemy.HasOnlyZeroHPEnemies(
        ) and not self.inventory.HasReusableWeaponOrBoomerang():
            return False
        if enemy == Enemy.HUNGRY_ENEMY and not self.inventory.Has(Item.BAIT):
            return False
        if (enemy.HasPolsVoice()
                and not (self.inventory.HasSwordOrWand()
                         or self.inventory.HasBowAndArrows())):
            return False
        if (self.settings.avoid_required_hard_combat
                and enemy.HasHardCombatEnemies()
                and not (self.inventory.HasRing()
                         and self.inventory.Has(Item.WHITE_SWORD))):
            return False

        # At this point, assume regular enemies
        return self.inventory.HasReusableWeapon()
Exemple #2
0
    def _CanMove(self, entry_direction: Direction, exit_direction: Direction,
                 level_num: LevelNum, room_num: RoomNum, room: Room) -> bool:
        if not room.GetRoomType().AllowsDoorToDoorMovement(
                entry_direction, exit_direction, self.inventory.Has(
                    Item.LADDER)):
            return False

        # Hungry enemy's room doesn't have a closed shutter door. So need a special check to similate
        # how it's not possible to move up in the room until the goriya has been properly fed.
        if (exit_direction == Direction.NORTH
                and room.GetEnemy() == Enemy.HUNGRY_ENEMY
                and not self.inventory.Has(Item.BAIT)):
            log.info("Hungry goriya is still hungry :(")
            return False

        wall_type = room.GetWallType(exit_direction)
        if (wall_type == WallType.SOLID_WALL
                or (wall_type == WallType.SHUTTER_DOOR
                    and not self._CanDefeatEnemies(room))):
            return False

        if wall_type in [WallType.LOCKED_DOOR_1, WallType.LOCKED_DOOR_2]:
            if self.inventory.HasKey():
                self.inventory.UseKey(level_num, room_num, exit_direction)
            else:
                return False
        return True