Delay.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. //===========================================================================================================================
  2. // Spirenkov Maxim, 2003
  3. //===========================================================================================================================//
  4. // Mission objects
  5. //===========================================================================================================================
  6. // Delay
  7. //============================================================================================
  8. #include "Delay.h"
  9. #include "MissionReloader.h"
  10. //============================================================================================
  11. Delay::Delay()
  12. {
  13. waitTime = 0.0f;
  14. deltaTime = 0.0f;
  15. isInstant = false;
  16. isProcess = false;
  17. }
  18. Delay::~Delay()
  19. {
  20. }
  21. //============================================================================================
  22. //Инициализировать объект
  23. bool Delay::Create(MOPReader & reader)
  24. {
  25. initTime = waitTime = reader.Float();
  26. deltaTime = reader.Float();
  27. waitTime += Rnd(deltaTime);
  28. bool isActivate = reader.Bool();
  29. isInstant = reader.Bool();
  30. isProcess = false;
  31. event.Init(reader);
  32. Activate(isActivate);
  33. return true;
  34. }
  35. //Активировать
  36. void Delay::Activate(bool isActive)
  37. {
  38. MissionObject::Activate(isActive);
  39. if(IsActive())
  40. {
  41. LogicDebug("Activate");
  42. if(!isInstant)
  43. {
  44. waitTime = initTime + Rnd(deltaTime);
  45. SetUpdate(&Delay::Work, ML_TRIGGERS);
  46. }else{
  47. waitTime = 0.0f;
  48. Work(0.0f, 0);
  49. }
  50. }else{
  51. LogicDebug("Deactivate");
  52. DelUpdate(&Delay::Work);
  53. }
  54. }
  55. //Инициализировать объект
  56. bool Delay::EditMode_Create(MOPReader & reader)
  57. {
  58. return true;
  59. }
  60. //Обновить параметры
  61. bool Delay::EditMode_Update(MOPReader & reader)
  62. {
  63. return true;
  64. }
  65. //Получить размеры описывающего ящика
  66. void Delay::EditMode_GetSelectBox(Vector & min, Vector & max)
  67. {
  68. min = max = 0.0f;
  69. }
  70. //Работа
  71. void _cdecl Delay::Work(float dltTime, long level)
  72. {
  73. waitTime -= dltTime;
  74. if(waitTime > 0.0f) return;
  75. waitTime = -1.0f;
  76. Activate(false);
  77. if(isProcess)
  78. {
  79. LogicDebugError("Delay already in process! Critical error!");
  80. return;
  81. }
  82. isProcess = true;
  83. LogicDebug("Triggering");
  84. event.Activate(Mission(), false);
  85. isProcess = false;
  86. }
  87. //============================================================================================
  88. //Параметры инициализации
  89. //============================================================================================
  90. MOP_BEGINLISTG(Delay, "Delay", '1.00', 0x0fffffff, "Logic")
  91. MOP_FLOATEXC("Wait time", 10.0f, 0.0f, 1000000.0f, "Delay time in seconds")
  92. MOP_FLOATEXC("Random delta time", 0.0f, 0.0f, 1000000.0f, "Random time value add to wait time")
  93. MOP_BOOL("Active", false)
  94. MOP_BOOLC("Instant trigger", false, "Skip time params and execute instant triggers")
  95. MOP_MISSIONTRIGGERG("Events", "")
  96. MOP_ENDLIST(Delay)