//========= Copyright © 1996-2005, 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