mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-19 22:23:51 +00:00
Enchanting: fix skill-based cast cost bonus being applied twice
This commit is contained in:
parent
ef1b0a191b
commit
13c5bd5cc2
6 changed files with 29 additions and 21 deletions
|
@ -111,7 +111,7 @@ namespace MWGui
|
||||||
mCharge->setCaption(boost::lexical_cast<std::string>(mEnchanting.getGemCharge()));
|
mCharge->setCaption(boost::lexical_cast<std::string>(mEnchanting.getGemCharge()));
|
||||||
|
|
||||||
std::stringstream castCost;
|
std::stringstream castCost;
|
||||||
castCost << mEnchanting.getCastCost();
|
castCost << mEnchanting.getEffectiveCastCost();
|
||||||
mCastCost->setCaption(castCost.str());
|
mCastCost->setCaption(castCost.str());
|
||||||
|
|
||||||
mPrice->setCaption(boost::lexical_cast<std::string>(mEnchanting.getEnchantPrice()));
|
mPrice->setCaption(boost::lexical_cast<std::string>(mEnchanting.getEnchantPrice()));
|
||||||
|
|
|
@ -103,9 +103,7 @@ namespace MWGui
|
||||||
&& item.getClass().canBeEquipped(item, mActor).first == 0)
|
&& item.getClass().canBeEquipped(item, mActor).first == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
float enchantCost = enchant->mData.mCost;
|
int castCost = MWMechanics::getEffectiveEnchantmentCastCost(enchant->mData.mCost, mActor);
|
||||||
int eSkill = mActor.getClass().getSkill(mActor, ESM::Skill::Enchant);
|
|
||||||
int castCost = std::max(1.f, enchantCost - (enchantCost / 100) * (eSkill - 10));
|
|
||||||
|
|
||||||
std::string cost = boost::lexical_cast<std::string>(castCost);
|
std::string cost = boost::lexical_cast<std::string>(castCost);
|
||||||
int currentCharge = int(item.getCellRef().getEnchantmentCharge());
|
int currentCharge = int(item.getCellRef().getEnchantmentCharge());
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
#include "creaturestats.hpp"
|
#include "creaturestats.hpp"
|
||||||
#include "npcstats.hpp"
|
#include "npcstats.hpp"
|
||||||
|
#include "spellcasting.hpp"
|
||||||
|
|
||||||
namespace MWMechanics
|
namespace MWMechanics
|
||||||
{
|
{
|
||||||
|
@ -55,7 +56,7 @@ namespace MWMechanics
|
||||||
enchantment.mData.mCharge = getGemCharge();
|
enchantment.mData.mCharge = getGemCharge();
|
||||||
enchantment.mData.mAutocalc = 0;
|
enchantment.mData.mAutocalc = 0;
|
||||||
enchantment.mData.mType = mCastStyle;
|
enchantment.mData.mType = mCastStyle;
|
||||||
enchantment.mData.mCost = getCastCost();
|
enchantment.mData.mCost = getBaseCastCost();
|
||||||
|
|
||||||
store.remove(mSoulGemPtr, 1, player);
|
store.remove(mSoulGemPtr, 1, player);
|
||||||
|
|
||||||
|
@ -199,23 +200,19 @@ namespace MWMechanics
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int Enchanting::getCastCost() const
|
int Enchanting::getBaseCastCost() const
|
||||||
{
|
{
|
||||||
if (mCastStyle == ESM::Enchantment::ConstantEffect)
|
if (mCastStyle == ESM::Enchantment::ConstantEffect)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
const float enchantCost = getEnchantPoints();
|
return getEnchantPoints();
|
||||||
|
}
|
||||||
|
|
||||||
|
int Enchanting::getEffectiveCastCost() const
|
||||||
|
{
|
||||||
|
int baseCost = getBaseCastCost();
|
||||||
MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayerPtr();
|
MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayerPtr();
|
||||||
MWMechanics::NpcStats &stats = player.getClass().getNpcStats(player);
|
return getEffectiveEnchantmentCastCost(baseCost, player);
|
||||||
int eSkill = stats.getSkill(ESM::Skill::Enchant).getModified();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Each point of enchant skill above/under 10 subtracts/adds
|
|
||||||
* one percent of enchantment cost while minimum is 1.
|
|
||||||
*/
|
|
||||||
const float castCost = enchantCost - (enchantCost / 100) * (eSkill - 10);
|
|
||||||
|
|
||||||
return static_cast<int>((castCost < 1) ? 1 : castCost);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,8 @@ namespace MWMechanics
|
||||||
void nextCastStyle(); //Set enchant type to next possible type (for mOldItemPtr object)
|
void nextCastStyle(); //Set enchant type to next possible type (for mOldItemPtr object)
|
||||||
int getCastStyle() const;
|
int getCastStyle() const;
|
||||||
int getEnchantPoints() const;
|
int getEnchantPoints() const;
|
||||||
int getCastCost() const;
|
int getBaseCastCost() const; // To be saved in the enchantment's record
|
||||||
|
int getEffectiveCastCost() const; // Effective cost taking player Enchant skill into account, used for preview purposes in the UI
|
||||||
int getEnchantPrice() const;
|
int getEnchantPrice() const;
|
||||||
int getMaxEnchantValue() const;
|
int getMaxEnchantValue() const;
|
||||||
int getGemCharge() const;
|
int getGemCharge() const;
|
||||||
|
|
|
@ -689,9 +689,7 @@ namespace MWMechanics
|
||||||
// Check if there's enough charge left
|
// Check if there's enough charge left
|
||||||
if (enchantment->mData.mType == ESM::Enchantment::WhenUsed || enchantment->mData.mType == ESM::Enchantment::WhenStrikes)
|
if (enchantment->mData.mType == ESM::Enchantment::WhenUsed || enchantment->mData.mType == ESM::Enchantment::WhenStrikes)
|
||||||
{
|
{
|
||||||
const float enchantCost = enchantment->mData.mCost;
|
const int castCost = getEffectiveEnchantmentCastCost(enchantment->mData.mCost, mCaster);
|
||||||
int eSkill = mCaster.getClass().getSkill(mCaster, ESM::Skill::Enchant);
|
|
||||||
const int castCost = std::max(1.f, enchantCost - (enchantCost / 100) * (eSkill - 10));
|
|
||||||
|
|
||||||
if (item.getCellRef().getEnchantmentCharge() == -1)
|
if (item.getCellRef().getEnchantmentCharge() == -1)
|
||||||
item.getCellRef().setEnchantmentCharge(enchantment->mData.mCharge);
|
item.getCellRef().setEnchantmentCharge(enchantment->mData.mCharge);
|
||||||
|
@ -915,4 +913,16 @@ namespace MWMechanics
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int getEffectiveEnchantmentCastCost(float castCost, const MWWorld::Ptr &actor)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Each point of enchant skill above/under 10 subtracts/adds
|
||||||
|
* one percent of enchantment cost while minimum is 1.
|
||||||
|
*/
|
||||||
|
int eSkill = actor.getClass().getSkill(actor, ESM::Skill::Enchant);
|
||||||
|
const float result = castCost - (castCost / 100) * (eSkill - 10);
|
||||||
|
|
||||||
|
return static_cast<int>((result < 1) ? 1 : result);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,6 +58,8 @@ namespace MWMechanics
|
||||||
float getEffectMultiplier(short effectId, const MWWorld::Ptr& actor, const MWWorld::Ptr& caster,
|
float getEffectMultiplier(short effectId, const MWWorld::Ptr& actor, const MWWorld::Ptr& caster,
|
||||||
const ESM::Spell* spell = NULL, const MagicEffects* effects = NULL);
|
const ESM::Spell* spell = NULL, const MagicEffects* effects = NULL);
|
||||||
|
|
||||||
|
int getEffectiveEnchantmentCastCost (float castCost, const MWWorld::Ptr& actor);
|
||||||
|
|
||||||
class CastSpell
|
class CastSpell
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
Loading…
Reference in a new issue