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