diff options
| author | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
|---|---|---|
| committer | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
| commit | 39ed87570bdb2f86969d4be821c94b722dc71179 (patch) | |
| tree | abc53757f75f40c80278e87650ea92808274aa59 /sp/src/game/server/ai_behavior_standoff.h | |
| download | source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip | |
First version of the SOurce SDK 2013
Diffstat (limited to 'sp/src/game/server/ai_behavior_standoff.h')
| -rw-r--r-- | sp/src/game/server/ai_behavior_standoff.h | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/sp/src/game/server/ai_behavior_standoff.h b/sp/src/game/server/ai_behavior_standoff.h new file mode 100644 index 00000000..11f6f6b3 --- /dev/null +++ b/sp/src/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
|