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;
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];

6
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;

10
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;

4
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) {

6
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) {

2
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);

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

2
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<size_t>(mi) >= MaxMonsters) {
Log("Draw Monster: tried to draw illegal monster {}", mi);
return;
}

6
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++;

12
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<int32_t>();
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<int8_t>(MaxMissilesForSaveGame);
@ -2346,7 +2346,7 @@ void SaveGameData(MpqWriter &saveWriter)
if (leveltype != DTYPE_TOWN) {
for (int monsterId : ActiveMonsters)
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]]);
// 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<int32_t>(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<int8_t>(objectId);
@ -2555,7 +2555,7 @@ void LoadLevel()
if (leveltype != DTYPE_TOWN) {
for (int &monsterId : ActiveMonsters)
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]]);
for (int &objectId : ActiveObjects)
objectId = file.NextLE<int8_t>();

148
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<int>(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<int>(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<size_t>(i) < MaxMonsters);
Monster &killer = Monsters[i];
assert(mid >= 0 && mid < MaxMonsters);
assert(static_cast<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId];
if (monster.mode != MonsterMode::Stand || monster.activeForTicks == 0) {
@ -2337,7 +2337,7 @@ std::optional<Point> ScavengerFindCorpse(const Monster &scavenger)
void ScavengerAi(int monsterId)
{
assert(monsterId >= 0 && monsterId < MaxMonsters);
assert(static_cast<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<uint8_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(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<size_t>(monsterId) < MaxMonsters);
auto &monster = Monsters[monsterId];
Point oldPosition = missile.position.tile;

16
Source/monster.h

@ -5,8 +5,10 @@
*/
#pragma once
#include <array>
#include <cstddef>
#include <cstdint>
#include <array>
#include <functional>
#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);

8
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;

2
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;
}

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

16
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<size_t>(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<TSyncMonster *>(pbBuf);
bool sync = false;
if (i < 2) {

Loading…
Cancel
Save