Browse Source

♻️ Make Monster counters `size_t`

pull/4979/head
Gleb Mazovetskiy 4 years ago
parent
commit
33ac2cca8e
  1. 2
      Source/controls/plrctrls.cpp
  2. 6
      Source/dead.cpp
  3. 10
      Source/debug.cpp
  4. 4
      Source/diablo.cpp
  5. 6
      Source/effects.cpp
  6. 2
      Source/effects.h
  7. 2
      Source/effects_stubs.cpp
  8. 2
      Source/engine/render/scrollrt.cpp
  9. 6
      Source/levels/themes.cpp
  10. 12
      Source/loadsave.cpp
  11. 148
      Source/monster.cpp
  12. 16
      Source/monster.h
  13. 8
      Source/msg.cpp
  14. 2
      Source/multi.cpp
  15. 7
      Source/player.cpp
  16. 16
      Source/sync.cpp

2
Source/controls/plrctrls.cpp

@ -250,7 +250,7 @@ void FindRangedTarget()
int distance = 0; int distance = 0;
bool canTalk = false; bool canTalk = false;
for (int i = 0; i < ActiveMonsterCount; i++) { for (size_t i = 0; i < ActiveMonsterCount; i++) {
int mi = ActiveMonsters[i]; int mi = ActiveMonsters[i];
const auto &monster = Monsters[mi]; const auto &monster = Monsters[mi];

6
Source/dead.cpp

@ -31,7 +31,7 @@ void InitCorpses()
int8_t nd = 0; 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) if (mtypes[LevelMonsterTypes[i].type] != 0)
continue; continue;
@ -55,7 +55,7 @@ void InitCorpses()
stonendx = nd; stonendx = nd;
for (int i = 0; i < ActiveMonsterCount; i++) { for (size_t i = 0; i < ActiveMonsterCount; i++) {
auto &monster = Monsters[ActiveMonsters[i]]; auto &monster = Monsters[ActiveMonsters[i]];
if (monster.uniqType != 0) { if (monster.uniqType != 0) {
InitDeadAnimationFromMonster(Corpses[nd], monster.type()); InitDeadAnimationFromMonster(Corpses[nd], monster.type());
@ -76,7 +76,7 @@ void AddCorpse(Point tilePosition, int8_t dv, Direction ddir)
void SyncUniqDead() void SyncUniqDead()
{ {
for (int i = 0; i < ActiveMonsterCount; i++) { for (size_t i = 0; i < ActiveMonsterCount; i++) {
auto &monster = Monsters[ActiveMonsters[i]]; auto &monster = Monsters[ActiveMonsters[i]];
if (monster.uniqType == 0) if (monster.uniqType == 0)
continue; continue;

10
Source/debug.cpp

@ -105,7 +105,7 @@ void PrintDebugMonster(int m)
bool bActive = false; bool bActive = false;
for (int i = 0; i < ActiveMonsterCount; i++) { for (size_t i = 0; i < ActiveMonsterCount; i++) {
if (ActiveMonsters[i] == m) if (ActiveMonsters[i] == m)
bActive = true; bActive = true;
} }
@ -693,10 +693,10 @@ std::string DebugCmdSpawnUniqueMonster(const string_view parameter)
if (mtype == -1) if (mtype == -1)
return "Monster not found!"; return "Monster not found!";
int id = MaxLvlMTypes - 1; size_t id = MaxLvlMTypes - 1;
bool found = false; bool found = false;
for (int i = 0; i < LevelMonsterTypeCount; i++) { for (size_t i = 0; i < LevelMonsterTypeCount; i++) {
if (LevelMonsterTypes[i].type == mtype) { if (LevelMonsterTypes[i].type == mtype) {
id = i; id = i;
found = true; found = true;
@ -779,10 +779,10 @@ std::string DebugCmdSpawnMonster(const string_view parameter)
if (mtype == -1) if (mtype == -1)
return "Monster not found!"; return "Monster not found!";
int id = MaxLvlMTypes - 1; size_t id = MaxLvlMTypes - 1;
bool found = false; bool found = false;
for (int i = 0; i < LevelMonsterTypeCount; i++) { for (size_t i = 0; i < LevelMonsterTypeCount; i++) {
if (LevelMonsterTypes[i].type == mtype) { if (LevelMonsterTypes[i].type == mtype) {
id = i; id = i;
found = true; found = true;

4
Source/diablo.cpp

@ -1215,7 +1215,7 @@ void UnstuckChargers()
return; return;
} }
} }
for (int i = 0; i < ActiveMonsterCount; i++) { for (size_t i = 0; i < ActiveMonsterCount; i++) {
auto &monster = Monsters[ActiveMonsters[i]]; auto &monster = Monsters[ActiveMonsters[i]];
if (monster.mode == MonsterMode::Charge) if (monster.mode == MonsterMode::Charge)
monster.mode = MonsterMode::Stand; monster.mode = MonsterMode::Stand;
@ -1224,7 +1224,7 @@ void UnstuckChargers()
void UpdateMonsterLights() void UpdateMonsterLights()
{ {
for (int i = 0; i < ActiveMonsterCount; i++) { for (size_t i = 0; i < ActiveMonsterCount; i++) {
auto &monster = Monsters[ActiveMonsters[i]]; auto &monster = Monsters[ActiveMonsters[i]];
if ((monster.flags & MFLAG_BERSERK) != 0) { if ((monster.flags & MFLAG_BERSERK) != 0) {

6
Source/effects.cpp

@ -1211,7 +1211,7 @@ void stream_stop()
} }
} }
void InitMonsterSND(int monst) void InitMonsterSND(size_t monst)
{ {
if (!gbSndInited) { if (!gbSndInited) {
return; return;
@ -1234,9 +1234,9 @@ void InitMonsterSND(int monst)
void FreeMonsterSnd() void FreeMonsterSnd()
{ {
#ifdef _DEBUG #ifdef _DEBUG
for (int i = 0; i < MaxLvlMTypes; i++) { for (size_t i = 0; i < MaxLvlMTypes; i++) {
#else #else
for (int i = 0; i < LevelMonsterTypeCount; i++) { for (size_t i = 0; i < LevelMonsterTypeCount; i++) {
#endif #endif
for (auto &variants : LevelMonsterTypes[i].sounds) { for (auto &variants : LevelMonsterTypes[i].sounds) {
for (auto &snd : variants) { for (auto &snd : variants) {

2
Source/effects.h

@ -1177,7 +1177,7 @@ extern _sfx_id sfxdnum;
bool effect_is_playing(int nSFX); bool effect_is_playing(int nSFX);
void stream_stop(); void stream_stop();
void InitMonsterSND(int monst); void InitMonsterSND(size_t monst);
void FreeMonsterSnd(); void FreeMonsterSnd();
bool CalculateSoundPosition(Point soundPosition, int *plVolume, int *plPan); bool CalculateSoundPosition(Point soundPosition, int *plVolume, int *plPan);
void PlaySFX(_sfx_id psfx); void PlaySFX(_sfx_id psfx);

2
Source/effects_stubs.cpp

@ -12,7 +12,7 @@ _sfx_id sfxdnum;
// clang-format off // clang-format off
bool effect_is_playing(int nSFX) { return false; } bool effect_is_playing(int nSFX) { return false; }
void stream_stop() { } void stream_stop() { }
void InitMonsterSND(int monst) { } void InitMonsterSND(size_t monst) { }
void FreeMonsterSnd() { } void FreeMonsterSnd() { }
bool CalculateSoundPosition(Point soundPosition, int *plVolume, int *plPan) { return false; } bool CalculateSoundPosition(Point soundPosition, int *plVolume, int *plPan) { return false; }
void PlaySFX(_sfx_id psfx) void PlaySFX(_sfx_id psfx)

2
Source/engine/render/scrollrt.cpp

@ -766,7 +766,7 @@ void DrawMonsterHelper(const Surface &out, Point tilePosition, Point targetBuffe
if (!IsTileLit(tilePosition) && !MyPlayer->_pInfraFlag) if (!IsTileLit(tilePosition) && !MyPlayer->_pInfraFlag)
return; return;
if (mi < 0 || mi >= MaxMonsters) { if (static_cast<size_t>(mi) >= MaxMonsters) {
Log("Draw Monster: tried to draw illegal monster {}", mi); Log("Draw Monster: tried to draw illegal monster {}", mi);
return; return;
} }

6
Source/levels/themes.cpp

@ -148,7 +148,7 @@ bool TFit_SkelRoom(int t)
return false; return false;
} }
for (int i = 0; i < LevelMonsterTypeCount; i++) { for (size_t i = 0; i < LevelMonsterTypeCount; i++) {
if (IsSkel(LevelMonsterTypes[i].type)) { if (IsSkel(LevelMonsterTypes[i].type)) {
themeVar1 = i; themeVar1 = i;
return TFit_Obj5(t); return TFit_Obj5(t);
@ -160,7 +160,7 @@ bool TFit_SkelRoom(int t)
bool TFit_GoatShrine(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)) { if (IsGoat(LevelMonsterTypes[i].type)) {
themeVar1 = i; themeVar1 = i;
return TFit_Obj5(t); return TFit_Obj5(t);
@ -480,7 +480,7 @@ void PlaceThemeMonsts(int t, int f)
int scattertypes[138]; int scattertypes[138];
int numscattypes = 0; 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) { if ((LevelMonsterTypes[i].placeFlags & PLACE_SCATTER) != 0) {
scattertypes[numscattypes] = i; scattertypes[numscattypes] = i;
numscattypes++; numscattypes++;

12
Source/loadsave.cpp

@ -685,7 +685,7 @@ void SyncPackSize(Monster &leader)
leader.packSize = 0; leader.packSize = 0;
for (int i = 0; i < ActiveMonsterCount; i++) { for (size_t i = 0; i < ActiveMonsterCount; i++) {
auto &minion = Monsters[ActiveMonsters[i]]; auto &minion = Monsters[ActiveMonsters[i]];
if (minion.leaderRelation == LeaderRelation::Leashed && &Monsters[minion.leader] == &leader) if (minion.leaderRelation == LeaderRelation::Leashed && &Monsters[minion.leader] == &leader)
leader.packSize++; leader.packSize++;
@ -2090,9 +2090,9 @@ void LoadGame(bool firstflag)
if (leveltype != DTYPE_TOWN) { if (leveltype != DTYPE_TOWN) {
for (int &monsterId : ActiveMonsters) for (int &monsterId : ActiveMonsters)
monsterId = file.NextBE<int32_t>(); monsterId = file.NextBE<int32_t>();
for (int i = 0; i < ActiveMonsterCount; i++) for (size_t i = 0; i < ActiveMonsterCount; i++)
LoadMonster(&file, Monsters[ActiveMonsters[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]]); SyncPackSize(Monsters[ActiveMonsters[i]]);
// Skip ActiveMissiles // Skip ActiveMissiles
file.Skip<int8_t>(MaxMissilesForSaveGame); file.Skip<int8_t>(MaxMissilesForSaveGame);
@ -2346,7 +2346,7 @@ void SaveGameData(MpqWriter &saveWriter)
if (leveltype != DTYPE_TOWN) { if (leveltype != DTYPE_TOWN) {
for (int monsterId : ActiveMonsters) for (int monsterId : ActiveMonsters)
file.WriteBE<int32_t>(monsterId); file.WriteBE<int32_t>(monsterId);
for (int i = 0; i < ActiveMonsterCount; i++) for (size_t i = 0; i < ActiveMonsterCount; i++)
SaveMonster(&file, Monsters[ActiveMonsters[i]]); SaveMonster(&file, Monsters[ActiveMonsters[i]]);
// Write ActiveMissiles // Write ActiveMissiles
for (uint8_t activeMissile = 0; activeMissile < MaxMissilesForSaveGame; activeMissile++) for (uint8_t activeMissile = 0; activeMissile < MaxMissilesForSaveGame; activeMissile++)
@ -2482,7 +2482,7 @@ void SaveLevel(MpqWriter &saveWriter)
if (leveltype != DTYPE_TOWN) { if (leveltype != DTYPE_TOWN) {
for (int monsterId : ActiveMonsters) for (int monsterId : ActiveMonsters)
file.WriteBE<int32_t>(monsterId); file.WriteBE<int32_t>(monsterId);
for (int i = 0; i < ActiveMonsterCount; i++) for (size_t i = 0; i < ActiveMonsterCount; i++)
SaveMonster(&file, Monsters[ActiveMonsters[i]]); SaveMonster(&file, Monsters[ActiveMonsters[i]]);
for (int objectId : ActiveObjects) for (int objectId : ActiveObjects)
file.WriteLE<int8_t>(objectId); file.WriteLE<int8_t>(objectId);
@ -2555,7 +2555,7 @@ void LoadLevel()
if (leveltype != DTYPE_TOWN) { if (leveltype != DTYPE_TOWN) {
for (int &monsterId : ActiveMonsters) for (int &monsterId : ActiveMonsters)
monsterId = file.NextBE<int32_t>(); monsterId = file.NextBE<int32_t>();
for (int i = 0; i < ActiveMonsterCount; i++) for (size_t i = 0; i < ActiveMonsterCount; i++)
LoadMonster(&file, Monsters[ActiveMonsters[i]]); LoadMonster(&file, Monsters[ActiveMonsters[i]]);
for (int &objectId : ActiveObjects) for (int &objectId : ActiveObjects)
objectId = file.NextLE<int8_t>(); objectId = file.NextLE<int8_t>();

148
Source/monster.cpp

@ -48,10 +48,10 @@
namespace devilution { namespace devilution {
CMonster LevelMonsterTypes[MaxLvlMTypes]; CMonster LevelMonsterTypes[MaxLvlMTypes];
int LevelMonsterTypeCount; size_t LevelMonsterTypeCount;
Monster Monsters[MaxMonsters]; Monster Monsters[MaxMonsters];
int ActiveMonsters[MaxMonsters]; int ActiveMonsters[MaxMonsters];
int ActiveMonsterCount; size_t ActiveMonsterCount;
// BUGFIX: replace MonsterKillCounts[MaxMonsters] with MonsterKillCounts[NUM_MTYPES]. // BUGFIX: replace MonsterKillCounts[MaxMonsters] with MonsterKillCounts[NUM_MTYPES].
/** Tracks the total number of monsters killed per monster_id. */ /** Tracks the total number of monsters killed per monster_id. */
int MonsterKillCounts[MaxMonsters]; int MonsterKillCounts[MaxMonsters];
@ -66,7 +66,7 @@ constexpr int NightmareAcBonus = 50;
constexpr int HellAcBonus = 80; constexpr int HellAcBonus = 80;
/** Tracks which missile files are already loaded */ /** Tracks which missile files are already loaded */
int totalmonsters; size_t totalmonsters;
int monstimgtot; int monstimgtot;
int uniquetrans; int uniquetrans;
@ -302,7 +302,7 @@ bool CanPlaceMonster(Point position)
void PlaceMonster(int i, int mtype, Point position) void PlaceMonster(int i, int mtype, Point position)
{ {
if (LevelMonsterTypes[mtype].type == MT_NAKRUL) { 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) { if (Monsters[j].levelType == mtype) {
return; return;
} }
@ -317,9 +317,9 @@ void PlaceMonster(int i, int mtype, Point position)
InitMonster(Monsters[i], rd, mtype, 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]; auto &leader = Monsters[leaderId];
@ -400,7 +400,7 @@ void PlaceUniqueMonst(int uniqindex, int miniontype, int bosspacksize)
auto &monster = Monsters[ActiveMonsterCount]; auto &monster = Monsters[ActiveMonsterCount];
const auto &uniqueMonsterData = UniqueMonstersData[uniqindex]; const auto &uniqueMonsterData = UniqueMonstersData[uniqindex];
int uniqtype; size_t uniqtype;
for (uniqtype = 0; uniqtype < LevelMonsterTypeCount; uniqtype++) { for (uniqtype = 0; uniqtype < LevelMonsterTypeCount; uniqtype++) {
if (LevelMonsterTypes[uniqtype].type == uniqueMonsterData.mtype) { if (LevelMonsterTypes[uniqtype].type == uniqueMonsterData.mtype) {
break; break;
@ -480,24 +480,24 @@ void PlaceUniqueMonst(int uniqindex, int miniontype, int bosspacksize)
return; return;
} }
position = { UberRow - 2, UberCol }; position = { UberRow - 2, UberCol };
UberDiabloMonsterIndex = ActiveMonsterCount; UberDiabloMonsterIndex = static_cast<int>(ActiveMonsterCount);
} }
PlaceMonster(ActiveMonsterCount, uniqtype, position); PlaceMonster(ActiveMonsterCount, uniqtype, position);
PrepareUniqueMonst(monster, uniqindex, miniontype, bosspacksize, uniqueMonsterData); 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) if (LevelMonsterTypes[i].type == type)
return i; return i;
} }
return LevelMonsterTypeCount; 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) { if (typeIndex == LevelMonsterTypeCount) {
LevelMonsterTypeCount++; LevelMonsterTypeCount++;
@ -548,7 +548,7 @@ void PlaceUniqueMonsters()
if (UniqueMonstersData[u].mlevel != currlevel) if (UniqueMonstersData[u].mlevel != currlevel)
continue; continue;
int mt = GetMonsterTypeIndex(UniqueMonstersData[u].mtype); const size_t mt = GetMonsterTypeIndex(UniqueMonstersData[u].mtype);
if (mt == LevelMonsterTypeCount) if (mt == LevelMonsterTypeCount)
continue; continue;
@ -575,7 +575,7 @@ void PlaceQuestMonsters()
} }
if (currlevel == Quests[Q_SKELKING]._qlevel && gbIsMultiplayer) { 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)) { if (IsSkel(LevelMonsterTypes[i].type)) {
PlaceUniqueMonst(UMT_SKELKING, i, 30); PlaceUniqueMonst(UMT_SKELKING, i, 30);
break; break;
@ -623,17 +623,17 @@ void PlaceQuestMonsters()
if (currlevel == 24) { if (currlevel == 24) {
UberDiabloMonsterIndex = -1; UberDiabloMonsterIndex = -1;
int i1; size_t i1;
for (i1 = 0; i1 < LevelMonsterTypeCount; i1++) { for (i1 = 0; i1 < LevelMonsterTypeCount; i1++) {
if (LevelMonsterTypes[i1].type == UniqueMonstersData[UMT_NAKRUL].mtype) if (LevelMonsterTypes[i1].type == UniqueMonstersData[UMT_NAKRUL].mtype)
break; break;
} }
if (i1 < LevelMonsterTypeCount) { if (i1 < LevelMonsterTypeCount) {
for (int i2 = 0; i2 < ActiveMonsterCount; i2++) { for (size_t i2 = 0; i2 < ActiveMonsterCount; i2++) {
auto &monster = Monsters[i2]; auto &monster = Monsters[i2];
if (monster.uniqType != 0 || monster.levelType == i1) { if (monster.uniqType != 0 || monster.levelType == i1) {
UberDiabloMonsterIndex = i2; UberDiabloMonsterIndex = static_cast<int>(i2);
break; 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]; int mi = ActiveMonsters[j];
auto &otherMonster = Monsters[mi]; auto &otherMonster = Monsters[mi];
if (&otherMonster == &monster) if (&otherMonster == &monster)
@ -942,7 +942,7 @@ void DiabloDeath(Monster &diablo, bool sendmsg)
NetSendCmdQuest(true, quest); NetSendCmdQuest(true, quest);
sgbSaveSoundOn = gbSoundOn; sgbSaveSoundOn = gbSoundOn;
gbProcessPlayers = false; gbProcessPlayers = false;
for (int j = 0; j < ActiveMonsterCount; j++) { for (size_t j = 0; j < ActiveMonsterCount; j++) {
int k = ActiveMonsters[j]; int k = ActiveMonsters[j];
auto &monster = Monsters[k]; auto &monster = Monsters[k];
if (monster.type().type == MT_DIABLO || diablo.activeForTicks == 0) 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) void StartDeathFromMonster(int i, int mid)
{ {
assert(i >= 0 && i < MaxMonsters); assert(static_cast<size_t>(i) < MaxMonsters);
Monster &killer = Monsters[i]; Monster &killer = Monsters[i];
assert(mid >= 0 && mid < MaxMonsters); assert(static_cast<size_t>(mid) < MaxMonsters);
Monster &monster = Monsters[mid]; Monster &monster = Monsters[mid];
delta_kill_monster(mid, monster.position.tile, *MyPlayer); 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) void MonsterAttackMonster(int i, int mid, int hper, int mind, int maxd)
{ {
assert(mid >= 0 && mid < MaxMonsters); assert(static_cast<size_t>(mid) < MaxMonsters);
auto &monster = Monsters[mid]; auto &monster = Monsters[mid];
if (!monster.isPossibleToHit()) 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) void MonsterAttackPlayer(int monsterId, int pnum, int hit, int minDam, int maxDam)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if ((monster.flags & MFLAG_TARGETS_MONSTER) != 0) { 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) bool MonsterAttack(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.animInfo.currentFrame == monster.data().mAFNum - 1) { if (monster.animInfo.currentFrame == monster.data().mAFNum - 1) {
@ -1467,7 +1467,7 @@ bool MonsterRangedAttack(Monster &monster)
bool MonsterRangedSpecialAttack(int monsterId) bool MonsterRangedSpecialAttack(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.animInfo.currentFrame == monster.data().mAFNum2 - 1 && monster.animInfo.tickCounterOfCurrentFrame == 0 && (monster.ai != AI_MEGA || monster.var2 == 0)) { 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) bool MonsterSpecialAttack(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.animInfo.currentFrame == monster.data().mAFNum2 - 1) if (monster.animInfo.currentFrame == monster.data().mAFNum2 - 1)
@ -1648,7 +1648,7 @@ bool MonsterGotHit(Monster &monster)
void MonsterDeath(int monsterId) void MonsterDeath(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
monster.var1++; monster.var1++;
@ -1722,7 +1722,7 @@ void MonsterPetrified(Monster &monster)
Monster *AddSkeleton(Point position, Direction dir, bool inMap) Monster *AddSkeleton(Point position, Direction dir, bool inMap)
{ {
int j = 0; int j = 0;
for (int i = 0; i < LevelMonsterTypeCount; i++) { for (size_t i = 0; i < LevelMonsterTypeCount; i++) {
if (IsSkel(LevelMonsterTypes[i].type)) if (IsSkel(LevelMonsterTypes[i].type))
j++; j++;
} }
@ -1732,7 +1732,7 @@ Monster *AddSkeleton(Point position, Direction dir, bool inMap)
} }
int skeltypes = GenerateRnd(j); int skeltypes = GenerateRnd(j);
int m = 0; size_t m = 0;
for (int i = 0; m < LevelMonsterTypeCount && i <= skeltypes; m++) { for (int i = 0; m < LevelMonsterTypeCount && i <= skeltypes; m++) {
if (IsSkel(LevelMonsterTypes[m].type)) if (IsSkel(LevelMonsterTypes[m].type))
i++; i++;
@ -1906,7 +1906,7 @@ bool AiPlanWalk(int monsterId)
/** Maps from walking path step to facing direction. */ /** 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 }; 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<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (FindPath([&monster](Point position) { return IsTileAccessible(monster, position); }, monster.position.tile, monster.enemyPosition, path) == 0) { 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) bool AiPlanPath(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.type().type != MT_GOLEM) { if (monster.type().type != MT_GOLEM) {
@ -1987,7 +1987,7 @@ bool AiPlanPath(int monsterId)
void AiAvoidance(int monsterId) void AiAvoidance(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) { if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) {
@ -2077,7 +2077,7 @@ missile_id GetMissileType(_mai_id ai)
void AiRanged(int monsterId) void AiRanged(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.mode != MonsterMode::Stand) { if (monster.mode != MonsterMode::Stand) {
@ -2123,7 +2123,7 @@ void AiRanged(int monsterId)
void AiRangedAvoidance(int monsterId) void AiRangedAvoidance(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) { if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) {
@ -2184,7 +2184,7 @@ void AiRangedAvoidance(int monsterId)
void ZombieAi(int monsterId) void ZombieAi(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.mode != MonsterMode::Stand) { if (monster.mode != MonsterMode::Stand) {
@ -2217,7 +2217,7 @@ void ZombieAi(int monsterId)
void OverlordAi(int monsterId) void OverlordAi(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) { if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) {
@ -2247,7 +2247,7 @@ void OverlordAi(int monsterId)
void SkeletonAi(int monsterId) void SkeletonAi(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) { if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) {
@ -2277,7 +2277,7 @@ void SkeletonAi(int monsterId)
void SkeletonBowAi(int monsterId) void SkeletonBowAi(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) { if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) {
@ -2337,7 +2337,7 @@ std::optional<Point> ScavengerFindCorpse(const Monster &scavenger)
void ScavengerAi(int monsterId) void ScavengerAi(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.mode != MonsterMode::Stand) if (monster.mode != MonsterMode::Stand)
@ -2398,7 +2398,7 @@ void ScavengerAi(int monsterId)
void RhinoAi(int monsterId) void RhinoAi(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) { if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) {
@ -2463,7 +2463,7 @@ void RhinoAi(int monsterId)
void FallenAi(int monsterId) void FallenAi(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.goal == MonsterGoal::Attack) { if (monster.goal == MonsterGoal::Attack) {
@ -2530,7 +2530,7 @@ void FallenAi(int monsterId)
void LeoricAi(int monsterId) void LeoricAi(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) { if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) {
@ -2592,7 +2592,7 @@ void LeoricAi(int monsterId)
void BatAi(int monsterId) void BatAi(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) { if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) {
@ -2646,7 +2646,7 @@ void BatAi(int monsterId)
void GargoyleAi(int monsterId) void GargoyleAi(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
int dx = monster.position.tile.x - monster.position.last.x; int dx = monster.position.tile.x - monster.position.last.x;
@ -2682,7 +2682,7 @@ void GargoyleAi(int monsterId)
void ButcherAi(int monsterId) void ButcherAi(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) { if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) {
@ -2707,7 +2707,7 @@ void ButcherAi(int monsterId)
void SneakAi(int monsterId) void SneakAi(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.mode != MonsterMode::Stand) { if (monster.mode != MonsterMode::Stand) {
@ -2765,7 +2765,7 @@ void SneakAi(int monsterId)
void GharbadAi(int monsterId) void GharbadAi(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.mode != MonsterMode::Stand) { if (monster.mode != MonsterMode::Stand) {
@ -2812,7 +2812,7 @@ void GharbadAi(int monsterId)
void SnotSpilAi(int monsterId) void SnotSpilAi(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.mode != MonsterMode::Stand) { if (monster.mode != MonsterMode::Stand) {
@ -2853,7 +2853,7 @@ void SnotSpilAi(int monsterId)
void SnakeAi(int monsterId) void SnakeAi(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
char pattern[6] = { 1, 1, 0, -1, -1, 0 }; char pattern[6] = { 1, 1, 0, -1, -1, 0 };
@ -2913,7 +2913,7 @@ void SnakeAi(int monsterId)
void CounselorAi(int monsterId) void CounselorAi(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) { if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) {
@ -2980,7 +2980,7 @@ void CounselorAi(int monsterId)
void ZharAi(int monsterId) void ZharAi(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.mode != MonsterMode::Stand) { if (monster.mode != MonsterMode::Stand) {
@ -3011,7 +3011,7 @@ void ZharAi(int monsterId)
void MegaAi(int monsterId) void MegaAi(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
int mx = monster.position.tile.x - monster.enemyPosition.x; int mx = monster.position.tile.x - monster.enemyPosition.x;
@ -3080,7 +3080,7 @@ void MegaAi(int monsterId)
void LazarusAi(int monsterId) void LazarusAi(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.mode != MonsterMode::Stand) { if (monster.mode != MonsterMode::Stand) {
@ -3127,7 +3127,7 @@ void LazarusAi(int monsterId)
void LazarusMinionAi(int monsterId) void LazarusMinionAi(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.mode != MonsterMode::Stand) if (monster.mode != MonsterMode::Stand)
@ -3154,7 +3154,7 @@ void LazarusMinionAi(int monsterId)
void LachdananAi(int monsterId) void LachdananAi(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.mode != MonsterMode::Stand) { if (monster.mode != MonsterMode::Stand) {
@ -3183,7 +3183,7 @@ void LachdananAi(int monsterId)
void WarlordAi(int monsterId) void WarlordAi(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.mode != MonsterMode::Stand) { if (monster.mode != MonsterMode::Stand) {
@ -3209,7 +3209,7 @@ void WarlordAi(int monsterId)
void HorkDemonAi(int monsterId) void HorkDemonAi(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) { if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) {
@ -3546,7 +3546,7 @@ void InitLevelMonsters()
ActiveMonsterCount = 0; ActiveMonsterCount = 0;
totalmonsters = MaxMonsters; totalmonsters = MaxMonsters;
for (int i = 0; i < MaxMonsters; i++) { for (size_t i = 0; i < MaxMonsters; i++) {
ActiveMonsters[i] = i; ActiveMonsters[i] = i;
} }
@ -3638,7 +3638,7 @@ void GetLevelMTypes()
} }
} }
void InitMonsterGFX(int monsterTypeIndex) void InitMonsterGFX(size_t monsterTypeIndex)
{ {
CMonster &monster = LevelMonsterTypes[monsterTypeIndex]; CMonster &monster = LevelMonsterTypes[monsterTypeIndex];
const _monster_id mtype = monster.type; const _monster_id mtype = monster.type;
@ -3731,7 +3731,7 @@ void InitMonsterGFX(int monsterTypeIndex)
void WeakenNaKrul() void WeakenNaKrul()
{ {
if (currlevel != 24 || UberDiabloMonsterIndex < 0 || UberDiabloMonsterIndex >= ActiveMonsterCount) if (currlevel != 24 || static_cast<size_t>(UberDiabloMonsterIndex) >= ActiveMonsterCount)
return; return;
auto &monster = Monsters[UberDiabloMonsterIndex]; auto &monster = Monsters[UberDiabloMonsterIndex];
@ -3786,7 +3786,7 @@ void InitMonsters()
totalmonsters = ActiveMonsterCount + numplacemonsters; totalmonsters = ActiveMonsterCount + numplacemonsters;
int numscattypes = 0; int numscattypes = 0;
int scattertypes[NUM_MTYPES]; 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) { if ((LevelMonsterTypes[i].placeFlags & PLACE_SCATTER) != 0) {
scattertypes[numscattypes] = i; scattertypes[numscattypes] = i;
numscattypes++; numscattypes++;
@ -3842,14 +3842,14 @@ void SetMapMonsters(const uint16_t *dunData, Point startPosition)
for (int i = 0; i < width; i++) { for (int i = 0; i < width; i++) {
auto monsterId = static_cast<uint8_t>(SDL_SwapLE16(monsterLayer[j * width + i])); auto monsterId = static_cast<uint8_t>(SDL_SwapLE16(monsterLayer[j * width + i]));
if (monsterId != 0) { 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 }); 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) { if (ActiveMonsterCount < MaxMonsters) {
Monster &monster = Monsters[ActiveMonsters[ActiveMonsterCount++]]; Monster &monster = Monsters[ActiveMonsters[ActiveMonsterCount++]];
@ -3872,7 +3872,7 @@ void AddDoppelganger(Monster &monster)
target = position; target = position;
} }
if (target != Point { 0, 0 }) { 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) { if (LevelMonsterTypes[j].type == monster.type().type) {
AddMonster(target, monster.direction, j, true); AddMonster(target, monster.direction, j, true);
break; break;
@ -3967,7 +3967,7 @@ void StartMonsterDeath(Monster &monster, int pnum, bool sendmsg)
void M_StartKill(int monsterId, int pnum) void M_StartKill(int monsterId, int pnum)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
Monster &monster = Monsters[monsterId]; Monster &monster = Monsters[monsterId];
if (pnum == MyPlayerId) { if (pnum == MyPlayerId) {
@ -3984,7 +3984,7 @@ void M_StartKill(int monsterId, int pnum)
void M_SyncStartKill(int monsterId, Point position, int pnum) void M_SyncStartKill(int monsterId, Point position, int pnum)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
if (monster.hitPoints == 0 || monster.mode == MonsterMode::Death) { 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) void M_UpdateLeader(int monsterId)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
for (int j = 0; j < ActiveMonsterCount; j++) { for (size_t j = 0; j < ActiveMonsterCount; j++) {
auto &minion = Monsters[ActiveMonsters[j]]; auto &minion = Monsters[ActiveMonsters[j]];
if (minion.leaderRelation == LeaderRelation::Leashed && minion.leader == monsterId) if (minion.leaderRelation == LeaderRelation::Leashed && minion.leader == monsterId)
minion.leaderRelation = LeaderRelation::None; minion.leaderRelation = LeaderRelation::None;
@ -4195,7 +4195,7 @@ void DeleteMonsterList()
golem.isInvalid = false; golem.isInvalid = false;
} }
for (int i = MAX_PLRS; i < ActiveMonsterCount;) { for (size_t i = MAX_PLRS; i < ActiveMonsterCount;) {
if (Monsters[ActiveMonsters[i]].isInvalid) { if (Monsters[ActiveMonsters[i]].isInvalid) {
if (pcursmonst == ActiveMonsters[i]) // Unselect monster if player highlighted it if (pcursmonst == ActiveMonsters[i]) // Unselect monster if player highlighted it
pcursmonst = -1; pcursmonst = -1;
@ -4210,8 +4210,8 @@ void ProcessMonsters()
{ {
DeleteMonsterList(); DeleteMonsterList();
assert(ActiveMonsterCount >= 0 && ActiveMonsterCount <= MaxMonsters); assert(ActiveMonsterCount <= MaxMonsters);
for (int i = 0; i < ActiveMonsterCount; i++) { for (size_t i = 0; i < ActiveMonsterCount; i++) {
int monsterId = ActiveMonsters[i]; int monsterId = ActiveMonsters[i];
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
FollowTheLeader(monster); FollowTheLeader(monster);
@ -4282,14 +4282,14 @@ void ProcessMonsters()
void FreeMonsters() void FreeMonsters()
{ {
for (int i = 0; i < LevelMonsterTypeCount; i++) { for (size_t i = 0; i < LevelMonsterTypeCount; i++) {
LevelMonsterTypes[i].animData = nullptr; LevelMonsterTypes[i].animData = nullptr;
} }
} }
bool DirOK(int monsterId, Direction mdir) bool DirOK(int monsterId, Direction mdir)
{ {
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
Point position = monster.position.tile; Point position = monster.position.tile;
Point futurePosition = position + mdir; Point futurePosition = position + mdir;
@ -4602,7 +4602,7 @@ void MissToMonst(Missile &missile, Point position)
{ {
int monsterId = missile._misource; int monsterId = missile._misource;
assert(monsterId >= 0 && monsterId < MaxMonsters); assert(static_cast<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId]; auto &monster = Monsters[monsterId];
Point oldPosition = missile.position.tile; Point oldPosition = missile.position.tile;

16
Source/monster.h

@ -5,8 +5,10 @@
*/ */
#pragma once #pragma once
#include <array> #include <cstddef>
#include <cstdint> #include <cstdint>
#include <array>
#include <functional> #include <functional>
#include "engine.h" #include "engine.h"
@ -24,8 +26,8 @@ namespace devilution {
struct Missile; struct Missile;
constexpr int MaxMonsters = 200; constexpr size_t MaxMonsters = 200;
constexpr int MaxLvlMTypes = 24; constexpr size_t MaxLvlMTypes = 24;
enum monster_flag : uint16_t { enum monster_flag : uint16_t {
// clang-format off // clang-format off
@ -297,22 +299,22 @@ struct Monster { // note: missing field _mAFNum
bool tryLiftGargoyle(); bool tryLiftGargoyle();
}; };
extern int LevelMonsterTypeCount; extern size_t LevelMonsterTypeCount;
extern Monster Monsters[MaxMonsters]; extern Monster Monsters[MaxMonsters];
extern int ActiveMonsters[MaxMonsters]; extern int ActiveMonsters[MaxMonsters];
extern int ActiveMonsterCount; extern size_t ActiveMonsterCount;
extern int MonsterKillCounts[MaxMonsters]; extern int MonsterKillCounts[MaxMonsters];
extern bool sgbSaveSoundOn; extern bool sgbSaveSoundOn;
void PrepareUniqueMonst(Monster &monster, int uniqindex, int miniontype, int bosspacksize, const UniqueMonsterData &uniqueMonsterData); void PrepareUniqueMonst(Monster &monster, int uniqindex, int miniontype, int bosspacksize, const UniqueMonsterData &uniqueMonsterData);
void InitLevelMonsters(); void InitLevelMonsters();
void GetLevelMTypes(); void GetLevelMTypes();
void InitMonsterGFX(int monsterTypeIndex); void InitMonsterGFX(size_t monsterTypeIndex);
void WeakenNaKrul(); void WeakenNaKrul();
void InitGolems(); void InitGolems();
void InitMonsters(); void InitMonsters();
void SetMapMonsters(const uint16_t *dunData, Point startPosition); 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); void AddDoppelganger(Monster &monster);
bool M_Talker(const Monster &monster); bool M_Talker(const Monster &monster);
void M_StartStand(Monster &monster, Direction md); void M_StartStand(Monster &monster, Direction md);

8
Source/msg.cpp

@ -348,7 +348,7 @@ size_t DeltaImportObject(const byte *src, DObjectStr *dst)
byte *DeltaExportMonster(byte *dst, const DMonsterStr *src) 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) { if (src->position.x == 0xFF) {
*dst++ = byte { 0xFF }; *dst++ = byte { 0xFF };
} else { } else {
@ -363,7 +363,7 @@ byte *DeltaExportMonster(byte *dst, const DMonsterStr *src)
void DeltaImportMonster(const byte *src, DMonsterStr *dst) void DeltaImportMonster(const byte *src, DMonsterStr *dst)
{ {
size_t size = 0; 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 }) { if (src[size] == byte { 0xFF }) {
memset(dst, 0xFF, sizeof(DMonsterStr)); memset(dst, 0xFF, sizeof(DMonsterStr));
size++; size++;
@ -522,7 +522,7 @@ void DeltaLeaveSync(uint8_t bLevel)
DLevel &deltaLevel = GetDeltaLevel(bLevel); DLevel &deltaLevel = GetDeltaLevel(bLevel);
for (int i = 0; i < ActiveMonsterCount; i++) { for (size_t i = 0; i < ActiveMonsterCount; i++) {
int ma = ActiveMonsters[i]; int ma = ActiveMonsters[i];
auto &monster = Monsters[ma]; auto &monster = Monsters[ma];
if (monster.hitPoints == 0) if (monster.hitPoints == 0)
@ -2445,7 +2445,7 @@ void DeltaLoadLevel()
uint8_t localLevel = GetLevelForMultiplayer(*MyPlayer); uint8_t localLevel = GetLevelForMultiplayer(*MyPlayer);
DLevel &deltaLevel = GetDeltaLevel(localLevel); DLevel &deltaLevel = GetDeltaLevel(localLevel);
if (leveltype != DTYPE_TOWN) { 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) if (deltaLevel.monster[i].position.x == 0xFF)
continue; continue;

2
Source/multi.cpp

@ -195,7 +195,7 @@ void MonsterSeeds()
{ {
sgdwGameLoops++; sgdwGameLoops++;
const uint32_t seed = (sgdwGameLoops >> 8) | (sgdwGameLoops << 24); // _rotr(sgdwGameLoops, 8) 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; Monsters[i].aiSeed = seed + i;
} }

7
Source/player.cpp

@ -785,14 +785,11 @@ bool DamageWeapon(Player &player, unsigned damageFrequency)
return false; return false;
} }
bool PlrHitMonst(int pnum, int monsterId, bool adjacentDamage = false) bool PlrHitMonst(int pnum, size_t monsterId, bool adjacentDamage = false)
{ {
int hper = 0; int hper = 0;
if (monsterId < 0 || monsterId >= MaxMonsters) { Monster &monster = Monsters[monsterId];
app_fatal(StrCat("PlrHitMonst: illegal monster ", monsterId));
}
auto &monster = Monsters[monsterId];
if (pnum < 0 || pnum >= MAX_PLRS) { if (pnum < 0 || pnum >= MAX_PLRS) {
app_fatal(StrCat("PlrHitMonst: illegal player ", pnum)); app_fatal(StrCat("PlrHitMonst: illegal player ", pnum));

16
Source/sync.cpp

@ -14,14 +14,14 @@ namespace devilution {
namespace { namespace {
uint16_t sgnMonsterPriority[MaxMonsters]; uint16_t sgnMonsterPriority[MaxMonsters];
int sgnMonsters; size_t sgnMonsters;
uint16_t sgwLRU[MaxMonsters]; uint16_t sgwLRU[MaxMonsters];
int sgnSyncItem; int sgnSyncItem;
int sgnSyncPInv; int sgnSyncPInv;
void SyncOneMonster() void SyncOneMonster()
{ {
for (int i = 0; i < ActiveMonsterCount; i++) { for (size_t i = 0; i < ActiveMonsterCount; i++) {
int m = ActiveMonsters[i]; int m = ActiveMonsters[i];
auto &monster = Monsters[m]; auto &monster = Monsters[m];
sgnMonsterPriority[m] = MyPlayer->position.tile.ManhattanDistance(monster.position.tile); sgnMonsterPriority[m] = MyPlayer->position.tile.ManhattanDistance(monster.position.tile);
@ -53,7 +53,7 @@ bool SyncMonsterActive(TSyncMonster &monsterSync)
int ndx = -1; int ndx = -1;
uint32_t lru = 0xFFFFFFFF; uint32_t lru = 0xFFFFFFFF;
for (int i = 0; i < ActiveMonsterCount; i++) { for (size_t i = 0; i < ActiveMonsterCount; i++) {
int m = ActiveMonsters[i]; int m = ActiveMonsters[i];
if (sgnMonsterPriority[m] < lru && sgwLRU[m] < 0xFFFE) { if (sgnMonsterPriority[m] < lru && sgwLRU[m] < 0xFFFE) {
lru = sgnMonsterPriority[m]; lru = sgnMonsterPriority[m];
@ -74,7 +74,7 @@ bool SyncMonsterActive2(TSyncMonster &monsterSync)
int ndx = -1; int ndx = -1;
uint32_t lru = 0xFFFE; uint32_t lru = 0xFFFE;
for (int i = 0; i < ActiveMonsterCount; i++) { for (size_t i = 0; i < ActiveMonsterCount; i++) {
if (sgnMonsters >= ActiveMonsterCount) { if (sgnMonsters >= ActiveMonsterCount) {
sgnMonsters = 0; sgnMonsters = 0;
} }
@ -211,7 +211,7 @@ bool IsEnemyIdValid(const Monster &monster, int enemyId)
} }
enemyId -= MAX_PLRS; enemyId -= MAX_PLRS;
if (enemyId >= MaxMonsters) { if (static_cast<size_t>(enemyId) >= MaxMonsters) {
return false; return false;
} }
@ -230,9 +230,9 @@ bool IsEnemyIdValid(const Monster &monster, int enemyId)
bool IsTSyncMonsterValidate(const TSyncMonster &monsterSync) 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; return false;
if (!InDungeonBounds({ monsterSync._mx, monsterSync._my })) if (!InDungeonBounds({ monsterSync._mx, monsterSync._my }))
@ -266,7 +266,7 @@ uint32_t sync_all_monsters(byte *pbBuf, uint32_t dwMaxLen)
assert(dwMaxLen <= 0xffff); assert(dwMaxLen <= 0xffff);
SyncOneMonster(); 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<TSyncMonster *>(pbBuf); auto &monsterSync = *reinterpret_cast<TSyncMonster *>(pbBuf);
bool sync = false; bool sync = false;
if (i < 2) { if (i < 2) {

Loading…
Cancel
Save