1 /*--------------Patrick 21/1/97----------------------- 2 Header file for predator AI & NPC support functions 3 ---------------------------------------------------*/ 4 5 #ifndef _bhpred_h_ 6 #define _bhpred_h_ 1 7 8 #ifdef __cplusplus 9 extern "C" { 10 #endif 11 12 #include "bh_ais.h" 13 #include "decal.h" 14 15 /*----------------------------- 16 Predator Specific Support 17 -------------------------------*/ 18 /* predator animation sequences */ 19 typedef enum predatorsequence 20 { 21 PredSQ_Run=0, 22 PredSQ_Crawl, 23 PredSQ_Stand, 24 PredSQ_Crouch, 25 PredSQ_StandDie, 26 PredSQ_StandDead, 27 PredSQ_CrouchDie, 28 PredSQ_CrouchDead, 29 PredSQ_StandingSwipe, 30 PredSQ_CrouchedSwipe, 31 PredSQ_RunningSwipe, 32 PredSQ_CrawlingSwipe, 33 PredSQ_Jump, 34 PredSQ_Taunt, 35 PredSQ_Run_Backwards, 36 PredSQ_Crawl_Backwards, 37 PredSQ_RunningSwipe_Backwards, 38 PredSQ_CrawlingSwipe_Backwards, 39 PredSQ_BaseOfStaffAttacks=20, 40 PredSQ_BaseOfWristbladeAttacks=40, 41 }PREDATOR_SEQUENCE; 42 43 typedef enum pred_bhstate { 44 PBS_Wandering, 45 PBS_Hunting, 46 PBS_Avoidance, 47 PBS_Withdrawing, 48 PBS_Dying, 49 PBS_Recovering, 50 PBS_SwapWeapon, 51 PBS_Engaging, 52 PBS_Attacking, 53 PBS_Pathfinding, 54 PBS_Returning, 55 PBS_Taunting, 56 PBS_SelfDestruct, 57 } PRED_BHSTATE; 58 59 typedef enum pred_return_condition { 60 PRC_No_Change, 61 PRC_Request_Engage, 62 PRC_Request_Attack, 63 PRC_Request_Wander, 64 PRC_Request_Avoidance, 65 PRC_Request_Hunt, 66 PRC_Request_Withdraw, 67 PRC_Request_Recover, 68 PRC_Request_Swap, 69 PRC_Request_Return, 70 PRC_Request_Pathfind, 71 PRC_Request_Taunt, 72 PRC_Request_SelfDestruct, 73 } PRED_RETURN_CONDITION; 74 75 /* cloaking states */ 76 typedef enum pred_cloakstate 77 { 78 PCLOAK_Off, 79 PCLOAK_Activating, 80 PCLOAK_On, 81 PCLOAK_Deactivating, 82 }PRED_CLOAKSTATE; 83 84 typedef struct predatorPersonalParameters 85 { 86 int startingHealth; /* initial health */ 87 int speed; /* running speed */ 88 int defenceHealth; /* health level below which defensive behaviour is used */ 89 int useShoulderCannon; /* 1 = shouldercannon, 0 = disc */ 90 int timeBetweenRangedAttacks; 91 int maxShotsPerRangedAttack; 92 int timeBetweenShots; 93 int closeAttackDamage; 94 int regenerationUnit; /* health recovered when made visible */ 95 int chanceOfCloaking; /* 0-8, chance in 8 */ 96 } PREDATOR_PERSONALPARAMETERS; 97 98 typedef enum predator_npc_weapons { 99 100 PNPCW_Pistol, 101 PNPCW_Wristblade, 102 PNPCW_PlasmaCaster, 103 PNPCW_Staff, 104 PNPCW_Medicomp, 105 PNPCW_Speargun, 106 PNPCW_SeriousPlasmaCaster, 107 PNPCW_End, 108 109 } PREDATOR_NPC_WEAPONS; 110 111 typedef struct predator_weapon_data { 112 113 PREDATOR_NPC_WEAPONS id; 114 PRED_RETURN_CONDITION (*WeaponFireFunction)(STRATEGYBLOCK *); 115 PRED_RETURN_CONDITION (*WeaponEngageFunction)(STRATEGYBLOCK *); 116 char *Riffname; 117 char *HierarchyName; 118 char *GunName; 119 char *ElevationName; 120 char *HitLocationTableName; 121 int MinRange; 122 int ForceFireRange; 123 int MaxRange; 124 int FiringRate; 125 int VolleySize; 126 int SwappingTime; 127 int UseElevation :1; 128 129 }PREDATOR_WEAPON_DATA; 130 131 typedef struct predatorStatusBlock 132 { 133 signed int health; 134 PRED_BHSTATE behaviourState; 135 PRED_BHSTATE lastState; 136 137 int stateTimer; 138 int internalState; 139 int patience; 140 int enableSwap; 141 int enableTaunt; 142 VECTORCH weaponTarget; /* target position for firing weapon at */ 143 int volleySize; /* used for weapon control */ 144 NPC_OBSTRUCTIONREPORT obstruction; 145 NPC_MOVEMENTDATA moveData; 146 NPC_WANDERDATA wanderData; 147 148 NPC_AVOIDANCEMANAGER avoidanceManager; 149 WAYPOINT_MANAGER waypointManager; 150 151 int IAmCrouched; 152 int personalNumber; /* for predator personalisation */ 153 int nearSpeed; 154 int GibbFactor; 155 156 int incidentFlag; 157 int incidentTimer; 158 159 PREDATOR_WEAPON_DATA *Selected_Weapon; 160 PREDATOR_NPC_WEAPONS PrimaryWeapon; 161 PREDATOR_NPC_WEAPONS SecondaryWeapon; 162 PREDATOR_NPC_WEAPONS ChangeToWeapon; 163 ATTACK_DATA *current_attack; 164 165 STRATEGYBLOCK *Target; 166 char Target_SBname[SB_NAME_LENGTH]; 167 int soundHandle; 168 169 HMODELCONTROLLER HModelController; 170 SECTION_DATA *My_Gun_Section; /* For template computation. */ 171 SECTION_DATA *My_Elevation_Section; /* For elevation computation. */ 172 173 /* these are for cloaking... */ 174 PRED_CLOAKSTATE CloakStatus; 175 int CloakingEffectiveness; 176 int CloakTimer; 177 178 /* And these for the laser dots. */ 179 THREE_LASER_DOT_DESC Pred_Laser_Sight; 180 int Pred_Laser_On :1; 181 int Explode :1; 182 /* Pathfinder parameters */ 183 int path; 184 int stepnumber; 185 AIMODULE *missionmodule; 186 AIMODULE *fearmodule; 187 /* Pathfinder parameters */ 188 189 char death_target_ID[SB_NAME_LENGTH]; //another strategy can be notified of the marine's death 190 STRATEGYBLOCK* death_target_sbptr; 191 int death_target_request; 192 193 }PREDATOR_STATUS_BLOCK; 194 195 typedef struct dormantPredatorStatusBlock 196 { 197 AVP_BEHAVIOUR_TYPE bhvr_type; 198 void* toolsData; 199 }DORMANT_PREDATOR_STATUS_BLOCK; 200 201 /* Tools data template */ 202 typedef struct tools_data_predator 203 { 204 struct vectorch position; 205 int shapeIndex; 206 int predator_number; 207 char nameID[SB_NAME_LENGTH]; 208 PREDATOR_NPC_WEAPONS primary; 209 PREDATOR_NPC_WEAPONS secondary; 210 int path; 211 int stepnumber; 212 213 char death_target_ID[SB_NAME_LENGTH]; 214 int death_target_request; 215 216 }TOOLS_DATA_PREDATOR; 217 218 #define PRED_SELF_DESTRUCT_TIMER (ONE_FIXED*3) 219 #define PRED_WALKING_SPEED_MAX (5000) 220 #define PRED_WALKING_SPEED_MIN (3000) 221 #define PRED_PATIENCE_TIME (6*ONE_FIXED) 222 #define PRED_REGEN_TIME (10*ONE_FIXED) 223 #define PRED_MAXIDENTITY (4) 224 #define NO_OF_FRAGMENTS_FROM_DEAD_PREDATOR (10) 225 #define PRED_CLOSE_ATTACK_RANGE (1500) /* mm */ 226 #define PRED_STAFF_ATTACK_RANGE (2000) /* mm */ 227 #define PRED_NEAR_VIEW_WIDTH (500) /* mm */ 228 #define PRED_FPPLASMA_INFRONT (600) /* mm */ 229 #define PRED_FPPLASMA_ACROSS (-500) /* mm */ 230 #define PRED_FPPLASMA_UP (900) /* mm */ 231 #define PRED_FPPLASMA_INFRONTCROUCH (600) /* mm */ 232 #define PRED_FPPLASMA_ACROSSCROUCH (-500) /* mm */ 233 #define PRED_FPPLASMA_UPCROUCH (400) /* mm */ 234 #define PRED_FPDISC_INFRONT (600) /* mm */ 235 #define PRED_FPDISC_ACROSS (500) /* mm */ 236 #define PRED_FPDISC_UP (500) /* mm */ 237 #define PRED_FPDISC_INFRONTCROUCH (600) /* mm */ 238 #define PRED_FPDISC_ACROSSCROUCH (500) /* mm */ 239 #define PRED_FPDISC_UPCROUCH (200) /* mm */ 240 #define PRED_PLASBOLTSPEED (22000) /* mm/s */ 241 #define PRED_PLASBOLTDAMAGE (50) 242 /* 1.5-2 seconds in 1/16 second. NB DO NOT INCREASE THIS */ 243 #define PRED_FAR_MOVE_TIME ((24+(FastRandom()&0x07))*(ONE_FIXED>>4)) 244 #define PRED_NEAR_CLOSEATTACK_TIME ONE_FIXED /* 1 second */ 245 246 extern void InitPredatorBehaviour(void* bhdata, STRATEGYBLOCK *sbPtr); 247 extern void InitDormantPredatorBehaviour(void* bhdata, STRATEGYBLOCK *sbPtr); 248 extern void PredatorBehaviour(STRATEGYBLOCK *sbPtr); 249 extern void MakePredatorNear(STRATEGYBLOCK *sbPtr); 250 extern void MakePredatorFar(STRATEGYBLOCK *sbPtr); 251 extern void PredatorIsDamaged(STRATEGYBLOCK *sbPtr, DAMAGE_PROFILE *damage, int multiple,SECTION_DATA *Section, VECTORCH *incoming); 252 extern void ActivateDormantPredator(STRATEGYBLOCK *sbPtr); 253 extern int NPCPredatorIsCloaked(STRATEGYBLOCK *sbPtr); 254 extern void StartPredatorSelfDestructExplosion(STRATEGYBLOCK *sbPtr); 255 256 #ifdef __cplusplus 257 } 258 #endif 259 260 261 #endif 262