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