quake4-sdk/source/game/ai/AI_Move.h
2007-06-15 00:00:00 +00:00

295 lines
7.6 KiB
C++

/*
===============================================================================
AI_Move.h
This file has all movement related typedefs, enums, flags, and structures. It
and its sister CPP file were split from AI.h and AI.cpp in order to prevent
merge conflicts and to make further changes to the system possible.
===============================================================================
*/
#ifndef __AI_MOVE_H__
#define __AI_MOVE_H__
typedef idEntityPtr<idEntity> entityPointer_t;
#define MAX_PATH_LEN 48
/*
=====================
aiMoveDir_t - used by directional movement code
=====================
*/
typedef enum {
MOVEDIR_FORWARD,
MOVEDIR_BACKWARD,
MOVEDIR_LEFT,
MOVEDIR_RIGHT,
MOVEDIR_MAX
} aiMoveDir_t;
extern const char* aiMoveDirectionString [ MOVEDIR_MAX ];
/*
=====================
moveType_t - determines which movement function to call
=====================
*/
typedef enum {
MOVETYPE_DEAD,
MOVETYPE_ANIM,
MOVETYPE_SLIDE,
MOVETYPE_FLY,
MOVETYPE_STATIC,
MOVETYPE_PLAYBACK,
//twhitaker: added custom move type
MOVETYPE_CUSTOM,
NUM_MOVETYPES
} moveType_t;
/*
=====================
aiMoveCommand_t - tells the AI how to get there
=====================
*/
typedef enum {
MOVE_NONE,
MOVE_FACE_ENEMY,
MOVE_FACE_ENTITY,
// commands < NUM_NONMOVING_COMMANDS don't cause a change in position
NUM_NONMOVING_COMMANDS,
MOVE_TO_ENEMY = NUM_NONMOVING_COMMANDS,
MOVE_TO_ENTITY,
MOVE_TO_ATTACK,
MOVE_TO_HELPER,
MOVE_TO_TETHER,
MOVE_TO_COVER,
MOVE_TO_HIDE,
MOVE_TO_POSITION,
MOVE_TO_POSITION_DIRECT,
MOVE_OUT_OF_RANGE,
MOVE_SLIDE_TO_POSITION,
MOVE_WANDER,
MOVE_RV_PLAYBACK,
NUM_MOVE_COMMANDS
} aiMoveCommand_t;
/*
=====================
moveStatus_t - status results from move commands
make sure to change script/doom_defs.script if you add any, or change their order
=====================
*/
typedef enum {
MOVE_STATUS_DONE,
MOVE_STATUS_MOVING,
MOVE_STATUS_WAITING,
MOVE_STATUS_DEST_NOT_FOUND,
MOVE_STATUS_DEST_UNREACHABLE,
MOVE_STATUS_BLOCKED_BY_WALL,
MOVE_STATUS_BLOCKED_BY_OBJECT,
MOVE_STATUS_BLOCKED_BY_ENEMY,
MOVE_STATUS_BLOCKED_BY_MONSTER,
MOVE_STATUS_BLOCKED_BY_PLAYER,
MOVE_STATUS_DISABLED,
NUM_MOVE_STATUS,
} moveStatus_t;
extern const char* aiMoveStatusString[ NUM_MOVE_STATUS ];
/*
=====================
stopEvent_t - used by path prediction
=====================
*/
typedef enum {
SE_BLOCKED = BIT(0),
SE_ENTER_LEDGE_AREA = BIT(1),
SE_ENTER_OBSTACLE = BIT(2),
SE_FALL = BIT(3),
SE_LAND = BIT(4)
} stopEvent_t;
/*
=====================
obstaclePath_s
=====================
*/
typedef struct obstaclePath_s {
idVec3 seekPos; // seek position avoiding obstacles
idEntity * firstObstacle; // if != NULL the first obstacle along the path
idVec3 startPosOutsideObstacles; // start position outside obstacles
idEntity * startPosObstacle; // if != NULL the obstacle containing the start position
idVec3 seekPosOutsideObstacles; // seek position outside obstacles
idEntity * seekPosObstacle; // if != NULL the obstacle containing the seek position
// RAVEN BEGIN
// cdr: Alternate Routes Bug
idList<idEntity*> allObstacles;
// RAVEN END
} obstaclePath_t;
/*
=====================
predictedPath_s
=====================
*/
typedef struct predictedPath_s {
idVec3 endPos; // final position
idVec3 endVelocity; // velocity at end position
idVec3 endNormal; // normal of blocking surface
int endTime; // time predicted
int endEvent; // event that stopped the prediction
const idEntity * blockingEntity; // entity that blocks the movement
} predictedPath_t;
/*
=====================
pathSeek_s
=====================
*/
typedef struct pathSeek_s {
idReachability* reach;
idVec3 seekPos;
} pathSeek_t;
/*
=====================
idMoveState
=====================
*/
class idMoveState {
public:
idMoveState();
void Save( idSaveGame *savefile ) const;
void Restore( idRestoreGame *savefile );
void Spawn( idDict &spawnArgs );
struct movementFlags_s {
// current state
bool done :1;
bool moving :1;
bool crouching :1; // is currently crouching?
bool running :1; // is currently running?
bool blocked :1;
bool obstacleInPath :1;
bool goalUnreachable :1;
bool onGround :1;
bool flyTurning :1; // lean into turns when flying
// ideal state
bool idealRunning :1; // what we want running to be
// various enable / disable flags
bool disabled :1; // is movement disabled? (this includes turning)
bool ignoreObstacles :1; // don't check for obsticles in path
bool allowDirectional :1; // allows directional movement (ie. running sideways, backwards)
bool allowAnimMove :1; // allows any animation movement
bool allowPrevAnimMove :1; // allows slide move if current animmove has no motion extraction on it (smooth transitions)
bool allowHiddenMove :1; // allows character to still move around while hidden
bool allowPushMovables :1; // allows the articulated figure to push moveable objects
bool allowSlideToGoal :1; // allows the AI to excactly slide to the goal position if close enough
bool noRun :1; // force the actor to walk
bool noWalk :1; // force the actor to run
bool noTurn :1; // can the ai turn?
bool noGravity :1; // dont use gravity
bool noRangedInterrupt :1; // dont stop halfway to attack position just because you have a clear shot
} fl;
moveType_t moveType;
aiMoveCommand_t moveCommand;
moveStatus_t moveStatus;
idVec3 moveDest;
idVec3 moveDir; // used for wandering and slide moves
int toAreaNum;
int startTime;
int duration;
float speed; // only used by flying creatures
float range;
float wanderYaw;
int nextWanderTime;
int blockTime;
idEntityPtr<idEntity> obstacle;
idVec3 lastMoveOrigin;
int lastMoveTime;
int anim;
int travelFlags;
float kickForce;
float blockedRadius;
int blockedMoveTime;
int blockedAttackTime;
// turning
float ideal_yaw;
float current_yaw;
float turnRate;
float turnVel;
float anim_turn_yaw;
float anim_turn_amount;
float anim_turn_angles;
// flying
jointHandle_t flyTiltJoint;
float fly_speed;
float fly_bob_strength;
float fly_bob_vert;
float fly_bob_horz;
int fly_offset; // prefered offset from player's view
float fly_seek_scale;
float fly_roll_scale;
float fly_roll_max;
float fly_roll;
float fly_pitch_scale;
float fly_pitch_max;
float fly_pitch;
aiMoveDir_t currentDirection; // Direction currently moving in
aiMoveDir_t idealDirection; // Direction we want to be moving in
float walkRange; // Distance to target before starting to walk
float walkTurn; // Turn delta threshold for walking when turning
idVec2 followRange; // Min and max range for AI following their leader
idVec2 searchRange; // Min and max range to use when searching for a new place to move to
float attackPositionRange; // Override for how close you have to get to your attackPosition before stopping
float turnDelta; // Amount to turn when turning
idVec3 goalPos;
int goalArea;
entityPointer_t goalEntity;
idVec3 goalEntityOrigin; // move to entity uses this to avoid checking the floor position every frame
idVec3 myPos;
int myArea;
idVec3 seekPos;
pathSeek_t path[MAX_PATH_LEN];
int pathLen;
int pathArea;
int pathTime;
idVec3 addVelocity;
};
// cdr: Obstacle Avoidance
void AI_EntityMoved(idEntity* ent);
void AI_MoveInitialize();
#endif /* !__AI_MOVE_H__ */