//========= 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 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