LogicSwitcher.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. //===========================================================================================================================
  2. // Spirenkov Maxim, 2003
  3. //===========================================================================================================================//
  4. // Mission objects
  5. //===========================================================================================================================
  6. // LogicSwitcher
  7. //============================================================================================
  8. #include "LogicSwitcher.h"
  9. #include "MissionReloader.h"
  10. //============================================================================================
  11. LogicSwitcher::LogicSwitcher() : input(_FL_)
  12. {
  13. andLogic = true;
  14. }
  15. LogicSwitcher::~LogicSwitcher()
  16. {
  17. }
  18. //============================================================================================
  19. //Инициализировать объект
  20. bool LogicSwitcher::Create(MOPReader & reader)
  21. {
  22. input.DelAll();
  23. andLogic = false;
  24. const char * mode = reader.Enum().c_str();
  25. if(mode)
  26. {
  27. if(mode[0] == 'A' || mode[0] == 'a')
  28. {
  29. if(mode[1] == 'L' || mode[1] == 'l')
  30. {
  31. andLogic = true;
  32. }
  33. }
  34. }
  35. long icount = reader.Array();
  36. for(long i = 0; i < icount; i++)
  37. {
  38. Input & inp = input[input.Add()];
  39. inp.name = reader.String();
  40. inp.state = false;
  41. }
  42. Activate(reader.Bool());
  43. event.Init(reader);
  44. return true;
  45. }
  46. //Обработчик команд для объекта
  47. void LogicSwitcher::Command(const char * id, dword numParams, const char ** params)
  48. {
  49. if(string::IsEmpty(id)) return;
  50. ConstString cid(id);
  51. static const ConstString creset("reset");
  52. if(cid == creset)
  53. {
  54. for(long i = 0; i < input; i++) input[i].state = false;
  55. event.Reset();
  56. LogicDebug("Reseting...");
  57. return;
  58. }
  59. if(!IsActive())
  60. {
  61. LogicDebug("Skip command \"%s\", switch now is't active...", id);
  62. return;
  63. }
  64. //Если ошибочны параметры - скипаем
  65. if(!numParams || !params[0])
  66. {
  67. LogicDebug("Logic switcher -> invalidate input trigger name: \"\"");
  68. return;
  69. }
  70. long index = -1;
  71. ConstString param(params[0]);
  72. for(long i = 0; i < input; i++)
  73. {
  74. if(input[i].name == param)
  75. {
  76. index = i;
  77. break;
  78. }
  79. }
  80. if(index < 0)
  81. {
  82. LogicDebug("Logic switcher -> unknown input trigger name: \"%s\"", params[0]);
  83. return;
  84. }
  85. //Активация
  86. static const ConstString cevent("event");
  87. if(cid == cevent)
  88. {
  89. LogicDebug("Receive event \"%s\"", params[0]);
  90. input[index].state = true;
  91. bool isStart = true;
  92. if(andLogic)
  93. {
  94. for(long i = 0; i < input; i++)
  95. {
  96. if(!input[i].state)
  97. {
  98. isStart = false;
  99. break;
  100. }
  101. }
  102. }
  103. if(isStart)
  104. {
  105. LogicDebug("Triggering...");
  106. event.Activate(Mission());
  107. }
  108. return;
  109. }
  110. //Деактивация
  111. static const ConstString cunevent("unevent");
  112. if(cid == cunevent)
  113. {
  114. LogicDebug("Unevent \"%s\"", params[0]);
  115. input[index].state = false;
  116. return;
  117. }
  118. LogicDebugError("Unknown command: %s", id);
  119. }
  120. //Активировать
  121. void LogicSwitcher::Activate(bool isActive)
  122. {
  123. MissionObject::Activate(isActive);
  124. if(IsActive())
  125. {
  126. LogicDebug("Activate");
  127. }else{
  128. LogicDebug("Deactivate");
  129. }
  130. }
  131. //Инициализировать объект
  132. bool LogicSwitcher::EditMode_Create(MOPReader & reader)
  133. {
  134. return true;
  135. }
  136. //Обновить параметры
  137. bool LogicSwitcher::EditMode_Update(MOPReader & reader)
  138. {
  139. return true;
  140. }
  141. //Получить размеры описывающего ящика
  142. void LogicSwitcher::EditMode_GetSelectBox(Vector & min, Vector & max)
  143. {
  144. min = max = 0.0f;
  145. }
  146. //============================================================================================
  147. //Описание
  148. //============================================================================================
  149. const char * LogicSwitcher::triggerDesc =
  150. "Trigger type:\n"
  151. " #b\"All active\"@b when all input triggers active, activated output trigger\n"
  152. " #b\"Any active\"@b when any input trigger active, activated output trigger\n"
  153. " ";
  154. const char * LogicSwitcher::comment =
  155. "Logic element use for analyse of many event\n"
  156. "\n"
  157. "Commands list:\n"
  158. "----------------------------------------\n"
  159. " Activate input trigger\n"
  160. "----------------------------------------\n"
  161. " command: event\n"
  162. " parm: input trigger name\n"
  163. " \n"
  164. "----------------------------------------\n"
  165. " Deactivate input trigger\n"
  166. "----------------------------------------\n"
  167. " command: unevent\n"
  168. " parm: input trigger name\n"
  169. " \n"
  170. "----------------------------------------\n"
  171. " Reset all input triggers and\n"
  172. " output trigger\n"
  173. "----------------------------------------\n"
  174. " command: reset\n"
  175. " \n"
  176. " ";
  177. //============================================================================================
  178. //Параметры инициализации
  179. //============================================================================================
  180. MOP_BEGINLISTCG(LogicSwitcher, "Logic switcher", '1.00', 0x0fffffff, LogicSwitcher::comment, "Logic")
  181. MOP_ENUMBEG("LogicFunction")
  182. MOP_ENUMELEMENT("All active")
  183. MOP_ENUMELEMENT("Any active")
  184. MOP_ENUMEND
  185. MOP_ENUMC("LogicFunction", "Type", LogicSwitcher::triggerDesc)
  186. MOP_ARRAYBEGC("Input", 1, 1000, "Input triggers")
  187. MOP_STRINGC("Name", "", "Input trigger name")
  188. MOP_ARRAYEND
  189. MOP_BOOLC("Active", true, "Active trigger in start mission time")
  190. MOP_MISSIONTRIGGER("")
  191. MOP_ENDLIST(LogicSwitcher)