Commit c6761e34 authored by Marc Zinnschlag's avatar Marc Zinnschlag

replaced NPC stats in ref data with new custom data implementation

parent baf9cff2
#include "npc.hpp"
#include <memory>
#include <components/esm/loadnpc.hpp>
#include "../mwmechanics/creaturestats.hpp"
......@@ -18,10 +20,44 @@ namespace
{
const Ogre::Radian kOgrePi (Ogre::Math::PI);
const Ogre::Radian kOgrePiOverTwo (Ogre::Math::PI / Ogre::Real(2.0));
struct CustomData : public MWWorld::CustomData
{
MWMechanics::NpcStats mNpcStats;
virtual MWWorld::CustomData *clone() const;
};
MWWorld::CustomData *CustomData::clone() const
{
return new CustomData (*this);
}
}
namespace MWClass
{
void Npc::ensureCustomData (const MWWorld::Ptr& ptr) const
{
if (!ptr.getRefData().getCustomData())
{
std::auto_ptr<CustomData> data (new CustomData);
ESMS::LiveCellRef<ESM::NPC, MWWorld::RefData> *ref = ptr.get<ESM::NPC>();
if (!ref->base->faction.empty())
{
// TODO research how initial rank is stored. The information in loadnpc.hpp are at
// best very unclear.
data->mNpcStats.mFactionRank[ref->base->faction] = 0;
}
for (int i=0; i<27; ++i)
data->mNpcStats.mSkill[i].setBase (ref->base->npdt52.skills[i]);
ptr.getRefData().setCustomData (data.release());
}
}
std::string Npc::getId (const MWWorld::Ptr& ptr) const
{
ESMS::LiveCellRef<ESM::NPC, MWWorld::RefData> *ref =
......@@ -106,27 +142,9 @@ namespace MWClass
MWMechanics::NpcStats& Npc::getNpcStats (const MWWorld::Ptr& ptr) const
{
if (!ptr.getRefData().getNpcStats().get())
{
boost::shared_ptr<MWMechanics::NpcStats> stats (
new MWMechanics::NpcStats);
ESMS::LiveCellRef<ESM::NPC, MWWorld::RefData> *ref = ptr.get<ESM::NPC>();
if (!ref->base->faction.empty())
{
// TODO research how initial rank is stored. The information in loadnpc.hpp are at
// best very unclear.
stats->mFactionRank[ref->base->faction] = 0;
}
for (int i=0; i<27; ++i)
stats->mSkill[i].setBase (ref->base->npdt52.skills[i]);
ptr.getRefData().getNpcStats() = stats;
}
ensureCustomData (ptr);
return *ptr.getRefData().getNpcStats();
return dynamic_cast<CustomData&> (*ptr.getRefData().getCustomData()).mNpcStats;
}
boost::shared_ptr<MWWorld::Action> Npc::activate (const MWWorld::Ptr& ptr,
......
......@@ -2,12 +2,14 @@
#define GAME_MWCLASS_NPC_H
#include "../mwworld/class.hpp"
#include "../mwworld/customdata.hpp"
namespace MWClass
{
class Npc : public MWWorld::Class
{
void ensureCustomData (const MWWorld::Ptr& ptr) const;
public:
virtual std::string getId (const MWWorld::Ptr& ptr) const;
......
......@@ -10,6 +10,7 @@
#include "../mwworld/class.hpp"
#include "../mwmechanics/creaturestats.hpp"
#include "../mwmechanics/npcstats.hpp"
#include "interpretercontext.hpp"
#include "ref.hpp"
......
......@@ -15,7 +15,6 @@ namespace MWWorld
mPosition = refData.mPosition;
mCreatureStats = refData.mCreatureStats;
mNpcStats = refData.mNpcStats;
mMovement = refData.mMovement;
mContainerStore = refData.mContainerStore;
......@@ -134,11 +133,6 @@ namespace MWWorld
return mCreatureStats;
}
boost::shared_ptr<MWMechanics::NpcStats>& RefData::getNpcStats()
{
return mNpcStats;
}
boost::shared_ptr<MWMechanics::Movement>& RefData::getMovement()
{
return mMovement;
......
......@@ -10,7 +10,6 @@
#include "../mwscript/locals.hpp"
#include "../mwmechanics/creaturestats.hpp"
#include "../mwmechanics/npcstats.hpp"
#include "../mwmechanics/movement.hpp"
#include "containerstore.hpp"
......@@ -45,7 +44,6 @@ namespace MWWorld
// manually will probably give unexcepted results. This is not a problem since RefData
// are never copied outside of container operations.
boost::shared_ptr<MWMechanics::CreatureStats> mCreatureStats;
boost::shared_ptr<MWMechanics::NpcStats> mNpcStats;
boost::shared_ptr<MWMechanics::Movement> mMovement;
boost::shared_ptr<ContainerStore<RefData> > mContainerStore;
......@@ -92,8 +90,6 @@ namespace MWWorld
boost::shared_ptr<MWMechanics::CreatureStats>& getCreatureStats();
boost::shared_ptr<MWMechanics::NpcStats>& getNpcStats();
boost::shared_ptr<MWMechanics::Movement>& getMovement();
boost::shared_ptr<ContainerStore<RefData> >& getContainerStore();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment