From 33ac2cca8e83eb686391349520e78095fec0b4fa Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy Date: Mon, 11 Jul 2022 23:45:58 +0100 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Make=20Monster=20counters?= =?UTF-8?q?=20`size=5Ft`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Source/controls/plrctrls.cpp | 2 +- Source/dead.cpp | 6 +- Source/debug.cpp | 10 +- Source/diablo.cpp | 4 +- Source/effects.cpp | 6 +- Source/effects.h | 2 +- Source/effects_stubs.cpp | 2 +- Source/engine/render/scrollrt.cpp | 2 +- Source/levels/themes.cpp | 6 +- Source/loadsave.cpp | 12 +-- Source/monster.cpp | 148 +++++++++++++++--------------- Source/monster.h | 16 ++-- Source/msg.cpp | 8 +- Source/multi.cpp | 2 +- Source/player.cpp | 7 +- Source/sync.cpp | 16 ++-- 16 files changed, 124 insertions(+), 125 deletions(-) diff --git a/Source/controls/plrctrls.cpp b/Source/controls/plrctrls.cpp index 7fe487d5c..73777131c 100644 --- a/Source/controls/plrctrls.cpp +++ b/Source/controls/plrctrls.cpp @@ -250,7 +250,7 @@ void FindRangedTarget() int distance = 0; bool canTalk = false; - for (int i = 0; i < ActiveMonsterCount; i++) { + for (size_t i = 0; i < ActiveMonsterCount; i++) { int mi = ActiveMonsters[i]; const auto &monster = Monsters[mi]; diff --git a/Source/dead.cpp b/Source/dead.cpp index 5beeb93b8..90694fdd7 100644 --- a/Source/dead.cpp +++ b/Source/dead.cpp @@ -31,7 +31,7 @@ void InitCorpses() int8_t nd = 0; - for (int i = 0; i < LevelMonsterTypeCount; i++) { + for (size_t i = 0; i < LevelMonsterTypeCount; i++) { if (mtypes[LevelMonsterTypes[i].type] != 0) continue; @@ -55,7 +55,7 @@ void InitCorpses() stonendx = nd; - for (int i = 0; i < ActiveMonsterCount; i++) { + for (size_t i = 0; i < ActiveMonsterCount; i++) { auto &monster = Monsters[ActiveMonsters[i]]; if (monster.uniqType != 0) { InitDeadAnimationFromMonster(Corpses[nd], monster.type()); @@ -76,7 +76,7 @@ void AddCorpse(Point tilePosition, int8_t dv, Direction ddir) void SyncUniqDead() { - for (int i = 0; i < ActiveMonsterCount; i++) { + for (size_t i = 0; i < ActiveMonsterCount; i++) { auto &monster = Monsters[ActiveMonsters[i]]; if (monster.uniqType == 0) continue; diff --git a/Source/debug.cpp b/Source/debug.cpp index abb6fd3dd..fd4ce797b 100644 --- a/Source/debug.cpp +++ b/Source/debug.cpp @@ -105,7 +105,7 @@ void PrintDebugMonster(int m) bool bActive = false; - for (int i = 0; i < ActiveMonsterCount; i++) { + for (size_t i = 0; i < ActiveMonsterCount; i++) { if (ActiveMonsters[i] == m) bActive = true; } @@ -693,10 +693,10 @@ std::string DebugCmdSpawnUniqueMonster(const string_view parameter) if (mtype == -1) return "Monster not found!"; - int id = MaxLvlMTypes - 1; + size_t id = MaxLvlMTypes - 1; bool found = false; - for (int i = 0; i < LevelMonsterTypeCount; i++) { + for (size_t i = 0; i < LevelMonsterTypeCount; i++) { if (LevelMonsterTypes[i].type == mtype) { id = i; found = true; @@ -779,10 +779,10 @@ std::string DebugCmdSpawnMonster(const string_view parameter) if (mtype == -1) return "Monster not found!"; - int id = MaxLvlMTypes - 1; + size_t id = MaxLvlMTypes - 1; bool found = false; - for (int i = 0; i < LevelMonsterTypeCount; i++) { + for (size_t i = 0; i < LevelMonsterTypeCount; i++) { if (LevelMonsterTypes[i].type == mtype) { id = i; found = true; diff --git a/Source/diablo.cpp b/Source/diablo.cpp index cecdf4d53..2700b7b96 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -1215,7 +1215,7 @@ void UnstuckChargers() return; } } - for (int i = 0; i < ActiveMonsterCount; i++) { + for (size_t i = 0; i < ActiveMonsterCount; i++) { auto &monster = Monsters[ActiveMonsters[i]]; if (monster.mode == MonsterMode::Charge) monster.mode = MonsterMode::Stand; @@ -1224,7 +1224,7 @@ void UnstuckChargers() void UpdateMonsterLights() { - for (int i = 0; i < ActiveMonsterCount; i++) { + for (size_t i = 0; i < ActiveMonsterCount; i++) { auto &monster = Monsters[ActiveMonsters[i]]; if ((monster.flags & MFLAG_BERSERK) != 0) { diff --git a/Source/effects.cpp b/Source/effects.cpp index fba51f28f..6ebf70a68 100644 --- a/Source/effects.cpp +++ b/Source/effects.cpp @@ -1211,7 +1211,7 @@ void stream_stop() } } -void InitMonsterSND(int monst) +void InitMonsterSND(size_t monst) { if (!gbSndInited) { return; @@ -1234,9 +1234,9 @@ void InitMonsterSND(int monst) void FreeMonsterSnd() { #ifdef _DEBUG - for (int i = 0; i < MaxLvlMTypes; i++) { + for (size_t i = 0; i < MaxLvlMTypes; i++) { #else - for (int i = 0; i < LevelMonsterTypeCount; i++) { + for (size_t i = 0; i < LevelMonsterTypeCount; i++) { #endif for (auto &variants : LevelMonsterTypes[i].sounds) { for (auto &snd : variants) { diff --git a/Source/effects.h b/Source/effects.h index 6ed7a8fd5..a5074cbac 100644 --- a/Source/effects.h +++ b/Source/effects.h @@ -1177,7 +1177,7 @@ extern _sfx_id sfxdnum; bool effect_is_playing(int nSFX); void stream_stop(); -void InitMonsterSND(int monst); +void InitMonsterSND(size_t monst); void FreeMonsterSnd(); bool CalculateSoundPosition(Point soundPosition, int *plVolume, int *plPan); void PlaySFX(_sfx_id psfx); diff --git a/Source/effects_stubs.cpp b/Source/effects_stubs.cpp index 14d8ebbab..08fc48f62 100644 --- a/Source/effects_stubs.cpp +++ b/Source/effects_stubs.cpp @@ -12,7 +12,7 @@ _sfx_id sfxdnum; // clang-format off bool effect_is_playing(int nSFX) { return false; } void stream_stop() { } -void InitMonsterSND(int monst) { } +void InitMonsterSND(size_t monst) { } void FreeMonsterSnd() { } bool CalculateSoundPosition(Point soundPosition, int *plVolume, int *plPan) { return false; } void PlaySFX(_sfx_id psfx) diff --git a/Source/engine/render/scrollrt.cpp b/Source/engine/render/scrollrt.cpp index 947edac6f..ede7074aa 100644 --- a/Source/engine/render/scrollrt.cpp +++ b/Source/engine/render/scrollrt.cpp @@ -766,7 +766,7 @@ void DrawMonsterHelper(const Surface &out, Point tilePosition, Point targetBuffe if (!IsTileLit(tilePosition) && !MyPlayer->_pInfraFlag) return; - if (mi < 0 || mi >= MaxMonsters) { + if (static_cast(mi) >= MaxMonsters) { Log("Draw Monster: tried to draw illegal monster {}", mi); return; } diff --git a/Source/levels/themes.cpp b/Source/levels/themes.cpp index fed4746f2..09298973a 100644 --- a/Source/levels/themes.cpp +++ b/Source/levels/themes.cpp @@ -148,7 +148,7 @@ bool TFit_SkelRoom(int t) return false; } - for (int i = 0; i < LevelMonsterTypeCount; i++) { + for (size_t i = 0; i < LevelMonsterTypeCount; i++) { if (IsSkel(LevelMonsterTypes[i].type)) { themeVar1 = i; return TFit_Obj5(t); @@ -160,7 +160,7 @@ bool TFit_SkelRoom(int t) bool TFit_GoatShrine(int t) { - for (int i = 0; i < LevelMonsterTypeCount; i++) { + for (size_t i = 0; i < LevelMonsterTypeCount; i++) { if (IsGoat(LevelMonsterTypes[i].type)) { themeVar1 = i; return TFit_Obj5(t); @@ -480,7 +480,7 @@ void PlaceThemeMonsts(int t, int f) int scattertypes[138]; int numscattypes = 0; - for (int i = 0; i < LevelMonsterTypeCount; i++) { + for (size_t i = 0; i < LevelMonsterTypeCount; i++) { if ((LevelMonsterTypes[i].placeFlags & PLACE_SCATTER) != 0) { scattertypes[numscattypes] = i; numscattypes++; diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index 60249fbb9..fdd92073b 100644 --- a/Source/loadsave.cpp +++ b/Source/loadsave.cpp @@ -685,7 +685,7 @@ void SyncPackSize(Monster &leader) leader.packSize = 0; - for (int i = 0; i < ActiveMonsterCount; i++) { + for (size_t i = 0; i < ActiveMonsterCount; i++) { auto &minion = Monsters[ActiveMonsters[i]]; if (minion.leaderRelation == LeaderRelation::Leashed && &Monsters[minion.leader] == &leader) leader.packSize++; @@ -2090,9 +2090,9 @@ void LoadGame(bool firstflag) if (leveltype != DTYPE_TOWN) { for (int &monsterId : ActiveMonsters) monsterId = file.NextBE(); - for (int i = 0; i < ActiveMonsterCount; i++) + for (size_t i = 0; i < ActiveMonsterCount; i++) LoadMonster(&file, Monsters[ActiveMonsters[i]]); - for (int i = 0; i < ActiveMonsterCount; i++) + for (size_t i = 0; i < ActiveMonsterCount; i++) SyncPackSize(Monsters[ActiveMonsters[i]]); // Skip ActiveMissiles file.Skip(MaxMissilesForSaveGame); @@ -2346,7 +2346,7 @@ void SaveGameData(MpqWriter &saveWriter) if (leveltype != DTYPE_TOWN) { for (int monsterId : ActiveMonsters) file.WriteBE(monsterId); - for (int i = 0; i < ActiveMonsterCount; i++) + for (size_t i = 0; i < ActiveMonsterCount; i++) SaveMonster(&file, Monsters[ActiveMonsters[i]]); // Write ActiveMissiles for (uint8_t activeMissile = 0; activeMissile < MaxMissilesForSaveGame; activeMissile++) @@ -2482,7 +2482,7 @@ void SaveLevel(MpqWriter &saveWriter) if (leveltype != DTYPE_TOWN) { for (int monsterId : ActiveMonsters) file.WriteBE(monsterId); - for (int i = 0; i < ActiveMonsterCount; i++) + for (size_t i = 0; i < ActiveMonsterCount; i++) SaveMonster(&file, Monsters[ActiveMonsters[i]]); for (int objectId : ActiveObjects) file.WriteLE(objectId); @@ -2555,7 +2555,7 @@ void LoadLevel() if (leveltype != DTYPE_TOWN) { for (int &monsterId : ActiveMonsters) monsterId = file.NextBE(); - for (int i = 0; i < ActiveMonsterCount; i++) + for (size_t i = 0; i < ActiveMonsterCount; i++) LoadMonster(&file, Monsters[ActiveMonsters[i]]); for (int &objectId : ActiveObjects) objectId = file.NextLE(); diff --git a/Source/monster.cpp b/Source/monster.cpp index ae4293ec2..3f3c2048d 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -48,10 +48,10 @@ namespace devilution { CMonster LevelMonsterTypes[MaxLvlMTypes]; -int LevelMonsterTypeCount; +size_t LevelMonsterTypeCount; Monster Monsters[MaxMonsters]; int ActiveMonsters[MaxMonsters]; -int ActiveMonsterCount; +size_t ActiveMonsterCount; // BUGFIX: replace MonsterKillCounts[MaxMonsters] with MonsterKillCounts[NUM_MTYPES]. /** Tracks the total number of monsters killed per monster_id. */ int MonsterKillCounts[MaxMonsters]; @@ -66,7 +66,7 @@ constexpr int NightmareAcBonus = 50; constexpr int HellAcBonus = 80; /** Tracks which missile files are already loaded */ -int totalmonsters; +size_t totalmonsters; int monstimgtot; int uniquetrans; @@ -302,7 +302,7 @@ bool CanPlaceMonster(Point position) void PlaceMonster(int i, int mtype, Point position) { if (LevelMonsterTypes[mtype].type == MT_NAKRUL) { - for (int j = 0; j < ActiveMonsterCount; j++) { + for (size_t j = 0; j < ActiveMonsterCount; j++) { if (Monsters[j].levelType == mtype) { return; } @@ -317,9 +317,9 @@ void PlaceMonster(int i, int mtype, Point position) InitMonster(Monsters[i], rd, mtype, position); } -void PlaceGroup(int mtype, int num, UniqueMonsterPack uniqueMonsterPack, int leaderId) +void PlaceGroup(int mtype, unsigned num, UniqueMonsterPack uniqueMonsterPack, int leaderId) { - int placed = 0; + unsigned placed = 0; auto &leader = Monsters[leaderId]; @@ -400,7 +400,7 @@ void PlaceUniqueMonst(int uniqindex, int miniontype, int bosspacksize) auto &monster = Monsters[ActiveMonsterCount]; const auto &uniqueMonsterData = UniqueMonstersData[uniqindex]; - int uniqtype; + size_t uniqtype; for (uniqtype = 0; uniqtype < LevelMonsterTypeCount; uniqtype++) { if (LevelMonsterTypes[uniqtype].type == uniqueMonsterData.mtype) { break; @@ -480,24 +480,24 @@ void PlaceUniqueMonst(int uniqindex, int miniontype, int bosspacksize) return; } position = { UberRow - 2, UberCol }; - UberDiabloMonsterIndex = ActiveMonsterCount; + UberDiabloMonsterIndex = static_cast(ActiveMonsterCount); } PlaceMonster(ActiveMonsterCount, uniqtype, position); PrepareUniqueMonst(monster, uniqindex, miniontype, bosspacksize, uniqueMonsterData); } -int GetMonsterTypeIndex(_monster_id type) +size_t GetMonsterTypeIndex(_monster_id type) { - for (int i = 0; i < LevelMonsterTypeCount; i++) { + for (size_t i = 0; i < LevelMonsterTypeCount; i++) { if (LevelMonsterTypes[i].type == type) return i; } return LevelMonsterTypeCount; } -int AddMonsterType(_monster_id type, placeflag placeflag) +size_t AddMonsterType(_monster_id type, placeflag placeflag) { - int typeIndex = GetMonsterTypeIndex(type); + const size_t typeIndex = GetMonsterTypeIndex(type); if (typeIndex == LevelMonsterTypeCount) { LevelMonsterTypeCount++; @@ -548,7 +548,7 @@ void PlaceUniqueMonsters() if (UniqueMonstersData[u].mlevel != currlevel) continue; - int mt = GetMonsterTypeIndex(UniqueMonstersData[u].mtype); + const size_t mt = GetMonsterTypeIndex(UniqueMonstersData[u].mtype); if (mt == LevelMonsterTypeCount) continue; @@ -575,7 +575,7 @@ void PlaceQuestMonsters() } if (currlevel == Quests[Q_SKELKING]._qlevel && gbIsMultiplayer) { - for (int i = 0; i < LevelMonsterTypeCount; i++) { + for (size_t i = 0; i < LevelMonsterTypeCount; i++) { if (IsSkel(LevelMonsterTypes[i].type)) { PlaceUniqueMonst(UMT_SKELKING, i, 30); break; @@ -623,17 +623,17 @@ void PlaceQuestMonsters() if (currlevel == 24) { UberDiabloMonsterIndex = -1; - int i1; + size_t i1; for (i1 = 0; i1 < LevelMonsterTypeCount; i1++) { if (LevelMonsterTypes[i1].type == UniqueMonstersData[UMT_NAKRUL].mtype) break; } if (i1 < LevelMonsterTypeCount) { - for (int i2 = 0; i2 < ActiveMonsterCount; i2++) { + for (size_t i2 = 0; i2 < ActiveMonsterCount; i2++) { auto &monster = Monsters[i2]; if (monster.uniqType != 0 || monster.levelType == i1) { - UberDiabloMonsterIndex = i2; + UberDiabloMonsterIndex = static_cast(i2); break; } } @@ -731,7 +731,7 @@ void UpdateEnemy(Monster &monster) } } } - for (int j = 0; j < ActiveMonsterCount; j++) { + for (size_t j = 0; j < ActiveMonsterCount; j++) { int mi = ActiveMonsters[j]; auto &otherMonster = Monsters[mi]; if (&otherMonster == &monster) @@ -942,7 +942,7 @@ void DiabloDeath(Monster &diablo, bool sendmsg) NetSendCmdQuest(true, quest); sgbSaveSoundOn = gbSoundOn; gbProcessPlayers = false; - for (int j = 0; j < ActiveMonsterCount; j++) { + for (size_t j = 0; j < ActiveMonsterCount; j++) { int k = ActiveMonsters[j]; auto &monster = Monsters[k]; if (monster.type().type == MT_DIABLO || diablo.activeForTicks == 0) @@ -1120,9 +1120,9 @@ void MonsterDeath(Monster &monster, int pnum, Direction md, bool sendmsg) void StartDeathFromMonster(int i, int mid) { - assert(i >= 0 && i < MaxMonsters); + assert(static_cast(i) < MaxMonsters); Monster &killer = Monsters[i]; - assert(mid >= 0 && mid < MaxMonsters); + assert(static_cast(mid) < MaxMonsters); Monster &monster = Monsters[mid]; delta_kill_monster(mid, monster.position.tile, *MyPlayer); @@ -1249,7 +1249,7 @@ bool MonsterWalk(Monster &monster, MonsterMode variant) void MonsterAttackMonster(int i, int mid, int hper, int mind, int maxd) { - assert(mid >= 0 && mid < MaxMonsters); + assert(static_cast(mid) < MaxMonsters); auto &monster = Monsters[mid]; if (!monster.isPossibleToHit()) @@ -1298,7 +1298,7 @@ void CheckReflect(int monsterId, int pnum, int dam) void MonsterAttackPlayer(int monsterId, int pnum, int hit, int minDam, int maxDam) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if ((monster.flags & MFLAG_TARGETS_MONSTER) != 0) { @@ -1408,7 +1408,7 @@ void MonsterAttackPlayer(int monsterId, int pnum, int hit, int minDam, int maxDa bool MonsterAttack(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.animInfo.currentFrame == monster.data().mAFNum - 1) { @@ -1467,7 +1467,7 @@ bool MonsterRangedAttack(Monster &monster) bool MonsterRangedSpecialAttack(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.animInfo.currentFrame == monster.data().mAFNum2 - 1 && monster.animInfo.tickCounterOfCurrentFrame == 0 && (monster.ai != AI_MEGA || monster.var2 == 0)) { @@ -1503,7 +1503,7 @@ bool MonsterRangedSpecialAttack(int monsterId) bool MonsterSpecialAttack(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.animInfo.currentFrame == monster.data().mAFNum2 - 1) @@ -1648,7 +1648,7 @@ bool MonsterGotHit(Monster &monster) void MonsterDeath(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; monster.var1++; @@ -1722,7 +1722,7 @@ void MonsterPetrified(Monster &monster) Monster *AddSkeleton(Point position, Direction dir, bool inMap) { int j = 0; - for (int i = 0; i < LevelMonsterTypeCount; i++) { + for (size_t i = 0; i < LevelMonsterTypeCount; i++) { if (IsSkel(LevelMonsterTypes[i].type)) j++; } @@ -1732,7 +1732,7 @@ Monster *AddSkeleton(Point position, Direction dir, bool inMap) } int skeltypes = GenerateRnd(j); - int m = 0; + size_t m = 0; for (int i = 0; m < LevelMonsterTypeCount && i <= skeltypes; m++) { if (IsSkel(LevelMonsterTypes[m].type)) i++; @@ -1906,7 +1906,7 @@ bool AiPlanWalk(int monsterId) /** Maps from walking path step to facing direction. */ const Direction plr2monst[9] = { Direction::South, Direction::NorthEast, Direction::NorthWest, Direction::SouthEast, Direction::SouthWest, Direction::North, Direction::East, Direction::South, Direction::West }; - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (FindPath([&monster](Point position) { return IsTileAccessible(monster, position); }, monster.position.tile, monster.enemyPosition, path) == 0) { @@ -1951,7 +1951,7 @@ bool RoundWalk(int monsterId, Direction direction, int *dir) bool AiPlanPath(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.type().type != MT_GOLEM) { @@ -1987,7 +1987,7 @@ bool AiPlanPath(int monsterId) void AiAvoidance(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) { @@ -2077,7 +2077,7 @@ missile_id GetMissileType(_mai_id ai) void AiRanged(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.mode != MonsterMode::Stand) { @@ -2123,7 +2123,7 @@ void AiRanged(int monsterId) void AiRangedAvoidance(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) { @@ -2184,7 +2184,7 @@ void AiRangedAvoidance(int monsterId) void ZombieAi(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.mode != MonsterMode::Stand) { @@ -2217,7 +2217,7 @@ void ZombieAi(int monsterId) void OverlordAi(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) { @@ -2247,7 +2247,7 @@ void OverlordAi(int monsterId) void SkeletonAi(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) { @@ -2277,7 +2277,7 @@ void SkeletonAi(int monsterId) void SkeletonBowAi(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) { @@ -2337,7 +2337,7 @@ std::optional ScavengerFindCorpse(const Monster &scavenger) void ScavengerAi(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.mode != MonsterMode::Stand) @@ -2398,7 +2398,7 @@ void ScavengerAi(int monsterId) void RhinoAi(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) { @@ -2463,7 +2463,7 @@ void RhinoAi(int monsterId) void FallenAi(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.goal == MonsterGoal::Attack) { @@ -2530,7 +2530,7 @@ void FallenAi(int monsterId) void LeoricAi(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) { @@ -2592,7 +2592,7 @@ void LeoricAi(int monsterId) void BatAi(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) { @@ -2646,7 +2646,7 @@ void BatAi(int monsterId) void GargoyleAi(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; int dx = monster.position.tile.x - monster.position.last.x; @@ -2682,7 +2682,7 @@ void GargoyleAi(int monsterId) void ButcherAi(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) { @@ -2707,7 +2707,7 @@ void ButcherAi(int monsterId) void SneakAi(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.mode != MonsterMode::Stand) { @@ -2765,7 +2765,7 @@ void SneakAi(int monsterId) void GharbadAi(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.mode != MonsterMode::Stand) { @@ -2812,7 +2812,7 @@ void GharbadAi(int monsterId) void SnotSpilAi(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.mode != MonsterMode::Stand) { @@ -2853,7 +2853,7 @@ void SnotSpilAi(int monsterId) void SnakeAi(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; char pattern[6] = { 1, 1, 0, -1, -1, 0 }; @@ -2913,7 +2913,7 @@ void SnakeAi(int monsterId) void CounselorAi(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) { @@ -2980,7 +2980,7 @@ void CounselorAi(int monsterId) void ZharAi(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.mode != MonsterMode::Stand) { @@ -3011,7 +3011,7 @@ void ZharAi(int monsterId) void MegaAi(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; int mx = monster.position.tile.x - monster.enemyPosition.x; @@ -3080,7 +3080,7 @@ void MegaAi(int monsterId) void LazarusAi(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.mode != MonsterMode::Stand) { @@ -3127,7 +3127,7 @@ void LazarusAi(int monsterId) void LazarusMinionAi(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.mode != MonsterMode::Stand) @@ -3154,7 +3154,7 @@ void LazarusMinionAi(int monsterId) void LachdananAi(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.mode != MonsterMode::Stand) { @@ -3183,7 +3183,7 @@ void LachdananAi(int monsterId) void WarlordAi(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.mode != MonsterMode::Stand) { @@ -3209,7 +3209,7 @@ void WarlordAi(int monsterId) void HorkDemonAi(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) { @@ -3546,7 +3546,7 @@ void InitLevelMonsters() ActiveMonsterCount = 0; totalmonsters = MaxMonsters; - for (int i = 0; i < MaxMonsters; i++) { + for (size_t i = 0; i < MaxMonsters; i++) { ActiveMonsters[i] = i; } @@ -3638,7 +3638,7 @@ void GetLevelMTypes() } } -void InitMonsterGFX(int monsterTypeIndex) +void InitMonsterGFX(size_t monsterTypeIndex) { CMonster &monster = LevelMonsterTypes[monsterTypeIndex]; const _monster_id mtype = monster.type; @@ -3731,7 +3731,7 @@ void InitMonsterGFX(int monsterTypeIndex) void WeakenNaKrul() { - if (currlevel != 24 || UberDiabloMonsterIndex < 0 || UberDiabloMonsterIndex >= ActiveMonsterCount) + if (currlevel != 24 || static_cast(UberDiabloMonsterIndex) >= ActiveMonsterCount) return; auto &monster = Monsters[UberDiabloMonsterIndex]; @@ -3786,7 +3786,7 @@ void InitMonsters() totalmonsters = ActiveMonsterCount + numplacemonsters; int numscattypes = 0; int scattertypes[NUM_MTYPES]; - for (int i = 0; i < LevelMonsterTypeCount; i++) { + for (size_t i = 0; i < LevelMonsterTypeCount; i++) { if ((LevelMonsterTypes[i].placeFlags & PLACE_SCATTER) != 0) { scattertypes[numscattypes] = i; numscattypes++; @@ -3842,14 +3842,14 @@ void SetMapMonsters(const uint16_t *dunData, Point startPosition) for (int i = 0; i < width; i++) { auto monsterId = static_cast(SDL_SwapLE16(monsterLayer[j * width + i])); if (monsterId != 0) { - int mtype = AddMonsterType(MonstConvTbl[monsterId - 1], PLACE_SPECIAL); + const size_t mtype = AddMonsterType(MonstConvTbl[monsterId - 1], PLACE_SPECIAL); PlaceMonster(ActiveMonsterCount++, mtype, startPosition + Displacement { i, j }); } } } } -Monster *AddMonster(Point position, Direction dir, int mtype, bool inMap) +Monster *AddMonster(Point position, Direction dir, size_t mtype, bool inMap) { if (ActiveMonsterCount < MaxMonsters) { Monster &monster = Monsters[ActiveMonsters[ActiveMonsterCount++]]; @@ -3872,7 +3872,7 @@ void AddDoppelganger(Monster &monster) target = position; } if (target != Point { 0, 0 }) { - for (int j = 0; j < MaxLvlMTypes; j++) { + for (size_t j = 0; j < MaxLvlMTypes; j++) { if (LevelMonsterTypes[j].type == monster.type().type) { AddMonster(target, monster.direction, j, true); break; @@ -3967,7 +3967,7 @@ void StartMonsterDeath(Monster &monster, int pnum, bool sendmsg) void M_StartKill(int monsterId, int pnum) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); Monster &monster = Monsters[monsterId]; if (pnum == MyPlayerId) { @@ -3984,7 +3984,7 @@ void M_StartKill(int monsterId, int pnum) void M_SyncStartKill(int monsterId, Point position, int pnum) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; if (monster.hitPoints == 0 || monster.mode == MonsterMode::Death) { @@ -4002,10 +4002,10 @@ void M_SyncStartKill(int monsterId, Point position, int pnum) void M_UpdateLeader(int monsterId) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; - for (int j = 0; j < ActiveMonsterCount; j++) { + for (size_t j = 0; j < ActiveMonsterCount; j++) { auto &minion = Monsters[ActiveMonsters[j]]; if (minion.leaderRelation == LeaderRelation::Leashed && minion.leader == monsterId) minion.leaderRelation = LeaderRelation::None; @@ -4195,7 +4195,7 @@ void DeleteMonsterList() golem.isInvalid = false; } - for (int i = MAX_PLRS; i < ActiveMonsterCount;) { + for (size_t i = MAX_PLRS; i < ActiveMonsterCount;) { if (Monsters[ActiveMonsters[i]].isInvalid) { if (pcursmonst == ActiveMonsters[i]) // Unselect monster if player highlighted it pcursmonst = -1; @@ -4210,8 +4210,8 @@ void ProcessMonsters() { DeleteMonsterList(); - assert(ActiveMonsterCount >= 0 && ActiveMonsterCount <= MaxMonsters); - for (int i = 0; i < ActiveMonsterCount; i++) { + assert(ActiveMonsterCount <= MaxMonsters); + for (size_t i = 0; i < ActiveMonsterCount; i++) { int monsterId = ActiveMonsters[i]; auto &monster = Monsters[monsterId]; FollowTheLeader(monster); @@ -4282,14 +4282,14 @@ void ProcessMonsters() void FreeMonsters() { - for (int i = 0; i < LevelMonsterTypeCount; i++) { + for (size_t i = 0; i < LevelMonsterTypeCount; i++) { LevelMonsterTypes[i].animData = nullptr; } } bool DirOK(int monsterId, Direction mdir) { - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; Point position = monster.position.tile; Point futurePosition = position + mdir; @@ -4602,7 +4602,7 @@ void MissToMonst(Missile &missile, Point position) { int monsterId = missile._misource; - assert(monsterId >= 0 && monsterId < MaxMonsters); + assert(static_cast(monsterId) < MaxMonsters); auto &monster = Monsters[monsterId]; Point oldPosition = missile.position.tile; diff --git a/Source/monster.h b/Source/monster.h index 33a74808d..0af118f86 100644 --- a/Source/monster.h +++ b/Source/monster.h @@ -5,8 +5,10 @@ */ #pragma once -#include +#include #include + +#include #include #include "engine.h" @@ -24,8 +26,8 @@ namespace devilution { struct Missile; -constexpr int MaxMonsters = 200; -constexpr int MaxLvlMTypes = 24; +constexpr size_t MaxMonsters = 200; +constexpr size_t MaxLvlMTypes = 24; enum monster_flag : uint16_t { // clang-format off @@ -297,22 +299,22 @@ struct Monster { // note: missing field _mAFNum bool tryLiftGargoyle(); }; -extern int LevelMonsterTypeCount; +extern size_t LevelMonsterTypeCount; extern Monster Monsters[MaxMonsters]; extern int ActiveMonsters[MaxMonsters]; -extern int ActiveMonsterCount; +extern size_t ActiveMonsterCount; extern int MonsterKillCounts[MaxMonsters]; extern bool sgbSaveSoundOn; void PrepareUniqueMonst(Monster &monster, int uniqindex, int miniontype, int bosspacksize, const UniqueMonsterData &uniqueMonsterData); void InitLevelMonsters(); void GetLevelMTypes(); -void InitMonsterGFX(int monsterTypeIndex); +void InitMonsterGFX(size_t monsterTypeIndex); void WeakenNaKrul(); void InitGolems(); void InitMonsters(); void SetMapMonsters(const uint16_t *dunData, Point startPosition); -Monster *AddMonster(Point position, Direction dir, int mtype, bool inMap); +Monster *AddMonster(Point position, Direction dir, size_t mtype, bool inMap); void AddDoppelganger(Monster &monster); bool M_Talker(const Monster &monster); void M_StartStand(Monster &monster, Direction md); diff --git a/Source/msg.cpp b/Source/msg.cpp index a0c2c298e..d5f2f2d6b 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -348,7 +348,7 @@ size_t DeltaImportObject(const byte *src, DObjectStr *dst) byte *DeltaExportMonster(byte *dst, const DMonsterStr *src) { - for (int i = 0; i < MaxMonsters; i++, src++) { + for (size_t i = 0; i < MaxMonsters; i++, src++) { if (src->position.x == 0xFF) { *dst++ = byte { 0xFF }; } else { @@ -363,7 +363,7 @@ byte *DeltaExportMonster(byte *dst, const DMonsterStr *src) void DeltaImportMonster(const byte *src, DMonsterStr *dst) { size_t size = 0; - for (int i = 0; i < MaxMonsters; i++, dst++) { + for (size_t i = 0; i < MaxMonsters; i++, dst++) { if (src[size] == byte { 0xFF }) { memset(dst, 0xFF, sizeof(DMonsterStr)); size++; @@ -522,7 +522,7 @@ void DeltaLeaveSync(uint8_t bLevel) DLevel &deltaLevel = GetDeltaLevel(bLevel); - for (int i = 0; i < ActiveMonsterCount; i++) { + for (size_t i = 0; i < ActiveMonsterCount; i++) { int ma = ActiveMonsters[i]; auto &monster = Monsters[ma]; if (monster.hitPoints == 0) @@ -2445,7 +2445,7 @@ void DeltaLoadLevel() uint8_t localLevel = GetLevelForMultiplayer(*MyPlayer); DLevel &deltaLevel = GetDeltaLevel(localLevel); if (leveltype != DTYPE_TOWN) { - for (int i = 0; i < MaxMonsters; i++) { + for (size_t i = 0; i < MaxMonsters; i++) { if (deltaLevel.monster[i].position.x == 0xFF) continue; diff --git a/Source/multi.cpp b/Source/multi.cpp index 5d585b56c..eea277b8a 100644 --- a/Source/multi.cpp +++ b/Source/multi.cpp @@ -195,7 +195,7 @@ void MonsterSeeds() { sgdwGameLoops++; const uint32_t seed = (sgdwGameLoops >> 8) | (sgdwGameLoops << 24); // _rotr(sgdwGameLoops, 8) - for (int i = 0; i < MaxMonsters; i++) + for (size_t i = 0; i < MaxMonsters; i++) Monsters[i].aiSeed = seed + i; } diff --git a/Source/player.cpp b/Source/player.cpp index d1feefe66..cdf1d393c 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -785,14 +785,11 @@ bool DamageWeapon(Player &player, unsigned damageFrequency) return false; } -bool PlrHitMonst(int pnum, int monsterId, bool adjacentDamage = false) +bool PlrHitMonst(int pnum, size_t monsterId, bool adjacentDamage = false) { int hper = 0; - if (monsterId < 0 || monsterId >= MaxMonsters) { - app_fatal(StrCat("PlrHitMonst: illegal monster ", monsterId)); - } - auto &monster = Monsters[monsterId]; + Monster &monster = Monsters[monsterId]; if (pnum < 0 || pnum >= MAX_PLRS) { app_fatal(StrCat("PlrHitMonst: illegal player ", pnum)); diff --git a/Source/sync.cpp b/Source/sync.cpp index 2d7989b17..1e581210d 100644 --- a/Source/sync.cpp +++ b/Source/sync.cpp @@ -14,14 +14,14 @@ namespace devilution { namespace { uint16_t sgnMonsterPriority[MaxMonsters]; -int sgnMonsters; +size_t sgnMonsters; uint16_t sgwLRU[MaxMonsters]; int sgnSyncItem; int sgnSyncPInv; void SyncOneMonster() { - for (int i = 0; i < ActiveMonsterCount; i++) { + for (size_t i = 0; i < ActiveMonsterCount; i++) { int m = ActiveMonsters[i]; auto &monster = Monsters[m]; sgnMonsterPriority[m] = MyPlayer->position.tile.ManhattanDistance(monster.position.tile); @@ -53,7 +53,7 @@ bool SyncMonsterActive(TSyncMonster &monsterSync) int ndx = -1; uint32_t lru = 0xFFFFFFFF; - for (int i = 0; i < ActiveMonsterCount; i++) { + for (size_t i = 0; i < ActiveMonsterCount; i++) { int m = ActiveMonsters[i]; if (sgnMonsterPriority[m] < lru && sgwLRU[m] < 0xFFFE) { lru = sgnMonsterPriority[m]; @@ -74,7 +74,7 @@ bool SyncMonsterActive2(TSyncMonster &monsterSync) int ndx = -1; uint32_t lru = 0xFFFE; - for (int i = 0; i < ActiveMonsterCount; i++) { + for (size_t i = 0; i < ActiveMonsterCount; i++) { if (sgnMonsters >= ActiveMonsterCount) { sgnMonsters = 0; } @@ -211,7 +211,7 @@ bool IsEnemyIdValid(const Monster &monster, int enemyId) } enemyId -= MAX_PLRS; - if (enemyId >= MaxMonsters) { + if (static_cast(enemyId) >= MaxMonsters) { return false; } @@ -230,9 +230,9 @@ bool IsEnemyIdValid(const Monster &monster, int enemyId) bool IsTSyncMonsterValidate(const TSyncMonster &monsterSync) { - const int monsterId = monsterSync._mndx; + const size_t monsterId = monsterSync._mndx; - if (monsterId < 0 || monsterId >= MaxMonsters) + if (monsterId >= MaxMonsters) return false; if (!InDungeonBounds({ monsterSync._mx, monsterSync._my })) @@ -266,7 +266,7 @@ uint32_t sync_all_monsters(byte *pbBuf, uint32_t dwMaxLen) assert(dwMaxLen <= 0xffff); SyncOneMonster(); - for (int i = 0; i < ActiveMonsterCount && dwMaxLen >= sizeof(TSyncMonster); i++) { + for (size_t i = 0; i < ActiveMonsterCount && dwMaxLen >= sizeof(TSyncMonster); i++) { auto &monsterSync = *reinterpret_cast(pbBuf); bool sync = false; if (i < 2) {