summaryrefslogtreecommitdiff
path: root/apps/openmw/mwmechanics/spellutil.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'apps/openmw/mwmechanics/spellutil.cpp')
-rw-r--r--apps/openmw/mwmechanics/spellutil.cpp22
1 files changed, 20 insertions, 2 deletions
diff --git a/apps/openmw/mwmechanics/spellutil.cpp b/apps/openmw/mwmechanics/spellutil.cpp
index 2a63a3a444..671939cb00 100644
--- a/apps/openmw/mwmechanics/spellutil.cpp
+++ b/apps/openmw/mwmechanics/spellutil.cpp
@@ -2,6 +2,7 @@
#include <limits>
+#include <components/esm3/loadalch.hpp>
#include <components/esm3/loadench.hpp>
#include <components/esm3/loadmgef.hpp>
@@ -48,7 +49,7 @@ namespace MWMechanics
bool appliedOnce = magicEffect->mData.mFlags & ESM::MagicEffect::AppliedOnce;
int minMagn = hasMagnitude ? effect.mMagnMin : 1;
int maxMagn = hasMagnitude ? effect.mMagnMax : 1;
- if (method != EffectCostMethod::GameEnchantment)
+ if (method == EffectCostMethod::PlayerSpell || method == EffectCostMethod::GameSpell)
{
minMagn = std::max(1, minMagn);
maxMagn = std::max(1, maxMagn);
@@ -57,21 +58,28 @@ namespace MWMechanics
if (!appliedOnce)
duration = std::max(1, duration);
static const float fEffectCostMult = store.get<ESM::GameSetting>().find("fEffectCostMult")->mValue.getFloat();
+ static const float iAlchemyMod = store.get<ESM::GameSetting>().find("iAlchemyMod")->mValue.getFloat();
int durationOffset = 0;
int minArea = 0;
+ float costMult = fEffectCostMult;
if (method == EffectCostMethod::PlayerSpell)
{
durationOffset = 1;
minArea = 1;
}
+ else if (method == EffectCostMethod::GamePotion)
+ {
+ minArea = 1;
+ costMult = iAlchemyMod;
+ }
float x = 0.5 * (minMagn + maxMagn);
x *= 0.1 * magicEffect->mData.mBaseCost;
x *= durationOffset + duration;
x += 0.05 * std::max(minArea, effect.mArea) * magicEffect->mData.mBaseCost;
- return x * fEffectCostMult;
+ return x * costMult;
}
int calcSpellCost(const ESM::Spell& spell)
@@ -140,6 +148,16 @@ namespace MWMechanics
return enchantment.mData.mCharge;
}
+ int getPotionValue(const ESM::Potion& potion)
+ {
+ if (potion.mData.mFlags & ESM::Potion::Autocalc)
+ {
+ float cost = getTotalCost(potion.mEffects, EffectCostMethod::GamePotion);
+ return std::round(cost);
+ }
+ return potion.mData.mValue;
+ }
+
float calcSpellBaseSuccessChance(const ESM::Spell* spell, const MWWorld::Ptr& actor, ESM::RefId* effectiveSchool)
{
// Morrowind for some reason uses a formula slightly different from magicka cost calculation