From bbcdfd4078275cbb5e3060e5b04645567b2297d3 Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Thu, 6 Sep 2018 21:49:50 +0200 Subject: [PATCH] Implements vanilla's off-by-one error, fixing #4611 --- apps/openmw/mwgui/spellcreationdialog.cpp | 4 +++- apps/openmw/mwgui/spellcreationdialog.hpp | 1 + apps/openmw/mwmechanics/spellcasting.cpp | 9 ++++++--- apps/openmw/mwmechanics/spellcasting.hpp | 4 ++-- files/settings-default.cfg | 3 +++ 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/apps/openmw/mwgui/spellcreationdialog.cpp b/apps/openmw/mwgui/spellcreationdialog.cpp index 65d66f9e2e..bd54d47ee4 100644 --- a/apps/openmw/mwgui/spellcreationdialog.cpp +++ b/apps/openmw/mwgui/spellcreationdialog.cpp @@ -449,11 +449,13 @@ namespace MWGui const MWWorld::ESMStore &store = MWBase::Environment::get().getWorld()->getStore(); + static const bool vanillaCost = Settings::Manager::getBool("expensive spells", "Game"); + for (std::vector::const_iterator it = mEffects.begin(); it != mEffects.end(); ++it) { const ESM::ENAMstruct& effect = *it; - y += std::max(1.f, MWMechanics::calcEffectCost(effect)); + y += std::max(1.f, MWMechanics::calcEffectCost(effect, vanillaCost)); if (effect.mRange == ESM::RT_Target) y *= 1.5; diff --git a/apps/openmw/mwgui/spellcreationdialog.hpp b/apps/openmw/mwgui/spellcreationdialog.hpp index ec90fa3cec..084c3e1e1c 100644 --- a/apps/openmw/mwgui/spellcreationdialog.hpp +++ b/apps/openmw/mwgui/spellcreationdialog.hpp @@ -3,6 +3,7 @@ #include #include +#include #include "windowbase.hpp" #include "referenceinterface.hpp" diff --git a/apps/openmw/mwmechanics/spellcasting.cpp b/apps/openmw/mwmechanics/spellcasting.cpp index b857c6d7e2..83af249dac 100644 --- a/apps/openmw/mwmechanics/spellcasting.cpp +++ b/apps/openmw/mwmechanics/spellcasting.cpp @@ -49,13 +49,13 @@ namespace MWMechanics return schoolSkillMap[school]; } - float calcEffectCost(const ESM::ENAMstruct& effect) + float calcEffectCost(const ESM::ENAMstruct& effect, const bool customSpellCost) { const ESM::MagicEffect* magicEffect = MWBase::Environment::get().getWorld()->getStore().get().find(effect.mEffectID); - return calcEffectCost(effect, magicEffect); + return calcEffectCost(effect, magicEffect, customSpellCost); } - float calcEffectCost(const ESM::ENAMstruct& effect, const ESM::MagicEffect* magicEffect) + float calcEffectCost(const ESM::ENAMstruct& effect, const ESM::MagicEffect* magicEffect, const bool customSpellCost) { int minMagn = 1; int maxMagn = 1; @@ -68,6 +68,9 @@ namespace MWMechanics int duration = 0; if (!(magicEffect->mData.mFlags & ESM::MagicEffect::NoDuration)) duration = effect.mDuration; + //The wonders of vanilla spellmaking + if (customSpellCost && duration < 1) + duration = 1; static const float fEffectCostMult = MWBase::Environment::get().getWorld()->getStore() .get().find("fEffectCostMult")->mValue.getFloat(); diff --git a/apps/openmw/mwmechanics/spellcasting.hpp b/apps/openmw/mwmechanics/spellcasting.hpp index 2844e7f23f..836473653d 100644 --- a/apps/openmw/mwmechanics/spellcasting.hpp +++ b/apps/openmw/mwmechanics/spellcasting.hpp @@ -25,8 +25,8 @@ namespace MWMechanics ESM::Skill::SkillEnum spellSchoolToSkill(int school); - float calcEffectCost(const ESM::ENAMstruct& effect); - float calcEffectCost(const ESM::ENAMstruct& effect, const ESM::MagicEffect* magicEffect); + float calcEffectCost(const ESM::ENAMstruct& effect, const bool customSpellCost = false); + float calcEffectCost(const ESM::ENAMstruct& effect, const ESM::MagicEffect* magicEffect, const bool customSpellCost = false); bool isSummoningEffect(int effectId); diff --git a/files/settings-default.cfg b/files/settings-default.cfg index c2ac2eb1ca..352b86f658 100644 --- a/files/settings-default.cfg +++ b/files/settings-default.cfg @@ -229,6 +229,9 @@ barter disposition change is permanent = false # (0 means it does not factor it in, 1 means it factors into werewolves damage calculation and # 2 means werewolves are ignored) strength influences hand to hand = 0 + +# Makes custom spells cost the same as in vanilla +expensive spells = true [General]