Browse Source

unify ranged and melee pierce

pull/2737/head
qndel 5 years ago committed by Anders Jenbo
parent
commit
770f3a2f20
  1. 2
      Source/control.cpp
  2. 5
      Source/missiles.cpp
  3. 20
      Source/player.cpp
  4. 46
      Source/player.h

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

5
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;
}

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

46
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
*

Loading…
Cancel
Save