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.
|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: An NPC's memory of potential enemies
//
//=============================================================================//
#include "mempool.h"
#include "utlmap.h"
#ifndef AI_MEMORY_H
#define AI_MEMORY_H
#pragma once
class CAI_Network;
DECLARE_POINTER_HANDLE(AIEnemiesIter_t);
const float AI_DEF_ENEMY_DISCARD_TIME = 60.0;
#define AI_UNKNOWN_ENEMY (((CBaseEntity *)NULL)+1) // use this to probe for unseen attackers
#define AI_INVALID_TIME (FLT_MAX * -1.0)
//-----------------------------------------------------------------------------
// AI_EnemyInfo_t
//
// Purpose: Stores relevant tactical information about an enemy
//
//-----------------------------------------------------------------------------
struct AI_EnemyInfo_t { AI_EnemyInfo_t(); EHANDLE hEnemy; // Pointer to the enemy
Vector vLastKnownLocation; Vector vLastSeenLocation; float timeLastSeen; // Last time enemy was seen
float timeFirstSeen; // First time enemy was seen
float timeLastReacquired; float timeValidEnemy; // First time can be selected (reaction delay)
float timeLastReceivedDamageFrom; float timeAtFirstHand; // Time at which the enemy was seen firsthand
bool bDangerMemory; // Memory of danger position w/o Enemy pointer
bool bEludedMe; // True if enemy not at last known location
bool bUnforgettable; bool bMobbedMe; // True if enemy was part of a mob at some point
DECLARE_SIMPLE_DATADESC(); };
//-----------------------------------------------------------------------------
// CAI_Enemies
//
// Purpose: Stores a set of AI_EnemyInfo_t's
//
//-----------------------------------------------------------------------------
class CAI_Enemies { public: CAI_Enemies(void); ~CAI_Enemies(); AI_EnemyInfo_t *GetFirst( AIEnemiesIter_t *pIter ); AI_EnemyInfo_t *GetNext( AIEnemiesIter_t *pIter ); AI_EnemyInfo_t *Find( CBaseEntity *pEntity, bool bTryDangerMemory = false ); AI_EnemyInfo_t *GetDangerMemory();
int NumEnemies() const { return m_Map.Count(); } int GetSerialNumber() const { return m_serial; }
void RefreshMemories(void); bool UpdateMemory( CAI_Network* pAINet, CBaseEntity *enemy, const Vector &vPosition, float reactionDelay, bool firstHand ); void OnTookDamageFrom( CBaseEntity *pEnemy );
bool HasMemory( CBaseEntity *enemy ); void ClearMemory( CBaseEntity *enemy );
const Vector & LastKnownPosition( CBaseEntity *pEnemy ); const Vector & LastSeenPosition( CBaseEntity *pEnemy );
float TimeLastReacquired( CBaseEntity *pEnemy ); float LastTimeSeen( CBaseEntity *pEnemy, bool bCheckDangerMemory = true ); float FirstTimeSeen( CBaseEntity *pEnemy); bool HasFreeKnowledgeOf( CBaseEntity *pEnemy );
float LastTimeTookDamageFrom( CBaseEntity *pEnemy);
float TimeAtFirstHand( CBaseEntity *pEnemy ); void MarkAsEluded( CBaseEntity *enemy ); // Don't know where he is (whole squad)
bool HasEludedMe( CBaseEntity *pEnemy );
void SetTimeValidEnemy( CBaseEntity *pEnemy, float flTime );
void SetUnforgettable( CBaseEntity *pEnemy, bool bUnforgettable = true ); void SetMobbedMe( CBaseEntity *pEnemy, bool bMobbedMe = true ); void SetFreeKnowledgeDuration( float flDuration ); void SetEnemyDiscardTime( float flTime ); float GetEnemyDiscardTime( void ) const { return m_flEnemyDiscardTime; }
DECLARE_SIMPLE_DATADESC();
typedef CUtlMap<CBaseEntity *, AI_EnemyInfo_t*, unsigned char> CMemMap;
private: bool ShouldDiscardMemory( AI_EnemyInfo_t *pMemory );
CMemMap m_Map; float m_flFreeKnowledgeDuration; float m_flEnemyDiscardTime; Vector m_vecDefaultLKP; Vector m_vecDefaultLSP; int m_serial; };
//-----------------------------------------------------------------------------
#endif // AI_MEMORY_H
|