From 78a3edb719bb690b2c678219fdfc593d93c30753 Mon Sep 17 00:00:00 2001 From: obligaron Date: Fri, 1 Aug 2025 20:45:04 +0200 Subject: [PATCH] Change MonsterTrapHit and MonsterMHit from index to Monster reference --- Source/missiles.cpp | 45 ++++++++++++++++++++------------------------- Source/missiles.h | 2 +- Source/objects.cpp | 14 +++++++------- 3 files changed, 28 insertions(+), 33 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index b9507812f..9ffdb164a 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -274,10 +274,8 @@ int ProjectileTrapDamage() return currlevel + GenerateRnd(2 * currlevel); } -bool MonsterMHit(const Player &player, int monsterId, int mindam, int maxdam, int dist, MissileID t, WorldTilePosition startPos, DamageType damageType, bool shift) +bool MonsterMHit(const Player &player, Monster &monster, int mindam, int maxdam, int dist, MissileID t, WorldTilePosition startPos, DamageType damageType, bool shift) { - Monster &monster = Monsters[monsterId]; - if (!monster.isPossibleToHit() || monster.isImmune(t, damageType)) return false; @@ -479,23 +477,22 @@ void CheckMissileCol(Missile &missile, DamageType damageType, int minDamage, int if (!InDungeonBounds(position)) return; - const int mx = position.x; - const int my = position.y; - bool isMonsterHit = false; - int mid = dMonster[mx][my]; - if (mid > 0 || (mid != 0 && Monsters[std::abs(mid) - 1].mode == MonsterMode::Petrified)) { - mid = std::abs(mid) - 1; - if (missile.IsTrap() - || (missile._micaster == TARGET_PLAYERS && ( // or was fired by a monster and - Monsters[mid].isPlayerMinion() != Monsters[missile._misource].isPlayerMinion() // the monsters are on opposing factions - || (Monsters[missile._misource].flags & MFLAG_BERSERK) != 0 // or the attacker is berserked - || (Monsters[mid].flags & MFLAG_BERSERK) != 0 // or the target is berserked - ))) { - // then the missile can potentially hit this target - isMonsterHit = MonsterTrapHit(mid, minDamage, maxDamage, missile._midist, missile._mitype, damageType, isDamageShifted); - } else if (IsAnyOf(missile._micaster, TARGET_BOTH, TARGET_MONSTERS)) { - isMonsterHit = MonsterMHit(*missile.sourcePlayer(), mid, minDamage, maxDamage, missile._midist, missile._mitype, missile.position.start, damageType, isDamageShifted); + int mid = dMonster[position.x][position.y]; + if (mid != 0) { + Monster &monster = Monsters[std::abs(mid) - 1]; + if (mid > 0 || monster.mode == MonsterMode::Petrified) { + if (missile.IsTrap() + || (missile._micaster == TARGET_PLAYERS && ( // or was fired by a monster and + monster.isPlayerMinion() != Monsters[missile._misource].isPlayerMinion() // the monsters are on opposing factions + || (Monsters[missile._misource].flags & MFLAG_BERSERK) != 0 // or the attacker is berserked + || (monster.flags & MFLAG_BERSERK) != 0 // or the target is berserked + ))) { + // then the missile can potentially hit this target + isMonsterHit = MonsterTrapHit(monster, minDamage, maxDamage, missile._midist, missile._mitype, damageType, isDamageShifted); + } else if (IsAnyOf(missile._micaster, TARGET_BOTH, TARGET_MONSTERS)) { + isMonsterHit = MonsterMHit(*missile.sourcePlayer(), monster, minDamage, maxDamage, missile._midist, missile._mitype, missile.position.start, damageType, isDamageShifted); + } } } @@ -507,7 +504,7 @@ void CheckMissileCol(Missile &missile, DamageType damageType, int minDamage, int bool isPlayerHit = false; bool blocked = false; - Player *player = PlayerAtPosition({ mx, my }, true); + Player *player = PlayerAtPosition(position, true); if (player != nullptr) { if (missile._micaster != TARGET_BOTH && !missile.IsTrap()) { if (missile._micaster == TARGET_MONSTERS) { @@ -532,8 +529,8 @@ void CheckMissileCol(Missile &missile, DamageType damageType, int minDamage, int missile._miHitFlag = true; } - if (IsMissileBlockedByTile({ mx, my })) { - Object *object = FindObjectAtPosition({ mx, my }); + if (IsMissileBlockedByTile(position)) { + Object *object = FindObjectAtPosition(position); if (object != nullptr && object->IsBreakable()) { BreakObjectMissile(missile.sourcePlayer(), *object); } @@ -995,10 +992,8 @@ Direction16 GetDirection16(Point p1, Point p2) return ret; } -bool MonsterTrapHit(int monsterId, int mindam, int maxdam, int dist, MissileID t, DamageType damageType, bool shift) +bool MonsterTrapHit(Monster &monster, int mindam, int maxdam, int dist, MissileID t, DamageType damageType, bool shift) { - Monster &monster = Monsters[monsterId]; - if (!monster.isPossibleToHit() || monster.isImmune(t, damageType)) return false; diff --git a/Source/missiles.h b/Source/missiles.h index 334c066a8..5cb6d0082 100644 --- a/Source/missiles.h +++ b/Source/missiles.h @@ -264,7 +264,7 @@ DamageRange GetDamageAmt(SpellID spell, int spellLevel); * @return the direction of the p1->p2 vector */ Direction16 GetDirection16(Point p1, Point p2); -bool MonsterTrapHit(int monsterId, int mindam, int maxdam, int dist, MissileID t, DamageType damageType, bool shift); +bool MonsterTrapHit(Monster &monster, int mindam, int maxdam, int dist, MissileID t, DamageType damageType, bool shift); bool PlayerMHit(Player &player, Monster *monster, int dist, int mind, int maxd, MissileID mtype, DamageType damageType, bool shift, DeathReason deathReason, bool *blocked); /** diff --git a/Source/objects.cpp b/Source/objects.cpp index 675cc1c6d..e8afa3745 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -1624,12 +1624,11 @@ void UpdateFlameTrap(Object &trap) const int mindam = damage[leveltype - 1]; const int maxdam = mindam * 2; - const int x = trap.position.x; - const int y = trap.position.y; constexpr MissileID TrapMissile = MissileID::FireWallControl; - if (dMonster[x][y] > 0) - MonsterTrapHit(dMonster[x][y] - 1, mindam / 2, maxdam / 2, 0, TrapMissile, GetMissileData(TrapMissile).damageType(), false); - Player *player = PlayerAtPosition({ x, y }, true); + Monster *monster = FindMonsterAtPosition(trap.position, true); + if (monster != nullptr) + MonsterTrapHit(*monster, mindam / 2, maxdam / 2, 0, TrapMissile, GetMissileData(TrapMissile).damageType(), false); + Player *player = PlayerAtPosition(trap.position, true); if (player != nullptr) { bool unused; PlayerMHit(*player, nullptr, 0, mindam, maxdam, TrapMissile, GetMissileData(TrapMissile).damageType(), false, DeathReason::MonsterOrTrap, &unused); @@ -3490,8 +3489,9 @@ void BreakBarrel(const Player &player, Object &barrel, bool forcebreak, bool sen for (int yp = barrel.position.y - 1; yp <= barrel.position.y + 1; yp++) { for (int xp = barrel.position.x - 1; xp <= barrel.position.x + 1; xp++) { constexpr MissileID TrapMissile = MissileID::Firebolt; - if (dMonster[xp][yp] > 0) { - MonsterTrapHit(dMonster[xp][yp] - 1, 1, 4, 0, TrapMissile, GetMissileData(TrapMissile).damageType(), false); + Monster *monster = FindMonsterAtPosition({ xp, yp }, true); + if (monster != nullptr) { + MonsterTrapHit(*monster, 1, 4, 0, TrapMissile, GetMissileData(TrapMissile).damageType(), false); } Player *adjacentPlayer = PlayerAtPosition({ xp, yp }, true); if (adjacentPlayer != nullptr) {