2012-12-30 16:37:54 +00:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// $Logfile:: /Code/DLLs/game/actor_locomotion.h $
|
|
|
|
// $Revision:: 22 $
|
|
|
|
// $Author:: Steven $
|
|
|
|
// $Date:: 10/13/03 8:53a $
|
|
|
|
//
|
|
|
|
// Copyright (C) 2001 by Ritual Entertainment, Inc.
|
|
|
|
// All rights reserved.
|
|
|
|
//
|
|
|
|
// This source may not be distributed and/or modified without
|
|
|
|
// expressly written permission by Ritual Entertainment, Inc.
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// DESCRIPTION:
|
|
|
|
// Motion and Movement Related Classes
|
|
|
|
//
|
|
|
|
|
|
|
|
class MovementSubsystem;
|
|
|
|
class LocomotionController;
|
|
|
|
|
|
|
|
#ifndef __ACTOR_LOCOMOTION_H__
|
|
|
|
#define __ACTOR_LOCOMOTION_H__
|
|
|
|
|
|
|
|
#include "actorincludes.h"
|
|
|
|
#include "path.h"
|
|
|
|
|
|
|
|
class LocomotionController
|
2015-04-29 20:34:44 +00:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
LocomotionController();
|
|
|
|
|
|
|
|
explicit LocomotionController(Actor *actor)
|
|
|
|
{
|
|
|
|
//Initialize our Actor
|
|
|
|
if (actor)
|
|
|
|
act = actor;
|
|
|
|
else
|
|
|
|
gi.Error(ERR_DROP, "LocomotionController::LocomotionController -- actor is NULL");
|
|
|
|
|
|
|
|
_init();
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual ~LocomotionController();
|
|
|
|
|
|
|
|
void Begin();
|
|
|
|
void Evaluate();
|
|
|
|
void End();
|
|
|
|
|
|
|
|
// Accessors & Mutators
|
|
|
|
void SetMovementStyle(MovementStyle style);
|
|
|
|
MovementStyle GetMovementStyle();
|
|
|
|
|
|
|
|
// Archiving
|
|
|
|
virtual void Archive(Archiver &arc);
|
|
|
|
void DoArchive(Archiver &arc, Actor *actor);
|
|
|
|
|
|
|
|
protected:
|
|
|
|
void _init();
|
|
|
|
|
|
|
|
private:
|
|
|
|
Actor *act;
|
|
|
|
MovementStyle _movementStyle;
|
|
|
|
FollowPath _chase;
|
|
|
|
|
|
|
|
};
|
2012-12-30 16:37:54 +00:00
|
|
|
|
|
|
|
//============================
|
|
|
|
// Class MovementSubsystem
|
|
|
|
//============================
|
|
|
|
//
|
|
|
|
// Encapsulates movement related data and functionality for the actor
|
|
|
|
//
|
2015-04-29 20:34:44 +00:00
|
|
|
class MovementSubsystem
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
MovementSubsystem();
|
|
|
|
explicit MovementSubsystem(Actor *actor);
|
|
|
|
virtual ~MovementSubsystem();
|
|
|
|
|
|
|
|
qboolean CanMoveTo(const Vector &pos);
|
|
|
|
bool CanWalkTowardsPoint(const Vector &goalPoint, const int mask = -1);
|
|
|
|
qboolean CanWalkTo(const Vector &pos, float bounding_box_extra = 0, int entnum = ENTITYNUM_NONE, const int mask = -1);
|
|
|
|
qboolean CanWalkToFrom(const Vector &origin, const Vector &pos, float bounding_box_extra = 0, int entnum = ENTITYNUM_NONE, const int mask = -1);
|
|
|
|
void Accelerate(const Vector &steering);
|
|
|
|
void CalcMove(void);
|
|
|
|
stepmoveresult_t WaterMove(void);
|
|
|
|
stepmoveresult_t AirMove(void);
|
|
|
|
stepmoveresult_t IsMoveValid(trace_t &horizontalTrace, trace_t &verticalTrace, const Vector &moveBegin, const Vector &moveEnd);
|
|
|
|
stepmoveresult_t TryMove(void);
|
|
|
|
stepmoveresult_t SimpleMove(const bool stickToGround);
|
|
|
|
|
|
|
|
qboolean Push(const Vector &dir);
|
|
|
|
void CheckWater(void);
|
|
|
|
float JumpTo(PathNode * goal, const Angle angle = 45.0f);
|
|
|
|
float JumpTo(Entity * goal, const Angle angle = 45.0f);
|
|
|
|
float JumpTo(const Vector &targ, const Angle angle = 45.0f);
|
|
|
|
Vector SteerTowardsPoint(const Vector &targetPosition, const Vector &targetVelocity, const Vector &moveDirection, const float maxSpeed = 1.0f, const bool adjustSpeed = false);
|
|
|
|
|
|
|
|
|
|
|
|
// Archiving
|
|
|
|
virtual void Archive(Archiver &arc);
|
|
|
|
void DoArchive(Archiver &arc, Actor *actor);
|
|
|
|
|
|
|
|
// Accessors and Mutators
|
|
|
|
void setStep(const Vector &step);
|
|
|
|
const Vector & getStep() const;
|
|
|
|
|
|
|
|
void setLastMove(stepmoveresult_t lastMove);
|
|
|
|
stepmoveresult_t getLastMove();
|
|
|
|
|
|
|
|
void setMove(const Vector &move);
|
|
|
|
Vector getMove();
|
|
|
|
|
|
|
|
void setMoveDir(const Vector &moveDir);
|
|
|
|
Vector getMoveDir();
|
|
|
|
|
|
|
|
void setMoveVelocity(const Vector &moveVelocity);
|
|
|
|
Vector getMoveVelocity();
|
|
|
|
|
|
|
|
void setAnimDir(const Vector &animDir);
|
|
|
|
Vector getAnimDir();
|
|
|
|
|
|
|
|
void setDiveDir(const Vector &diveDir);
|
|
|
|
Vector getDiveDir();
|
|
|
|
|
|
|
|
void setStartPos(const Vector &startPos);
|
|
|
|
Vector getStartPos();
|
|
|
|
|
|
|
|
void setTotalLen(float totalLen);
|
|
|
|
float getTotalLen();
|
|
|
|
|
|
|
|
void setTurnSpeed(float turnSpeed);
|
|
|
|
float getTurnSpeed();
|
|
|
|
|
|
|
|
void setForwardSpeed(float forwardSpeed);
|
|
|
|
float getForwardSpeed();
|
|
|
|
|
|
|
|
void setMoveSpeed(float moveSpeed);
|
|
|
|
float getMoveSpeed();
|
|
|
|
|
|
|
|
void setPath(Path* path);
|
|
|
|
Path* getPath();
|
|
|
|
|
|
|
|
void setFlipLegs(qboolean flip);
|
|
|
|
qboolean getFlipLegs();
|
|
|
|
void flipLegs();
|
|
|
|
|
|
|
|
void setMovingBackwards(qboolean backwards);
|
|
|
|
qboolean getMovingBackwards();
|
|
|
|
|
|
|
|
void setFaceEnemy(bool faceEnemy);
|
|
|
|
bool getFaceEnemy();
|
|
|
|
|
|
|
|
void setAdjustAnimDir(bool adjustAnimDir);
|
|
|
|
bool getAdjustAnimDir();
|
|
|
|
|
|
|
|
|
|
|
|
void setMovementType(MovementType_t mType);
|
|
|
|
MovementType_t getMovementType();
|
|
|
|
|
|
|
|
void SetStickToGround(const bool stick);
|
|
|
|
bool GetStickToGround(void) const;
|
|
|
|
|
|
|
|
void setUseCodeDrivenSpeed(bool useCode);
|
|
|
|
bool getUseCodeDrivenSpeed();
|
|
|
|
|
|
|
|
Entity* getBlockingEntity();
|
|
|
|
void clearBlockingEntity();
|
|
|
|
|
|
|
|
|
|
|
|
protected: // Functions
|
|
|
|
|
|
|
|
Vector _getRealDestinationPosition(const Vector &pos) const;
|
|
|
|
stepmoveresult_t _noGravityTryMove(const Vector &oldorg, trace_t &verticalTrace) const;
|
|
|
|
trace_t _feetWidthTrace(const Vector ¤tLoc, const Vector &bottom, const Vector &endPos, const int mask) const;
|
|
|
|
float _getTraceStep() const;
|
|
|
|
void _saveGroundInformation(trace_t &trace);
|
|
|
|
qboolean _isBlockedByDoor(trace_t &trace) const;
|
|
|
|
qboolean _canMoveSimplePath(const Vector &mins, const Vector &maxs, const Vector &pos) const;
|
|
|
|
qboolean _isBlockedByFall(trace_t &trace) const;
|
|
|
|
qboolean _allowFall() const;
|
|
|
|
qboolean _shouldTryMove() const;
|
|
|
|
qboolean _checkHaveGroundEachStep(const Vector &start, const Vector &end, const Vector &test_mins, const Vector &test_maxs, const int mask = -1) const;
|
|
|
|
void _init();
|
|
|
|
|
|
|
|
private: // Member Variables
|
|
|
|
static Vector _step;
|
|
|
|
|
|
|
|
stepmoveresult_t _lastmove;
|
|
|
|
float _forwardspeed;
|
|
|
|
PathPtr _path;
|
|
|
|
Vector _move;
|
|
|
|
Vector _movedir;
|
|
|
|
float _movespeed;
|
|
|
|
Vector _movevelocity;
|
|
|
|
float _totallen;
|
|
|
|
float _turnspeed;
|
|
|
|
Vector _animdir;
|
|
|
|
Vector _divedir;
|
|
|
|
Vector _startpos;
|
|
|
|
qboolean _fliplegs;
|
|
|
|
qboolean _movingBackwards;
|
|
|
|
bool _faceEnemy;
|
|
|
|
bool _adjustAnimDir;
|
|
|
|
MovementType_t _movementType;
|
|
|
|
bool _stickToGround;
|
|
|
|
bool _useCodeDrivenSpeed;
|
|
|
|
|
|
|
|
Actor *act;
|
|
|
|
EntityPtr _blockingEntity;
|
|
|
|
|
|
|
|
};
|
2012-12-30 16:37:54 +00:00
|
|
|
|
2015-04-29 20:34:44 +00:00
|
|
|
inline void MovementSubsystem::setUseCodeDrivenSpeed(bool useCode)
|
2012-12-30 16:37:54 +00:00
|
|
|
{
|
2015-04-29 20:34:44 +00:00
|
|
|
_useCodeDrivenSpeed = useCode;
|
2012-12-30 16:37:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
inline bool MovementSubsystem::getUseCodeDrivenSpeed()
|
|
|
|
{
|
2015-04-29 20:34:44 +00:00
|
|
|
return _useCodeDrivenSpeed;
|
2012-12-30 16:37:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* __ACTOR_LOCOMOTION_H__ */
|