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
|