IcarusImplementation.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. // IcarusImplementation.h
  2. #ifndef ICARUSIMPLEMENTATION_DEFINED
  3. #define ICARUSIMPLEMENTATION_DEFINED
  4. #ifndef ICARUSINTERFACE_DEFINED
  5. #include "IcarusInterface.h"
  6. #endif
  7. #pragma warning( disable : 4786 ) // identifier was truncated
  8. #pragma warning (push, 3) // go back down to 3 for the stl include
  9. #pragma warning (disable:4503) // decorated name length xceeded, name was truncated
  10. #include <string>
  11. #include <vector>
  12. #include <map>
  13. #include <list>
  14. #include <algorithm>
  15. #pragma warning (pop)
  16. #pragma warning (disable:4503) // decorated name length xceeded, name was truncated
  17. using namespace std;
  18. class CSequence;
  19. class CSequencer;
  20. class CIcarusSequencer;
  21. class CIcarusSequence;
  22. class CIcarus : public IIcarusInterface
  23. {
  24. public:
  25. CIcarus(int flavor);
  26. virtual ~CIcarus();
  27. inline IGameInterface* GetGame() {return IGameInterface::GetGame(m_flavor);};
  28. enum
  29. {
  30. MAX_STRING_SIZE = 256,
  31. MAX_FILENAME_LENGTH = 1024,
  32. };
  33. protected:
  34. int m_flavor;
  35. int m_nextSequencerID;
  36. int m_GUID;
  37. typedef list< CSequence * > sequence_l;
  38. typedef list< CSequencer * > sequencer_l;
  39. typedef map < int, CSequencer* > sequencer_m;
  40. sequence_l m_sequences;
  41. sequencer_l m_sequencers;
  42. sequencer_m m_sequencerMap;
  43. typedef map < string, unsigned char > signal_m;
  44. signal_m m_signals;
  45. static double ICARUS_VERSION;
  46. #ifdef _DEBUG
  47. int m_DEBUG_NumSequencerAlloc;
  48. int m_DEBUG_NumSequencerFreed;
  49. int m_DEBUG_NumSequencerResidual;
  50. int m_DEBUG_NumSequenceAlloc;
  51. int m_DEBUG_NumSequenceFreed;
  52. int m_DEBUG_NumSequenceResidual;
  53. #endif
  54. public:
  55. static int s_flavorsAvailable;
  56. static CIcarus** s_instances;
  57. // mandatory overrides
  58. // Get the current Game flavor.
  59. int GetFlavor();
  60. int Save();
  61. int Load();
  62. int Run(int icarusID, char* buffer, long length);
  63. void DeleteIcarusID(int& icarusID);
  64. int GetIcarusID(int ownerID);
  65. int Update(int icarusID);
  66. int IsRunning(int icarusID);
  67. void Completed( int icarusID, int taskID );
  68. void Precache(char* buffer, long length);
  69. protected:
  70. void Delete();
  71. void Free();
  72. public:
  73. CSequence* GetSequence(int id);
  74. void DeleteSequence( CSequence *sequence );
  75. int AllocateSequences( int numSequences, int *idTable );
  76. CSequencer* FindSequencer(int sequencerID);
  77. CSequence* GetSequence();
  78. protected:
  79. int SaveSequenceIDTable();
  80. int SaveSequences();
  81. int SaveSequencers();
  82. int SaveSignals();
  83. int LoadSignals();
  84. int LoadSequence();
  85. int LoadSequences();
  86. int LoadSequencers();
  87. public:
  88. void Signal( const char *identifier );
  89. bool CheckSignal( const char *identifier );
  90. void ClearSignal( const char *identifier );
  91. // Overloaded new operator.
  92. inline void *operator new( size_t size )
  93. {
  94. return IGameInterface::GetGame()->Malloc( size );
  95. }
  96. // Overloaded delete operator.
  97. inline void operator delete( void *pRawData )
  98. {
  99. // Free the Memory.
  100. IGameInterface::GetGame()->Free( pRawData );
  101. }
  102. public:
  103. enum
  104. {
  105. TK_EOF = -1,
  106. TK_UNDEFINED,
  107. TK_COMMENT,
  108. TK_EOL,
  109. TK_CHAR,
  110. TK_STRING,
  111. TK_INT,
  112. TK_INTEGER = TK_INT,
  113. TK_FLOAT,
  114. TK_IDENTIFIER,
  115. TK_USERDEF,
  116. TK_BLOCK_START = TK_USERDEF,
  117. TK_BLOCK_END,
  118. TK_VECTOR_START,
  119. TK_VECTOR_END,
  120. TK_OPEN_PARENTHESIS,
  121. TK_CLOSED_PARENTHESIS,
  122. TK_VECTOR,
  123. TK_GREATER_THAN,
  124. TK_LESS_THAN,
  125. TK_EQUALS,
  126. TK_NOT,
  127. NUM_USER_TOKENS
  128. };
  129. //ID defines
  130. enum
  131. {
  132. ID_AFFECT = NUM_USER_TOKENS,
  133. ID_SOUND,
  134. ID_MOVE,
  135. ID_ROTATE,
  136. ID_WAIT,
  137. ID_BLOCK_START,
  138. ID_BLOCK_END,
  139. ID_SET,
  140. ID_LOOP,
  141. ID_LOOPEND,
  142. ID_PRINT,
  143. ID_USE,
  144. ID_FLUSH,
  145. ID_RUN,
  146. ID_KILL,
  147. ID_REMOVE,
  148. ID_CAMERA,
  149. ID_GET,
  150. ID_RANDOM,
  151. ID_IF,
  152. ID_ELSE,
  153. ID_REM,
  154. ID_TASK,
  155. ID_DO,
  156. ID_DECLARE,
  157. ID_FREE,
  158. ID_DOWAIT,
  159. ID_SIGNAL,
  160. ID_WAITSIGNAL,
  161. ID_PLAY,
  162. ID_TAG,
  163. ID_EOF,
  164. NUM_IDS
  165. };
  166. //Type defines
  167. enum
  168. {
  169. //Wait types
  170. TYPE_WAIT_COMPLETE = NUM_IDS,
  171. TYPE_WAIT_TRIGGERED,
  172. //Set types
  173. TYPE_ANGLES,
  174. TYPE_ORIGIN,
  175. //Affect types
  176. TYPE_INSERT,
  177. TYPE_FLUSH,
  178. //Camera types
  179. TYPE_PAN,
  180. TYPE_ZOOM,
  181. TYPE_MOVE,
  182. TYPE_FADE,
  183. TYPE_PATH,
  184. TYPE_ENABLE,
  185. TYPE_DISABLE,
  186. TYPE_SHAKE,
  187. TYPE_ROLL,
  188. TYPE_TRACK,
  189. TYPE_DISTANCE,
  190. TYPE_FOLLOW,
  191. //Variable type
  192. TYPE_VARIABLE,
  193. TYPE_EOF,
  194. NUM_TYPES
  195. };
  196. // Used by the new Icarus Save code.
  197. enum { MAX_BUFFER_SIZE = 100000 };
  198. unsigned long m_ulBufferCurPos;
  199. unsigned long m_ulBytesRead;
  200. unsigned char *m_byBuffer;
  201. // Destroy the File Buffer.
  202. void DestroyBuffer();
  203. // Create the File Buffer.
  204. void CreateBuffer();
  205. // Reset the buffer completely.
  206. void ResetBuffer();
  207. // Write to a buffer.
  208. void BufferWrite( void *pSrcData, unsigned long ulNumBytesToWrite );
  209. // Read from a buffer.
  210. void BufferRead( void *pDstBuff, unsigned long ulNumBytesToRead );
  211. };
  212. #endif