AliveDetector.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. //===========================================================================================================================
  2. // Spirenkov Maxim, 2003
  3. //===========================================================================================================================//
  4. // Mission objects
  5. //===========================================================================================================================
  6. // AliveDetector
  7. //============================================================================================
  8. #include "AliveDetector.h"
  9. //============================================================================================
  10. AliveDetector::AliveDetector() : aiObjects(_FL_)
  11. {
  12. isDown = false;
  13. autoReset = false;
  14. time = -1.0f;
  15. delayTime = 0.0f;
  16. watchDieFact = false;
  17. deadState = true;
  18. }
  19. AliveDetector::~AliveDetector()
  20. {
  21. }
  22. //============================================================================================
  23. //Инициализировать объект
  24. bool AliveDetector::Create(MOPReader & reader)
  25. {
  26. aiObjects.DelAll();
  27. isDown = false;
  28. autoReset = false;
  29. time = -1.0f;
  30. delayTime = 0.0f;
  31. watchDieFact = false;
  32. deadState = true;
  33. if(!DetectorObject::Create(reader)) return false;
  34. isDown = false;
  35. Show(false);
  36. //Составляем список объектов
  37. aiObjects.Empty();
  38. long objs = reader.Array();
  39. AIElement el;
  40. for(long i = 0; i < objs; i++)
  41. {
  42. FindObject(reader.String(), el.object);
  43. el.isLive = false;
  44. el.isDead = false;
  45. aiObjects.Add(el);
  46. }
  47. if(aiObjects <= 0)
  48. {
  49. Mission().LogicDebugError("AliveDetector \"%s\" not created -> AIObjects not found", GetObjectID().c_str());
  50. return false;
  51. }
  52. delayTime = reader.Float();
  53. watchDieFact = reader.Bool();
  54. deadState = reader.Bool();
  55. inverseLogic = reader.Bool();
  56. //Инициализируем тригер события
  57. event.Init(reader);
  58. Activate(reader.Bool());
  59. return true;
  60. }
  61. //Активировать
  62. void AliveDetector::Activate(bool isActive)
  63. {
  64. DetectorObject::Activate(isActive);
  65. if(!EditMode_IsOn())
  66. {
  67. if(IsActive())
  68. {
  69. LogicDebug("Activate");
  70. SetUpdate(&AliveDetector::Work, ML_TRIGGERS);
  71. }else{
  72. LogicDebug("Deactivate");
  73. DelUpdate(&AliveDetector::Work);
  74. }
  75. }else{
  76. DelUpdate(&AliveDetector::Work);
  77. }
  78. }
  79. //Инициализировать объект
  80. bool AliveDetector::EditMode_Create(MOPReader & reader)
  81. {
  82. return true;
  83. }
  84. //Обновить параметры
  85. bool AliveDetector::EditMode_Update(MOPReader & reader)
  86. {
  87. return true;
  88. }
  89. //============================================================================================
  90. //Работа детектора
  91. void _cdecl AliveDetector::Work(float dltTime, long level)
  92. {
  93. long aliveCount = 0;
  94. for(long i = 0; i < aiObjects; i++)
  95. {
  96. AIElement & el = aiObjects[i];
  97. //Проверяем правильность объекта
  98. if(!el.object.Validate())
  99. {
  100. continue;
  101. }
  102. if(watchDieFact)
  103. {
  104. //Если жив
  105. if(el.isLive)
  106. {
  107. if(!el.isDead)
  108. {
  109. if(IsAlive(el.object.Ptr()))
  110. {
  111. aliveCount++;
  112. }else{
  113. el.isDead = true;
  114. }
  115. }
  116. }else{
  117. aliveCount++;
  118. if(IsAlive(el.object.Ptr()))
  119. {
  120. el.isLive = true;
  121. }
  122. }
  123. }else{
  124. if(IsAlive(el.object.Ptr()))
  125. {
  126. aliveCount++;
  127. }
  128. }
  129. }
  130. if(!aliveCount && time < -0.5f)
  131. {
  132. time = delayTime;
  133. LogicDebug("Start timer in time: %f", time);
  134. }
  135. if(time > -0.5f)
  136. {
  137. time -= dltTime;
  138. if(time <= 0.0f)
  139. {
  140. LogicDebug("Triggering");
  141. time = -1.0f;
  142. Activate(false);
  143. event.Activate(Mission(), false);
  144. for(long i = 0; i < aiObjects; i++)
  145. {
  146. AIElement & el = aiObjects[i];
  147. el.isLive = false;
  148. el.isDead = false;
  149. }
  150. }
  151. }
  152. }
  153. //Проверить жив или нет
  154. bool AliveDetector::IsAlive(MissionObject * obj)
  155. {
  156. bool dead;
  157. if(deadState)
  158. {
  159. dead = obj->IsDead();
  160. }else{
  161. dead = obj->IsDie() | obj->IsDead();
  162. }
  163. if(inverseLogic)
  164. {
  165. return dead;
  166. }
  167. return !dead;
  168. }
  169. //============================================================================================
  170. //Параметры инициализации
  171. //============================================================================================
  172. MOP_BEGINLISTCG(AliveDetector, "Alive detector", '1.00', 0x0fffffff, "Alive detector look for some AI mission object,\nand triggering if all objects is dead.", "Logic")
  173. MOP_ARRAYBEG("Alive object", 0, 1000)
  174. MOP_STRING("Object id", "Player")
  175. MOP_ARRAYEND
  176. MOP_FLOATEXC("Delay time", 5.0f, 0.0f, 100000.0f, "Delay time in seconds before activate trigger")
  177. MOP_BOOLC("Triggering", true, "Triggering at die fact or look dead objects")
  178. MOP_BOOLC("Look dead", true, "Look dead or die objects")
  179. MOP_BOOLC("Inverse logic", false, "Inverse logic -> look live objects or birth fact")
  180. MOP_MISSIONTRIGGERG("Events", "")
  181. MOP_BOOL("Active", true)
  182. MOP_ENDLIST(AliveDetector)