taskmanager.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. // Task Manager header file
  2. #ifndef __TASK_MANAGER__
  3. #define __TASK_MANAGER__
  4. typedef unsigned long DWORD;
  5. #define MAX_TASK_NAME 64
  6. #define TASKFLAG_NORMAL 0x00000000
  7. const int RUNAWAY_LIMIT = 256;
  8. enum
  9. {
  10. TASK_RETURN_COMPLETE,
  11. TASK_RETURN_FAILED,
  12. };
  13. enum
  14. {
  15. TASK_OK,
  16. TASK_FAILED,
  17. TASK_START,
  18. TASK_END,
  19. };
  20. // CTask
  21. class CTask
  22. {
  23. public:
  24. CTask();
  25. ~CTask();
  26. static CTask *Create( int GUID, CBlock *block );
  27. void Free( void );
  28. DWORD GetTimeStamp( void ) const { return m_timeStamp; }
  29. CBlock *GetBlock( void ) const { return m_block; }
  30. int GetGUID( void) const { return m_id; }
  31. int GetID( void ) const { return m_block->GetBlockID(); }
  32. void SetTimeStamp( DWORD timeStamp ) { m_timeStamp = timeStamp; }
  33. void SetBlock( CBlock *block ) { m_block = block; }
  34. void SetGUID( int id ) { m_id = id; }
  35. // Overloaded new operator.
  36. inline void *operator new( size_t size )
  37. { // Allocate the memory.
  38. return IGameInterface::GetGame()->Malloc( size );
  39. }
  40. // Overloaded delete operator.
  41. inline void operator delete( void *pRawData )
  42. { // Free the Memory.
  43. IGameInterface::GetGame()->Free( pRawData );
  44. }
  45. protected:
  46. int m_id;
  47. DWORD m_timeStamp;
  48. CBlock *m_block;
  49. };
  50. // CTaskGroup
  51. class CTaskGroup
  52. {
  53. public:
  54. typedef map < int, bool > taskCallback_m;
  55. CTaskGroup( void );
  56. ~CTaskGroup( void );
  57. void Init( void );
  58. int Add( CTask *task );
  59. void SetGUID( int GUID );
  60. void SetParent( CTaskGroup *group ) { m_parent = group; }
  61. bool Complete(void) const { return ( m_numCompleted == m_completedTasks.size() ); }
  62. bool MarkTaskComplete( int id );
  63. CTaskGroup *GetParent( void ) const { return m_parent; }
  64. int GetGUID( void ) const { return m_GUID; }
  65. // Overloaded new operator.
  66. static void *operator new( size_t size )
  67. { // Allocate the memory.
  68. return IGameInterface::GetGame()->Malloc( size );
  69. }
  70. // Overloaded delete operator.
  71. static void operator delete( void *pRawData )
  72. { // Free the Memory.
  73. IGameInterface::GetGame()->Free( pRawData );
  74. }
  75. //protected:
  76. taskCallback_m m_completedTasks;
  77. CTaskGroup *m_parent;
  78. unsigned int m_numCompleted;
  79. int m_GUID;
  80. };
  81. // CTaskManager
  82. class CSequencer;
  83. class CTaskManager
  84. {
  85. typedef map < int, CTask * > taskID_m;
  86. typedef map < string, CTaskGroup * > taskGroupName_m;
  87. typedef map < int, CTaskGroup * > taskGroupID_m;
  88. typedef vector < CTaskGroup * > taskGroup_v;
  89. typedef list < CTask *> tasks_l;
  90. public:
  91. CTaskManager();
  92. ~CTaskManager();
  93. int GetID();
  94. static CTaskManager *Create( void );
  95. CBlock *GetCurrentTask( void );
  96. int Init( CSequencer *owner );
  97. int Free( void );
  98. int Flush( void );
  99. int SetCommand( CBlock *block, int type, CIcarus* icarus );
  100. int Completed( int id );
  101. int Update( CIcarus* icarus );
  102. int IsRunning( void ) const { return(!m_tasks.empty()); };
  103. bool IsResident( void ) const { return m_resident;};
  104. CTaskGroup *AddTaskGroup( const char *name , CIcarus* icarus);
  105. CTaskGroup *GetTaskGroup( const char *name, CIcarus* icarus);
  106. CTaskGroup *GetTaskGroup( int id, CIcarus* icarus );
  107. int MarkTask( int id, int operation, CIcarus* icarus );
  108. CBlock *RecallTask( void );
  109. void Save();
  110. void Load( CIcarus* icarus );
  111. // Overloaded new operator.
  112. inline void* operator new( size_t size )
  113. { // Allocate the memory.
  114. return IGameInterface::GetGame()->Malloc( size );
  115. }
  116. // Overloaded delete operator.
  117. inline void operator delete( void *pRawData )
  118. { // Free the Memory.
  119. IGameInterface::GetGame()->Free( pRawData );
  120. }
  121. protected:
  122. int Go( CIcarus* icarus ); //Heartbeat function called once per game frame
  123. int CallbackCommand( CTask *task, int returnCode, CIcarus* icarus );
  124. inline bool Check( int targetID, CBlock *block, int memberNum ) const;
  125. int GetVector( int entID, CBlock *block, int &memberNum, vec3_t &value, CIcarus* icarus );
  126. int GetFloat( int entID, CBlock *block, int &memberNum, float &value, CIcarus* icarus );
  127. int Get( int entID, CBlock *block, int &memberNum, char **value, CIcarus* icarus );
  128. int PushTask( CTask *task, int flag );
  129. CTask *PopTask( int flag );
  130. // Task functions
  131. int Rotate( CTask *task, CIcarus* icarus );
  132. int Remove( CTask *task , CIcarus* icarus);
  133. int Camera( CTask *task, CIcarus* icarus );
  134. int Print( CTask *task , CIcarus* icarus);
  135. int Sound( CTask *task, CIcarus* icarus );
  136. int Move( CTask *task , CIcarus* icarus);
  137. int Kill( CTask *task , CIcarus* icarus);
  138. int Set( CTask *task, CIcarus* icarus );
  139. int Use( CTask *task , CIcarus* icarus);
  140. int DeclareVariable( CTask *task , CIcarus* icarus);
  141. int FreeVariable( CTask *task, CIcarus* icarus );
  142. int Signal( CTask *task , CIcarus* icarus);
  143. int Play( CTask *task , CIcarus* icarus);
  144. int Wait( CTask *task, bool &completed, CIcarus* icarus );
  145. int WaitSignal( CTask *task, bool &completed, CIcarus* icarus);
  146. int SaveCommand( CBlock *block );
  147. // Variables
  148. CSequencer *m_owner;
  149. int m_ownerID;
  150. CTaskGroup *m_curGroup;
  151. taskGroup_v m_taskGroups;
  152. tasks_l m_tasks;
  153. int m_GUID;
  154. int m_count;
  155. taskGroupName_m m_taskGroupNameMap;
  156. taskGroupID_m m_taskGroupIDMap;
  157. bool m_resident;
  158. int m_id;
  159. //CTask *m_waitTask; //Global pointer to the current task that is waiting for callback completion
  160. };
  161. #endif //__TASK_MANAGER__