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()
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