Change bounds behavior of stat script commands

Fixes (#3776)
0.6.1
Allofich 8 years ago
parent c992cb6e82
commit 57aeec59d5

@ -189,7 +189,7 @@ namespace MWMechanics
void AttributeValue::setBase(int base) void AttributeValue::setBase(int base)
{ {
mBase = std::max(0, base); mBase = base;
} }
void AttributeValue::setModifier(int mod) void AttributeValue::setModifier(int mod)

@ -123,7 +123,7 @@ namespace MWScript
runtime.pop(); runtime.pop();
MWMechanics::AttributeValue attribute = ptr.getClass().getCreatureStats(ptr).getAttribute(mIndex); MWMechanics::AttributeValue attribute = ptr.getClass().getCreatureStats(ptr).getAttribute(mIndex);
attribute.setBase (value - (attribute.getModified() - attribute.getBase())); attribute.setBase (value);
ptr.getClass().getCreatureStats(ptr).setAttribute(mIndex, attribute); ptr.getClass().getCreatureStats(ptr).setAttribute(mIndex, attribute);
} }
}; };
@ -148,7 +148,18 @@ namespace MWScript
.getCreatureStats(ptr) .getCreatureStats(ptr)
.getAttribute(mIndex); .getAttribute(mIndex);
attribute.setBase (std::min(100, attribute.getBase() + value)); if (value == 0)
return;
if (((attribute.getBase() <= 0) && (value < 0))
|| ((attribute.getBase() >= 100) && (value > 0)))
return;
if (value < 0)
attribute.setBase(std::max(0, attribute.getBase() + value));
else
attribute.setBase(std::min(100, attribute.getBase() + value));
ptr.getClass().getCreatureStats(ptr).setAttribute(mIndex, attribute); ptr.getClass().getCreatureStats(ptr).setAttribute(mIndex, attribute);
} }
}; };
@ -350,12 +361,7 @@ namespace MWScript
MWMechanics::NpcStats& stats = ptr.getClass().getNpcStats (ptr); MWMechanics::NpcStats& stats = ptr.getClass().getNpcStats (ptr);
int newLevel = value - (stats.getSkill(mIndex).getModified() - stats.getSkill(mIndex).getBase()); stats.getSkill (mIndex).setBase (value);
if (newLevel<0)
newLevel = 0;
stats.getSkill (mIndex).setBase (newLevel);
} }
}; };
@ -375,10 +381,21 @@ namespace MWScript
Interpreter::Type_Integer value = runtime[0].mInteger; Interpreter::Type_Integer value = runtime[0].mInteger;
runtime.pop(); runtime.pop();
MWMechanics::NpcStats& stats = ptr.getClass().getNpcStats(ptr); MWMechanics::SkillValue &skill = ptr.getClass()
.getNpcStats(ptr)
.getSkill(mIndex);
if (value == 0)
return;
if (((skill.getBase() <= 0) && (value < 0))
|| ((skill.getBase() >= 100) && (value > 0)))
return;
stats.getSkill(mIndex). if (value < 0)
setBase (std::min(100, stats.getSkill(mIndex).getBase() + value)); skill.setBase(std::max(0, skill.getBase() + value));
else
skill.setBase(std::min(100, skill.getBase() + value));
} }
}; };

Loading…
Cancel
Save