MultiDelay.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. //============================================================================================
  2. // Spirenkov Maxim, 2007
  3. //============================================================================================
  4. // Mission objects
  5. //============================================================================================
  6. // MultiDelay
  7. //============================================================================================
  8. #include "MultiDelay.h"
  9. #include "MissionReloader.h"
  10. //============================================================================================
  11. MultiDelay::MultiDelay() : elements(_FL_)
  12. {
  13. }
  14. MultiDelay::~MultiDelay()
  15. {
  16. }
  17. //============================================================================================
  18. //Инициализировать объект
  19. bool MultiDelay::Create(MOPReader & reader)
  20. {
  21. currentIndex = 0;
  22. elements.DelAll();
  23. elements.AddElements(reader.Array());
  24. for(long i = 0; i < elements; i++)
  25. {
  26. Element & el = elements[i];
  27. el.initTime = reader.Float();
  28. el.deltaTime = reader.Float();
  29. el.waitTime = el.initTime + Rnd(el.deltaTime);
  30. el.event.Init(reader);
  31. }
  32. isChain = reader.Bool();
  33. bool isActivate = reader.Bool();
  34. isPause = false;
  35. Activate(isActivate);
  36. return true;
  37. }
  38. //Активировать
  39. void MultiDelay::Activate(bool isActive)
  40. {
  41. MissionObject::Activate(isActive);
  42. if(IsActive())
  43. {
  44. LogicDebug("Activate");
  45. for(long i = 0; i < elements; i++)
  46. {
  47. Element & el = elements[i];
  48. el.waitTime = el.initTime + Rnd(el.deltaTime);
  49. }
  50. currentIndex = 0;
  51. if(!isChain)
  52. {
  53. SetUpdate(&MultiDelay::ParalelWork, ML_TRIGGERS);
  54. }else{
  55. SetUpdate(&MultiDelay::ChainWork, ML_TRIGGERS);
  56. }
  57. isPause = false;
  58. }else{
  59. LogicDebug("Deactivate");
  60. DelUpdate();
  61. }
  62. }
  63. //Обработчик команд для объекта
  64. void MultiDelay::Command(const char * id, dword numParams, const char ** params)
  65. {
  66. if(!id)
  67. {
  68. return;
  69. }
  70. if(string::IsEqual(id, "pause"))
  71. {
  72. isPause = true;
  73. LogicDebug("Multidelay is pause");
  74. }else
  75. if(string::IsEqual(id, "resume"))
  76. {
  77. isPause = false;
  78. LogicDebug("Multidelay is resume");
  79. }
  80. }
  81. //Инициализировать объект
  82. bool MultiDelay::EditMode_Create(MOPReader & reader)
  83. {
  84. return true;
  85. }
  86. //Обновить параметры
  87. bool MultiDelay::EditMode_Update(MOPReader & reader)
  88. {
  89. return true;
  90. }
  91. //Получить размеры описывающего ящика
  92. void MultiDelay::EditMode_GetSelectBox(Vector & min, Vector & max)
  93. {
  94. min = max = 0.0f;
  95. }
  96. //Работа
  97. void _cdecl MultiDelay::ParalelWork(float dltTime, long level)
  98. {
  99. if(isPause)
  100. {
  101. return;
  102. }
  103. long workCount = 0;
  104. for(long i = 0; i < elements; i++)
  105. {
  106. Element & el = elements[i];
  107. if(el.waitTime < -1.0f) continue;
  108. workCount++;
  109. el.waitTime -= dltTime;
  110. if(el.waitTime > 0.0f) continue;
  111. el.waitTime = -10.0f;
  112. LogicDebug("Triggering %i delay", i);
  113. el.event.Activate(Mission(), false);
  114. }
  115. if(!workCount)
  116. {
  117. Activate(false);
  118. }
  119. }
  120. //Работа
  121. void _cdecl MultiDelay::ChainWork(float dltTime, long level)
  122. {
  123. if(isPause)
  124. {
  125. return;
  126. }
  127. if(currentIndex >= elements)
  128. {
  129. Activate(false);
  130. return;
  131. }
  132. Element & el = elements[currentIndex];
  133. el.waitTime -= dltTime;
  134. if(el.waitTime > 0.0f) return;
  135. el.waitTime = -10.0f;
  136. LogicDebug("Triggering %i delay", currentIndex);
  137. currentIndex++;
  138. el.event.Activate(Mission(), false);
  139. }
  140. //Пересоздать объект
  141. void MultiDelay::Restart()
  142. {
  143. ReCreate();
  144. };
  145. //============================================================================================
  146. //Параметры инициализации
  147. //============================================================================================
  148. MOP_BEGINLISTCG(MultiDelay, "Multi delay", '1.00', 0x0fffffff, "Commands: pause - pause delay work;\n resume - continue work after pause;\nActivate: true - restart object and resume work,\n false - stop working", "Logic")
  149. MOP_ARRAYBEG("Delleis", 1, 100)
  150. MOP_FLOATEXC("Wait time", 10.0f, 0.0f, 1000000.0f, "Delay time in seconds from activate")
  151. MOP_FLOATEXC("Random delta time", 0.0f, 0.0f, 1000000.0f, "Random time value add to wait time")
  152. MOP_MISSIONTRIGGER("")
  153. MOP_ARRAYEND
  154. MOP_BOOLC("Chain", false, "Chain or paralel work")
  155. MOP_BOOL("Active", false)
  156. MOP_ENDLIST(MultiDelay)