TrackManagerLogic.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #include "TrackManagerLogic.h"
  2. #include "Ships\ship.h"
  3. //============================================================================================
  4. TrackManagerLogic::TrackManagerLogic() :
  5. m_TrackList(_FL_),
  6. m_ShipsList(_FL_)
  7. {
  8. }
  9. TrackManagerLogic::~TrackManagerLogic()
  10. {
  11. m_TrackList.DelAll();
  12. m_ShipsList.DelAll();
  13. }
  14. //============================================================================================
  15. //Инициализировать объект
  16. bool TrackManagerLogic::Create(MOPReader & reader)
  17. {
  18. ReadMOPs(reader);
  19. return true;
  20. }
  21. //Активировать
  22. void TrackManagerLogic::Activate(bool isActive)
  23. {
  24. MissionObject::Activate(isActive);
  25. if(!EditMode_IsOn())
  26. {
  27. if( IsActive() )
  28. {
  29. LogicDebug("Activate");
  30. SetUpdate(&TrackManagerLogic::Work, ML_TRIGGERS);
  31. }else{
  32. LogicDebug("Deactivate");
  33. DelUpdate(&TrackManagerLogic::Work);
  34. }
  35. }else{
  36. DelUpdate(&TrackManagerLogic::Work);
  37. }
  38. }
  39. //============================================================================================
  40. //Работа детектора
  41. void _cdecl TrackManagerLogic::Work(float dltTime, long level)
  42. {
  43. // проверяем наличие свободных кораблей
  44. if( m_ShipsList.Size()==0 )
  45. {
  46. // нет свободных кораблей нечего делать, закончим работу
  47. Activate(false);
  48. return;
  49. }
  50. // проверяем треки на наличие свободных
  51. for( dword n=0; n<m_TrackList.Size(); n++ )
  52. {
  53. bool bIsLaunchNextShip = false;
  54. if( m_TrackList[n].spShip.Validate() )
  55. {
  56. if( m_TrackList[n].spShip.Ptr()->IsDead() )
  57. bIsLaunchNextShip = true;
  58. }
  59. else
  60. bIsLaunchNextShip = true;
  61. // пробуем запустить корабль на трек
  62. while( bIsLaunchNextShip && m_ShipsList.Size()>0 && m_TrackList[n].AIParams.Size()>0 )
  63. {
  64. // берем очередной корабль и удаляем его из списка очередников
  65. const ConstString pcShipID = m_ShipsList[0];
  66. m_ShipsList.DelIndex(0);
  67. // ищем объект представляющий этот корабль
  68. if( FindObject(pcShipID, m_TrackList[n].spShip) )
  69. {
  70. // выбираем рандомный трек из текущей группы треков
  71. const char* pcNewAI = NULL;
  72. dword idxTrack = rand() % m_TrackList[n].AIParams.Size();
  73. // ставим новый АИ (трек) для выбранного корабля
  74. const char* aParams[1];
  75. aParams[0] = m_TrackList[n].AIParams[idxTrack];
  76. m_TrackList[n].spShip.Ptr()->Command("changeAI",1,aParams);
  77. break;
  78. }
  79. }
  80. }
  81. }
  82. void TrackManagerLogic::ReadMOPs(MOPReader & reader)
  83. {
  84. // тут нечего показывать - это логический объект
  85. Show(false);
  86. // список кораблей
  87. dword shipsQ = reader.Array();
  88. m_ShipsList.DelAll();
  89. if( shipsQ > 0 )
  90. {
  91. m_ShipsList.AddElements(shipsQ);
  92. for( dword n=0; n<shipsQ; n++ )
  93. m_ShipsList[n] = reader.String();
  94. }
  95. // список треков
  96. dword trackGroupQ = reader.Array();
  97. m_TrackList.DelAll();
  98. if( trackGroupQ > 0 )
  99. {
  100. m_TrackList.AddElements(trackGroupQ);
  101. for( dword n=0; n<trackGroupQ; n++ )
  102. {
  103. m_TrackList[n].spShip.Reset();
  104. dword trackQ = reader.Array();
  105. if( trackQ > 0 )
  106. {
  107. m_TrackList[n].AIParams.AddElements(trackQ);
  108. for( dword i=0; i<trackQ; i++ )
  109. m_TrackList[n].AIParams[i] = reader.String().c_str();
  110. }
  111. }
  112. }
  113. // активация
  114. Activate(reader.Bool());
  115. }
  116. //============================================================================================
  117. //Параметры инициализации
  118. //============================================================================================
  119. MOP_BEGINLISTCG(TrackManagerLogic, "Ship track manager", '1.00', 0x0fffffff, "Track manager looking for ship objects order and track order.\nSend ship from common order into free track and triggered when no more ship", "Logic")
  120. MOP_ARRAYBEG("Ships list", 0, 100)
  121. MOP_STRING("Ship object id", "")
  122. MOP_ARRAYEND
  123. MOP_ARRAYBEG("Track groups", 1, 100)
  124. MOP_ARRAYBEG("Track AI parameters list", 1, 100)
  125. MOP_STRING("AI parameters", "")
  126. MOP_ARRAYEND
  127. MOP_ARRAYEND
  128. MOP_BOOL("Active", true)
  129. MOP_ENDLIST(TrackManagerLogic)