mirror of
https://github.com/jmarshall23/DoomRTX.git
synced 2026-08-21 13:10:37 +02:00
Quake 4 integrated with DoomRTX
This commit is contained in:
@@ -0,0 +1,295 @@
|
||||
/*
|
||||
===============================================================================
|
||||
|
||||
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__ */
|
||||
Reference in New Issue
Block a user