217 lines
6.7 KiB
C++
217 lines
6.7 KiB
C++
//-----------------------------------------------------------------------------
|
|
//
|
|
// $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 "actor.h"
|
|
#include "actorincludes.h"
|
|
#include "weapon.h"
|
|
#include "path.h"
|
|
#include "steering.h"
|
|
|
|
class LocomotionController
|
|
{
|
|
public:
|
|
LocomotionController();
|
|
LocomotionController( Actor *actor );
|
|
~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;
|
|
|
|
};
|
|
|
|
//============================
|
|
// Class MovementSubsystem
|
|
//============================
|
|
//
|
|
// Encapsulates movement related data and functionality for the actor
|
|
//
|
|
class MovementSubsystem
|
|
{
|
|
public:
|
|
MovementSubsystem();
|
|
MovementSubsystem( Actor *actor );
|
|
~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 );
|
|
const 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 );
|
|
const 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;
|
|
|
|
};
|
|
|
|
inline void MovementSubsystem::setUseCodeDrivenSpeed( bool useCode )
|
|
{
|
|
_useCodeDrivenSpeed = useCode;
|
|
}
|
|
|
|
inline bool MovementSubsystem::getUseCodeDrivenSpeed()
|
|
{
|
|
return _useCodeDrivenSpeed;
|
|
}
|
|
|
|
#endif /* __ACTOR_LOCOMOTION_H__ */
|