Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

297 lines
9.0 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose:
  4. //
  5. //=============================================================================//
  6. #ifndef NPC_COMBINE_H
  7. #define NPC_COMBINE_H
  8. #ifdef _WIN32
  9. #pragma once
  10. #endif
  11. #include "ai_basenpc.h"
  12. #include "ai_basehumanoid.h"
  13. #include "ai_behavior.h"
  14. #include "ai_behavior_assault.h"
  15. #include "ai_behavior_standoff.h"
  16. #include "ai_behavior_follow.h"
  17. #include "ai_behavior_functank.h"
  18. #include "ai_behavior_rappel.h"
  19. #include "ai_behavior_actbusy.h"
  20. #include "ai_sentence.h"
  21. #include "ai_baseactor.h"
  22. // Used when only what combine to react to what the spotlight sees
  23. #define SF_COMBINE_NO_LOOK (1 << 16)
  24. #define SF_COMBINE_NO_GRENADEDROP ( 1 << 17 )
  25. #define SF_COMBINE_NO_AR2DROP ( 1 << 18 )
  26. //=========================================================
  27. // >> CNPC_Combine
  28. //=========================================================
  29. class CNPC_Combine : public CAI_BaseActor
  30. {
  31. DECLARE_DATADESC();
  32. DEFINE_CUSTOM_AI;
  33. DECLARE_CLASS( CNPC_Combine, CAI_BaseActor );
  34. public:
  35. CNPC_Combine();
  36. // Create components
  37. virtual bool CreateComponents();
  38. bool CanThrowGrenade( const Vector &vecTarget );
  39. bool CheckCanThrowGrenade( const Vector &vecTarget );
  40. virtual bool CanGrenadeEnemy( bool bUseFreeKnowledge = true );
  41. virtual bool CanAltFireEnemy( bool bUseFreeKnowledge );
  42. int GetGrenadeConditions( float flDot, float flDist );
  43. int RangeAttack2Conditions( float flDot, float flDist ); // For innate grenade attack
  44. int MeleeAttack1Conditions( float flDot, float flDist ); // For kick/punch
  45. bool FVisible( CBaseEntity *pEntity, int traceMask = MASK_BLOCKLOS, CBaseEntity **ppBlocker = NULL );
  46. virtual bool IsCurTaskContinuousMove();
  47. virtual float GetJumpGravity() const { return 1.8f; }
  48. virtual Vector GetCrouchEyeOffset( void );
  49. void Event_Killed( const CTakeDamageInfo &info );
  50. void SetActivity( Activity NewActivity );
  51. NPC_STATE SelectIdealState ( void );
  52. // Input handlers.
  53. void InputLookOn( inputdata_t &inputdata );
  54. void InputLookOff( inputdata_t &inputdata );
  55. void InputStartPatrolling( inputdata_t &inputdata );
  56. void InputStopPatrolling( inputdata_t &inputdata );
  57. void InputAssault( inputdata_t &inputdata );
  58. void InputHitByBugbait( inputdata_t &inputdata );
  59. void InputThrowGrenadeAtTarget( inputdata_t &inputdata );
  60. bool UpdateEnemyMemory( CBaseEntity *pEnemy, const Vector &position, CBaseEntity *pInformer = NULL );
  61. void Spawn( void );
  62. void Precache( void );
  63. void Activate();
  64. Class_T Classify( void );
  65. bool IsElite() { return m_fIsElite; }
  66. void DelayAltFireAttack( float flDelay );
  67. void DelaySquadAltFireAttack( float flDelay );
  68. float MaxYawSpeed( void );
  69. bool ShouldMoveAndShoot();
  70. bool OverrideMoveFacing( const AILocalMoveGoal_t &move, float flInterval );;
  71. void HandleAnimEvent( animevent_t *pEvent );
  72. Vector Weapon_ShootPosition( );
  73. Vector EyeOffset( Activity nActivity );
  74. Vector EyePosition( void );
  75. Vector BodyTarget( const Vector &posSrc, bool bNoisy = true );
  76. Vector GetAltFireTarget();
  77. void StartTask( const Task_t *pTask );
  78. void RunTask( const Task_t *pTask );
  79. void PostNPCInit();
  80. void GatherConditions();
  81. virtual void PrescheduleThink();
  82. Activity NPC_TranslateActivity( Activity eNewActivity );
  83. void BuildScheduleTestBits( void );
  84. virtual int SelectSchedule( void );
  85. virtual int SelectFailSchedule( int failedSchedule, int failedTask, AI_TaskFailureCode_t taskFailCode );
  86. int SelectScheduleAttack();
  87. bool CreateBehaviors();
  88. bool OnBeginMoveAndShoot();
  89. void OnEndMoveAndShoot();
  90. // Combat
  91. WeaponProficiency_t CalcWeaponProficiency( CBaseCombatWeapon *pWeapon );
  92. bool HasShotgun();
  93. bool ActiveWeaponIsFullyLoaded();
  94. bool HandleInteraction(int interactionType, void *data, CBaseCombatCharacter *sourceEnt);
  95. const char* GetSquadSlotDebugName( int iSquadSlot );
  96. bool IsUsingTacticalVariant( int variant );
  97. bool IsUsingPathfindingVariant( int variant ) { return m_iPathfindingVariant == variant; }
  98. bool IsRunningApproachEnemySchedule();
  99. // -------------
  100. // Sounds
  101. // -------------
  102. void DeathSound( void );
  103. void PainSound( void );
  104. void IdleSound( void );
  105. void AlertSound( void );
  106. void LostEnemySound( void );
  107. void FoundEnemySound( void );
  108. void AnnounceAssault( void );
  109. void AnnounceEnemyType( CBaseEntity *pEnemy );
  110. void AnnounceEnemyKill( CBaseEntity *pEnemy );
  111. void NotifyDeadFriend( CBaseEntity* pFriend );
  112. virtual float HearingSensitivity( void ) { return 1.0; };
  113. int GetSoundInterests( void );
  114. virtual bool QueryHearSound( CSound *pSound );
  115. // Speaking
  116. void SpeakSentence( int sentType );
  117. virtual int TranslateSchedule( int scheduleType );
  118. void OnStartSchedule( int scheduleType );
  119. virtual bool ShouldPickADeathPose( void );
  120. protected:
  121. void SetKickDamage( int nDamage ) { m_nKickDamage = nDamage; }
  122. CAI_Sentence< CNPC_Combine > *GetSentences() { return &m_Sentences; }
  123. private:
  124. //=========================================================
  125. // Combine S schedules
  126. //=========================================================
  127. enum
  128. {
  129. SCHED_COMBINE_SUPPRESS = BaseClass::NEXT_SCHEDULE,
  130. SCHED_COMBINE_COMBAT_FAIL,
  131. SCHED_COMBINE_VICTORY_DANCE,
  132. SCHED_COMBINE_COMBAT_FACE,
  133. SCHED_COMBINE_HIDE_AND_RELOAD,
  134. SCHED_COMBINE_SIGNAL_SUPPRESS,
  135. SCHED_COMBINE_ENTER_OVERWATCH,
  136. SCHED_COMBINE_OVERWATCH,
  137. SCHED_COMBINE_ASSAULT,
  138. SCHED_COMBINE_ESTABLISH_LINE_OF_FIRE,
  139. SCHED_COMBINE_PRESS_ATTACK,
  140. SCHED_COMBINE_WAIT_IN_COVER,
  141. SCHED_COMBINE_RANGE_ATTACK1,
  142. SCHED_COMBINE_RANGE_ATTACK2,
  143. SCHED_COMBINE_TAKE_COVER1,
  144. SCHED_COMBINE_TAKE_COVER_FROM_BEST_SOUND,
  145. SCHED_COMBINE_RUN_AWAY_FROM_BEST_SOUND,
  146. SCHED_COMBINE_GRENADE_COVER1,
  147. SCHED_COMBINE_TOSS_GRENADE_COVER1,
  148. SCHED_COMBINE_TAKECOVER_FAILED,
  149. SCHED_COMBINE_GRENADE_AND_RELOAD,
  150. SCHED_COMBINE_PATROL,
  151. SCHED_COMBINE_BUGBAIT_DISTRACTION,
  152. SCHED_COMBINE_CHARGE_TURRET,
  153. SCHED_COMBINE_DROP_GRENADE,
  154. SCHED_COMBINE_CHARGE_PLAYER,
  155. SCHED_COMBINE_PATROL_ENEMY,
  156. SCHED_COMBINE_BURNING_STAND,
  157. SCHED_COMBINE_AR2_ALTFIRE,
  158. SCHED_COMBINE_FORCED_GRENADE_THROW,
  159. SCHED_COMBINE_MOVE_TO_FORCED_GREN_LOS,
  160. SCHED_COMBINE_FACE_IDEAL_YAW,
  161. SCHED_COMBINE_MOVE_TO_MELEE,
  162. NEXT_SCHEDULE,
  163. };
  164. //=========================================================
  165. // Combine Tasks
  166. //=========================================================
  167. enum
  168. {
  169. TASK_COMBINE_FACE_TOSS_DIR = BaseClass::NEXT_TASK,
  170. TASK_COMBINE_IGNORE_ATTACKS,
  171. TASK_COMBINE_SIGNAL_BEST_SOUND,
  172. TASK_COMBINE_DEFER_SQUAD_GRENADES,
  173. TASK_COMBINE_CHASE_ENEMY_CONTINUOUSLY,
  174. TASK_COMBINE_DIE_INSTANTLY,
  175. TASK_COMBINE_PLAY_SEQUENCE_FACE_ALTFIRE_TARGET,
  176. TASK_COMBINE_GET_PATH_TO_FORCED_GREN_LOS,
  177. TASK_COMBINE_SET_STANDING,
  178. NEXT_TASK
  179. };
  180. //=========================================================
  181. // Combine Conditions
  182. //=========================================================
  183. enum Combine_Conds
  184. {
  185. COND_COMBINE_NO_FIRE = BaseClass::NEXT_CONDITION,
  186. COND_COMBINE_DEAD_FRIEND,
  187. COND_COMBINE_SHOULD_PATROL,
  188. COND_COMBINE_HIT_BY_BUGBAIT,
  189. COND_COMBINE_DROP_GRENADE,
  190. COND_COMBINE_ON_FIRE,
  191. COND_COMBINE_ATTACK_SLOT_AVAILABLE,
  192. NEXT_CONDITION
  193. };
  194. private:
  195. // Select the combat schedule
  196. int SelectCombatSchedule();
  197. // Should we charge the player?
  198. bool ShouldChargePlayer();
  199. // Chase the enemy, updating the target position as the player moves
  200. void StartTaskChaseEnemyContinuously( const Task_t *pTask );
  201. void RunTaskChaseEnemyContinuously( const Task_t *pTask );
  202. class CCombineStandoffBehavior : public CAI_ComponentWithOuter<CNPC_Combine, CAI_StandoffBehavior>
  203. {
  204. typedef CAI_ComponentWithOuter<CNPC_Combine, CAI_StandoffBehavior> BaseClass;
  205. virtual int SelectScheduleAttack()
  206. {
  207. int result = GetOuter()->SelectScheduleAttack();
  208. if ( result == SCHED_NONE )
  209. result = BaseClass::SelectScheduleAttack();
  210. return result;
  211. }
  212. };
  213. // Rappel
  214. virtual bool IsWaitingToRappel( void ) { return m_RappelBehavior.IsWaitingToRappel(); }
  215. void BeginRappel() { m_RappelBehavior.BeginRappel(); }
  216. private:
  217. int m_nKickDamage;
  218. Vector m_vecTossVelocity;
  219. EHANDLE m_hForcedGrenadeTarget;
  220. bool m_bShouldPatrol;
  221. bool m_bFirstEncounter;// only put on the handsign show in the squad's first encounter.
  222. // Time Variables
  223. float m_flNextPainSoundTime;
  224. float m_flNextAlertSoundTime;
  225. float m_flNextGrenadeCheck;
  226. float m_flNextLostSoundTime;
  227. float m_flAlertPatrolTime; // When to stop doing alert patrol
  228. float m_flNextAltFireTime; // Elites only. Next time to begin considering alt-fire attack.
  229. int m_nShots;
  230. float m_flShotDelay;
  231. float m_flStopMoveShootTime;
  232. CAI_Sentence< CNPC_Combine > m_Sentences;
  233. int m_iNumGrenades;
  234. CAI_AssaultBehavior m_AssaultBehavior;
  235. CCombineStandoffBehavior m_StandoffBehavior;
  236. CAI_FollowBehavior m_FollowBehavior;
  237. CAI_FuncTankBehavior m_FuncTankBehavior;
  238. CAI_RappelBehavior m_RappelBehavior;
  239. CAI_ActBusyBehavior m_ActBusyBehavior;
  240. public:
  241. int m_iLastAnimEventHandled;
  242. bool m_fIsElite;
  243. Vector m_vecAltFireTarget;
  244. int m_iTacticalVariant;
  245. int m_iPathfindingVariant;
  246. };
  247. #endif // NPC_COMBINE_H