From 20a0040bdb88084846c5da633f82635318428cc5 Mon Sep 17 00:00:00 2001 From: scrawl Date: Tue, 15 Jul 2014 22:06:46 +0200 Subject: [PATCH] Apply elemental shield magnitude to element resistance (Closes #1121) --- apps/openmw/mwmechanics/combat.cpp | 8 +----- apps/openmw/mwmechanics/spellcasting.cpp | 32 ++++++++++++++++-------- apps/openmw/mwmechanics/spellcasting.hpp | 5 ++++ 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/apps/openmw/mwmechanics/combat.cpp b/apps/openmw/mwmechanics/combat.cpp index 19f00e81b..5908e79cd 100644 --- a/apps/openmw/mwmechanics/combat.cpp +++ b/apps/openmw/mwmechanics/combat.cpp @@ -286,13 +286,7 @@ namespace MWMechanics 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; + float elementResistance = MWMechanics::getEffectResistanceAttribute(element, &attackerStats.getMagicEffects()); x = std::min(100.f, x + elementResistance); diff --git a/apps/openmw/mwmechanics/spellcasting.cpp b/apps/openmw/mwmechanics/spellcasting.cpp index 1b0c444ab..9253a9453 100644 --- a/apps/openmw/mwmechanics/spellcasting.cpp +++ b/apps/openmw/mwmechanics/spellcasting.cpp @@ -148,6 +148,27 @@ namespace MWMechanics return school; } + float getEffectResistanceAttribute (short effectId, const MagicEffects* actorEffects) + { + short resistanceEffect = ESM::MagicEffect::getResistanceEffect(effectId); + short weaknessEffect = ESM::MagicEffect::getWeaknessEffect(effectId); + + float resistance = 0; + if (resistanceEffect != -1) + resistance += actorEffects->get(resistanceEffect).mMagnitude; + if (weaknessEffect != -1) + resistance -= actorEffects->get(weaknessEffect).mMagnitude; + + if (effectId == ESM::MagicEffect::FireDamage) + resistance += actorEffects->get(ESM::MagicEffect::FireShield).mMagnitude; + if (effectId == ESM::MagicEffect::ShockDamage) + resistance += actorEffects->get(ESM::MagicEffect::LightningShield).mMagnitude; + if (effectId == ESM::MagicEffect::FrostDamage) + resistance += actorEffects->get(ESM::MagicEffect::FrostShield).mMagnitude; + + return resistance; + } + float getEffectResistance (short effectId, const MWWorld::Ptr& actor, const MWWorld::Ptr& caster, const ESM::Spell* spell, const MagicEffects* effects) { @@ -163,16 +184,7 @@ namespace MWMechanics float resisted = 0; if (magicEffect->mData.mFlags & ESM::MagicEffect::Harmful) { - - short resistanceEffect = ESM::MagicEffect::getResistanceEffect(effectId); - short weaknessEffect = ESM::MagicEffect::getWeaknessEffect(effectId); - - float resistance = 0; - if (resistanceEffect != -1) - resistance += magicEffects->get(resistanceEffect).mMagnitude; - if (weaknessEffect != -1) - resistance -= magicEffects->get(weaknessEffect).mMagnitude; - + float resistance = getEffectResistanceAttribute(effectId, magicEffects); float willpower = stats.getAttribute(ESM::Attribute::Willpower).getModified(); float luck = stats.getAttribute(ESM::Attribute::Luck).getModified(); diff --git a/apps/openmw/mwmechanics/spellcasting.hpp b/apps/openmw/mwmechanics/spellcasting.hpp index b526a4353..2de187ae4 100644 --- a/apps/openmw/mwmechanics/spellcasting.hpp +++ b/apps/openmw/mwmechanics/spellcasting.hpp @@ -35,6 +35,11 @@ namespace MWMechanics int getSpellSchool(const std::string& spellId, const MWWorld::Ptr& actor); int getSpellSchool(const ESM::Spell* spell, const MWWorld::Ptr& actor); + /// Get the resistance attribute against an effect for a given actor. This will add together + /// ResistX and Weakness to X effects relevant against the given effect. + float getEffectResistanceAttribute (short effectId, const MagicEffects* actorEffects); + + /// Get the effective resistance against an effect casted by the given actor in the given spell (optional). /// @return >=100 for fully resisted. can also return negative value for damage amplification. /// @param effects Override the actor's current magicEffects. Useful if there are effects currently /// being applied (but not applied yet) that should also be considered.