forked from teamnwah/openmw-tes3coop
Inherit NpcStats from CreatureStats
This commit is contained in:
parent
89c7f5bc70
commit
75b6515915
3 changed files with 31 additions and 32 deletions
|
@ -41,7 +41,6 @@ namespace
|
||||||
struct CustomData : public MWWorld::CustomData
|
struct CustomData : public MWWorld::CustomData
|
||||||
{
|
{
|
||||||
MWMechanics::NpcStats mNpcStats;
|
MWMechanics::NpcStats mNpcStats;
|
||||||
MWMechanics::CreatureStats mCreatureStats;
|
|
||||||
MWMechanics::Movement mMovement;
|
MWMechanics::Movement mMovement;
|
||||||
MWWorld::InventoryStore mInventoryStore;
|
MWWorld::InventoryStore mInventoryStore;
|
||||||
|
|
||||||
|
@ -188,45 +187,45 @@ namespace MWClass
|
||||||
for (int i=0; i<27; ++i)
|
for (int i=0; i<27; ++i)
|
||||||
data->mNpcStats.getSkill (i).setBase (ref->mBase->mNpdt52.mSkills[i]);
|
data->mNpcStats.getSkill (i).setBase (ref->mBase->mNpdt52.mSkills[i]);
|
||||||
|
|
||||||
data->mCreatureStats.getAttribute(0).set (ref->mBase->mNpdt52.mStrength);
|
data->mNpcStats.getAttribute(0).set (ref->mBase->mNpdt52.mStrength);
|
||||||
data->mCreatureStats.getAttribute(1).set (ref->mBase->mNpdt52.mIntelligence);
|
data->mNpcStats.getAttribute(1).set (ref->mBase->mNpdt52.mIntelligence);
|
||||||
data->mCreatureStats.getAttribute(2).set (ref->mBase->mNpdt52.mWillpower);
|
data->mNpcStats.getAttribute(2).set (ref->mBase->mNpdt52.mWillpower);
|
||||||
data->mCreatureStats.getAttribute(3).set (ref->mBase->mNpdt52.mAgility);
|
data->mNpcStats.getAttribute(3).set (ref->mBase->mNpdt52.mAgility);
|
||||||
data->mCreatureStats.getAttribute(4).set (ref->mBase->mNpdt52.mSpeed);
|
data->mNpcStats.getAttribute(4).set (ref->mBase->mNpdt52.mSpeed);
|
||||||
data->mCreatureStats.getAttribute(5).set (ref->mBase->mNpdt52.mEndurance);
|
data->mNpcStats.getAttribute(5).set (ref->mBase->mNpdt52.mEndurance);
|
||||||
data->mCreatureStats.getAttribute(6).set (ref->mBase->mNpdt52.mPersonality);
|
data->mNpcStats.getAttribute(6).set (ref->mBase->mNpdt52.mPersonality);
|
||||||
data->mCreatureStats.getAttribute(7).set (ref->mBase->mNpdt52.mLuck);
|
data->mNpcStats.getAttribute(7).set (ref->mBase->mNpdt52.mLuck);
|
||||||
data->mCreatureStats.setHealth (ref->mBase->mNpdt52.mHealth);
|
data->mNpcStats.setHealth (ref->mBase->mNpdt52.mHealth);
|
||||||
data->mCreatureStats.setMagicka (ref->mBase->mNpdt52.mMana);
|
data->mNpcStats.setMagicka (ref->mBase->mNpdt52.mMana);
|
||||||
data->mCreatureStats.setFatigue (ref->mBase->mNpdt52.mFatigue);
|
data->mNpcStats.setFatigue (ref->mBase->mNpdt52.mFatigue);
|
||||||
|
|
||||||
data->mCreatureStats.setLevel(ref->mBase->mNpdt52.mLevel);
|
data->mNpcStats.setLevel(ref->mBase->mNpdt52.mLevel);
|
||||||
data->mNpcStats.setBaseDisposition(ref->mBase->mNpdt52.mDisposition);
|
data->mNpcStats.setBaseDisposition(ref->mBase->mNpdt52.mDisposition);
|
||||||
data->mNpcStats.setReputation(ref->mBase->mNpdt52.mReputation);
|
data->mNpcStats.setReputation(ref->mBase->mNpdt52.mReputation);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (int i=0; i<3; ++i)
|
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.setBaseDisposition(ref->mBase->mNpdt12.mDisposition);
|
||||||
data->mNpcStats.setReputation(ref->mBase->mNpdt12.mReputation);
|
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->mNpcStats.setAiSetting (0, ref->mBase->mAiData.mHello);
|
||||||
data->mCreatureStats.setAiSetting (1, ref->mBase->mAiData.mFight);
|
data->mNpcStats.setAiSetting (1, ref->mBase->mAiData.mFight);
|
||||||
data->mCreatureStats.setAiSetting (2, ref->mBase->mAiData.mFlee);
|
data->mNpcStats.setAiSetting (2, ref->mBase->mAiData.mFlee);
|
||||||
data->mCreatureStats.setAiSetting (3, ref->mBase->mAiData.mAlarm);
|
data->mNpcStats.setAiSetting (3, ref->mBase->mAiData.mAlarm);
|
||||||
|
|
||||||
// spells
|
// spells
|
||||||
for (std::vector<std::string>::const_iterator iter (ref->mBase->mSpells.mList.begin());
|
for (std::vector<std::string>::const_iterator iter (ref->mBase->mSpells.mList.begin());
|
||||||
iter!=ref->mBase->mSpells.mList.end(); ++iter)
|
iter!=ref->mBase->mSpells.mList.end(); ++iter)
|
||||||
data->mCreatureStats.getSpells().add (*iter);
|
data->mNpcStats.getSpells().add (*iter);
|
||||||
|
|
||||||
// inventory
|
// inventory
|
||||||
data->mInventoryStore.fill(ref->mBase->mInventory, getId(ptr),
|
data->mInventoryStore.fill(ref->mBase->mInventory, getId(ptr),
|
||||||
|
@ -307,7 +306,7 @@ namespace MWClass
|
||||||
{
|
{
|
||||||
ensureCustomData (ptr);
|
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
|
MWMechanics::NpcStats& Npc::getNpcStats (const MWWorld::Ptr& ptr) const
|
||||||
|
@ -679,11 +678,11 @@ namespace MWClass
|
||||||
{
|
{
|
||||||
const MWBase::World *world = MWBase::Environment::get().getWorld();
|
const MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||||
const CustomData *npcdata = static_cast<const CustomData*>(ptr.getRefData().getCustomData());
|
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);
|
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());
|
(fMaxWalkSpeed->getFloat() - fMinWalkSpeed->getFloat());
|
||||||
walkSpeed *= 1.0f - fEncumberedMoveEffect->getFloat()*normalizedEncumbrance;
|
walkSpeed *= 1.0f - fEncumberedMoveEffect->getFloat()*normalizedEncumbrance;
|
||||||
walkSpeed = std::max(0.0f, walkSpeed);
|
walkSpeed = std::max(0.0f, walkSpeed);
|
||||||
|
@ -700,7 +699,7 @@ namespace MWClass
|
||||||
moveSpeed = 0.0f;
|
moveSpeed = 0.0f;
|
||||||
else if(mageffects.get(MWMechanics::EffectKey(10/*levitate*/)).mMagnitude > 0)
|
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);
|
mageffects.get(MWMechanics::EffectKey(10/*levitate*/)).mMagnitude);
|
||||||
flySpeed = fMinFlySpeed->getFloat() + flySpeed*(fMaxFlySpeed->getFloat() - fMinFlySpeed->getFloat());
|
flySpeed = fMinFlySpeed->getFloat() + flySpeed*(fMaxFlySpeed->getFloat() - fMinFlySpeed->getFloat());
|
||||||
flySpeed *= 1.0f - fEncumberedMoveEffect->getFloat() * normalizedEncumbrance;
|
flySpeed *= 1.0f - fEncumberedMoveEffect->getFloat() * normalizedEncumbrance;
|
||||||
|
@ -730,7 +729,7 @@ namespace MWClass
|
||||||
float Npc::getJump(const MWWorld::Ptr &ptr) const
|
float Npc::getJump(const MWWorld::Ptr &ptr) const
|
||||||
{
|
{
|
||||||
const CustomData *npcdata = static_cast<const CustomData*>(ptr.getRefData().getCustomData());
|
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() +
|
const float encumbranceTerm = fJumpEncumbranceBase->getFloat() +
|
||||||
fJumpEncumbranceMultiplier->getFloat() *
|
fJumpEncumbranceMultiplier->getFloat() *
|
||||||
(1.0f - Npc::getEncumbrance(ptr)/Npc::getCapacity(ptr));
|
(1.0f - Npc::getEncumbrance(ptr)/Npc::getCapacity(ptr));
|
||||||
|
@ -751,7 +750,7 @@ namespace MWClass
|
||||||
|
|
||||||
if(Npc::getStance(ptr, Run, false))
|
if(Npc::getStance(ptr, Run, false))
|
||||||
x *= fJumpRunMultiplier->getFloat();
|
x *= fJumpRunMultiplier->getFloat();
|
||||||
x *= npcdata->mCreatureStats.getFatigueTerm();
|
x *= npcdata->mNpcStats.getFatigueTerm();
|
||||||
x -= -627.2f;/*gravity constant*/
|
x -= -627.2f;/*gravity constant*/
|
||||||
x /= 3.0f;
|
x /= 3.0f;
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,8 @@
|
||||||
#include "stat.hpp"
|
#include "stat.hpp"
|
||||||
#include "drawstate.hpp"
|
#include "drawstate.hpp"
|
||||||
|
|
||||||
|
#include "creaturestats.hpp"
|
||||||
|
|
||||||
namespace ESM
|
namespace ESM
|
||||||
{
|
{
|
||||||
struct Class;
|
struct Class;
|
||||||
|
@ -18,12 +20,10 @@ namespace MWMechanics
|
||||||
{
|
{
|
||||||
/// \brief Additional stats for NPCs
|
/// \brief Additional stats for NPCs
|
||||||
///
|
///
|
||||||
/// For non-NPC-specific stats, see the CreatureStats struct.
|
|
||||||
///
|
|
||||||
/// \note For technical reasons the spell list and the currently selected spell is also handled by
|
/// \note For technical reasons the spell list and the currently selected spell is also handled by
|
||||||
/// CreatureStats, even though they are actually NPC stats.
|
/// CreatureStats, even though they are actually NPC stats.
|
||||||
|
|
||||||
class NpcStats
|
class NpcStats : public CreatureStats
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ namespace
|
||||||
{
|
{
|
||||||
MWWorld::Ptr actor = MWBase::Environment::get().getDialogueManager()->getActor();
|
MWWorld::Ptr actor = MWBase::Environment::get().getDialogueManager()->getActor();
|
||||||
|
|
||||||
MWMechanics::NpcStats stats = MWWorld::Class::get (actor).getNpcStats (actor);
|
const MWMechanics::NpcStats &stats = MWWorld::Class::get (actor).getNpcStats (actor);
|
||||||
|
|
||||||
if (stats.getFactionRanks().empty())
|
if (stats.getFactionRanks().empty())
|
||||||
throw std::runtime_error (
|
throw std::runtime_error (
|
||||||
|
|
Loading…
Reference in a new issue