From dfca5d95c2cb52d9f01339adcb2baad66ec992a0 Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Thu, 29 Dec 2022 12:40:10 +0100 Subject: [PATCH] Don't apply spell multiplier to on hit enchantments --- apps/openmw/mwmechanics/spellpriority.cpp | 18 ++++++++++++------ apps/openmw/mwmechanics/spellpriority.hpp | 3 ++- apps/openmw/mwmechanics/weaponpriority.cpp | 2 +- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/apps/openmw/mwmechanics/spellpriority.cpp b/apps/openmw/mwmechanics/spellpriority.cpp index 64afda1af2..d52a0fa4a0 100644 --- a/apps/openmw/mwmechanics/spellpriority.cpp +++ b/apps/openmw/mwmechanics/spellpriority.cpp @@ -656,23 +656,29 @@ namespace MWMechanics return rating; } - float rateEffects(const ESM::EffectList& list, const MWWorld::Ptr& actor, const MWWorld::Ptr& enemy) + float rateEffects( + const ESM::EffectList& list, const MWWorld::Ptr& actor, const MWWorld::Ptr& enemy, bool useSpellMult) { // NOTE: enemy may be empty float rating = 0.f; - float ratingMult = 1.f; // NB: this multiplier is applied to the effect rating, not the final rating const MWWorld::Store& gmst = MWBase::Environment::get().getWorld()->getStore().get(); static const float fAIMagicSpellMult = gmst.find("fAIMagicSpellMult")->mValue.getFloat(); static const float fAIRangeMagicSpellMult = gmst.find("fAIRangeMagicSpellMult")->mValue.getFloat(); - for (std::vector::const_iterator it = list.mList.begin(); it != list.mList.end(); ++it) + for (const ESM::ENAMstruct& effect : list.mList) { - ratingMult = (it->mRange == ESM::RT_Target) ? fAIRangeMagicSpellMult : fAIMagicSpellMult; - - rating += rateEffect(*it, actor, enemy) * ratingMult; + float effectRating = rateEffect(effect, actor, enemy); + if (useSpellMult) + { + if (effect.mRange == ESM::RT_Target) + effectRating *= fAIRangeMagicSpellMult; + else + effectRating *= fAIMagicSpellMult; + } + rating += effectRating; } return rating; } diff --git a/apps/openmw/mwmechanics/spellpriority.hpp b/apps/openmw/mwmechanics/spellpriority.hpp index b35c5aaf0e..32cd17155e 100644 --- a/apps/openmw/mwmechanics/spellpriority.hpp +++ b/apps/openmw/mwmechanics/spellpriority.hpp @@ -32,7 +32,8 @@ namespace MWMechanics /// @note target may be empty float rateEffect(const ESM::ENAMstruct& effect, const MWWorld::Ptr& actor, const MWWorld::Ptr& enemy); /// @note target may be empty - float rateEffects(const ESM::EffectList& list, const MWWorld::Ptr& actor, const MWWorld::Ptr& enemy); + float rateEffects( + const ESM::EffectList& list, const MWWorld::Ptr& actor, const MWWorld::Ptr& enemy, bool useSpellMult = true); float vanillaRateSpell(const ESM::Spell* spell, const MWWorld::Ptr& actor, const MWWorld::Ptr& enemy); } diff --git a/apps/openmw/mwmechanics/weaponpriority.cpp b/apps/openmw/mwmechanics/weaponpriority.cpp index b6550af9c8..d5f7ccf517 100644 --- a/apps/openmw/mwmechanics/weaponpriority.cpp +++ b/apps/openmw/mwmechanics/weaponpriority.cpp @@ -113,7 +113,7 @@ namespace MWMechanics if (charge == -1 || charge >= castCost || weapclass == ESM::WeaponType::Thrown || weapclass == ESM::WeaponType::Ammo) - rating += rateEffects(enchantment->mEffects, actor, enemy); + rating += rateEffects(enchantment->mEffects, actor, enemy, false); } }