1 #ifndef __AI_H
2 #define __AI_H
3 
4 #include "JA2Types.h"
5 #include "WorldDef.h"
6 #include "Logger.h"
7 
8 extern INT8	gubAIPathCosts[19][19];
9 #define AI_PATHCOST_RADIUS 9
10 
11 extern BOOLEAN gfDisplayCoverValues;
12 extern INT16 gsCoverValue[WORLD_MAX];
13 
14 // AI actions
15 
16 enum CreatureCalls
17 {
18 	CALL_NONE = 0,
19 	CALL_1_PREY,
20 	CALL_MULTIPLE_PREY,
21 	CALL_ATTACKED,
22 	CALL_CRIPPLED,
23 	NUM_CREATURE_CALLS
24 };
25 
26 // ANY NEW ACTIONS ADDED - UPDATE OVERHEAD.C ARRAY WITH ACTION'S STRING VALUE
27 #define FIRST_MOVEMENT_ACTION AI_ACTION_RANDOM_PATROL
28 #define LAST_MOVEMENT_ACTION AI_ACTION_CHANGE_STANCE
29 enum ActionType
30 {
31 	AI_ACTION_NONE = 0,						// maintain current position & facing
32 
33 	// actions that involve a move to another tile
34 	AI_ACTION_RANDOM_PATROL,			// move towards a random destination
35 	AI_ACTION_SEEK_FRIEND,				// move towards friend in trouble
36 	AI_ACTION_SEEK_OPPONENT,			// move towards a reported opponent
37 	AI_ACTION_TAKE_COVER,					// run for nearest cover from threat
38 	AI_ACTION_GET_CLOSER,					// move closer to a strategic location
39 
40 	AI_ACTION_POINT_PATROL,				// move towards next patrol point
41 	AI_ACTION_LEAVE_WATER_GAS,		// seek nearest spot of ungassed land
42 	AI_ACTION_SEEK_NOISE,					// seek most important noise heard
43 	AI_ACTION_ESCORTED_MOVE,			// go where told to by escortPlayer
44 	AI_ACTION_RUN_AWAY,						// run away from nearby opponent(s)
45 
46 	AI_ACTION_KNIFE_MOVE,					// preparing to stab an opponent
47 	AI_ACTION_APPROACH_MERC,			// move up to a merc in order to talk with them; RT
48 	AI_ACTION_TRACK,							// track a scent
49 	AI_ACTION_EAT,								// monster eats corpse
50 	AI_ACTION_PICKUP_ITEM,				// grab things lying on the ground
51 
52 	AI_ACTION_SCHEDULE_MOVE,			// move according to schedule
53 	AI_ACTION_WALK,								// walk somewhere (NPC stuff etc)
54 	AI_ACTION_RUN,								// run somewhere (NPC stuff etc)
55 	AI_ACTION_MOVE_TO_CLIMB,			// move to edge of roof/building
56 	// miscellaneous movement actions
57 	AI_ACTION_CHANGE_FACING,			// turn to face a different direction
58 
59 	AI_ACTION_CHANGE_STANCE,			// stand, crouch, or go prone
60 	// actions related to items and attacks
61 	AI_ACTION_YELLOW_ALERT,				// tell friends opponent(s) heard
62 	AI_ACTION_RED_ALERT,					// tell friends opponent(s) seen
63 	AI_ACTION_CREATURE_CALL,			// creature communication
64 	AI_ACTION_PULL_TRIGGER,				// go off to activate a panic trigger
65 
66 	AI_ACTION_USE_DETONATOR,			// grab detonator and set off bomb(s)
67 	AI_ACTION_FIRE_GUN,						// shoot at nearby opponent
68 	AI_ACTION_TOSS_PROJECTILE,		// throw grenade at/near opponent(s)
69 	AI_ACTION_KNIFE_STAB,					// during the actual knifing attack
70 	AI_ACTION_THROW_KNIFE,				// throw a knife
71 
72 	AI_ACTION_GIVE_AID,						// help injured/dying friend
73 	AI_ACTION_WAIT,								// RT: don't do anything for a certain length of time
74 	AI_ACTION_PENDING_ACTION,			// RT: wait for pending action (pickup, door open, etc) to finish
75 	AI_ACTION_DROP_ITEM,					// duh
76 	AI_ACTION_COWER,							// for civilians:  cower in fear and stay there!
77 
78 	AI_ACTION_STOP_COWERING,			// stop cowering
79 	AI_ACTION_OPEN_OR_CLOSE_DOOR,	// schedule-provoked; open or close door
80 	AI_ACTION_UNLOCK_DOOR,				// schedule-provoked; unlock door (don't open)
81 	AI_ACTION_LOCK_DOOR,					// schedule-provoked; lock door (close if necessary)
82 	AI_ACTION_LOWER_GUN,					// lower gun prior to throwing knife
83 
84 	AI_ACTION_ABSOLUTELY_NONE,		// like "none" but can't be converted to a wait by realtime
85 	AI_ACTION_CLIMB_ROOF,					// climb up or down roof
86 	AI_ACTION_END_TURN,						// end turn (after final stance change)
87 	AI_ACTION_END_COWER_AND_MOVE,	// sort of dummy value, special for civilians who are to go somewhere at end of battle
88 	AI_ACTION_TRAVERSE_DOWN,			// move down a level
89 	AI_ACTION_OFFER_SURRENDER,		// offer surrender to the player
90 };
91 
92 
93 enum QuoteActionType
94 {
95 	QUOTE_ACTION_ID_CHECKFORDEST = 1,
96 	QUOTE_ACTION_ID_TURNTOWARDSPLAYER,
97 	QUOTE_ACTION_ID_DRAWGUN,
98 	QUOTE_ACTION_ID_LOWERGUN,
99 	QUOTE_ACTION_ID_TRAVERSE_EAST,
100 	QUOTE_ACTION_ID_TRAVERSE_SOUTH,
101 	QUOTE_ACTION_ID_TRAVERSE_WEST,
102 	QUOTE_ACTION_ID_TRAVERSE_NORTH
103 };
104 
105 // NB THESE THREE FLAGS SHOULD BE REMOVED FROM CODE
106 #define AI_RTP_OPTION_CAN_RETREAT				0x01
107 #define AI_RTP_OPTION_CAN_SEEK_COVER		0x02
108 #define AI_RTP_OPTION_CAN_HELP					0x04
109 
110 #define AI_CAUTIOUS											0x08
111 #define AI_HANDLE_EVERY_FRAME						0x10
112 #define AI_ASLEEP												0x20
113 #define AI_LOCK_DOOR_INCLUDES_CLOSE			0x40
114 #define AI_CHECK_SCHEDULE								0x80
115 
116 #define NOT_NEW_SITUATION 0
117 #define WAS_NEW_SITUATION 1
118 #define IS_NEW_SITUATION 2
119 
120 
121 #define DIFF_ENEMY_EQUIP_MOD            0
122 #define DIFF_ENEMY_TO_HIT_MOD           1
123 #define DIFF_ENEMY_INTERRUPT_MOD        2
124 #define DIFF_RADIO_RED_ALERT            3
125 #define DIFF_MAX_COVER_RANGE            4
126 #define MAX_DIFF_PARMS									5      // how many different difficulty variables?
127 
128 extern INT8 gbDiff[MAX_DIFF_PARMS][5];
129 
130 void ActionDone(SOLDIERTYPE *pSoldier);
131 INT16 ActionInProgress(SOLDIERTYPE *pSoldier);
132 
133 INT8 CalcMorale(SOLDIERTYPE *pSoldier);
134 void CallAvailableEnemiesTo(GridNo);
135 void CallAvailableKingpinMenTo( INT16 sGridNo );
136 void CallAvailableTeamEnemiesTo(GridNo, INT8 team);
137 void CallAvailableTeamEnemiesToAmbush(GridNo);
138 void CallEldinTo( INT16 sGridNo );
139 void CancelAIAction(SOLDIERTYPE* pSoldier);
140 void CheckForChangingOrders(SOLDIERTYPE *pSoldier );
141 
142 INT8 ClosestPanicTrigger( SOLDIERTYPE * pSoldier );
143 
144 INT16 ClosestKnownOpponent(SOLDIERTYPE *pSoldier, INT16 * psGridNo, INT8 * pbLevel);
145 INT16 ClosestPC(const SOLDIERTYPE* pSoldier, INT16* psDistance);
146 BOOLEAN CanAutoBandage( BOOLEAN fDoFullCheck );
147 
148 INT8	DecideAction(SOLDIERTYPE *pSoldier);
149 INT8 DecideActionRed(SOLDIERTYPE *pSoldier, UINT8 ubUnconsciousOK);
150 
151 INT16 DistanceToClosestFriend( SOLDIERTYPE * pSoldier );
152 
153 void EndAIDeadlock();
154 void EndAIGuysTurn(SOLDIERTYPE&);
155 
156 INT8  ExecuteAction(SOLDIERTYPE *pSoldier);
157 
158 INT16 FindBestNearbyCover(SOLDIERTYPE *pSoldier, INT32 morale, INT32 *pPercentBetter);
159 INT16 FindClosestDoor( SOLDIERTYPE * pSoldier );
160 INT16 FindNearbyPointOnEdgeOfMap( SOLDIERTYPE * pSoldier, INT8 * pbDirection );
161 INT16 FindNearestEdgePoint( INT16 sGridNo );
162 
163 //Kris:  Added these as I need specific searches on certain sides.
164 enum
165 {
166 	NORTH_EDGEPOINT_SEARCH,
167 	EAST_EDGEPOINT_SEARCH,
168 	SOUTH_EDGEPOINT_SEARCH,
169 	WEST_EDGEPOINT_SEARCH,
170 };
171 INT16 FindNearestEdgepointOnSpecifiedEdge( INT16 sGridNo, INT8 bEdgeCode );
172 
173 INT16 FindNearestUngassedLand(SOLDIERTYPE *pSoldier);
174 BOOLEAN FindRoofClimbingPoints( SOLDIERTYPE * pSoldier, INT16 sDesiredSpot );
175 INT16 FindSpotMaxDistFromOpponents(SOLDIERTYPE *pSoldier);
176 INT16 FindSweetCoverSpot(SOLDIERTYPE *pSoldier);
177 
178 void FreeUpNPCFromAttacking(SOLDIERTYPE* s);
179 void FreeUpNPCFromPendingAction( SOLDIERTYPE * pSoldier );
180 void FreeUpNPCFromTurning(SOLDIERTYPE* pSoldier);
181 void FreeUpNPCFromStanceChange(SOLDIERTYPE *pSoldier );
182 void FreeUpNPCFromRoofClimb(SOLDIERTYPE *pSoldier );
183 
184 UINT8 GetClosestOpponent( SOLDIERTYPE *pSoldier );
185 
186 void HandleSoldierAI( SOLDIERTYPE *pSoldier );
187 void HandleInitialRedAlert(INT8 bTeam);
188 
189 void InitPanicSystem(void);
190 bool InWaterOrGas(SOLDIERTYPE const*, GridNo);
191 BOOLEAN IsActionAffordable(SOLDIERTYPE *pSoldier);
192 void InitAI(void);
193 
194 void MakeClosestEnemyChosenOne(void);
195 
196 void NewDest(SOLDIERTYPE *pSoldier, UINT16 sGridno);
197 
198 INT8 PanicAI(SOLDIERTYPE *pSoldier, UINT8 ubCanMove);
199 void HaltMoveForSoldierOutOfPoints(SOLDIERTYPE&);
200 
201 INT16 RandDestWithinRange(SOLDIERTYPE *pSoldier);
202 INT16 RandomFriendWithin(SOLDIERTYPE *pSoldier);
203 INT16 RoamingRange(SOLDIERTYPE *pSoldier, INT16 *pFromGridno);
204 
205 void SetNewSituation( SOLDIERTYPE * pSoldier );
206 
207 UINT8 SoldierDifficultyLevel( const SOLDIERTYPE * pSoldier );
208 void SoldierTriesToContinueAlongPath(SOLDIERTYPE *pSoldier);
209 void StartNPCAI(SOLDIERTYPE&);
210 void TempHurt(SOLDIERTYPE *pVictim, SOLDIERTYPE *pAttacker);
211 int TryToResumeMovement(SOLDIERTYPE *pSoldier, INT16 sGridno);
212 
213 BOOLEAN ValidCreatureTurn( SOLDIERTYPE * pCreature, INT8 bNewDirection );
214 
215 bool  WearGasMaskIfAvailable(SOLDIERTYPE*);
216 INT16 WhatIKnowThatPublicDont(SOLDIERTYPE *pSoldier, UINT8 ubInSightOnly);
217 
218 #endif
219