ObjectsGroup.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. //===========================================================================================================================
  2. // Spirenkov Maxim, 2003
  3. //===========================================================================================================================//
  4. // Mission objects
  5. //===========================================================================================================================
  6. // ObjectsGroup
  7. //============================================================================================
  8. #include "ObjectsGroup.h"
  9. //============================================================================================
  10. ObjectsGroup::ObjectsGroup() : objects(_FL_)
  11. {
  12. processActivate = false;
  13. processShow = false;
  14. processCommand = false;
  15. processRestart = false;
  16. }
  17. ObjectsGroup::~ObjectsGroup()
  18. {
  19. }
  20. //============================================================================================
  21. //Инициализировать объект
  22. bool ObjectsGroup::Create(MOPReader & reader)
  23. {
  24. objects.DelAll();
  25. long counter = reader.Array();
  26. for(long i = 0; i < counter; i++)
  27. {
  28. ObjectInfo & info = objects[objects.Add()];
  29. info.object.Reset();
  30. info.id = reader.String();
  31. info.changeShow = reader.Bool();
  32. info.changeActive = reader.Bool();
  33. info.recivingCommand = reader.Bool();
  34. }
  35. processActivate = false;
  36. processShow = false;
  37. processCommand = false;
  38. processRestart = false;
  39. return true;
  40. }
  41. //Показать/скрыть объект
  42. void ObjectsGroup::Show(bool isShow)
  43. {
  44. if(processShow)
  45. {
  46. LogicDebugError("Group already in show process! Critical error!");
  47. return;
  48. }
  49. processShow = true;
  50. UpdateObjectsList();
  51. for(long i = 0; i < objects; i++)
  52. {
  53. ObjectInfo & info = objects[i];
  54. if(info.object.Validate())
  55. {
  56. if(info.changeShow) info.object.Ptr()->Show(isShow);
  57. }
  58. }
  59. processShow = false;
  60. }
  61. //Активировать/деактивировать объект
  62. void ObjectsGroup::Activate(bool isActive)
  63. {
  64. if(processActivate)
  65. {
  66. LogicDebugError("Group already in activate process! Critical error!");
  67. return;
  68. }
  69. if(isActive)
  70. {
  71. LogicDebug("Activate");
  72. }else{
  73. LogicDebug("Deactivate");
  74. }
  75. processActivate = true;
  76. LogicDebugLevel(true);
  77. UpdateObjectsList();
  78. for(long i = 0; i < objects; i++)
  79. {
  80. ObjectInfo & info = objects[i];
  81. if(info.object.Validate())
  82. {
  83. if(info.changeActive) info.object.Ptr()->Activate(isActive);
  84. }
  85. }
  86. LogicDebugLevel(false);
  87. processActivate = false;
  88. }
  89. //Распространить команду
  90. void ObjectsGroup::Command(const char * id, dword numParams, const char ** params)
  91. {
  92. if(processCommand)
  93. {
  94. LogicDebugError("Group already in command process! Critical error!");
  95. return;
  96. }
  97. processCommand = true;
  98. UpdateObjectsList();
  99. for(long i = 0; i < objects; i++)
  100. {
  101. ObjectInfo & info = objects[i];
  102. if(info.object.Validate())
  103. {
  104. if(info.recivingCommand) info.object.Ptr()->Command(id, numParams, params);
  105. }
  106. }
  107. processCommand = false;
  108. }
  109. //Пересоздать объект
  110. void ObjectsGroup::Restart()
  111. {
  112. if(processRestart)
  113. {
  114. LogicDebugError("Group already in restart process! Critical error!");
  115. return;
  116. }
  117. processRestart = true;
  118. UpdateObjectsList();
  119. for(long i = 0; i < objects; i++)
  120. {
  121. ObjectInfo & info = objects[i];
  122. if(info.object.Validate())
  123. {
  124. info.object.Ptr()->Restart();
  125. }
  126. }
  127. processRestart = false;
  128. }
  129. //Инициализировать объект
  130. bool ObjectsGroup::EditMode_Create(MOPReader & reader)
  131. {
  132. Create(reader);
  133. return true;
  134. }
  135. //Обновить параметры
  136. bool ObjectsGroup::EditMode_Update(MOPReader & reader)
  137. {
  138. Create(reader);
  139. return true;
  140. }
  141. //Обновить список объектов
  142. void ObjectsGroup::UpdateObjectsList()
  143. {
  144. for(long i = 0; i < objects; i++)
  145. {
  146. ObjectInfo & info = objects[i];
  147. if(!info.object.Validate())
  148. {
  149. if(info.id.IsEmpty()) continue;
  150. FindObject(info.id, info.object);
  151. }else{
  152. if(!info.object.Validate())
  153. {
  154. info.object.Reset();
  155. }
  156. }
  157. }
  158. }
  159. //============================================================================================
  160. //Параметры инициализации
  161. //============================================================================================
  162. MOP_BEGINLISTCG(ObjectsGroup, "Objects group", '1.00', 0, "Retranslate events to group mission objects", "Logic")
  163. MOP_ARRAYBEG("Objects", 0, 1000)
  164. MOP_STRING("Object id", "")
  165. MOP_BOOL("Change visible", true)
  166. MOP_BOOL("Change active", true)
  167. MOP_BOOL("Reciving command", true)
  168. MOP_ARRAYEND
  169. MOP_ENDLIST(ObjectsGroup)