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.
200 lines
4.9 KiB
200 lines
4.9 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: A schedule |
|
// |
|
// $Workfile: $ |
|
// $Date: $ |
|
// |
|
//----------------------------------------------------------------------------- |
|
// $Log: $ |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#include "bitstring.h" |
|
|
|
#ifndef AI_SCHEDULE_H |
|
#define AI_SCHEDULE_H |
|
|
|
#pragma once |
|
|
|
class CStringRegistry; |
|
class CAI_ClassScheduleIdSpace; |
|
class CAI_BaseNPC; |
|
|
|
struct Task_t; |
|
|
|
#ifndef MAX_CONDITIONS |
|
#define MAX_CONDITIONS 32*8 |
|
#endif |
|
typedef CBitVec<MAX_CONDITIONS> CAI_ScheduleBits; |
|
|
|
//================================================== |
|
// goalType_t |
|
//================================================== |
|
|
|
enum goalType_t |
|
{ |
|
GOAL_NONE = -1, |
|
GOAL_ENEMY, //Our current enemy's position |
|
GOAL_TARGET, //Our current target's position |
|
GOAL_ENEMY_LKP, //Our current enemy's last known position |
|
GOAL_SAVED_POSITION, //Our saved position |
|
}; |
|
|
|
//================================================== |
|
// pathType_t |
|
//================================================== |
|
|
|
enum pathType_t |
|
{ |
|
PATH_NONE = -1, |
|
PATH_TRAVEL, //Path that will take us to the goal |
|
PATH_LOS, //Path that gives us line of sight to our goal |
|
//PATH_FLANK, //Path that will take us to a flanking position of our goal |
|
//PATH_FLANK_LOS, //Path that will take us to within line of sight to the flanking position of our goal |
|
PATH_COVER, //Path that will give us cover from our goal |
|
//PATH_COVER_LOS, //Path that will give us line of sight to cover from our goal |
|
}; |
|
|
|
//============================================================================= |
|
// >> CAI_Schedule |
|
//============================================================================= |
|
|
|
class CAI_Schedule; |
|
|
|
class CAI_SchedulesManager |
|
{ |
|
public: |
|
CAI_SchedulesManager() |
|
{ |
|
allSchedules = NULL; |
|
m_CurLoadSig = 0; // Note when schedules reset |
|
} |
|
|
|
int GetScheduleLoadSignature() { return m_CurLoadSig; } |
|
CAI_Schedule* GetScheduleFromID( int schedID ); // Function to return schedule from linked list |
|
CAI_Schedule* GetScheduleByName( const char *name ); |
|
|
|
bool LoadAllSchedules(void); |
|
|
|
bool LoadSchedules( const char* prefix, CAI_ClassScheduleIdSpace *pIdSpace ); |
|
bool LoadSchedulesFromBuffer( const char *prefix, const char *pfile, CAI_ClassScheduleIdSpace *pIdSpace ); |
|
|
|
private: |
|
friend class CAI_SystemHook; |
|
|
|
int m_CurLoadSig; // Note when schedules reset |
|
CAI_Schedule* allSchedules; // A linked list of all schedules |
|
|
|
CAI_Schedule * CreateSchedule(char *name, int schedule_id); |
|
|
|
void CreateStringRegistries( void ); |
|
void DestroyStringRegistries( void ); |
|
void DeleteAllSchedules(void); |
|
|
|
//static bool LoadSchedules( char* prefix, int taskIDOffset, int taskENOffset, |
|
// int schedIDOffset, int schedENOffset, |
|
// int condIDOffset, int condENOffset); |
|
|
|
// parsing helpers |
|
int GetStateID(const char *state_name); |
|
int GetMemoryID(const char *memory_name); |
|
int GetPathID( const char *token ); |
|
int GetGoalID( const char *token ); |
|
|
|
}; |
|
|
|
extern CAI_SchedulesManager g_AI_SchedulesManager; |
|
|
|
class CAI_Schedule |
|
{ |
|
// --------- |
|
// Static |
|
// --------- |
|
// --------- |
|
public: |
|
int GetId() const |
|
{ |
|
return m_iScheduleID; |
|
} |
|
|
|
const Task_t *GetTaskList() const |
|
{ |
|
return m_pTaskList; |
|
} |
|
|
|
int NumTasks() const |
|
{ |
|
return m_iNumTasks; |
|
} |
|
|
|
void GetInterruptMask( CAI_ScheduleBits *pBits ) const |
|
{ |
|
m_InterruptMask.CopyTo( pBits ); |
|
} |
|
|
|
bool HasInterrupt( int condition ) const |
|
{ |
|
return m_InterruptMask.IsBitSet( condition ); |
|
} |
|
|
|
const char *GetName() const |
|
{ |
|
return m_pName; |
|
} |
|
|
|
private: |
|
friend class CAI_SchedulesManager; |
|
|
|
int m_iScheduleID; // The id number of this schedule |
|
|
|
Task_t *m_pTaskList; |
|
int m_iNumTasks; |
|
|
|
CAI_ScheduleBits m_InterruptMask; // a bit mask of conditions that can interrupt this schedule |
|
char *m_pName; |
|
|
|
CAI_Schedule *nextSchedule; // The next schedule in the list of schedules |
|
|
|
CAI_Schedule(char *name,int schedule_id, CAI_Schedule *pNext); |
|
~CAI_Schedule( void ); |
|
}; |
|
|
|
//----------------------------------------------------------------------------- |
|
// |
|
// In-memory schedules |
|
// |
|
|
|
#define AI_DEFINE_SCHEDULE( name, text ) \ |
|
const char * g_psz##name = \ |
|
"\n Schedule" \ |
|
"\n " #name \ |
|
text \ |
|
"\n" |
|
|
|
|
|
#define AI_LOAD_SCHEDULE( classname, name ) \ |
|
do \ |
|
{ \ |
|
extern const char * g_psz##name; \ |
|
if ( classname::gm_SchedLoadStatus.fValid ) \ |
|
{ \ |
|
classname::gm_SchedLoadStatus.fValid = g_AI_SchedulesManager.LoadSchedulesFromBuffer( #classname,(char *)g_psz##name,&classname::gm_ClassScheduleIdSpace ); \ |
|
} \ |
|
} while (false) |
|
|
|
|
|
// For loading default schedules in memory (see ai_default.cpp) |
|
#define AI_LOAD_DEF_SCHEDULE( classname, name ) \ |
|
do \ |
|
{ \ |
|
extern const char * g_psz##name; \ |
|
if (!g_AI_SchedulesManager.LoadSchedulesFromBuffer( #classname,(char *)g_psz##name,&classname::gm_ClassScheduleIdSpace )) \ |
|
return false; \ |
|
} while (false) |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
|
#endif // AI_SCHEDULE_H
|
|
|