forked from mirror/openmw-tes3mp
Implement elemental shield damage to attacker (Feature #1121)
This commit is contained in:
parent
f43a10b7b9
commit
123157b216
4 changed files with 55 additions and 0 deletions
|
@ -330,6 +330,8 @@ namespace MWClass
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MWMechanics::applyElementalShields(ptr, victim);
|
||||||
|
|
||||||
if (!weapon.isEmpty() && MWMechanics::blockMeleeAttack(ptr, victim, weapon, damage))
|
if (!weapon.isEmpty() && MWMechanics::blockMeleeAttack(ptr, victim, weapon, damage))
|
||||||
damage = 0;
|
damage = 0;
|
||||||
|
|
||||||
|
|
|
@ -630,6 +630,8 @@ namespace MWClass
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MWMechanics::applyElementalShields(ptr, victim);
|
||||||
|
|
||||||
if (!weapon.isEmpty() && MWMechanics::blockMeleeAttack(ptr, victim, weapon, damage))
|
if (!weapon.isEmpty() && MWMechanics::blockMeleeAttack(ptr, victim, weapon, damage))
|
||||||
damage = 0;
|
damage = 0;
|
||||||
|
|
||||||
|
|
|
@ -256,4 +256,52 @@ namespace MWMechanics
|
||||||
return hitchance;
|
return hitchance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void applyElementalShields(const MWWorld::Ptr &attacker, const MWWorld::Ptr &victim)
|
||||||
|
{
|
||||||
|
for (int i=0; i<3; ++i)
|
||||||
|
{
|
||||||
|
float magnitude = victim.getClass().getCreatureStats(victim).getMagicEffects().get(ESM::MagicEffect::FireShield+i).mMagnitude;
|
||||||
|
|
||||||
|
if (!magnitude)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
CreatureStats& attackerStats = attacker.getClass().getCreatureStats(attacker);
|
||||||
|
float saveTerm = attacker.getClass().getSkill(attacker, ESM::Skill::Destruction)
|
||||||
|
+ 0.2f * attackerStats.getAttribute(ESM::Attribute::Willpower).getModified()
|
||||||
|
+ 0.1f * attackerStats.getAttribute(ESM::Attribute::Luck).getModified();
|
||||||
|
|
||||||
|
int fatigueMax = attackerStats.getFatigue().getModified();
|
||||||
|
int fatigueCurrent = attackerStats.getFatigue().getCurrent();
|
||||||
|
|
||||||
|
float normalisedFatigue = fatigueMax==0 ? 1 : std::max (0.0f, static_cast<float> (fatigueCurrent)/fatigueMax);
|
||||||
|
|
||||||
|
saveTerm *= 1.25f * normalisedFatigue;
|
||||||
|
|
||||||
|
float roll = std::rand()/ (static_cast<double> (RAND_MAX) + 1) * 100; // [0, 99]
|
||||||
|
float x = std::max(0.f, saveTerm - roll);
|
||||||
|
|
||||||
|
int element = ESM::MagicEffect::FireDamage;
|
||||||
|
if (i == 1)
|
||||||
|
element = ESM::MagicEffect::ShockDamage;
|
||||||
|
if (i == 2)
|
||||||
|
element = ESM::MagicEffect::FrostDamage;
|
||||||
|
|
||||||
|
short resistanceEffect = ESM::MagicEffect::getResistanceEffect(element);
|
||||||
|
short weaknessEffect = ESM::MagicEffect::getWeaknessEffect(element);
|
||||||
|
float elementResistance = 0;
|
||||||
|
if (resistanceEffect != -1)
|
||||||
|
elementResistance += attackerStats.getMagicEffects().get(resistanceEffect).mMagnitude;
|
||||||
|
if (weaknessEffect != -1)
|
||||||
|
elementResistance -= attackerStats.getMagicEffects().get(weaknessEffect).mMagnitude;
|
||||||
|
|
||||||
|
x = std::min(100.f, x + elementResistance);
|
||||||
|
|
||||||
|
static const float fElementalShieldMult = MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find("fElementalShieldMult")->getFloat();
|
||||||
|
x = fElementalShieldMult * magnitude * (1.f - 0.01f * x);
|
||||||
|
MWMechanics::DynamicStat<float> health = attackerStats.getHealth();
|
||||||
|
health.setCurrent(health.getCurrent() - x);
|
||||||
|
attackerStats.setHealth(health);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,9 @@ void projectileHit (const MWWorld::Ptr& attacker, const MWWorld::Ptr& victim, MW
|
||||||
/// Get the chance (in percent) for \a attacker to successfully hit \a victim with a given weapon skill value
|
/// Get the chance (in percent) for \a attacker to successfully hit \a victim with a given weapon skill value
|
||||||
float getHitChance (const MWWorld::Ptr& attacker, const MWWorld::Ptr& victim, int skillValue);
|
float getHitChance (const MWWorld::Ptr& attacker, const MWWorld::Ptr& victim, int skillValue);
|
||||||
|
|
||||||
|
/// Applies damage to attacker based on the victim's elemental shields.
|
||||||
|
void applyElementalShields(const MWWorld::Ptr& attacker, const MWWorld::Ptr& victim);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue