mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-03 16:45:34 +00:00
Limit maximum attribute damage (Fixes #2367)
Maximum damage that an attribute can have = base + fortify.
This commit is contained in:
parent
5e2839977b
commit
41e15e0c2d
3 changed files with 22 additions and 12 deletions
|
@ -515,8 +515,8 @@ namespace MWMechanics
|
|||
for(int i = 0;i < ESM::Attribute::Length;++i)
|
||||
{
|
||||
AttributeValue stat = creatureStats.getAttribute(i);
|
||||
stat.setModifier(effects.get(EffectKey(ESM::MagicEffect::FortifyAttribute, i)).getMagnitude() -
|
||||
effects.get(EffectKey(ESM::MagicEffect::DrainAttribute, i)).getMagnitude() -
|
||||
stat.setModifiers(effects.get(EffectKey(ESM::MagicEffect::FortifyAttribute, i)).getMagnitude(),
|
||||
effects.get(EffectKey(ESM::MagicEffect::DrainAttribute, i)).getMagnitude(),
|
||||
effects.get(EffectKey(ESM::MagicEffect::AbsorbAttribute, i)).getMagnitude());
|
||||
|
||||
stat.damage(effects.get(EffectKey(ESM::MagicEffect::DamageAttribute, i)).getMagnitude() * duration * 1.5);
|
||||
|
@ -782,8 +782,8 @@ namespace MWMechanics
|
|||
for(int i = 0;i < ESM::Skill::Length;++i)
|
||||
{
|
||||
SkillValue& skill = npcStats.getSkill(i);
|
||||
skill.setModifier(effects.get(EffectKey(ESM::MagicEffect::FortifySkill, i)).getMagnitude() -
|
||||
effects.get(EffectKey(ESM::MagicEffect::DrainSkill, i)).getMagnitude() -
|
||||
skill.setModifiers(effects.get(EffectKey(ESM::MagicEffect::FortifySkill, i)).getMagnitude(),
|
||||
effects.get(EffectKey(ESM::MagicEffect::DrainSkill, i)).getMagnitude(),
|
||||
effects.get(EffectKey(ESM::MagicEffect::AbsorbSkill, i)).getMagnitude());
|
||||
|
||||
skill.damage(effects.get(EffectKey(ESM::MagicEffect::DamageSkill, i)).getMagnitude() * duration * 1.5);
|
||||
|
|
|
@ -15,6 +15,11 @@ void MWMechanics::AttributeValue::readState (const ESM::StatState<int>& state)
|
|||
mDamage = state.mDamage;
|
||||
}
|
||||
|
||||
void MWMechanics::AttributeValue::setModifiers(int fortify, int drain, int absorb)
|
||||
{
|
||||
mFortified = fortify;
|
||||
mModifier = (fortify - drain) - absorb;
|
||||
}
|
||||
|
||||
void MWMechanics::SkillValue::writeState (ESM::StatState<int>& state) const
|
||||
{
|
||||
|
|
|
@ -235,26 +235,29 @@ namespace MWMechanics
|
|||
class AttributeValue
|
||||
{
|
||||
int mBase;
|
||||
int mModifier;
|
||||
int mFortified;
|
||||
int mModifier; // net effect of Fortified, Drain & Absorb
|
||||
float mDamage; // needs to be float to allow continuous damage
|
||||
|
||||
public:
|
||||
AttributeValue() : mBase(0), mModifier(0), mDamage(0) {}
|
||||
AttributeValue() : mBase(0), mFortified(0), mModifier(0), mDamage(0) {}
|
||||
|
||||
int getModified() const { return std::max(0, mBase - (int) mDamage + mModifier); }
|
||||
int getBase() const { return mBase; }
|
||||
int getModifier() const { return mModifier; }
|
||||
|
||||
void setBase(int base) { mBase = std::max(0, base); }
|
||||
void setModifier(int mod) { mModifier = mod; }
|
||||
void setModifiers(int fortify, int drain, int absorb);
|
||||
|
||||
void damage(float damage) { mDamage += damage; }
|
||||
void damage(float damage) { mDamage = std::min(mDamage + damage, (float)(mBase + mFortified)); }
|
||||
void restore(float amount) { mDamage -= std::min(mDamage, amount); }
|
||||
int getDamage() const { return mDamage; }
|
||||
|
||||
void writeState (ESM::StatState<int>& state) const;
|
||||
|
||||
void readState (const ESM::StatState<int>& state);
|
||||
|
||||
friend bool operator== (const AttributeValue& left, const AttributeValue& right);
|
||||
};
|
||||
|
||||
class SkillValue : public AttributeValue
|
||||
|
@ -268,13 +271,16 @@ namespace MWMechanics
|
|||
void writeState (ESM::StatState<int>& state) const;
|
||||
|
||||
void readState (const ESM::StatState<int>& state);
|
||||
|
||||
friend bool operator== (const SkillValue& left, const SkillValue& right);
|
||||
};
|
||||
|
||||
inline bool operator== (const AttributeValue& left, const AttributeValue& right)
|
||||
{
|
||||
return left.getBase() == right.getBase()
|
||||
&& left.mFortified == right.mFortified
|
||||
&& left.getModifier() == right.getModifier()
|
||||
&& left.getDamage() == right.getDamage();
|
||||
&& left.mDamage == right.mDamage;
|
||||
}
|
||||
inline bool operator!= (const AttributeValue& left, const AttributeValue& right)
|
||||
{
|
||||
|
@ -283,9 +289,8 @@ namespace MWMechanics
|
|||
|
||||
inline bool operator== (const SkillValue& left, const SkillValue& right)
|
||||
{
|
||||
return left.getBase() == right.getBase()
|
||||
&& left.getModifier() == right.getModifier()
|
||||
&& left.getDamage() == right.getDamage()
|
||||
// delegate to base class for most of the work
|
||||
return (static_cast<const AttributeValue&>(left) == right)
|
||||
&& left.getProgress() == right.getProgress();
|
||||
}
|
||||
inline bool operator!= (const SkillValue& left, const SkillValue& right)
|
||||
|
|
Loading…
Reference in a new issue