302 lines
9.7 KiB
C++
302 lines
9.7 KiB
C++
//========= 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
|