//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #ifndef AI_SENSES_H #define AI_SENSES_H #include "ai_component.h" #include "simtimer.h" #include "soundent.h" #include "tier1/utlmap.h" #include "tier1/utlvector.h" #if defined(_WIN32) #pragma once #endif class CBaseEntity; class CSound; //------------------------------------- DECLARE_POINTER_HANDLE(AISightIter_t); DECLARE_POINTER_HANDLE(AISoundIter_t); // GetFirstSeenEntity can take these as optional parameters to search for // a specific type of entity. enum seentype_t { SEEN_ALL = -1, // Default SEEN_HIGH_PRIORITY = 0, SEEN_NPCS, SEEN_MISC }; #define SENSING_FLAGS_NONE 0x00000000 #define SENSING_FLAGS_DONT_LOOK 0x00000001 // Effectively makes the NPC blind #define SENSING_FLAGS_DONT_LISTEN 0x00000002 // Effectively makes the NPC deaf //----------------------------------------------------------------------------- // class CAI_ScriptConditions // // Purpose: //----------------------------------------------------------------------------- class CAI_Senses : public CAI_Component { public: CAI_Senses() : m_LookDist(2048), m_LastLookDist(-1), m_TimeLastLook(-1), m_iAudibleList(0), m_TimeLastLookHighPriority(-1), m_TimeLastLookNPCs(-1), m_TimeLastLookMisc(-1) { m_SeenArrays[0] = &m_SeenHighPriority; m_SeenArrays[1] = &m_SeenNPCs; m_SeenArrays[2] = &m_SeenMisc; m_iSensingFlags = SENSING_FLAGS_NONE; } float GetDistLook() const { return m_LookDist; } void SetDistLook(float flDistLook) { m_LookDist = flDistLook; } void PerformSensing(); void Listen(void); void Look(int iDistance); // basic sight function for npcs bool ShouldSeeEntity(CBaseEntity *pEntity); // logical query bool CanSeeEntity( CBaseEntity *pSightEnt); // more expensive cone & raycast test #ifdef PORTAL bool CanSeeEntityThroughPortal( const CProp_Portal *pPortal, CBaseEntity *pSightEnt); // more expensive cone & raycast test #endif bool DidSeeEntity(CBaseEntity *pSightEnt) const; // a less expensive query that looks at cached results from // recent conditionsa gathering CBaseEntity *GetFirstSeenEntity(AISightIter_t *pIter, seentype_t iSeenType = SEEN_ALL) const; CBaseEntity *GetNextSeenEntity(AISightIter_t *pIter) const; CSound *GetFirstHeardSound(AISoundIter_t *pIter); CSound *GetNextHeardSound(AISoundIter_t *pIter); CSound *GetClosestSound(bool fScent = false, int validTypes = ALL_SOUNDS | ALL_SCENTS, bool bUsePriority = true); bool CanHearSound(CSound *pSound); //--------------------------------- float GetTimeLastUpdate(CBaseEntity *pEntity); //--------------------------------- void AddSensingFlags(int iFlags) { m_iSensingFlags |= iFlags; } void RemoveSensingFlags(int iFlags) { m_iSensingFlags &= ~iFlags; } bool HasSensingFlags(int iFlags) { return (m_iSensingFlags & iFlags) == iFlags; } DECLARE_SIMPLE_DATADESC(); private: int GetAudibleList() const { return m_iAudibleList; } bool WaitingUntilSeen(CBaseEntity *pSightEnt); void BeginGather(); void NoteSeenEntity(CBaseEntity *pSightEnt); void EndGather(int nSeen, CUtlVector *pResult); bool Look(CBaseEntity *pSightEnt); #ifdef PORTAL bool LookThroughPortal(const CProp_Portal *pPortal, CBaseEntity *pSightEnt); #endif int LookForHighPriorityEntities(int iDistance); int LookForNPCs(int iDistance); int LookForObjects(int iDistance); bool SeeEntity(CBaseEntity *pEntity); float m_LookDist; // distance npc sees (Default 2048) float m_LastLookDist; float m_TimeLastLook; int m_iAudibleList; // first index of a linked list of sounds that the npc // can hear. CUtlVector m_SeenHighPriority; CUtlVector m_SeenNPCs; CUtlVector m_SeenMisc; CUtlVector *m_SeenArrays[3]; float m_TimeLastLookHighPriority; float m_TimeLastLookNPCs; float m_TimeLastLookMisc; int m_iSensingFlags; }; //----------------------------------------------------------------------------- class CAI_SensedObjectsManager : public IEntityListener { public: void Init(); void Term(); CBaseEntity *GetFirst(int *pIter); CBaseEntity *GetNext(int *pIter); virtual void AddEntity(CBaseEntity *pEntity); private: virtual void OnEntitySpawned(CBaseEntity *pEntity); virtual void OnEntityDeleted(CBaseEntity *pEntity); CUtlVector m_SensedObjects; }; extern CAI_SensedObjectsManager g_AI_SensedObjectsManager; //----------------------------------------------------------------------------- #endif // AI_SENSES_H