/** * @file monsters/validation.cpp * * Implementation of functions for validation of monster data. */ #include "monsters/validation.hpp" #include #include "monster.h" #include "player.h" namespace devilution { namespace { bool IsEnemyValid(size_t enemyId, bool checkMonsterTable) { if (enemyId < MaxMonsters) return !checkMonsterTable || Monsters[enemyId].hitPoints > 0; const size_t playerId = enemyId - MaxMonsters; return playerId < Players.size() && Players[playerId].plractive; } } // namespace bool IsEnemyIdValid(size_t enemyId) { return IsEnemyValid(enemyId, false); } bool IsEnemyValid(size_t monsterId, size_t enemyId) { if (monsterId >= MaxMonsters) return false; if (monsterId == enemyId) return false; return IsEnemyValid(enemyId, true); } bool IsMonsterValid(const Monster &monster) { const CMonster &monsterType = LevelMonsterTypes[monster.levelType]; const _monster_id monsterId = monsterType.type; const size_t monsterIndex = static_cast(monsterId); if (monsterIndex >= MonstersData.size()) { return false; } if (monster.isUnique() && !IsUniqueMonsterValid(monster)) { return false; } return true; } bool IsUniqueMonsterValid(const Monster &monster) { assert(monster.isUnique()); const size_t uniqueMonsterIndex = static_cast(monster.uniqueType); if (uniqueMonsterIndex >= UniqueMonstersData.size()) { return false; } const CMonster &monsterType = LevelMonsterTypes[monster.levelType]; const _monster_id monsterId = monsterType.type; const UniqueMonsterData &uniqueMonsterData = UniqueMonstersData.at(uniqueMonsterIndex); if (monsterId != uniqueMonsterData.mtype) { return false; } return true; } } // namespace devilution