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.
232 lines
5.4 KiB
232 lines
5.4 KiB
//========= 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
|
|
|