Browse Source

Change MonsterTrapHit and MonsterMHit from index to Monster reference

pull/8252/head
obligaron 8 months ago committed by Anders Jenbo
parent
commit
78a3edb719
  1. 45
      Source/missiles.cpp
  2. 2
      Source/missiles.h
  3. 14
      Source/objects.cpp

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

2
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);
/**

14
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) {

Loading…
Cancel
Save