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.
287 lines
8.9 KiB
287 lines
8.9 KiB
//========= 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
|
|
|