Browse Source

Introduce SpawnMonster

pull/6897/head
obligaron 2 years ago committed by Anders Jenbo
parent
commit
423150b457
  1. 5
      Source/missiles.cpp
  2. 30
      Source/monster.cpp
  3. 1
      Source/monster.h

5
Source/missiles.cpp

@ -3080,10 +3080,7 @@ void ProcessHorkSpawn(Missile &missile)
if (spawnPosition) { if (spawnPosition) {
auto facing = static_cast<Direction>(missile.var1); auto facing = static_cast<Direction>(missile.var1);
Monster *monster = AddMonster(*spawnPosition, facing, 1, true); SpawnMonster(*spawnPosition, facing, 1);
if (monster != nullptr) {
M_StartStand(*monster, facing);
}
} }
} else { } else {
missile._midist++; missile._midist++;

30
Source/monster.cpp

@ -1538,7 +1538,7 @@ void MonsterPetrified(Monster &monster)
} }
} }
Monster *AddSkeleton(Point position, Direction dir, bool inMap) std::optional<size_t> GetRandomSkeletonTypeIndex()
{ {
int32_t typeCount = 0; int32_t typeCount = 0;
size_t skeletonIndexes[SkeletonTypes.size()]; size_t skeletonIndexes[SkeletonTypes.size()];
@ -1549,18 +1549,20 @@ Monster *AddSkeleton(Point position, Direction dir, bool inMap)
} }
if (typeCount == 0) { if (typeCount == 0) {
return nullptr; return {};
} }
const size_t typeIndex = skeletonIndexes[GenerateRnd(typeCount)]; const size_t typeIndex = skeletonIndexes[GenerateRnd(typeCount)];
return AddMonster(position, dir, typeIndex, inMap); return typeIndex;
} }
void SpawnSkeleton(Point position, Direction dir) Monster *AddSkeleton(Point position, Direction dir, bool inMap)
{ {
Monster *skeleton = AddSkeleton(position, dir, true); auto typeIndex = GetRandomSkeletonTypeIndex();
if (skeleton != nullptr) if (!typeIndex)
StartSpecialStand(*skeleton, dir); return nullptr;
return AddMonster(position, dir, *typeIndex, inMap);
} }
bool IsLineNotSolid(Point startPoint, Point endPoint) bool IsLineNotSolid(Point startPoint, Point endPoint)
@ -2295,7 +2297,10 @@ void LeoricAi(Monster &monster)
&& LineClearMissile(monster.position.tile, monster.enemyPosition)) { && LineClearMissile(monster.position.tile, monster.enemyPosition)) {
Point newPosition = monster.position.tile + md; Point newPosition = monster.position.tile + md;
if (IsTileAvailable(monster, newPosition) && ActiveMonsterCount < MaxMonsters) { if (IsTileAvailable(monster, newPosition) && ActiveMonsterCount < MaxMonsters) {
SpawnSkeleton(newPosition, md); auto typeIndex = GetRandomSkeletonTypeIndex();
if (typeIndex) {
SpawnMonster(newPosition, md, *typeIndex, true);
}
StartSpecialStand(monster, md); StartSpecialStand(monster, md);
} }
} else { } else {
@ -3638,6 +3643,13 @@ Monster *AddMonster(Point position, Direction dir, size_t typeIndex, bool inMap)
return nullptr; return nullptr;
} }
void SpawnMonster(Point position, Direction dir, size_t typeIndex, bool startSpecialStand /*= false*/)
{
Monster *monster = AddMonster(position, dir, typeIndex, true);
if (startSpecialStand && monster != nullptr)
StartSpecialStand(*monster, dir);
}
void AddDoppelganger(Monster &monster) void AddDoppelganger(Monster &monster)
{ {
Point target = { 0, 0 }; Point target = { 0, 0 };
@ -3649,7 +3661,7 @@ void AddDoppelganger(Monster &monster)
} }
if (target != Point { 0, 0 }) { if (target != Point { 0, 0 }) {
const size_t typeIndex = GetMonsterTypeIndex(monster.type().type); const size_t typeIndex = GetMonsterTypeIndex(monster.type().type);
AddMonster(target, monster.direction, typeIndex, true); SpawnMonster(target, monster.direction, typeIndex);
} }
} }

1
Source/monster.h

@ -495,6 +495,7 @@ 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, size_t mtype, bool inMap); Monster *AddMonster(Point position, Direction dir, size_t mtype, bool inMap);
void SpawnMonster(Point position, Direction dir, size_t typeIndex, bool startSpecialStand = false);
void AddDoppelganger(Monster &monster); void AddDoppelganger(Monster &monster);
void ApplyMonsterDamage(DamageType damageType, Monster &monster, int damage); void ApplyMonsterDamage(DamageType damageType, Monster &monster, int damage);
bool M_Talker(const Monster &monster); bool M_Talker(const Monster &monster);

Loading…
Cancel
Save