diff --git a/Source/missiles.cpp b/Source/missiles.cpp index a3a686c2a..061ff2e37 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -1883,19 +1883,22 @@ void AddTown(Missile &missile, const AddMissileParameter ¶meter) void AddFlash(Missile &missile, const AddMissileParameter & /*parameter*/) { - if (!missile.IsTrap()) { - if (missile._micaster == TARGET_MONSTERS) { - Player &player = Players[missile._misource]; - int dmg = GenerateRndSum(20, player._pLevel + 1) + player._pLevel + 1; - missile._midam = ScaleSpellEffect(dmg, missile._mispllvl); - missile._midam += missile._midam / 2; - UseMana(player, SPL_FLASH); - } else { - missile._midam = Monsters[missile._misource].level * 2; - } - } else { + switch (missile.sourceType()) { + case MissileSource::Player: { + Player *player = missile.sourcePlayer(); + int dmg = GenerateRndSum(20, player->_pLevel + 1) + player->_pLevel + 1; + missile._midam = ScaleSpellEffect(dmg, missile._mispllvl); + missile._midam += missile._midam / 2; + UseMana(*player, SPL_FLASH); + } break; + case MissileSource::Monster: + missile._midam = missile.sourceMonster()->level * 2; + break; + case MissileSource::Trap: missile._midam = currlevel / 2; + break; } + missile._mirange = 19; } diff --git a/Source/missiles.h b/Source/missiles.h index b89b47667..f49dc2368 100644 --- a/Source/missiles.h +++ b/Source/missiles.h @@ -85,6 +85,12 @@ enum class Direction16 { South_SouthEast, }; +enum class MissileSource { + Player, + Monster, + Trap, +}; + struct Missile { /** Type of projectile */ missile_id _mitype; @@ -132,6 +138,29 @@ struct Missile { { return _misource == -1; } + + [[nodiscard]] Player *sourcePlayer() + { + if (IsNoneOf(_micaster, TARGET_BOTH, TARGET_MONSTERS) || _misource == -1) + return nullptr; + return &Players[_misource]; + } + + [[nodiscard]] Monster *sourceMonster() + { + if (_micaster != TARGET_PLAYERS || _misource == -1) + return nullptr; + return &Monsters[_misource]; + } + + MissileSource sourceType() + { + if (_misource == -1) + return MissileSource::Trap; + if (_micaster == TARGET_PLAYERS) + return MissileSource::Monster; + return MissileSource::Player; + } }; extern std::list Missiles; diff --git a/Source/objects.cpp b/Source/objects.cpp index 08e7a7cea..6fc55865e 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -2714,7 +2714,7 @@ void OperateShrineMagical(int pnum) player.position.tile, player._pdir, MIS_MANASHIELD, - TARGET_PLAYERS, + TARGET_MONSTERS, pnum, 0, 2 * leveltype); @@ -2848,7 +2848,7 @@ void OperateShrineCryptic(int pnum) player.position.tile, player._pdir, MIS_NOVA, - TARGET_PLAYERS, + TARGET_MONSTERS, pnum, 0, 2 * leveltype); @@ -2936,7 +2936,7 @@ void OperateShrineHoly(int pnum) { const Player &player = Players[pnum]; - AddMissile(player.position.tile, { 0, 0 }, Direction::South, MIS_RNDTELEPORT, TARGET_PLAYERS, pnum, 0, 2 * leveltype); + AddMissile(player.position.tile, { 0, 0 }, Direction::South, MIS_RNDTELEPORT, TARGET_MONSTERS, pnum, 0, 2 * leveltype); if (&player != MyPlayer) return; @@ -3207,7 +3207,7 @@ void OperateShrineTown(int pnum, Point spawnPosition) player.position.tile, player._pdir, MIS_TOWN, - TARGET_PLAYERS, + TARGET_MONSTERS, pnum, 0, 0); @@ -3570,7 +3570,7 @@ bool OperateFountains(int pnum, int i) player.position.tile, player._pdir, MIS_INFRA, - TARGET_PLAYERS, + TARGET_MONSTERS, pnum, 0, 2 * leveltype);