sequencer.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. // Sequencer Header File
  2. #ifndef __SEQUENCER__
  3. #define __SEQUENCER__
  4. //Defines
  5. //const int MAX_ERROR_LENGTH = 256;
  6. //Typedefs
  7. typedef struct bstream_s
  8. {
  9. CBlockStream *stream;
  10. bstream_s *last;
  11. } bstream_t;
  12. // Sequencer
  13. /*
  14. ==================================================================================================
  15. CSequencer
  16. ==================================================================================================
  17. */
  18. class CSequencer
  19. {
  20. //typedef map < int, CSequence * > sequenceID_m;
  21. typedef list < CSequence * > sequence_l;
  22. typedef map < CTaskGroup *, CSequence * > taskSequence_m;
  23. public:
  24. enum
  25. {
  26. BF_ELSE = 0x00000001, //Block has an else id //FIXME: This was a sloppy fix for a problem that arose from conditionals
  27. };
  28. enum
  29. {
  30. SEQ_OK, //Command was successfully added
  31. SEQ_FAILED, //An error occured while trying to insert the command
  32. };
  33. CSequencer();
  34. protected:
  35. ~CSequencer();
  36. public:
  37. int GetID() { return m_id;};
  38. int Init( int ownerID, CTaskManager *taskManager);
  39. static CSequencer *Create ( void );
  40. void Free( CIcarus* icarus );
  41. int Run( char *buffer, long size, CIcarus* icarus);
  42. int Callback( CTaskManager *taskManager, CBlock *block, int returnCode, CIcarus* icarus );
  43. void SetOwnerID( int owner ) { m_ownerID = owner;}
  44. int GetOwnerID( void ) const { return m_ownerID; }
  45. CTaskManager *GetTaskManager( void ) const { return m_taskManager; }
  46. void SetTaskManager( CTaskManager *tm) { if ( tm ) m_taskManager = tm; }
  47. int Save();
  48. int Load( CIcarus* icarus, IGameInterface* game );
  49. // Overloaded new operator.
  50. inline void *operator new( size_t size )
  51. { // Allocate the memory.
  52. return IGameInterface::GetGame()->Malloc( size );
  53. }
  54. // Overloaded delete operator.
  55. inline void operator delete( void *pRawData )
  56. { // Free the Memory.
  57. IGameInterface::GetGame()->Free( pRawData );
  58. }
  59. // moved to public on 2/12/2 to allow calling during shutdown
  60. int Recall( CIcarus* icarus );
  61. protected:
  62. int EvaluateConditional( CBlock *block, CIcarus* icarus );
  63. int Route( CSequence *sequence, bstream_t *bstream , CIcarus* icarus);
  64. int Flush( CSequence *owner, CIcarus* icarus );
  65. void Interrupt( void );
  66. bstream_t *AddStream( void );
  67. void DeleteStream( bstream_t *bstream );
  68. int AddAffect( bstream_t *bstream, int retain, int *id, CIcarus* icarus );
  69. CSequence *AddSequence( CIcarus* icarus );
  70. CSequence *AddSequence( CSequence *parent, CSequence *returnSeq, int flags, CIcarus* icarus );
  71. CSequence *GetSequence( int id );
  72. //NOTENOTE: This only removes references to the sequence, IT DOES NOT FREE THE ALLOCATED MEMORY!
  73. int RemoveSequence( CSequence *sequence, CIcarus* icarus);
  74. int DestroySequence( CSequence *sequence, CIcarus* icarus);
  75. int PushCommand( CBlock *command, int flag );
  76. CBlock *PopCommand( int flag );
  77. inline CSequence *ReturnSequence( CSequence *sequence );
  78. void CheckRun( CBlock ** , CIcarus* icarus);
  79. void CheckLoop( CBlock ** , CIcarus* icarus);
  80. void CheckAffect( CBlock ** , CIcarus* icarus);
  81. void CheckIf( CBlock ** , CIcarus* icarus);
  82. void CheckDo( CBlock ** , CIcarus* icarus);
  83. void CheckFlush( CBlock ** , CIcarus* icarus);
  84. void Prep( CBlock ** , CIcarus* icarus);
  85. int Prime( CTaskManager *taskManager, CBlock *command, CIcarus* icarus);
  86. void StripExtension( const char *in, char *out );
  87. int ParseRun( CBlock *block , CIcarus* icarus);
  88. int ParseLoop( CBlock *block, bstream_t *bstream , CIcarus* icarus);
  89. int ParseAffect( CBlock *block, bstream_t *bstream, CIcarus* icarus );
  90. int ParseIf( CBlock *block, bstream_t *bstream, CIcarus* icarus );
  91. int ParseElse( CBlock *block, bstream_t *bstream, CIcarus* icarus );
  92. int ParseTask( CBlock *block, bstream_t *bstream , CIcarus* icarus);
  93. int Affect( int id, int type , CIcarus* icarus);
  94. void AddTaskSequence( CSequence *sequence, CTaskGroup *group );
  95. CSequence *GetTaskSequence( CTaskGroup *group );
  96. //Member variables
  97. int m_ownerID;
  98. CTaskManager *m_taskManager;
  99. int m_numCommands; //Total number of commands for the sequencer (including all child sequences)
  100. //sequenceID_m m_sequenceMap;
  101. sequence_l m_sequences;
  102. taskSequence_m m_taskSequences;
  103. CSequence *m_curSequence;
  104. CTaskGroup *m_curGroup;
  105. bstream_t *m_curStream;
  106. int m_elseValid;
  107. CBlock *m_elseOwner;
  108. vector<bstream_t*> m_streamsCreated;
  109. int m_id;
  110. };
  111. #endif //__SEQUENCER__