diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/server/ai_namespaces.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/server/ai_namespaces.h')
| -rw-r--r-- | game/server/ai_namespaces.h | 287 |
1 files changed, 287 insertions, 0 deletions
diff --git a/game/server/ai_namespaces.h b/game/server/ai_namespaces.h new file mode 100644 index 0000000..8ea9053 --- /dev/null +++ b/game/server/ai_namespaces.h @@ -0,0 +1,287 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef AI_NAMESPACES_H +#define AI_NAMESPACES_H + +class CStringRegistry; + +#if defined( _WIN32 ) +#pragma once +#endif + +#define MAX_STRING_INDEX 9999 +const int GLOBAL_IDS_BASE = 1000000000; // decimal for debugging readability + +//----------------------------------------------------------------------------- + +inline bool AI_IdIsGlobal( int id ) { return ( id >= GLOBAL_IDS_BASE || id == -1 ); } +inline bool AI_IdIsLocal( int id ) { return ( id < GLOBAL_IDS_BASE || id == -1 ); } +inline int AI_RemapToGlobal( int id ) { return ( id != -1 ) ? id + GLOBAL_IDS_BASE : -1; } +inline int AI_RemapFromGlobal( int id ) { return ( id != -1 ) ? id - GLOBAL_IDS_BASE : -1; } + +inline int AI_MakeGlobal( int id ) { return AI_IdIsLocal( id ) ? AI_RemapToGlobal( id ) : id; } + +//----------------------------------------------------------------------------- +// CAI_GlobalNamespace +// +// Purpose: Symbol table for all symbols across a given namespace, a +// bi-directional mapping of "text" to global ID +// + +class CAI_GlobalNamespace +{ +public: + CAI_GlobalNamespace(); + ~CAI_GlobalNamespace(); + + void Clear(); + + void AddSymbol( const char *pszSymbol, int symbolID ); + int NextGlobalBase() const; + + const char *IdToSymbol( int symbolID ) const; + int SymbolToId( const char *pszSymbol ) const; + +private: + CStringRegistry * m_pSymbols; + int m_NextGlobalBase; +}; + +//----------------------------------------------------------------------------- +// CAI_LocalIdSpace +// +// Purpose: Maps per class IDs to global IDs, so that various classes can use +// the same integer in local space to represent different globally +// unique integers. Used for schedules, tasks, conditions and squads +// + +class CAI_LocalIdSpace +{ +public: + CAI_LocalIdSpace( bool fIsRoot = false ); + + bool Init( CAI_GlobalNamespace *pGlobalNamespace, CAI_LocalIdSpace *pParentIDSpace = NULL ); + bool IsGlobalBaseSet() const { return ( m_globalBase != -1 ); } + + bool AddSymbol( const char *pszSymbol, int localId, const char *pszDebugSymbolType = "", const char *pszDebugOwner = "" ); + + int GlobalToLocal( int globalID ) const; + int LocalToGlobal( int localID ) const; + + CAI_GlobalNamespace *GetGlobalNamespace() { return m_pGlobalNamespace; } + const CAI_GlobalNamespace *GetGlobalNamespace() const { return m_pGlobalNamespace; } + +private: + bool IsLocalBaseSet() const { return ( m_localBase != MAX_STRING_INDEX ); } + int GetLocalBase() const { return m_localBase; } + int GetGlobalBase() const { return m_globalBase; } + int GetLocalTop() const { return m_localTop; } + int GetGlobalTop() const { return m_globalTop; } + + bool SetLocalBase( int newBase ); + + // -------------------------------- + + int m_globalBase; + int m_localBase; + int m_localTop; + int m_globalTop; + + CAI_LocalIdSpace * m_pParentIDSpace; + CAI_GlobalNamespace * m_pGlobalNamespace; +}; + +//----------------------------------------------------------------------------- +// +// Namespaces used by CAI_BaseNPC +// +//----------------------------------------------------------------------------- + +class CAI_GlobalScheduleNamespace +{ +public: + void Clear() + { + m_ScheduleNamespace.Clear(); + m_TaskNamespace.Clear(); + m_ConditionNamespace.Clear(); + } + + void AddSchedule( const char *pszSchedule, int scheduleID ); + const char *ScheduleIdToSymbol( int scheduleID ) const; + int ScheduleSymbolToId( const char *pszSchedule ) const; + + void AddTask( const char *pszTask, int taskID ); + const char *TaskIdToSymbol( int taskID ) const; + int TaskSymbolToId( const char *pszTask ) const; + + void AddCondition( const char *pszCondition, int conditionID ); + const char *ConditionIdToSymbol( int conditionID ) const; + int ConditionSymbolToId( const char *pszCondition ) const; + int NumConditions() const; + +private: + friend class CAI_ClassScheduleIdSpace; + + CAI_GlobalNamespace m_ScheduleNamespace; + CAI_GlobalNamespace m_TaskNamespace; + CAI_GlobalNamespace m_ConditionNamespace; +}; + +//------------------------------------- + +class CAI_ClassScheduleIdSpace +{ +public: + CAI_ClassScheduleIdSpace( bool fIsRoot = false ) + : m_ScheduleIds( fIsRoot ), + m_TaskIds( fIsRoot ), + m_ConditionIds( fIsRoot ) + { + } + + bool Init( const char *pszClassName, CAI_GlobalScheduleNamespace *pGlobalNamespace, CAI_ClassScheduleIdSpace *pParentIDSpace = NULL ); + + const char *GetClassName() const { return m_pszClassName; } + + bool IsGlobalBaseSet() const; + + bool AddSchedule( const char *pszSymbol, int localId, const char *pszDebugOwner = "" ); + int ScheduleGlobalToLocal( int globalID ) const; + int ScheduleLocalToGlobal( int localID ) const; + + bool AddTask( const char *pszSymbol, int localId, const char *pszDebugOwner = "" ); + int TaskGlobalToLocal( int globalID ) const; + int TaskLocalToGlobal( int localID ) const; + + bool AddCondition( const char *pszSymbol, int localId, const char *pszDebugOwner = "" ); + int ConditionGlobalToLocal( int globalID ) const; + int ConditionLocalToGlobal( int localID ) const; + +private: + const char * m_pszClassName; + CAI_LocalIdSpace m_ScheduleIds; + CAI_LocalIdSpace m_TaskIds; + CAI_LocalIdSpace m_ConditionIds; +}; + +//----------------------------------------------------------------------------- + +inline void CAI_GlobalScheduleNamespace::AddSchedule( const char *pszSchedule, int scheduleID ) +{ + m_ScheduleNamespace.AddSymbol( pszSchedule, scheduleID); +} + +inline const char *CAI_GlobalScheduleNamespace::ScheduleIdToSymbol( int scheduleID ) const +{ + return m_ScheduleNamespace.IdToSymbol( scheduleID ); +} + +inline int CAI_GlobalScheduleNamespace::ScheduleSymbolToId( const char *pszSchedule ) const +{ + return m_ScheduleNamespace.SymbolToId( pszSchedule ); +} + +inline void CAI_GlobalScheduleNamespace::AddTask( const char *pszTask, int taskID ) +{ + m_TaskNamespace.AddSymbol( pszTask, taskID); +} + +inline const char *CAI_GlobalScheduleNamespace::TaskIdToSymbol( int taskID ) const +{ + return m_TaskNamespace.IdToSymbol( taskID ); +} + +inline int CAI_GlobalScheduleNamespace::TaskSymbolToId( const char *pszTask ) const +{ + return m_TaskNamespace.SymbolToId( pszTask ); +} + +inline void CAI_GlobalScheduleNamespace::AddCondition( const char *pszCondition, int conditionID ) +{ + m_ConditionNamespace.AddSymbol( pszCondition, conditionID); +} + +inline const char *CAI_GlobalScheduleNamespace::ConditionIdToSymbol( int conditionID ) const +{ + return m_ConditionNamespace.IdToSymbol( conditionID ); +} + +inline int CAI_GlobalScheduleNamespace::ConditionSymbolToId( const char *pszCondition ) const +{ + return m_ConditionNamespace.SymbolToId( pszCondition ); +} + +inline int CAI_GlobalScheduleNamespace::NumConditions() const +{ + return m_ConditionNamespace.NextGlobalBase() - GLOBAL_IDS_BASE; +} + +inline bool CAI_ClassScheduleIdSpace::Init( const char *pszClassName, CAI_GlobalScheduleNamespace *pGlobalNamespace, CAI_ClassScheduleIdSpace *pParentIDSpace ) +{ + m_pszClassName = pszClassName; + return ( m_ScheduleIds.Init( &pGlobalNamespace->m_ScheduleNamespace, ( pParentIDSpace ) ? &pParentIDSpace->m_ScheduleIds : NULL ) && + m_TaskIds.Init( &pGlobalNamespace->m_TaskNamespace, ( pParentIDSpace ) ? &pParentIDSpace->m_TaskIds : NULL ) && + m_ConditionIds.Init( &pGlobalNamespace->m_ConditionNamespace, ( pParentIDSpace ) ? &pParentIDSpace->m_ConditionIds : NULL ) ); +} + +//----------------------------------------------------------------------------- + +inline bool CAI_ClassScheduleIdSpace::IsGlobalBaseSet() const +{ + return m_ScheduleIds.IsGlobalBaseSet(); +} + +inline bool CAI_ClassScheduleIdSpace::AddSchedule( const char *pszSymbol, int localId, const char *pszDebugOwner ) +{ + return m_ScheduleIds.AddSymbol( pszSymbol, localId, "schedule", pszDebugOwner ); +} + +inline int CAI_ClassScheduleIdSpace::ScheduleGlobalToLocal( int globalID ) const +{ + return m_ScheduleIds.GlobalToLocal( globalID ); +} + +inline int CAI_ClassScheduleIdSpace::ScheduleLocalToGlobal( int localID ) const +{ + return m_ScheduleIds.LocalToGlobal( localID ); +} + +inline bool CAI_ClassScheduleIdSpace::AddTask( const char *pszSymbol, int localId, const char *pszDebugOwner ) +{ + return m_TaskIds.AddSymbol( pszSymbol, localId, "task", pszDebugOwner ); +} + +inline int CAI_ClassScheduleIdSpace::TaskGlobalToLocal( int globalID ) const +{ + return m_TaskIds.GlobalToLocal( globalID ); +} + +inline int CAI_ClassScheduleIdSpace::TaskLocalToGlobal( int localID ) const +{ + return m_TaskIds.LocalToGlobal( localID ); +} + +inline bool CAI_ClassScheduleIdSpace::AddCondition( const char *pszSymbol, int localId, const char *pszDebugOwner ) +{ + return m_ConditionIds.AddSymbol( pszSymbol, localId, "condition", pszDebugOwner ); +} + +inline int CAI_ClassScheduleIdSpace::ConditionGlobalToLocal( int globalID ) const +{ + return m_ConditionIds.GlobalToLocal( globalID ); +} + +inline int CAI_ClassScheduleIdSpace::ConditionLocalToGlobal( int localID ) const +{ + return m_ConditionIds.LocalToGlobal( localID ); +} + +//============================================================================= + +#endif // AI_NAMESPACES_H |