|
|
|
@ -41,7 +41,6 @@ namespace
|
|
|
|
|
struct CustomData : public MWWorld::CustomData
|
|
|
|
|
{
|
|
|
|
|
MWMechanics::NpcStats mNpcStats;
|
|
|
|
|
MWMechanics::CreatureStats mCreatureStats;
|
|
|
|
|
MWMechanics::Movement mMovement;
|
|
|
|
|
MWWorld::InventoryStore mInventoryStore;
|
|
|
|
|
|
|
|
|
@ -188,45 +187,45 @@ namespace MWClass
|
|
|
|
|
for (int i=0; i<27; ++i)
|
|
|
|
|
data->mNpcStats.getSkill (i).setBase (ref->mBase->mNpdt52.mSkills[i]);
|
|
|
|
|
|
|
|
|
|
data->mCreatureStats.getAttribute(0).set (ref->mBase->mNpdt52.mStrength);
|
|
|
|
|
data->mCreatureStats.getAttribute(1).set (ref->mBase->mNpdt52.mIntelligence);
|
|
|
|
|
data->mCreatureStats.getAttribute(2).set (ref->mBase->mNpdt52.mWillpower);
|
|
|
|
|
data->mCreatureStats.getAttribute(3).set (ref->mBase->mNpdt52.mAgility);
|
|
|
|
|
data->mCreatureStats.getAttribute(4).set (ref->mBase->mNpdt52.mSpeed);
|
|
|
|
|
data->mCreatureStats.getAttribute(5).set (ref->mBase->mNpdt52.mEndurance);
|
|
|
|
|
data->mCreatureStats.getAttribute(6).set (ref->mBase->mNpdt52.mPersonality);
|
|
|
|
|
data->mCreatureStats.getAttribute(7).set (ref->mBase->mNpdt52.mLuck);
|
|
|
|
|
data->mCreatureStats.setHealth (ref->mBase->mNpdt52.mHealth);
|
|
|
|
|
data->mCreatureStats.setMagicka (ref->mBase->mNpdt52.mMana);
|
|
|
|
|
data->mCreatureStats.setFatigue (ref->mBase->mNpdt52.mFatigue);
|
|
|
|
|
|
|
|
|
|
data->mCreatureStats.setLevel(ref->mBase->mNpdt52.mLevel);
|
|
|
|
|
data->mNpcStats.getAttribute(0).set (ref->mBase->mNpdt52.mStrength);
|
|
|
|
|
data->mNpcStats.getAttribute(1).set (ref->mBase->mNpdt52.mIntelligence);
|
|
|
|
|
data->mNpcStats.getAttribute(2).set (ref->mBase->mNpdt52.mWillpower);
|
|
|
|
|
data->mNpcStats.getAttribute(3).set (ref->mBase->mNpdt52.mAgility);
|
|
|
|
|
data->mNpcStats.getAttribute(4).set (ref->mBase->mNpdt52.mSpeed);
|
|
|
|
|
data->mNpcStats.getAttribute(5).set (ref->mBase->mNpdt52.mEndurance);
|
|
|
|
|
data->mNpcStats.getAttribute(6).set (ref->mBase->mNpdt52.mPersonality);
|
|
|
|
|
data->mNpcStats.getAttribute(7).set (ref->mBase->mNpdt52.mLuck);
|
|
|
|
|
data->mNpcStats.setHealth (ref->mBase->mNpdt52.mHealth);
|
|
|
|
|
data->mNpcStats.setMagicka (ref->mBase->mNpdt52.mMana);
|
|
|
|
|
data->mNpcStats.setFatigue (ref->mBase->mNpdt52.mFatigue);
|
|
|
|
|
|
|
|
|
|
data->mNpcStats.setLevel(ref->mBase->mNpdt52.mLevel);
|
|
|
|
|
data->mNpcStats.setBaseDisposition(ref->mBase->mNpdt52.mDisposition);
|
|
|
|
|
data->mNpcStats.setReputation(ref->mBase->mNpdt52.mReputation);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
for (int i=0; i<3; ++i)
|
|
|
|
|
data->mCreatureStats.setDynamic (i, 10);
|
|
|
|
|
data->mNpcStats.setDynamic (i, 10);
|
|
|
|
|
|
|
|
|
|
data->mCreatureStats.setLevel(ref->mBase->mNpdt12.mLevel);
|
|
|
|
|
data->mNpcStats.setLevel(ref->mBase->mNpdt12.mLevel);
|
|
|
|
|
data->mNpcStats.setBaseDisposition(ref->mBase->mNpdt12.mDisposition);
|
|
|
|
|
data->mNpcStats.setReputation(ref->mBase->mNpdt12.mReputation);
|
|
|
|
|
|
|
|
|
|
autoCalculateAttributes(ref->mBase, data->mCreatureStats);
|
|
|
|
|
autoCalculateAttributes(ref->mBase, data->mNpcStats);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
data->mCreatureStats.getAiSequence().fill(ref->mBase->mAiPackage);
|
|
|
|
|
data->mNpcStats.getAiSequence().fill(ref->mBase->mAiPackage);
|
|
|
|
|
|
|
|
|
|
data->mCreatureStats.setAiSetting (0, ref->mBase->mAiData.mHello);
|
|
|
|
|
data->mCreatureStats.setAiSetting (1, ref->mBase->mAiData.mFight);
|
|
|
|
|
data->mCreatureStats.setAiSetting (2, ref->mBase->mAiData.mFlee);
|
|
|
|
|
data->mCreatureStats.setAiSetting (3, ref->mBase->mAiData.mAlarm);
|
|
|
|
|
data->mNpcStats.setAiSetting (0, ref->mBase->mAiData.mHello);
|
|
|
|
|
data->mNpcStats.setAiSetting (1, ref->mBase->mAiData.mFight);
|
|
|
|
|
data->mNpcStats.setAiSetting (2, ref->mBase->mAiData.mFlee);
|
|
|
|
|
data->mNpcStats.setAiSetting (3, ref->mBase->mAiData.mAlarm);
|
|
|
|
|
|
|
|
|
|
// spells
|
|
|
|
|
for (std::vector<std::string>::const_iterator iter (ref->mBase->mSpells.mList.begin());
|
|
|
|
|
iter!=ref->mBase->mSpells.mList.end(); ++iter)
|
|
|
|
|
data->mCreatureStats.getSpells().add (*iter);
|
|
|
|
|
data->mNpcStats.getSpells().add (*iter);
|
|
|
|
|
|
|
|
|
|
// inventory
|
|
|
|
|
data->mInventoryStore.fill(ref->mBase->mInventory, getId(ptr),
|
|
|
|
@ -307,7 +306,7 @@ namespace MWClass
|
|
|
|
|
{
|
|
|
|
|
ensureCustomData (ptr);
|
|
|
|
|
|
|
|
|
|
return dynamic_cast<CustomData&> (*ptr.getRefData().getCustomData()).mCreatureStats;
|
|
|
|
|
return dynamic_cast<CustomData&> (*ptr.getRefData().getCustomData()).mNpcStats;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MWMechanics::NpcStats& Npc::getNpcStats (const MWWorld::Ptr& ptr) const
|
|
|
|
@ -679,11 +678,11 @@ namespace MWClass
|
|
|
|
|
{
|
|
|
|
|
const MWBase::World *world = MWBase::Environment::get().getWorld();
|
|
|
|
|
const CustomData *npcdata = static_cast<const CustomData*>(ptr.getRefData().getCustomData());
|
|
|
|
|
const MWMechanics::MagicEffects &mageffects = npcdata->mCreatureStats.getMagicEffects();
|
|
|
|
|
const MWMechanics::MagicEffects &mageffects = npcdata->mNpcStats.getMagicEffects();
|
|
|
|
|
|
|
|
|
|
const float normalizedEncumbrance = Npc::getEncumbrance(ptr) / Npc::getCapacity(ptr);
|
|
|
|
|
|
|
|
|
|
float walkSpeed = fMinWalkSpeed->getFloat() + 0.01f*npcdata->mCreatureStats.getAttribute(ESM::Attribute::Speed).getModified()*
|
|
|
|
|
float walkSpeed = fMinWalkSpeed->getFloat() + 0.01f*npcdata->mNpcStats.getAttribute(ESM::Attribute::Speed).getModified()*
|
|
|
|
|
(fMaxWalkSpeed->getFloat() - fMinWalkSpeed->getFloat());
|
|
|
|
|
walkSpeed *= 1.0f - fEncumberedMoveEffect->getFloat()*normalizedEncumbrance;
|
|
|
|
|
walkSpeed = std::max(0.0f, walkSpeed);
|
|
|
|
@ -700,7 +699,7 @@ namespace MWClass
|
|
|
|
|
moveSpeed = 0.0f;
|
|
|
|
|
else if(mageffects.get(MWMechanics::EffectKey(10/*levitate*/)).mMagnitude > 0)
|
|
|
|
|
{
|
|
|
|
|
float flySpeed = 0.01f*(npcdata->mCreatureStats.getAttribute(ESM::Attribute::Speed).getModified() +
|
|
|
|
|
float flySpeed = 0.01f*(npcdata->mNpcStats.getAttribute(ESM::Attribute::Speed).getModified() +
|
|
|
|
|
mageffects.get(MWMechanics::EffectKey(10/*levitate*/)).mMagnitude);
|
|
|
|
|
flySpeed = fMinFlySpeed->getFloat() + flySpeed*(fMaxFlySpeed->getFloat() - fMinFlySpeed->getFloat());
|
|
|
|
|
flySpeed *= 1.0f - fEncumberedMoveEffect->getFloat() * normalizedEncumbrance;
|
|
|
|
@ -730,7 +729,7 @@ namespace MWClass
|
|
|
|
|
float Npc::getJump(const MWWorld::Ptr &ptr) const
|
|
|
|
|
{
|
|
|
|
|
const CustomData *npcdata = static_cast<const CustomData*>(ptr.getRefData().getCustomData());
|
|
|
|
|
const MWMechanics::MagicEffects &mageffects = npcdata->mCreatureStats.getMagicEffects();
|
|
|
|
|
const MWMechanics::MagicEffects &mageffects = npcdata->mNpcStats.getMagicEffects();
|
|
|
|
|
const float encumbranceTerm = fJumpEncumbranceBase->getFloat() +
|
|
|
|
|
fJumpEncumbranceMultiplier->getFloat() *
|
|
|
|
|
(1.0f - Npc::getEncumbrance(ptr)/Npc::getCapacity(ptr));
|
|
|
|
@ -751,7 +750,7 @@ namespace MWClass
|
|
|
|
|
|
|
|
|
|
if(Npc::getStance(ptr, Run, false))
|
|
|
|
|
x *= fJumpRunMultiplier->getFloat();
|
|
|
|
|
x *= npcdata->mCreatureStats.getFatigueTerm();
|
|
|
|
|
x *= npcdata->mNpcStats.getFatigueTerm();
|
|
|
|
|
x -= -627.2f;/*gravity constant*/
|
|
|
|
|
x /= 3.0f;
|
|
|
|
|
|
|
|
|
|