This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

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