Browse Source

Remove unique monster's light when no corpse is left behind

pull/6046/head
staphen 3 years ago committed by Anders Jenbo
parent
commit
45da8b2295
  1. 22
      Source/dead.cpp
  2. 2
      Source/dead.h
  3. 2
      Source/loadsave.cpp
  4. 2
      Source/monster.cpp

22
Source/dead.cpp

@ -28,6 +28,19 @@ void InitDeadAnimationFromMonster(Corpse &corpse, const CMonster &mon)
corpse.frame = animData.frames - 1;
corpse.width = animData.width;
}
void MoveLightToCorpse(Monster &monster)
{
for (int dx = 0; dx < MAXDUNX; dx++) {
for (int dy = 0; dy < MAXDUNY; dy++) {
if ((dCorpse[dx][dy] & 0x1F) == monster.corpseId) {
ChangeLightXY(monster.lightId, { dx, dy });
return;
}
}
}
AddUnLight(monster.lightId);
}
} // namespace
void InitCorpses()
@ -79,18 +92,13 @@ void AddCorpse(Point tilePosition, int8_t dv, Direction ddir)
dCorpse[tilePosition.x][tilePosition.y] = (dv & 0x1F) + (static_cast<int>(ddir) << 5);
}
void SyncUniqDead()
void MoveLightsToCorpses()
{
for (size_t i = 0; i < ActiveMonsterCount; i++) {
auto &monster = Monsters[ActiveMonsters[i]];
if (!monster.isUnique())
continue;
for (int dx = 0; dx < MAXDUNX; dx++) {
for (int dy = 0; dy < MAXDUNY; dy++) {
if ((dCorpse[dx][dy] & 0x1F) == monster.corpseId)
ChangeLightXY(monster.lightId, { dx, dy });
}
}
MoveLightToCorpse(monster);
}
}

2
Source/dead.h

@ -39,6 +39,6 @@ extern int8_t stonendx;
void InitCorpses();
void AddCorpse(Point tilePosition, int8_t dv, Direction ddir);
void SyncUniqDead();
void MoveLightsToCorpses();
} // namespace devilution

2
Source/loadsave.cpp

@ -2590,7 +2590,7 @@ void LoadLevel()
for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert)
dCorpse[i][j] = file.NextLE<int8_t>();
}
SyncUniqDead();
MoveLightsToCorpses();
}
ActiveMonsterCount = file.NextBE<int32_t>();

2
Source/monster.cpp

@ -3699,6 +3699,8 @@ void MonsterDeath(Monster &monster, Direction md, bool sendmsg)
md = Direction::South;
NewMonsterAnim(monster, MonsterGraphic::Death, md, gGameLogicStep < GameLogicStep::ProcessMonsters ? AnimationDistributionFlags::ProcessAnimationPending : AnimationDistributionFlags::None);
monster.mode = MonsterMode::Death;
} else if (monster.isUnique()) {
AddUnLight(monster.lightId);
}
monster.goal = MonsterGoal::None;
monster.var1 = 0;

Loading…
Cancel
Save