b_local.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. //B_local.h
  2. //re-added by MCG
  3. #ifndef __B_LOCAL_H__
  4. #define __B_LOCAL_H__
  5. #include "g_local.h"
  6. #include "say.h"
  7. #include "AI.h"
  8. #define AI_TIMERS 0//turn on to see print-outs of AI/nav timing
  9. //
  10. // Navigation susbsystem
  11. //
  12. #define NAVF_DUCK 0x00000001
  13. #define NAVF_JUMP 0x00000002
  14. #define NAVF_HOLD 0x00000004
  15. #define NAVF_SLOW 0x00000008
  16. #define DEBUG_LEVEL_DETAIL 4
  17. #define DEBUG_LEVEL_INFO 3
  18. #define DEBUG_LEVEL_WARNING 2
  19. #define DEBUG_LEVEL_ERROR 1
  20. #define DEBUG_LEVEL_NONE 0
  21. #define MAX_GOAL_REACHED_DIST_SQUARED 256//16 squared
  22. #define MIN_ANGLE_ERROR 0.01f
  23. #define MIN_ROCKET_DIST_SQUARED 16384//128*128
  24. //
  25. // NPC.cpp
  26. //
  27. // ai debug cvars
  28. void SetNPCGlobals( gentity_t *ent );
  29. void SaveNPCGlobals();
  30. void RestoreNPCGlobals();
  31. extern cvar_t *debugNPCAI; // used to print out debug info about the NPC AI
  32. extern cvar_t *debugNPCFreeze; // set to disable NPC ai and temporarily freeze them in place
  33. extern cvar_t *debugNPCName;
  34. extern cvar_t *d_JediAI;
  35. extern cvar_t *d_saberCombat;
  36. extern void NPC_Think ( gentity_t *self);
  37. extern void pitch_roll_for_slope( gentity_t *forwhom, vec3_t pass_slope = NULL, vec3_t storeAngles = NULL );
  38. //NPC_reactions.cpp
  39. extern void NPC_Pain( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, vec3_t point, int damage, int mod ,int hitLoc);
  40. extern void NPC_Touch( gentity_t *self, gentity_t *other, trace_t *trace );
  41. extern void NPC_Use( gentity_t *self, gentity_t *other, gentity_t *activator );
  42. extern float NPC_GetPainChance( gentity_t *self, int damage );
  43. //
  44. // NPC_misc.cpp
  45. //
  46. extern void Debug_Printf( cvar_t *cv, int level, char *fmt, ... );
  47. extern void Debug_NPCPrintf( gentity_t *printNPC, cvar_t *cv, int debugLevel, char *fmt, ... );
  48. //MCG - Begin============================================================
  49. //NPC_ai variables - shared by NPC.cpp andf the following modules
  50. extern gentity_t *NPC;
  51. extern gNPC_t *NPCInfo;
  52. extern gclient_t *client;
  53. extern usercmd_t ucmd;
  54. extern visibility_t enemyVisibility;
  55. //AI_Default
  56. extern qboolean NPC_CheckInvestigate( int alertEventNum );
  57. extern qboolean NPC_StandTrackAndShoot (gentity_t *NPC);
  58. extern void NPC_BSIdle( void );
  59. extern void NPC_BSPointShoot(qboolean shoot);
  60. extern void NPC_BSStandGuard (void);
  61. extern void NPC_BSPatrol (void);
  62. extern void NPC_BSHuntAndKill (void);
  63. extern void NPC_BSStandAndShoot (void);
  64. extern void NPC_BSRunAndShoot (void);
  65. extern void NPC_BSWait( void );
  66. extern void NPC_BSDefault( void );
  67. //NPC_behavior
  68. extern void NPC_BSAdvanceFight (void);
  69. extern void NPC_BSInvestigate (void);
  70. extern void NPC_BSSleep( void );
  71. extern void NPC_BSFollowLeader (void);
  72. extern void NPC_BSJump (void);
  73. extern void NPC_BSRemove (void);
  74. extern void NPC_BSSearch (void);
  75. extern void NPC_BSSearchStart (int homeWp, bState_t bState);
  76. extern void NPC_BSWander (void);
  77. extern qboolean NPC_BSFlee( void );
  78. extern void NPC_StartFlee( gentity_t *enemy, vec3_t dangerPoint, int dangerLevel, int fleeTimeMin, int fleeTimeMax );
  79. extern void G_StartFlee( gentity_t *self, gentity_t *enemy, vec3_t dangerPoint, int dangerLevel, int fleeTimeMin, int fleeTimeMax );
  80. //NPC_combat
  81. extern int ChooseBestWeapon( void );
  82. extern void NPC_ChangeWeapon( int newWeapon );
  83. extern void ShootThink( void );
  84. extern void WeaponThink( qboolean inCombat );
  85. extern qboolean HaveWeapon( int weapon );
  86. extern qboolean CanShoot ( gentity_t *ent, gentity_t *shooter );
  87. extern void NPC_CheckPossibleEnemy( gentity_t *other, visibility_t vis );
  88. extern gentity_t *NPC_PickEnemy (gentity_t *closestTo, int enemyTeam, qboolean checkVis, qboolean findPlayersFirst, qboolean findClosest);
  89. extern gentity_t *NPC_CheckEnemy (qboolean findNew, qboolean tooFarOk, qboolean setEnemy = qtrue );
  90. extern qboolean NPC_CheckAttack (float scale);
  91. extern qboolean NPC_CheckDefend (float scale);
  92. extern qboolean NPC_CheckCanAttack (float attack_scale, qboolean stationary);
  93. extern int NPC_AttackDebounceForWeapon (void);
  94. extern qboolean EntIsGlass (gentity_t *check);
  95. extern qboolean ShotThroughGlass (trace_t *tr, gentity_t *target, vec3_t spot, int mask);
  96. extern void G_ClearEnemy (gentity_t *self);
  97. extern void G_SetEnemy (gentity_t *self, gentity_t *enemy);
  98. extern gentity_t *NPC_PickAlly ( qboolean facingEachOther, float range, qboolean ignoreGroup, qboolean movingOnly );
  99. extern void NPC_LostEnemyDecideChase(void);
  100. extern float NPC_MaxDistSquaredForWeapon( void );
  101. extern qboolean NPC_EvaluateShot( int hit, qboolean glassOK );
  102. extern int NPC_ShotEntity( gentity_t *ent, vec3_t impactPos = NULL );
  103. //NPC_formation
  104. extern qboolean NPC_SlideMoveToGoal (void);
  105. extern float NPC_FindClosestTeammate (gentity_t *self);
  106. extern void NPC_CalcClosestFormationSpot(gentity_t *self);
  107. extern void G_MaintainFormations (gentity_t *self);
  108. extern void NPC_BSFormation (void);
  109. extern void NPC_CreateFormation (gentity_t *self);
  110. extern void NPC_DropFormation (gentity_t *self);
  111. extern void NPC_ReorderFormation (gentity_t *self);
  112. extern void NPC_InsertIntoFormation (gentity_t *self);
  113. extern void NPC_DeleteFromFormation (gentity_t *self);
  114. #define COLLISION_RADIUS 32
  115. #define NUM_POSITIONS 30
  116. //NPC spawnflags
  117. #define SFB_SMALLHULL 1
  118. #define SFB_RIFLEMAN 2
  119. #define SFB_OLDBORG 2//Borg
  120. #define SFB_PHASER 4
  121. #define SFB_GUN 4//Borg
  122. #define SFB_TRICORDER 8
  123. #define SFB_TASER 8//Borg
  124. #define SFB_DRILL 16//Borg
  125. #define SFB_CINEMATIC 32
  126. #define SFB_NOTSOLID 64
  127. #define SFB_STARTINSOLID 128
  128. #define SFB_TROOPERAI (1<<9)
  129. //NPC_goal
  130. extern void SetGoal( gentity_t *goal, float rating );
  131. extern void NPC_SetGoal( gentity_t *goal, float rating );
  132. extern void NPC_ClearGoal( void );
  133. extern void NPC_ReachedGoal( void );
  134. extern qboolean ReachedGoal( gentity_t *goal );
  135. extern gentity_t *UpdateGoal( void );
  136. extern qboolean NPC_MoveToGoal( qboolean tryStraight );
  137. //NPC_move
  138. qboolean NPC_Jumping( void );
  139. qboolean NPC_JumpBackingUp( void );
  140. qboolean NPC_TryJump( gentity_t *goal, float max_xy_dist = 0.0f, float max_z_diff = 0.0f );
  141. qboolean NPC_TryJump( const vec3_t& pos,float max_xy_dist = 0.0f, float max_z_diff = 0.0f );
  142. //NPC_reactions
  143. //NPC_senses
  144. #define ALERT_CLEAR_TIME 200
  145. #define CHECK_PVS 1
  146. #define CHECK_360 2
  147. #define CHECK_FOV 4
  148. #define CHECK_SHOOT 8
  149. #define CHECK_VISRANGE 16
  150. extern qboolean CanSee ( gentity_t *ent );
  151. extern qboolean InFOV ( gentity_t *ent, gentity_t *from, int hFOV, int vFOV );
  152. extern qboolean InFOV( vec3_t origin, gentity_t *from, int hFOV, int vFOV );
  153. extern qboolean InFOV( vec3_t spot, vec3_t from, vec3_t fromAngles, int hFOV, int vFOV );
  154. extern visibility_t NPC_CheckVisibility ( gentity_t *ent, int flags );
  155. extern qboolean InVisrange ( gentity_t *ent );
  156. //NPC_sounds
  157. //extern void NPC_AngerSound(void);
  158. //NPC_spawn
  159. extern void NPC_Spawn( gentity_t *self );
  160. //NPC_stats
  161. extern int NPC_ReactionTime ( void );
  162. extern qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC );
  163. extern void NPC_LoadParms( void );
  164. //NPC_utils
  165. extern int teamNumbers[TEAM_NUM_TEAMS];
  166. extern int teamStrength[TEAM_NUM_TEAMS];
  167. extern int teamCounter[TEAM_NUM_TEAMS];
  168. extern void CalcEntitySpot ( const gentity_t *ent, const spot_t spot, vec3_t point );
  169. extern qboolean NPC_UpdateAngles ( qboolean doPitch, qboolean doYaw );
  170. extern void NPC_UpdateShootAngles (vec3_t angles, qboolean doPitch, qboolean doYaw );
  171. extern qboolean NPC_UpdateFiringAngles ( qboolean doPitch, qboolean doYaw );
  172. extern void SetTeamNumbers (void);
  173. extern qboolean G_ActivateBehavior (gentity_t *self, int bset );
  174. extern void NPC_AimWiggle( vec3_t enemy_org );
  175. extern void NPC_SetLookTarget( gentity_t *self, int entNum, int clearTime );
  176. //other modules
  177. extern void CalcMuzzlePoint ( gentity_t *const ent, vec3_t forward, vec3_t right, vec3_t up, vec3_t muzzlePoint, float lead_in );
  178. //g_combat
  179. extern void ExplodeDeath( gentity_t *self );
  180. extern void ExplodeDeath_Wait( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int meansOfDeath,int dFlags,int hitLoc );
  181. extern void GoExplodeDeath( gentity_t *self, gentity_t *other, gentity_t *activator);
  182. extern float IdealDistance ( gentity_t *self );
  183. //g_client
  184. extern qboolean SpotWouldTelefrag( gentity_t *spot, team_t checkteam );
  185. //g_squad
  186. extern void NPC_SetSayState (gentity_t *self, gentity_t *to, int saying);
  187. //g_utils
  188. extern qboolean G_CheckInSolid (gentity_t *self, qboolean fix);
  189. extern qboolean infront(gentity_t *from, gentity_t *to);
  190. //MCG - End============================================================
  191. // NPC.cpp
  192. extern void NPC_SetAnim(gentity_t *ent,int setAnimParts,int anim,int setAnimFlags, int iBlend = SETANIM_BLEND_DEFAULT);
  193. extern qboolean NPC_EnemyTooFar(gentity_t *enemy, float dist, qboolean toShoot);
  194. // ==================================================================
  195. inline qboolean NPC_ClearLOS( const vec3_t start, const vec3_t end )
  196. {
  197. return G_ClearLOS( NPC, start, end );
  198. }
  199. inline qboolean NPC_ClearLOS( const vec3_t end )
  200. {
  201. return G_ClearLOS( NPC, end );
  202. }
  203. inline qboolean NPC_ClearLOS( gentity_t *ent )
  204. {
  205. return G_ClearLOS( NPC, ent );
  206. }
  207. inline qboolean NPC_ClearLOS( const vec3_t start, gentity_t *ent )
  208. {
  209. return G_ClearLOS( NPC, start, ent );
  210. }
  211. inline qboolean NPC_ClearLOS( gentity_t *ent, const vec3_t end )
  212. {
  213. return G_ClearLOS( NPC, ent, end );
  214. }
  215. extern qboolean NPC_ClearShot( gentity_t *ent );
  216. extern int NPC_FindCombatPoint( const vec3_t position, const vec3_t avoidPosition, vec3_t enemyPosition, const int flags, const float avoidDist, const int ignorePoint = -1 );
  217. extern int NPC_FindCombatPointRetry( const vec3_t position,
  218. const vec3_t avoidPosition,
  219. vec3_t enemyPosition,
  220. int *cpFlags,
  221. float avoidDist,
  222. const int ignorePoint );
  223. extern qboolean NPC_ReserveCombatPoint( int combatPointID );
  224. extern qboolean NPC_FreeCombatPoint( int combatPointID, qboolean failed = qfalse );
  225. extern qboolean NPC_SetCombatPoint( int combatPointID );
  226. #define CP_ANY 0 //No flags
  227. #define CP_COVER 0x00000001 //The enemy cannot currently shoot this position
  228. #define CP_CLEAR 0x00000002 //This cover point has a clear shot to the enemy
  229. #define CP_FLEE 0x00000004 //This cover point is marked as a flee point
  230. #define CP_DUCK 0x00000008 //This cover point is marked as a duck point
  231. #define CP_NEAREST 0x00000010 //Find the nearest combat point
  232. #define CP_AVOID_ENEMY 0x00000020 //Avoid our enemy
  233. #define CP_INVESTIGATE 0x00000040 //A special point worth enemy investigation if searching
  234. #define CP_SQUAD 0x00000080 //Squad path
  235. #define CP_AVOID 0x00000100 //Avoid supplied position
  236. #define CP_APPROACH_ENEMY 0x00000200 //Try to get closer to enemy
  237. #define CP_CLOSEST 0x00000400 //Take the closest combatPoint to the enemy that's available
  238. #define CP_FLANK 0x00000800 //Pick a combatPoint behind the enemy
  239. #define CP_HAS_ROUTE 0x00001000 //Pick a combatPoint that we have a route to
  240. #define CP_SNIPE 0x00002000 //Pick a combatPoint that is marked as a sniper spot
  241. #define CP_SAFE 0x00004000 //Pick a combatPoint that is not have dangerTime
  242. #define CP_HORZ_DIST_COLL 0x00008000 //Collect combat points within *horizontal* dist
  243. #define CP_NO_PVS 0x00010000 //A combat point out of the PVS of enemy pos
  244. #define CP_RETREAT 0x00020000 //Try to get farther from enemy
  245. #define CP_SHORTEST_PATH 0x0004000 //Shortest path from me to combat point to enemy
  246. #define CP_TRYFAR 0x00080000
  247. #define CPF_NONE 0
  248. #define CPF_DUCK 0x00000001
  249. #define CPF_FLEE 0x00000002
  250. #define CPF_INVESTIGATE 0x00000004
  251. #define CPF_SQUAD 0x00000008
  252. #define CPF_LEAN 0x00000010
  253. #define CPF_SNIPE 0x00000020
  254. #define MAX_COMBAT_POINT_CHECK 32
  255. extern int NPC_ValidEnemy( gentity_t *ent );
  256. extern int NPC_CheckEnemyExt( qboolean checkAlerts = qfalse );
  257. extern qboolean NPC_FindPlayer( void );
  258. extern qboolean NPC_CheckCanAttackExt( void );
  259. extern int NPC_CheckAlertEvents( qboolean checkSight, qboolean checkSound, int ignoreAlert = -1, qboolean mustHaveOwner = qfalse, int minAlertLevel = AEL_MINOR, qboolean onGroundOnly = qfalse );
  260. extern qboolean NPC_CheckForDanger( int alertEvent );
  261. extern void G_AlertTeam( gentity_t *victim, gentity_t *attacker, float radius, float soundDist );
  262. extern int NPC_FindSquadPoint( vec3_t position );
  263. extern void ClearPlayerAlertEvents( void );
  264. extern qboolean G_BoundsOverlap(const vec3_t mins1, const vec3_t maxs1, const vec3_t mins2, const vec3_t maxs2);
  265. extern void NPC_SetMoveGoal( gentity_t *ent, vec3_t point, int radius, qboolean isNavGoal = qfalse, int combatPoint = -1, gentity_t *targetEnt = NULL );
  266. extern void NPC_ApplyWeaponFireDelay(void);
  267. //NPC_FaceXXX suite
  268. extern qboolean NPC_FacePosition( vec3_t position, qboolean doPitch = qtrue );
  269. extern qboolean NPC_FaceEntity( gentity_t *ent, qboolean doPitch = qtrue );
  270. extern qboolean NPC_FaceEnemy( qboolean doPitch = qtrue );
  271. //Skill level cvar
  272. extern cvar_t *g_spskill;
  273. #define NIF_NONE 0x00000000
  274. #define NIF_FAILED 0x00000001 //failed to find a way to the goal
  275. #define NIF_MACRO_NAV 0x00000002 //using macro navigation
  276. #define NIF_COLLISION 0x00000004 //resolving collision with an entity
  277. #define NIF_BLOCKED 0x00000008 //blocked from moving
  278. /*
  279. -------------------------
  280. struct navInfo_s
  281. -------------------------
  282. */
  283. typedef struct navInfo_s
  284. {
  285. gentity_t *blocker;
  286. vec3_t direction;
  287. vec3_t pathDirection;
  288. float distance;
  289. trace_t trace;
  290. int flags;
  291. } navInfo_t;
  292. #endif