Implement Face instruction (Feature #1424)

This commit is contained in:
MiroslavR 2016-07-09 02:16:47 +02:00
parent 6f376bd499
commit dc0bc5b68c
7 changed files with 78 additions and 6 deletions

View file

@ -84,7 +84,7 @@ add_openmw_dir (mwmechanics
drawstate spells activespells npcstats aipackage aisequence aipursue alchemy aiwander aitravel aifollow aiavoiddoor
aiescort aiactivate aicombat repair enchanting pathfinding pathgrid security spellsuccess spellcasting
disease pickpocket levelledlist combat steering obstacle autocalcspell difficultyscaling aicombataction actor summoning
character actors objects aistate coordinateconverter trading
character actors objects aistate coordinateconverter trading aiface
)
add_openmw_dir (mwstate

View file

@ -0,0 +1,31 @@
#include "aiface.hpp"
#include "../mwbase/world.hpp"
#include "steering.hpp"
MWMechanics::AiFace::AiFace(float targetX, float targetY)
: mTargetX(targetX), mTargetY(targetY)
{
}
MWMechanics::AiPackage *MWMechanics::AiFace::clone() const
{
return new AiFace(*this);
}
bool MWMechanics::AiFace::execute(const MWWorld::Ptr& actor, MWMechanics::CharacterController& /*characterController*/, MWMechanics::AiState& /*state*/, float /*duration*/)
{
osg::Vec3f dir = osg::Vec3f(mTargetX, mTargetY, 0) - actor.getRefData().getPosition().asVec3();
return zTurn(actor, std::atan2(dir.x(), dir.y()), osg::DegreesToRadians(3.f));
}
int MWMechanics::AiFace::getTypeId() const
{
return AiPackage::TypeIdFace;
}
unsigned int MWMechanics::AiFace::getPriority() const
{
return 2;
}

View file

@ -0,0 +1,29 @@
#ifndef GAME_MWMECHANICS_AIFACE_H
#define GAME_MWMECHANICS_AIFACE_H
#include "aipackage.hpp"
namespace MWMechanics
{
/// AiPackage which makes an actor face a certain direction.
class AiFace : public AiPackage {
public:
AiFace(float targetX, float targetY);
virtual AiPackage *clone() const;
virtual bool execute (const MWWorld::Ptr& actor, CharacterController& characterController, AiState& state, float duration);
virtual int getTypeId() const;
virtual unsigned int getPriority() const;
virtual bool canCancel() const { return false; }
virtual bool shouldCancelPreviousAi() const { return false; }
private:
float mTargetX, mTargetY;
};
}
#endif

View file

@ -40,11 +40,12 @@ namespace MWMechanics
TypeIdFollow = 3,
TypeIdActivate = 4,
// These 3 are not really handled as Ai Packages in the MW engine
// These 4 are not really handled as Ai Packages in the MW engine
// For compatibility do *not* return these in the getCurrentAiPackage script function..
TypeIdCombat = 5,
TypeIdPursue = 6,
TypeIdAvoidDoor = 7
TypeIdAvoidDoor = 7,
TypeIdFace = 8
};
///Default constructor

View file

@ -159,7 +159,8 @@ bool isActualAiPackage(int packageTypeId)
{
return (packageTypeId != AiPackage::TypeIdCombat
&& packageTypeId != AiPackage::TypeIdPursue
&& packageTypeId != AiPackage::TypeIdAvoidDoor);
&& packageTypeId != AiPackage::TypeIdAvoidDoor
&& packageTypeId != AiPackage::TypeIdFace);
}
void AiSequence::execute (const MWWorld::Ptr& actor, CharacterController& characterController, AiState& state, float duration)

View file

@ -19,6 +19,7 @@
#include "../mwmechanics/aifollow.hpp"
#include "../mwmechanics/aitravel.hpp"
#include "../mwmechanics/aiwander.hpp"
#include "../mwmechanics/aiface.hpp"
#include "../mwbase/environment.hpp"
#include "../mwbase/world.hpp"
@ -483,7 +484,16 @@ namespace MWScript
public:
virtual void execute(Interpreter::Runtime& runtime)
{
/// \todo implement
MWWorld::Ptr actor = R()(runtime);
Interpreter::Type_Float x = runtime[0].mFloat;
runtime.pop();
Interpreter::Type_Float y = runtime[0].mFloat;
runtime.pop();
MWMechanics::AiFace facePackage(x, y);
actor.getClass().getCreatureStats(actor).getAiSequence().stack(facePackage, actor);
}
};

View file

@ -70,7 +70,7 @@ namespace Compiler
extensions.registerFunction ("getlineofsight", 'l', "c", opcodeGetLineOfSight, opcodeGetLineOfSightExplicit);
extensions.registerFunction ("getlos", 'l', "c", opcodeGetLineOfSight, opcodeGetLineOfSightExplicit);
extensions.registerFunction("gettarget", 'l', "c", opcodeGetTarget, opcodeGetTargetExplicit);
extensions.registerInstruction("face", "llX", opcodeFace, opcodeFaceExplicit);
extensions.registerInstruction("face", "ffX", opcodeFace, opcodeFaceExplicit);
}
}