diff options
Diffstat (limited to 'game/server/ai_behavior_standoff.h')
| -rw-r--r-- | game/server/ai_behavior_standoff.h | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/game/server/ai_behavior_standoff.h b/game/server/ai_behavior_standoff.h new file mode 100644 index 0000000..c08059e --- /dev/null +++ b/game/server/ai_behavior_standoff.h @@ -0,0 +1,232 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Combat behaviors for AIs in a relatively self-preservationist mode. +// Lots of cover taking and attempted shots out of cover. +// +//=============================================================================// + +#ifndef AI_BEHAVIOR_STANDOFF_H +#define AI_BEHAVIOR_STANDOFF_H + +#include "utlvector.h" +#include "utlmap.h" + +#include "ai_behavior.h" +#include "ai_utils.h" +#include "ai_hint.h" + +#if defined( _WIN32 ) +#pragma once +#endif + +//----------------------------------------------------------------------------- + +enum AI_HintChangeReaction_t +{ + AIHCR_DEFAULT_AI, + AIHCR_MOVE_ON_COVER, + AIHCR_MOVE_IMMEDIATE, +}; + +struct AI_StandoffParams_t +{ + AI_HintChangeReaction_t hintChangeReaction; + bool fCoverOnReload; + bool fPlayerIsBattleline; + float minTimeShots; + float maxTimeShots; + int minShots; + int maxShots; + int oddsCover; + bool fStayAtCover; + float flAbandonTimeLimit; + + DECLARE_SIMPLE_DATADESC(); +}; + +//------------------------------------- + +enum AI_Posture_t +{ + AIP_INDIFFERENT, + AIP_STANDING, + AIP_CROUCHING, + AIP_PEEKING, +}; + +enum +{ + STANDOFF_SENTENCE_BEGIN_STANDOFF = SENTENCE_BASE_BEHAVIOR_INDEX, + STANDOFF_SENTENCE_END_STANDOFF, + STANDOFF_SENTENCE_OUT_OF_AMMO, + STANDOFF_SENTENCE_FORCED_TAKE_COVER, + STANDOFF_SENTENCE_STAND_CHECK_TARGET, +}; + +class CAI_MappedActivityBehavior_Temporary : public CAI_SimpleBehavior +{ + DECLARE_CLASS( CAI_MappedActivityBehavior_Temporary, CAI_SimpleBehavior ); +public: + CAI_MappedActivityBehavior_Temporary( CAI_BaseNPC *pOuter = NULL ) + : CAI_SimpleBehavior(pOuter) + { + SetDefLessFunc( m_ActivityMap ); + } + +protected: + Activity GetMappedActivity( AI_Posture_t posture, Activity activity ); + void OnChangeActiveWeapon( CBaseCombatWeapon *pOldWeapon, CBaseCombatWeapon *pNewWeapon ); + + virtual void UpdateTranslateActivityMap(); + +private: + CUtlMap<unsigned, Activity> m_ActivityMap; +}; + +class CAI_StandoffBehavior : public CAI_MappedActivityBehavior_Temporary +{ + DECLARE_CLASS( CAI_StandoffBehavior, CAI_MappedActivityBehavior_Temporary ); +public: + CAI_StandoffBehavior( CAI_BaseNPC *pOuter = NULL ); + + virtual const char *GetName() { return "Standoff"; } + + void SetActive( bool fActive ); + void SetParameters( const AI_StandoffParams_t ¶ms, CAI_GoalEntity *pGoalEntity = NULL ); + + Vector GetStandoffGoalPosition(); + void SetStandoffGoalPosition( const Vector &vecPos ); + void ClearStandoffGoalPosition(); + + AI_Posture_t GetPosture(); + + bool IsActive( void ) { return m_fActive; } + void OnChangeTacticalConstraints(); + + bool CanSelectSchedule(); + bool IsBehindBattleLines( const Vector &point ); + +protected: + void Spawn(); + void BeginScheduleSelection(); + void EndScheduleSelection(); + void PrescheduleThink(); + void GatherConditions(); + int SelectSchedule(); + int TranslateSchedule( int scheduleType ); + void StartTask( const Task_t *pTask ); + void BuildScheduleTestBits(); + virtual void OnUpdateShotRegulator(); + + Activity NPC_TranslateActivity( Activity eNewActivity ); + + bool IsValidCover( const Vector &vecCoverLocation, CAI_Hint const *pHint ); + bool IsValidShootPosition( const Vector &vecCoverLocation, CAI_Node *pNode, CAI_Hint const *pHint ); + + void SetPosture( AI_Posture_t posture ); + + void OnChangeHintGroup( string_t oldGroup, string_t newGroup ); + + virtual int SelectScheduleUpdateWeapon(); + virtual int SelectScheduleCheckCover(); + virtual int SelectScheduleEstablishAim(); + virtual int SelectScheduleAttack(); + + bool PlayerIsLeading(); + CBaseEntity *GetPlayerLeader(); + bool GetDirectionOfStandoff( Vector *pDir ); + + void UpdateBattleLines(); + + Hint_e GetHintType(); + void SetReuseCurrentCover(); + void UnlockHintNode(); + Activity GetCoverActivity(); + + void OnRestore(); + + void UpdateTranslateActivityMap(); + + // Standoff overrides base AI crouch handling + bool IsCrouching( void ) { return false; } + +private: + + //---------------------------- + + enum + { + NEXT_SCHEDULE = BaseClass::NEXT_SCHEDULE, + + NEXT_TASK = BaseClass::NEXT_TASK, + + COND_ABANDON_TIME_EXPIRED = BaseClass::NEXT_CONDITION, + NEXT_CONDITION + }; + + DEFINE_CUSTOM_SCHEDULE_PROVIDER; + + //--------------------------------- + // @TODO (toml 07-30-03): replace all these booleans with a singe 32 bit unsigned & bit flags + + bool m_fActive; + bool m_fTestNoDamage; + + Vector m_vecStandoffGoalPosition; + + AI_Posture_t m_posture; + + AI_StandoffParams_t m_params; + EHANDLE m_hStandoffGoal; + + bool m_fTakeCover; + float m_SavedDistTooFar; + bool m_fForceNewEnemy; + CAI_MoveMonitor m_PlayerMoveMonitor; + + CSimTimer m_TimeForceCoverHint; + CSimTimer m_TimePreventForceNewEnemy; + CRandSimTimer m_RandomCoverChangeTimer; + + // FIXME: TEMPORARY! REMOVE + int m_nSavedMinShots, m_nSavedMaxShots; + float m_flSavedMinRest, m_flSavedMaxRest; + + //--------------------------------- + + struct BattleLine_t + { + Vector point; + Vector normal; + }; + + CThinkOnceSemaphore m_UpdateBattleLinesSemaphore; + CUtlVector<BattleLine_t> m_BattleLines; + bool m_fIgnoreFronts; + + //--------------------------------- + + bool m_bHasLowCoverActivity; + + //--------------------------------- + + DECLARE_DATADESC(); +}; + +//------------------------------------- + +inline void CAI_StandoffBehavior::SetPosture( AI_Posture_t posture ) +{ + m_posture = posture; +} + +//------------------------------------- + +inline AI_Posture_t CAI_StandoffBehavior::GetPosture() +{ + return m_posture; +} + +//----------------------------------------------------------------------------- + +#endif // AI_BEHAVIOR_STANDOFF_H |