Browse Source

♻️ Refactor AddMonster to return a monster pointer (#4894)

pull/4861/head^2
Cesar Canassa 4 years ago committed by GitHub
parent
commit
de971c6a8b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 11
      Source/debug.cpp
  2. 32
      Source/levels/themes.cpp
  3. 6
      Source/missiles.cpp
  4. 42
      Source/monster.cpp
  5. 6
      Source/monster.h
  6. 28
      Source/objects.cpp

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

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

6
Source/missiles.cpp

@ -2952,9 +2952,9 @@ void MI_HorkSpawn(Missile &missile)
if (spawnPosition) {
auto facing = static_cast<Direction>(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 {

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

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

28
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<uint16_t>(barrel.GetId()));

Loading…
Cancel
Save