Browse Source

Fix traps and monsters hitting monsters

Fixes #4669
pull/4802/head
Anders Jenbo 4 years ago
parent
commit
147cb426c8
  1. 44
      Source/missiles.cpp

44
Source/missiles.cpp

@ -191,17 +191,13 @@ bool MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, missile_id t
int hit = GenerateRnd(100);
int hper = 0;
if (pnum != -1) {
const Player &player = Players[pnum];
if (MissilesData[t].mType == 0) {
hper = player.GetRangedPiercingToHit();
hper -= player.CalculateArmorPierce(monster.mArmorClass, false);
hper -= (dist * dist) / 2;
} else {
hper = player.GetMagicToHit() - (monster.mLevel * 2) - dist;
}
const Player &player = Players[pnum];
if (MissilesData[t].mType == 0) {
hper = player.GetRangedPiercingToHit();
hper -= player.CalculateArmorPierce(monster.mArmorClass, false);
hper -= (dist * dist) / 2;
} else {
hper = GenerateRnd(75) - monster.mLevel * 2;
hper = player.GetMagicToHit() - (monster.mLevel * 2) - dist;
}
hper = clamp(hper, 5, 95);
@ -226,8 +222,6 @@ bool MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, missile_id t
dam = mindam + GenerateRnd(maxdam - mindam + 1);
}
const Player &player = Players[pnum];
if (MissilesData[t].mType == 0 && MissilesData[t].mResist == MISR_NONE) {
dam = player._pIBonusDamMod + dam * player._pIBonusDam / 100 + dam;
if (player._pClass == HeroClass::Rogue)
@ -395,25 +389,13 @@ void CheckMissileCol(Missile &missile, int minDamage, int maxDamage, bool isDama
int my = position.y;
bool isMonsterHit = false;
const int mid = dMonster[mx][my];
if (missile._micaster != TARGET_BOTH && !missile.IsTrap()) {
if (missile._micaster == TARGET_MONSTERS) {
if (mid != 0 && (mid > 0 || Monsters[abs(mid) - 1]._mmode == MonsterMode::Petrified)) {
isMonsterHit = MonsterMHit(missile._misource, abs(mid) - 1, minDamage, maxDamage, missile._midist, missile._mitype, isDamageShifted);
}
} else {
Monster &attackingMonster = Monsters[missile._misource];
if ((attackingMonster._mFlags & MFLAG_TARGETS_MONSTER) != 0
&& mid > 0
&& (Monsters[mid - 1]._mFlags & MFLAG_GOLEM) != 0)
isMonsterHit = MonsterTrapHit(mid - 1, minDamage, maxDamage, missile._midist, missile._mitype, isDamageShifted);
}
} else {
if (mid > 0) {
if (missile._micaster == TARGET_BOTH)
isMonsterHit = MonsterMHit(missile._misource, mid - 1, minDamage, maxDamage, missile._midist, missile._mitype, isDamageShifted);
else
isMonsterHit = MonsterTrapHit(mid - 1, minDamage, maxDamage, missile._midist, missile._mitype, isDamageShifted);
int mid = dMonster[mx][my];
if (mid > 0 || (mid != 0 && Monsters[abs(mid) - 1]._mmode == MonsterMode::Petrified)) {
mid = abs(mid) - 1;
if (missile.IsTrap() || (missile._micaster == TARGET_PLAYERS && (Monsters[missile._misource]._mFlags & MFLAG_TARGETS_MONSTER) != 0 && Monsters[missile._misource]._menemy == mid)) {
isMonsterHit = MonsterTrapHit(mid, minDamage, maxDamage, missile._midist, missile._mitype, isDamageShifted);
} else if (IsAnyOf(missile._micaster, TARGET_BOTH, TARGET_MONSTERS)) {
isMonsterHit = MonsterMHit(missile._misource, mid, minDamage, maxDamage, missile._midist, missile._mitype, isDamageShifted);
}
}

Loading…
Cancel
Save