summaryrefslogtreecommitdiff
path: root/game/server/ai_schedule.h
diff options
context:
space:
mode:
Diffstat (limited to 'game/server/ai_schedule.h')
-rw-r--r--game/server/ai_schedule.h200
1 files changed, 200 insertions, 0 deletions
diff --git a/game/server/ai_schedule.h b/game/server/ai_schedule.h
new file mode 100644
index 0000000..2a2d96c
--- /dev/null
+++ b/game/server/ai_schedule.h
@@ -0,0 +1,200 @@
+//========= 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