#include "creature.hpp" #include #include "../mwmechanics/creaturestats.hpp" #include "../mwmechanics/mechanicsmanager.hpp" #include "../mwworld/ptr.hpp" #include "../mwworld/actiontalk.hpp" #include "../mwworld/environment.hpp" #include "../mwworld/customdata.hpp" #include "../mwworld/containerstore.hpp" namespace { struct CustomData : public MWWorld::CustomData { MWMechanics::CreatureStats mCreatureStats; MWWorld::ContainerStore mContainerStore; virtual MWWorld::CustomData *clone() const; }; MWWorld::CustomData *CustomData::clone() const { return new CustomData (*this); } } namespace MWClass { void Creature::ensureCustomData (const MWWorld::Ptr& ptr) const { if (!ptr.getRefData().getCustomData()) { std::auto_ptr data (new CustomData); ESMS::LiveCellRef *ref = ptr.get(); // creature stats data->mCreatureStats.mAttributes[0].set (ref->base->data.strength); data->mCreatureStats.mAttributes[1].set (ref->base->data.intelligence); data->mCreatureStats.mAttributes[2].set (ref->base->data.willpower); data->mCreatureStats.mAttributes[3].set (ref->base->data.agility); data->mCreatureStats.mAttributes[4].set (ref->base->data.speed); data->mCreatureStats.mAttributes[5].set (ref->base->data.endurance); data->mCreatureStats.mAttributes[6].set (ref->base->data.personality); data->mCreatureStats.mAttributes[7].set (ref->base->data.luck); data->mCreatureStats.mDynamic[0].set (ref->base->data.health); data->mCreatureStats.mDynamic[1].set (ref->base->data.mana); data->mCreatureStats.mDynamic[2].set (ref->base->data.fatigue); data->mCreatureStats.mLevel = ref->base->data.level; // \todo add initial container content // store ptr.getRefData().setCustomData (data.release()); } } std::string Creature::getId (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = ptr.get(); return ref->base->mId; } void Creature::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const { MWRender::Actors& actors = renderingInterface.getActors(); actors.insertCreature(ptr); } void Creature::insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const { ESMS::LiveCellRef *ref = ptr.get(); const std::string &model = ref->base->model; assert (ref->base != NULL); if(!model.empty()){ physics.insertActorPhysics(ptr, "meshes\\" + model); } } void Creature::enable (const MWWorld::Ptr& ptr, MWWorld::Environment& environment) const { environment.mMechanicsManager->addActor (ptr); } void Creature::disable (const MWWorld::Ptr& ptr, MWWorld::Environment& environment) const { environment.mMechanicsManager->removeActor (ptr); } std::string Creature::getName (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = ptr.get(); return ref->base->name; } MWMechanics::CreatureStats& Creature::getCreatureStats (const MWWorld::Ptr& ptr) const { ensureCustomData (ptr); return dynamic_cast (*ptr.getRefData().getCustomData()).mCreatureStats; } boost::shared_ptr Creature::activate (const MWWorld::Ptr& ptr, const MWWorld::Ptr& actor, const MWWorld::Environment& environment) const { return boost::shared_ptr (new MWWorld::ActionTalk (ptr)); } MWWorld::ContainerStore& Creature::getContainerStore (const MWWorld::Ptr& ptr) const { ensureCustomData (ptr); return dynamic_cast (*ptr.getRefData().getCustomData()).mContainerStore; } std::string Creature::getScript (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = ptr.get(); return ref->base->script; } void Creature::registerSelf() { boost::shared_ptr instance (new Creature); registerClass (typeid (ESM::Creature).name(), instance); } }