From 770f3a2f20d4c5dd6cd7daeb7d8f131a65c4114b Mon Sep 17 00:00:00 2001 From: qndel Date: Sun, 8 Aug 2021 22:44:20 +0200 Subject: [PATCH] unify ranged and melee pierce --- Source/control.cpp | 2 +- Source/missiles.cpp | 5 ++--- Source/player.cpp | 20 +------------------- Source/player.h | 46 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 23 deletions(-) diff --git a/Source/control.cpp b/Source/control.cpp index 2b3d0fd25..ebd68e109 100644 --- a/Source/control.cpp +++ b/Source/control.cpp @@ -1447,7 +1447,7 @@ void DrawChr(const Surface &out) style = UiFlags::ColorBlue; if (myPlayer._pIBonusToHit < 0) style = UiFlags::ColorRed; - sprintf(chrstr, "%i%%", (myPlayer.InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_BOW ? myPlayer.GetRangedToHit() : myPlayer.GetMeleeToHit())); + sprintf(chrstr, "%i%%", (myPlayer.InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_BOW ? myPlayer.GetRangedPiercingToHit() : myPlayer.GetMeleePiercingToHit())); DrawString(out, chrstr, { GetPanelPosition(UiPanels::Character, { 258, 211 }), { 43, 0 } }, style | UiFlags::AlignCenter); style = UiFlags::ColorSilver; diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 28c1ed9e0..27cb0f158 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -234,10 +234,9 @@ bool MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, missile_id t if (pnum != -1) { const auto &player = Players[pnum]; if (MissileData[t].mType == 0) { - hper = player.GetRangedToHit(); - hper -= monster.mArmorClass; + hper = player.GetRangedPiercingToHit(); + hper -= player.CalculateArmorPierce(monster.mArmorClass, false); hper -= (dist * dist) / 2; - hper += player._pIEnAc; } else { hper = player.GetMagicToHit() - (monster.mLevel * 2) - dist; } diff --git a/Source/player.cpp b/Source/player.cpp index 49dfed73b..a93bf67bc 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -905,25 +905,7 @@ bool PlrHitMonst(int pnum, int m) hit = 0; } - int tmac = monster.mArmorClass; - if (gbIsHellfire && player._pIEnAc > 0) { - int pIEnAc = player._pIEnAc - 1; - if (pIEnAc > 0) - tmac >>= pIEnAc; - else - tmac -= tmac / 4; - - if (player._pClass == HeroClass::Barbarian) { - tmac -= monster.mArmorClass / 8; - } - - if (tmac < 0) - tmac = 0; - } else { - tmac -= player._pIEnAc; - } - - hper += player.GetMeleeToHit() - tmac; + hper += player.GetMeleePiercingToHit() - player.CalculateArmorPierce(monster.mArmorClass, true); hper = clamp(hper, 5, 95); bool ret = false; diff --git a/Source/player.h b/Source/player.h index 29b0fcc47..45cefdfd3 100644 --- a/Source/player.h +++ b/Source/player.h @@ -415,8 +415,21 @@ struct PlayerStruct { return hper; } + /** + * @brief Return player's melee to hit value, including armor piercing + */ + int GetMeleePiercingToHit() const + { + int hper = GetMeleeToHit(); + //in hellfire armor piercing ignores % of enemy armor instead, no way to include it here + if (!gbIsHellfire) + hper += _pIEnAc; + return hper; + } + /** * @brief Return player's ranged to hit value + * @param pierceArmor - indicate if player's armor piercing should be included - true vs monsters, false vs players */ int GetRangedToHit() const { @@ -428,6 +441,15 @@ struct PlayerStruct { return hper; } + int GetRangedPiercingToHit() const + { + int hper = GetRangedToHit(); + //in hellfire armor piercing ignores % of enemy armor instead, no way to include it here + if (!gbIsHellfire) + hper += _pIEnAc; + return hper; + } + /** * @brief Return magic hit chance */ @@ -453,6 +475,30 @@ struct PlayerStruct { return blkper; } + /** + * @brief Return monster armor value after including player's armor piercing % (hellfire only) + * @param monsterArmor - monster armor before applying % armor pierce + * @param isMelee - indicates if it's melee or ranged combat + */ + int CalculateArmorPierce(int monsterArmor, bool isMelee) const + { + int tmac = monsterArmor; + if (gbIsHellfire && _pIEnAc > 0) { + int pIEnAc = _pIEnAc - 1; + if (pIEnAc > 0) + tmac >>= pIEnAc; + else + tmac -= tmac / 4; + } + if (isMelee && _pClass == HeroClass::Barbarian) { + tmac -= monsterArmor / 8; + } + if (tmac < 0) + tmac = 0; + + return tmac; + } + /** * @brief Calculates the players current Hit Points as a percentage of their max HP and stores it for later reference *