1 /* CDF 11/6/98 - AI support functions moved out of bh_pred. */ 2 3 #ifndef _bhais_h_ 4 #define _bhais_h_ 1 5 6 #ifdef __cplusplus 7 extern "C" { 8 #endif 9 10 /*----------------------------- 11 General AI Support 12 -------------------------------*/ 13 typedef struct npc_obstructionreport 14 { 15 unsigned int environment :1; /* x consecutive obstructive colls against env or indestructible object */ 16 unsigned int destructableObject :1; /* x consecutive obstructive colls against destructible object */ 17 unsigned int otherCharacter :1; /* single collison with other npc of same type */ 18 unsigned int anySingleObstruction :1; /* any single collision of above types */ 19 }NPC_OBSTRUCTIONREPORT; 20 21 typedef enum avoidance_substate { 22 AvSS_FreeMovement=0, 23 AvSS_FirstAvoidance, 24 AvSS_SecondAvoidance, 25 AvSS_ThirdAvoidance, 26 } AVOIDANCE_SUBSTATE; 27 28 typedef enum avoidance_return_condition { 29 AvRC_Clear=0, 30 AvRC_Avoidance, 31 AvRC_Failure, 32 } AVOIDANCE_RETURN_CONDITION; 33 34 typedef struct npc_avoidancemanager { 35 /* New structure for super-avoidance system - expand at will! */ 36 VECTORCH avoidanceDirection; 37 VECTORCH incidenceDirection; 38 VECTORCH incidentPoint; 39 40 VECTORCH aggregateNormal; 41 42 int recommendedDistance; 43 int timer; 44 STRATEGYBLOCK *primaryCollision; 45 AVOIDANCE_SUBSTATE substate; 46 enum AMMO_ID ClearanceDamage; 47 /* Third avoidance parameters! */ 48 int stage; 49 VECTORCH baseVector; 50 VECTORCH basePoint; 51 VECTORCH currentVector; 52 MATRIXCH rotationMatrix; 53 VECTORCH bestVector; 54 int bestDistance; 55 int bestStage; 56 57 } NPC_AVOIDANCEMANAGER; 58 59 #define STANDARD_AVOIDANCE_TIME (ONE_FIXED*5) 60 #define THIRD_AVOIDANCE_MINDIST (2000) 61 62 typedef struct npc_movementdata 63 { 64 int numObstructiveCollisions; 65 VECTORCH avoidanceDirn; 66 VECTORCH lastTarget; 67 VECTORCH lastVelocity; 68 int numReverses; 69 AIMODULE *lastModule; 70 }NPC_MOVEMENTDATA; 71 72 typedef struct npc_wanderdata 73 { 74 int currentModule; 75 VECTORCH worldPosition; 76 }NPC_WANDERDATA; 77 78 #define NPC_AVOIDTIME (ONE_FIXED<<1) 79 #define NPC_GMD_NOPOLY (-1) 80 #define NPC_MIN_MOVEFROMPOLYDIST (650) 81 #define NPC_IMPEDING_COL_THRESHOLD (10) /* Was 10 */ 82 #define NPC_JUMPSPEED (55) /* mm/s */ 83 #define NPC_JUMPHEIGHT (1000) 84 //#define NPC_TURNRATE (ONE_FIXED) /* thro' 360 degrees */ 85 #define NPC_TURNRATE (4096) 86 #define NPC_DEATHTIME (ONE_FIXED>>1) 87 #define NPC_TARGETPOINTELEVATION (-400) 88 #define NPC_INANIMATEOBJECTDAMAGE (10000) 89 #define NPC_NOWANDERMODULE (-1) 90 #define NPC_BIMBLINGINMODULE (-2) 91 92 #define NUM_ATTACKFLAGS (3) 93 94 /* Death Structures */ 95 96 typedef struct hit_facing { 97 int Front: 1; 98 int Back: 1; 99 int Left: 1; 100 int Right: 1; 101 } HIT_FACING; 102 103 typedef struct death_data { 104 int Sequence_Type; 105 int Sub_Sequence; 106 int TweeningTime; 107 int Sequence_Length; 108 int Multiplayer_Code; 109 int Unique_Code; //unique across all deaths - for saving 110 int wound_flags; /* HModel wound flags */ 111 int priority_wounds; 112 int Template: 1; 113 HIT_FACING Facing; 114 int Burning: 1; 115 int Electrical: 1; 116 int Crouching: 1; 117 int MinorBoom: 1; 118 int MajorBoom: 1; 119 } DEATH_DATA; 120 121 typedef struct attack_data { 122 int Sequence_Type; 123 int Sub_Sequence; 124 int TweeningTime; 125 int Sequence_Length; 126 int Multiplayer_Code; 127 int Unique_Code; //unique across all attacks - for saving 128 int wound_flags; 129 enum AMMO_ID flag_damage[NUM_ATTACKFLAGS]; 130 int Crouching: 1; 131 int Pouncing: 1; 132 } ATTACK_DATA; 133 134 typedef enum movement_data_index { 135 MDI_Marine_Mooch_Bored=0, 136 MDI_Marine_Mooch_Alert, 137 MDI_Marine_Combat, 138 MDI_Marine_Sprint, 139 MDI_Civilian_Mooch_Bored, 140 MDI_Civilian_Mooch_Alert, 141 MDI_Civilian_Combat, 142 MDI_Civilian_Sprint, 143 MDI_Predator, 144 MDI_Casual_Predator, 145 MDI_Xenoborg, 146 MDI_End, 147 } MOVEMENT_DATA_INDEX; 148 149 typedef struct movement_data { 150 MOVEMENT_DATA_INDEX index; 151 unsigned int maxSpeed; 152 unsigned int acceleration; 153 } MOVEMENT_DATA; 154 155 /* Function Declarations */ 156 157 extern int CheckAdjacencyValidity(AIMODULE *target,AIMODULE *source,int alien); 158 extern int AIModuleIsVisible(AIMODULE *aimodule); 159 160 extern int NPC_IsDead(STRATEGYBLOCK *sbPtr); 161 extern void NPC_InitMovementData(NPC_MOVEMENTDATA *moveData); 162 extern void NPC_IsObstructed(STRATEGYBLOCK *sbPtr, NPC_MOVEMENTDATA *moveData, NPC_OBSTRUCTIONREPORT *details, STRATEGYBLOCK **destructableObject); 163 extern int NPC_CannotReachTarget(NPC_MOVEMENTDATA *moveData, VECTORCH* thisTarget, VECTORCH* thisVelocity); 164 extern void NPCGetAvoidanceDirection(STRATEGYBLOCK *sbPtr, VECTORCH *velocityDirection, NPC_OBSTRUCTIONREPORT *details); 165 extern void NPCGetTargetPosition(VECTORCH *targetPoint,STRATEGYBLOCK *target); 166 extern int NPCSetVelocity(STRATEGYBLOCK *sbPtr, VECTORCH* targetDirn, int in_speed); 167 extern int NPCOrientateToVector(STRATEGYBLOCK *sbPtr, VECTORCH *zAxisVector, int turnspeed, VECTORCH *offset); 168 extern void NPCGetMovementTarget(STRATEGYBLOCK *sbPtr, STRATEGYBLOCK *target, VECTORCH *targetPosition, int* targetIsAirduct,int alien); 169 extern void NPCGetMovementDirection(STRATEGYBLOCK *sbPtr, VECTORCH *velocityDirection, VECTORCH* target, WAYPOINT_MANAGER *waypointManager); 170 extern void NPC_InitWanderData(NPC_WANDERDATA *wanderData); 171 extern void NPC_FindWanderTarget(STRATEGYBLOCK *sbPtr, NPC_WANDERDATA *wanderData, NPC_MOVEMENTDATA *moveData); 172 extern void NPC_FindAIWanderTarget(STRATEGYBLOCK *sbPtr, NPC_WANDERDATA *wanderData, NPC_MOVEMENTDATA *moveData, int alien); 173 extern void ProjectNPCShot(STRATEGYBLOCK *sbPtr, STRATEGYBLOCK *target, VECTORCH *muzzlepos, MATRIXCH *muzzleorient,enum AMMO_ID AmmoID, int multiple); 174 extern void CastLOSProjectile(STRATEGYBLOCK *sbPtr, VECTORCH *muzzlepos, VECTORCH *in_shotvector, enum AMMO_ID AmmoID, int multiple, int inaccurate); 175 extern int VerifyHitShot(STRATEGYBLOCK *sbPtr, STRATEGYBLOCK *target, VECTORCH *muzzlepos, VECTORCH *in_shotvector, enum AMMO_ID AmmoID, int multiple, int maxrange); 176 extern AIMODULE *GetNextModuleForLink(AIMODULE *source,AIMODULE *target,int max_depth,int alien); 177 extern AIMODULE *GetNextModuleForLink_Core(AIMODULE *source,AIMODULE *target,int max_depth,int visibility_check,int alien); 178 extern int GetNextModuleInPath(int current_module, int path); 179 extern AIMODULE *TranslatePathIndex(int current_module, int path); 180 extern int GetClosestStepInPath(int path,MODULE* current_module); 181 182 extern DEATH_DATA *GetDeathSequence(HMODELCONTROLLER *controller,SECTION *TemplateRoot,DEATH_DATA *FirstDeath,int wound_flags,int priority_wounds, 183 int hurtiness,HIT_FACING *facing,int burning,int crouching,int electrical); 184 extern DEATH_DATA *GetAlienDeathSequence(HMODELCONTROLLER *controller,SECTION *TemplateRoot,int wound_flags,int priority_wounds, 185 int hurtiness,HIT_FACING *facing,int burning,int crouching,int electrical); 186 extern DEATH_DATA *GetMarineDeathSequence(HMODELCONTROLLER *controller,SECTION *TemplateRoot,int wound_flags,int priority_wounds, 187 int hurtiness,HIT_FACING *facing,int burning,int crouching,int electrical); 188 extern DEATH_DATA *GetPredatorDeathSequence(HMODELCONTROLLER *controller,SECTION *TemplateRoot,int wound_flags,int priority_wounds, 189 int hurtiness,HIT_FACING *facing,int burning,int crouching,int electrical); 190 extern DEATH_DATA *GetXenoborgDeathSequence(HMODELCONTROLLER *controller,SECTION *TemplateRoot,int wound_flags,int priority_wounds, 191 int hurtiness,HIT_FACING *facing,int burning,int crouching,int electrical); 192 193 extern DEATH_DATA *GetThisDeath_FromCode(HMODELCONTROLLER *controller,DEATH_DATA *FirstDeath,int code); 194 extern DEATH_DATA *GetThisDeath_FromUniqueCode(int code); 195 196 extern ATTACK_DATA *GetThisAttack_FromCode(HMODELCONTROLLER *controller,ATTACK_DATA *FirstAttack,int code); 197 extern ATTACK_DATA *GetAttackSequence(HMODELCONTROLLER *controller,ATTACK_DATA *FirstAttack,int wound_flags,int crouching, int pouncing); 198 extern ATTACK_DATA *GetAlienAttackSequence(HMODELCONTROLLER *controller,int wound_flags,int crouching); 199 extern ATTACK_DATA *GetAlienPounceAttack(HMODELCONTROLLER *controller,int wound_flags,int crouching); 200 extern ATTACK_DATA *GetWristbladeAttackSequence(HMODELCONTROLLER *controller,int wound_flags,int crouching); 201 extern ATTACK_DATA *GetPredStaffAttackSequence(HMODELCONTROLLER *controller,int wound_flags,int crouching); 202 203 extern ATTACK_DATA *GetThisAttack_FromUniqueCode(int code);//for loading 204 205 extern AIMODULE *NearNPC_GetTargetAIModuleForRetreat(STRATEGYBLOCK *sbPtr, NPC_MOVEMENTDATA *moveData); 206 extern AIMODULE *General_GetAIModuleForRetreat(STRATEGYBLOCK *sbPtr,AIMODULE *fearModule,int max_depth); 207 /* All New Avoidance Code! */ 208 extern int New_NPC_IsObstructed(STRATEGYBLOCK *sbPtr, NPC_AVOIDANCEMANAGER *manager); 209 extern void Initialise_AvoidanceManager(STRATEGYBLOCK *sbPtr, NPC_AVOIDANCEMANAGER *manager); 210 extern AVOIDANCE_RETURN_CONDITION AllNewAvoidanceKernel(STRATEGYBLOCK *sbPtr,NPC_AVOIDANCEMANAGER *manager); 211 /* All New Avoidance Code! */ 212 extern const MOVEMENT_DATA *GetThisMovementData(MOVEMENT_DATA_INDEX index); 213 extern void AlignVelocityToGravity(STRATEGYBLOCK *sbPtr,VECTORCH *velocity); 214 215 extern int NPC_targetIsPlayer; 216 extern VECTORCH NPC_movementTarget; 217 extern int *NPC_myPoly; 218 extern int *NPC_myLastPoly; 219 extern int *NPC_lastFrameModule; 220 221 extern int Observer; 222 223 typedef struct pathheader 224 { 225 int path_length; 226 AIMODULE** modules_in_path; 227 }PATHHEADER; 228 229 extern int PathArraySize; 230 extern PATHHEADER* PathArray; 231 232 #ifdef __cplusplus 233 } 234 #endif 235 236 237 #endif 238