diff --git a/Source/debug.cpp b/Source/debug.cpp index 426004195..0e9ad434a 100644 --- a/Source/debug.cpp +++ b/Source/debug.cpp @@ -731,13 +731,12 @@ std::string DebugCmdSpawnUniqueMonster(const string_view parameter) if (!IsTileWalkable(pos)) continue; - int mon = AddMonster(pos, myPlayer._pdir, id, true); - if (mon < 0) + Monster *monster = AddMonster(pos, myPlayer._pdir, id, true); + if (monster == nullptr) return fmt::format("I could only summon {} Monsters. The rest strike for shorter working hours.", spawnedMonster); - auto &monster = Monsters[mon]; - PrepareUniqueMonst(monster, uniqueIndex, 0, 0, UniqueMonstersData[uniqueIndex]); + PrepareUniqueMonst(*monster, uniqueIndex, 0, 0, UniqueMonstersData[uniqueIndex]); ActiveMonsterCount--; - monster._udeadval = 1; + monster->_udeadval = 1; spawnedMonster += 1; if (spawnedMonster >= count) @@ -816,7 +815,7 @@ std::string DebugCmdSpawnMonster(const string_view parameter) if (!IsTileWalkable(pos)) continue; - if (AddMonster(pos, myPlayer._pdir, id, true) < 0) + if (AddMonster(pos, myPlayer._pdir, id, true) == nullptr) return fmt::format("I could only summon {} Monsters. The rest strike for shorter working hours.", spawnedMonster); spawnedMonster += 1; diff --git a/Source/levels/themes.cpp b/Source/levels/themes.cpp index c987306cf..48c03f37b 100644 --- a/Source/levels/themes.cpp +++ b/Source/levels/themes.cpp @@ -594,50 +594,50 @@ void Theme_SkelRoom(int t) AddObject(OBJ_SKFIRE, { xp, yp }); if (GenerateRnd(monstrnd[leveltype - 1]) != 0) { - int i = PreSpawnSkeleton(); - SpawnSkeleton(i, { xp - 1, yp - 1 }); + Monster *skeleton = PreSpawnSkeleton(); + SpawnSkeleton(skeleton, { xp - 1, yp - 1 }); } else { AddObject(OBJ_BANNERL, { xp - 1, yp - 1 }); } { - int i = PreSpawnSkeleton(); - SpawnSkeleton(i, { xp, yp - 1 }); + Monster *skeleton = PreSpawnSkeleton(); + SpawnSkeleton(skeleton, { xp, yp - 1 }); } if (GenerateRnd(monstrnd[leveltype - 1]) != 0) { - int i = PreSpawnSkeleton(); - SpawnSkeleton(i, { xp + 1, yp - 1 }); + Monster *skeleton = PreSpawnSkeleton(); + SpawnSkeleton(skeleton, { xp + 1, yp - 1 }); } else { AddObject(OBJ_BANNERR, { xp + 1, yp - 1 }); } if (GenerateRnd(monstrnd[leveltype - 1]) != 0) { - int i = PreSpawnSkeleton(); - SpawnSkeleton(i, { xp - 1, yp }); + Monster *skeleton = PreSpawnSkeleton(); + SpawnSkeleton(skeleton, { xp - 1, yp }); } else { AddObject(OBJ_BANNERM, { xp - 1, yp }); } if (GenerateRnd(monstrnd[leveltype - 1]) != 0) { - int i = PreSpawnSkeleton(); - SpawnSkeleton(i, { xp + 1, yp }); + Monster *skeleton = PreSpawnSkeleton(); + SpawnSkeleton(skeleton, { xp + 1, yp }); } else { AddObject(OBJ_BANNERM, { xp + 1, yp }); } if (GenerateRnd(monstrnd[leveltype - 1]) != 0) { - int i = PreSpawnSkeleton(); - SpawnSkeleton(i, { xp - 1, yp + 1 }); + Monster *skeleton = PreSpawnSkeleton(); + SpawnSkeleton(skeleton, { xp - 1, yp + 1 }); } else { AddObject(OBJ_BANNERR, { xp - 1, yp + 1 }); } { - int i = PreSpawnSkeleton(); - SpawnSkeleton(i, { xp, yp + 1 }); + Monster *skeleton = PreSpawnSkeleton(); + SpawnSkeleton(skeleton, { xp, yp + 1 }); } if (GenerateRnd(monstrnd[leveltype - 1]) != 0) { - int i = PreSpawnSkeleton(); - SpawnSkeleton(i, { xp + 1, yp + 1 }); + Monster *skeleton = PreSpawnSkeleton(); + SpawnSkeleton(skeleton, { xp + 1, yp + 1 }); } else { AddObject(OBJ_BANNERL, { xp + 1, yp + 1 }); } diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 7094f1fa8..5373de87b 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -2952,9 +2952,9 @@ void MI_HorkSpawn(Missile &missile) if (spawnPosition) { auto facing = static_cast(missile.var1); - int monsterId = AddMonster(*spawnPosition, facing, 1, true); - if (monsterId != -1) { - M_StartStand(Monsters[monsterId], facing); + Monster *monster = AddMonster(*spawnPosition, facing, 1, true); + if (monster != nullptr) { + M_StartStand(*monster, facing); } } } else { diff --git a/Source/monster.cpp b/Source/monster.cpp index 1952cf7f8..3dcb8d53a 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -1710,7 +1710,7 @@ bool MonsterPetrified(Monster &monster) return false; } -int AddSkeleton(Point position, Direction dir, bool inMap) +Monster *AddSkeleton(Point position, Direction dir, bool inMap) { int j = 0; for (int i = 0; i < LevelMonsterTypeCount; i++) { @@ -1719,7 +1719,7 @@ int AddSkeleton(Point position, Direction dir, bool inMap) } if (j == 0) { - return -1; + return nullptr; } int skeltypes = GenerateRnd(j); @@ -1733,9 +1733,9 @@ int AddSkeleton(Point position, Direction dir, bool inMap) void SpawnSkeleton(Point position, Direction dir) { - int skel = AddSkeleton(position, dir, true); - if (skel != -1) - StartSpecialStand(Monsters[skel], dir); + Monster *skeleton = AddSkeleton(position, dir, true); + if (skeleton != nullptr) + StartSpecialStand(*skeleton, dir); } bool IsLineNotSolid(Point startPoint, Point endPoint) @@ -3813,17 +3813,17 @@ void SetMapMonsters(const uint16_t *dunData, Point startPosition) } } -int AddMonster(Point position, Direction dir, int mtype, bool inMap) +Monster *AddMonster(Point position, Direction dir, int mtype, bool inMap) { if (ActiveMonsterCount < MaxMonsters) { - int i = ActiveMonsters[ActiveMonsterCount++]; + Monster &monster = Monsters[ActiveMonsters[ActiveMonsterCount++]]; if (inMap) - dMonster[position.x][position.y] = i + 1; - InitMonster(Monsters[i], dir, mtype, position); - return i; + dMonster[position.x][position.y] = monster.getId() + 1; + InitMonster(monster, dir, mtype, position); + return &monster; } - return -1; + return nullptr; } void AddDoppelganger(Monster &monster) @@ -4708,16 +4708,14 @@ bool IsGoat(_monster_id mt) MT_NGOATBW, MT_BGOATBW, MT_RGOATBW, MT_GGOATBW); } -bool SpawnSkeleton(int ii, Point position) +bool SpawnSkeleton(Monster *monster, Point position) { - if (ii == -1) + if (monster == nullptr) return false; - Monster &monster = Monsters[ii]; - if (IsTileAvailable(position)) { Direction dir = GetDirection(position, position); // TODO useless calculation - ActivateSpawn(monster, position, dir); + ActivateSpawn(*monster, position, dir); return true; } @@ -4757,18 +4755,18 @@ bool SpawnSkeleton(int ii, Point position) Point spawn = position + Displacement { x2 - 1, y2 - 1 }; Direction dir = GetDirection(spawn, position); - ActivateSpawn(monster, spawn, dir); + ActivateSpawn(*monster, spawn, dir); return true; } -int PreSpawnSkeleton() +Monster *PreSpawnSkeleton() { - int skel = AddSkeleton({ 0, 0 }, Direction::South, false); - if (skel != -1) - M_StartStand(Monsters[skel], Direction::South); + Monster *skeleton = AddSkeleton({ 0, 0 }, Direction::South, false); + if (skeleton != nullptr) + M_StartStand(*skeleton, Direction::South); - return skel; + return skeleton; } void TalktoMonster(Monster &monster) diff --git a/Source/monster.h b/Source/monster.h index a7782e4eb..bc59ab950 100644 --- a/Source/monster.h +++ b/Source/monster.h @@ -301,7 +301,7 @@ void WeakenNaKrul(); void InitGolems(); void InitMonsters(); void SetMapMonsters(const uint16_t *dunData, Point startPosition); -int AddMonster(Point position, Direction dir, int mtype, bool inMap); +Monster *AddMonster(Point position, Direction dir, int mtype, bool inMap); void AddDoppelganger(Monster &monster); bool M_Talker(const Monster &monster); void M_StartStand(Monster &monster, Direction md); @@ -339,8 +339,8 @@ Monster *MonsterAtPosition(Point position); bool IsTileAvailable(const Monster &monster, Point position); bool IsSkel(_monster_id mt); bool IsGoat(_monster_id mt); -bool SpawnSkeleton(int ii, Point position); -int PreSpawnSkeleton(); +bool SpawnSkeleton(Monster *monster, Point position); +Monster *PreSpawnSkeleton(); void TalktoMonster(Monster &monster); void SpawnGolem(int id, Point position, Missile &missile); bool CanTalkToMonst(const Monster &monster); diff --git a/Source/objects.cpp b/Source/objects.cpp index 023d6199c..bce3ab7fd 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -1074,8 +1074,14 @@ void AddSarc(int i) dObject[Objects[i].position.x][Objects[i].position.y - 1] = -(i + 1); Objects[i]._oVar1 = GenerateRnd(10); Objects[i]._oRndSeed = AdvanceRndSeed(); - if (Objects[i]._oVar1 >= 8) - Objects[i]._oVar2 = PreSpawnSkeleton(); + if (Objects[i]._oVar1 >= 8) { + Monster *monster = PreSpawnSkeleton(); + if (monster != nullptr) { + Objects[i]._oVar2 = monster->getId(); + } else { + Objects[i]._oVar2 = -1; + } + } } void AddFlameTrap(int i) @@ -1127,8 +1133,14 @@ void AddBarrel(Object &barrel) barrel._oVar2 = barrel.isExplosive() ? 0 : GenerateRnd(10); barrel._oVar3 = GenerateRnd(3); - if (barrel._oVar2 >= 8) - barrel._oVar4 = PreSpawnSkeleton(); + if (barrel._oVar2 >= 8) { + Monster *skeleton = PreSpawnSkeleton(); + if (skeleton != nullptr) { + barrel._oVar4 = skeleton->getId(); + } else { + barrel._oVar4 = -1; + } + } } void AddShrine(int i) @@ -2494,8 +2506,8 @@ void OperateSarc(int i, bool sendMsg, bool sendLootMsg) SetRndSeed(Objects[i]._oRndSeed); if (Objects[i]._oVar1 <= 2) CreateRndItem(Objects[i].position, false, sendLootMsg, false); - if (Objects[i]._oVar1 >= 8) - SpawnSkeleton(Objects[i]._oVar2, Objects[i].position); + if (Objects[i]._oVar1 >= 8 && Objects[i]._oVar2 >= 0) + SpawnSkeleton(&Monsters[Objects[i]._oVar2], Objects[i].position); if (sendMsg) NetSendCmdParam1(false, CMD_OPERATEOBJ, i); } @@ -3855,8 +3867,8 @@ void BreakBarrel(int pnum, Object &barrel, bool forcebreak, bool sendmsg) else CreateRndItem(barrel.position, false, sendmsg, false); } - if (barrel._oVar2 >= 8) - SpawnSkeleton(barrel._oVar4, barrel.position); + if (barrel._oVar2 >= 8 && barrel._oVar4 >= 0) + SpawnSkeleton(&Monsters[barrel._oVar4], barrel.position); } if (pnum == MyPlayerId) { NetSendCmdParam2(false, CMD_BREAKOBJ, pnum, static_cast(barrel.GetId()));