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