MissionEditor.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733
  1. #include <io.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include "missioneditor.h"
  5. #include "..\common_h\gui.h"
  6. #include "..\common_h\FreeCamera.h"
  7. #include "Attributes\BaseAttr.h"
  8. #include "attributes\attributes.h"
  9. #include "..\common_h\mission.h"
  10. #include "..\common_h\gui_controls.h"
  11. #include "forms\mainwindow.h"
  12. #include "forms\panel.h"
  13. #include "forms\VSSLogin.h"
  14. #include "attributes\attributes.h"
  15. #include "movecontroller.h"
  16. #include "rotatecontroller.h"
  17. #include "selector.h"
  18. #include "forms/globalParams.h"
  19. #include "..\Common_h\corecmds.h"
  20. #include "..\Common_h\InputSrvCmds.h"
  21. //#include "vtune\vtuneapi.h"
  22. //#include "SourceSafe/VSSHelper.h"
  23. INTERFACE_FUNCTION
  24. #ifndef NO_TOOLS
  25. CREATE_CLASS(MissionEditor)
  26. #endif
  27. globalParams * gp = NULL;
  28. extern IMission* playing_miss; // Миссия в которую играем
  29. extern MOSafePointer pCurrentSelected; // Текущий выбранный объект
  30. long pCurrentSelectedCache = -1; // Кэшь значение для быстрой проверки текущего выбранного объекта
  31. IConsole* pConsole = NULL;
  32. IGUIManager* igui = NULL; // GUI мэнеджер
  33. IMission* miss = NULL; //Миссия для редактора
  34. IRender * pRS = NULL; // Рендер
  35. TPanelWindow* PanelWindow = NULL; // Главное окошко с панелью
  36. TMainWindow* MainWindow = NULL; // Субокно с тривиев
  37. MissionEditor* sMission = NULL; // Сам редактор
  38. int EditorMode = true; // Режим редактирования или игры
  39. IFreeCamera* pFreeCamera = NULL;
  40. TreeNodesPool* globalNodesPool = NULL;
  41. extern float fDeltaFromLastStart;
  42. extern void FreeAllAttributesPools();
  43. MoveController* MoveControl = NULL; // Контроллер для движения объектов
  44. RotateController* RotateControl = NULL; // Контроллер для вращения объектов
  45. ObjectSelector* SelectControl = NULL; // Контроллер для выбора объектов
  46. DWORD dwRealizeLevel = 0x1001;
  47. //extern string VSSUserName;
  48. //bool bVSSAvailable = false;
  49. //SourceSafeItem VSSRoot;
  50. bool bThisMissionIsSourceControlFolder = false;
  51. void _cdecl EditorFindObject(const ConsoleStack& stack)
  52. {
  53. const char* szObjectName = stack.GetParam(0);
  54. if (!szObjectName)
  55. {
  56. pConsole->Trace(COL_CMD_OUTPUT, "Задайте имя объекта для поиска!");
  57. return;
  58. }
  59. DWORD total_objects = sMission->GetCreatedMissionObjectsCount();
  60. for (DWORD i = 0; i < total_objects; i++)
  61. {
  62. MissionEditor::tCreatedMO* cObject = &sMission->GetCreatedMissionObjectStructByIndex(i);
  63. if (crt_stricmp(cObject->pObject.Ptr()->GetObjectID().c_str(), szObjectName) == 0)
  64. {
  65. pConsole->Trace(COL_CMD_OUTPUT, "Объект '%s' находится '%s'", szObjectName, cObject->PathInTree);
  66. return;
  67. }
  68. }
  69. }
  70. bool MissionEditor::Init()
  71. {
  72. gp = NEW globalParams();
  73. globalNodesPool = NEW TreeNodesPool;
  74. // CSSConnection m_vssConnection;
  75. //SourceSafeItem root;
  76. //bool bDatabase = VSSAcess::VSSEnumDatabase(root);
  77. MoveControl = NEW MoveController ();
  78. RotateControl = NEW RotateController ();
  79. SelectControl = NEW ObjectSelector ();
  80. SelectControl->Activate(true);
  81. EntitysMO.DelAll ();
  82. AvailableMO.DelAll ();
  83. CreatedMO.DelAll ();
  84. pConsole = (IConsole*)api->GetService("Console");
  85. pConsole->Register_PureC_Command("EditorFind", "Ищет объект по имени в редакторе\nВозвращает путь в дереве до объекта\nВ параметрах имя объекта", EditorFindObject);
  86. pRS = (IRender*)api->GetService("DX9Render");
  87. pRS->SetGlobalLight(Vector(0.0f, 5000.0f, 0.0f), false, Color(3.8f), 0.8f);
  88. pRS->SetBackgroundColor(Color (0xFFCECEE8L));
  89. // Создаем камеру...
  90. pFreeCamera = (IFreeCamera*)api->CreateObject("FreeCamera");
  91. pFreeCamera->SetPosition(Vector (9.0f, 7.0f, -12.0f));
  92. pFreeCamera->SetTarget(Vector (0.0f, 0.0f, 0.0f));
  93. //Создаем миссию
  94. miss = (IMission *)api->CreateObject("Mission");;
  95. if(!miss) return false;
  96. //lll
  97. //miss->Controls().
  98. //miss->Controls().LockMouseCursorPos(false);
  99. api->ExecuteCoreCommand(CoreCommand_LockDebugKeys(false));
  100. miss->Controls().ExecuteCommand(InputSrvLockMouse(false));
  101. // Создаем менеджер GUI...
  102. igui = (IGUIManager *)api->CreateObject("GUIManager");;
  103. if (!igui) return false;
  104. //Создаем директорию где все миссии лежат...
  105. static char sysStartDirectory[MAX_PATH];
  106. GetCurrentDirectory(MAX_PATH, sysStartDirectory);
  107. //crt_strcpy (sysStartDirectory, 200, "c:\\blood\\engine\\");
  108. gp->MissionsSrcLocalFolder = sysStartDirectory;
  109. gp->MissionsSrcLocalFolder += "\\MissionsSRC";
  110. BOOL bFldrRes = CreateDirectory(gp->MissionsSrcLocalFolder, 0);
  111. gp->StartDirectory = igui->GetCurrentDir();
  112. igui->PrecacheImages("");
  113. igui->PrecacheImages("meditor");
  114. // Создаем окошки
  115. PanelWindow = NEW TPanelWindow;
  116. igui->Show (PanelWindow);
  117. /*
  118. int res = _access("\\\\sourceserver\\Sources\\Blood_src\\srcsafe.ini", 0);
  119. if (res != -1)
  120. {
  121. bool bConnetedWithIniUserName = false;
  122. string INI_VSS_Login = "";
  123. IFileService* pFS = (IFileService*)api->GetService("FileService");
  124. IIniFile* pEngineIni = pFS->OpenIniFile(api->GetVarString("Ini"), _FL_);
  125. if (pEngineIni)
  126. {
  127. const char* szTempIniLogin = pEngineIni->GetString("VSS", "Login", NULL);
  128. INI_VSS_Login = szTempIniLogin;
  129. const char* szMachneName = pEngineIni->GetString("VSS", "MachineName", NULL);
  130. static char CurrentMachineName[8192];
  131. DWORD dwMachineBufferSize = 8000;
  132. HRESULT hr = GetComputerName(CurrentMachineName, &dwMachineBufferSize);
  133. if (!INI_VSS_Login.IsEmpty() && szMachneName)
  134. {
  135. //Если с той же машины входят...
  136. if (crt_stricmp (CurrentMachineName, szMachneName) == 0)
  137. {
  138. VSSUserName = INI_VSS_Login;
  139. bool bDatabase = VSSAcess::VSSEnumDatabase(VSSRoot, VSSUserName.c_str());
  140. if (bDatabase == false)
  141. {
  142. //igui->MessageBox("Can't open VSS database\nCheck you name !", "Error", GUIMB_OK, true);
  143. SetVSSAvailable(false);
  144. } else
  145. {
  146. Assert (VSSRoot.Childs.Size() > 0);
  147. SetVSSAvailable(true);
  148. bConnetedWithIniUserName = true;
  149. }
  150. }
  151. }
  152. pEngineIni->Release();
  153. }
  154. if (!bConnetedWithIniUserName)
  155. {
  156. VSSUserName = "VSS_User_name";
  157. if (!INI_VSS_Login.IsEmpty()) VSSUserName = INI_VSS_Login;
  158. TVSSLogin* cWind = NEW TVSSLogin ();
  159. cWind->OnClose = (CONTROL_EVENT)&MissionEditor::VSSLoginEntered;
  160. igui->ShowModal (cWind);
  161. }
  162. } else
  163. {
  164. api->Trace("Netword path not available !!!!\n VSS disabled !!!");
  165. SetVSSAvailable(false);
  166. }
  167. */
  168. //Включаем GUI контролы и отключаем MISSION
  169. miss->Controls().EnableControlGroup ("CDBuilder", true);
  170. miss->Controls().EnableControlGroup ("GUIADD", true);
  171. miss->Controls().EnableControlGroup ("GUI", true);
  172. miss->Controls().EnableControlGroup ("mission", false);
  173. miss->Controls().EnableControlGroup ("FreeCamera", false);
  174. //miss->Controls().LockMouseCursorPos(false);
  175. miss->Controls().ExecuteCommand(InputSrvLockMouse(false));
  176. CreateEntitysMOList ();
  177. CreateAvailableMOList ();
  178. sMission = this;
  179. api->SetObjectExecution(this, "missioneditor", 0x10001, &MissionEditor::Execute);
  180. //==================
  181. IFileService* pFS = (IFileService*)api->GetService("FileService");
  182. IIniFile* pEngineIni = pFS->SystemIni();
  183. if (pEngineIni)
  184. {
  185. bool bNeedConvert = (pEngineIni->GetLong("XMLConvertor", "Convert", 0) != 0);
  186. if (bNeedConvert)
  187. {
  188. array<string> xml2Convert(_FL_);
  189. pEngineIni->GetStrings("XMLConvertor", "XML", xml2Convert);
  190. for (dword n = 0; n < xml2Convert.Size(); n++)
  191. {
  192. api->Trace("Convert %d of %d - '%s'\n", n, xml2Convert.Size(), xml2Convert[n].c_str());
  193. printf ("Convert %d of %d - '%s'\n", n, xml2Convert.Size(), xml2Convert[n].c_str());
  194. ConvertXML2MIS (xml2Convert[n].c_str());
  195. }
  196. xml2Convert.DelAll();
  197. pEngineIni->Release();
  198. //api->Exit();
  199. exit(0);
  200. } else
  201. {
  202. pEngineIni->Release();
  203. }
  204. }
  205. IRender * render = (IRender *)api->GetService("DX9Render");
  206. Assert(render);
  207. render->EnableLoadingScreen(false);
  208. return true;
  209. }
  210. MissionEditor::MissionEditor() : EntitysMO (_FL_, 2048),
  211. AvailableMO(_FL_, 2048),
  212. CreatedMO(_FL_, 40000),
  213. CreatedMOReal (_FL_, 2048),
  214. importedMissions(_FL_, 128)
  215. {
  216. }
  217. array<string> & MissionEditor::GetImportList()
  218. {
  219. return importedMissions;
  220. }
  221. MissionEditor::~MissionEditor()
  222. {
  223. MainWindow->TreeView1->Items->Clear ();
  224. delete SelectControl;
  225. delete RotateControl;
  226. delete MoveControl;
  227. DWORD n = 0;
  228. for (n =0; n < AvailableMO.Size(); n++)
  229. {
  230. delete (AvailableMO[n].AttrList);
  231. }
  232. AvailableMO.DelAll ();
  233. for (n =0; n < CreatedMO.Size(); n++)
  234. {
  235. if (CreatedMO[n].bDeleted) continue;
  236. if (CreatedMO[n].AttrList) delete CreatedMO[n].AttrList;
  237. }
  238. CreatedMO.DelAll ();
  239. EntitysMO.DelAll ();
  240. //
  241. FreeAllAttributesPools();
  242. delete globalNodesPool;
  243. globalNodesPool = NULL;
  244. delete gp;
  245. gp = NULL;
  246. delete igui;
  247. igui = NULL;
  248. sMission = NULL;
  249. }
  250. // Если в режиме игры тут проверяем нажатие F1 и
  251. // переключаемся в редактор...
  252. void _fastcall MissionEditor::Execute(float dltTime)
  253. {
  254. fDeltaFromLastStart += dltTime;
  255. if (EditorMode == false)
  256. {
  257. //pRS->PrintBuffered((float)(pRS->GetScreenInfo3D().dwWidth - 300), 0, 0xFFFFFFFF, "GAME MODE, Press 'F1' to return EDITOR MODE");
  258. }
  259. if (GetAsyncKeyState (VK_F1) < 0)
  260. {
  261. // CMPause();
  262. // Переключиться в режим редактора...
  263. if (EditorMode == false)
  264. {
  265. pFreeCamera->Pause (false);
  266. fDeltaFromLastStart = 0.0f;
  267. pRS->SetBackgroundColor(Color (0xFFC5C5C5L));
  268. miss->Controls().ClearKeyBuffer();
  269. Sleep (300);
  270. api->Trace("Delete mission !!!");
  271. array<Object*> ObjList(_FL_);
  272. api->FindObject("Mission", ObjList);
  273. for (DWORD i = 0; i < ObjList.Size(); i++)
  274. {
  275. IMission* tMission = (IMission*)ObjList[i];
  276. if (tMission != miss)
  277. {
  278. tMission->DeleteMission();
  279. }
  280. }
  281. playing_miss = NULL;
  282. EditorMode = true;
  283. #ifndef NO_TOOLS
  284. miss->EditorSetSleep(false);
  285. #endif
  286. //miss->Controls().LockMouseCursorPos(false);
  287. miss->Controls().ExecuteCommand(InputSrvLockMouse(false));
  288. igui->Enable(true);
  289. //Удалить временную директорию и файл миссии
  290. string name = "TempRunGame";
  291. string path = "Resource\\Mission\\";
  292. path += name;
  293. string file = path + ".mis";
  294. IFileService* pFS = (IFileService*)api->GetService("FileService");
  295. pFS->Delete(file);
  296. miss->Controls().EnableControlGroup ("CDBuilder", true);
  297. miss->Controls().EnableControlGroup ("GUIADD", true);
  298. miss->Controls().EnableControlGroup ("GUI", true);
  299. miss->Controls().EnableControlGroup ("mission", false);
  300. miss->Controls().EnableControlGroup ("FreeCamera", false);
  301. //miss->Controls().LockDebugKeys(true);
  302. api->ExecuteCoreCommand(CoreCommand_LockDebugKeys(true));
  303. miss->Controls().ClearKeyBuffer();
  304. }
  305. }
  306. }
  307. //создать список Ентитей являющихся объектами миссии...
  308. void MissionEditor::CreateEntitysMOList ()
  309. {
  310. array<string> EngineObjects(_FL_);
  311. api->GetRegistryObjectsList(EngineObjects);
  312. for (dword i = 0; i < EngineObjects.Size(); i++)
  313. {
  314. if (strstr(EngineObjects[i].c_str(), MOP_ID) != NULL)
  315. {
  316. tEntitysMO* pNew = &EntitysMO[EntitysMO.Add ()];
  317. //strncpy (pNew->Name, EngineObjects[i].c_str(), MAX_ENTITY_NAME);
  318. pNew->Name = EngineObjects[i].c_str();
  319. }
  320. }
  321. }
  322. // Создать список доступных объектов миссии
  323. void MissionEditor::CreateAvailableMOList ()
  324. {
  325. for (DWORD n = 0; n < EntitysMO.Size (); n++)
  326. {
  327. string e_id = EntitysMO[n].Name;
  328. IMOParams* Params = (IMOParams* )api->CreateObject(e_id.GetBuffer ());
  329. if (string (Params->GetName()).IsEmpty()) continue;
  330. tAvailableMO* pNewEntry = &AvailableMO[AvailableMO.Add ()];
  331. const char* szComment = Params->GetComment();
  332. if (szComment)
  333. {
  334. pNewEntry->Comment = szComment;
  335. } else
  336. {
  337. pNewEntry->Comment = "No comment available !";
  338. }
  339. pNewEntry->Params = Params;
  340. crt_strncpy (pNewEntry->Name, MAX_ENTITY_NAME-1, pNewEntry->Params->GetName(), MAX_ENTITY_NAME);
  341. crt_strncpy (pNewEntry->ClassName, MAX_ENTITY_NAME-1, pNewEntry->Params->GetEntity(), MAX_ENTITY_NAME);
  342. pNewEntry->AttrList = NEW AttributeList;
  343. //api->Trace("OBJECT : '%s'", e_id.c_str());
  344. pNewEntry->AttrList->CreateFromParams (pNewEntry->Params);
  345. }
  346. }
  347. const char* MissionEditor::GetCommentForName (const char* szTextName)
  348. {
  349. for (DWORD i = 0; i < AvailableMO.Size(); i++)
  350. {
  351. if (crt_stricmp (AvailableMO[i].Name, szTextName) == 0)
  352. {
  353. return AvailableMO[i].Comment.c_str();
  354. }
  355. }
  356. return "Name not found !!!";
  357. }
  358. const char* MissionEditor::GetCommentForClassName (const char* szClassName)
  359. {
  360. for (DWORD i = 0; i < AvailableMO.Size(); i++)
  361. {
  362. if (crt_stricmp (AvailableMO[i].ClassName, szClassName) == 0)
  363. {
  364. return AvailableMO[i].Comment.c_str();
  365. }
  366. }
  367. return "Class not found !!!";
  368. }
  369. MissionEditor::tCreatedMO* MissionEditor::GetObjectByTreePath (const char* szTreePath)
  370. {
  371. for (DWORD i = 0; i < CreatedMO.Size(); i++)
  372. {
  373. if (crt_stricmp(szTreePath, CreatedMO[i].PathInTree) == 0) return &CreatedMO[i];
  374. }
  375. return NULL;
  376. }
  377. MissionEditor::tAvailableMO* MissionEditor::GetAvailableClassByName (const char* szClassName)
  378. {
  379. for (DWORD i = 0; i < AvailableMO.Size(); i++)
  380. {
  381. if (crt_stricmp(szClassName, AvailableMO[i].ClassName) == 0) return &AvailableMO[i];
  382. }
  383. return NULL;
  384. }
  385. void _cdecl MissionEditor::VSSLoginEntered (GUIControl* sender)
  386. {
  387. TVSSLogin* cWind = (TVSSLogin*)sender;
  388. if (!cWind->ExitByOK)
  389. {
  390. SetVSSAvailable(false);
  391. return;
  392. }
  393. /* bool bDatabase = VSSAcess::VSSEnumDatabase(VSSRoot, VSSUserName.c_str());
  394. if (bDatabase == false)
  395. {
  396. igui->MessageBox("Can't open VSS database\nCheck you name !", "Error", GUIMB_OK, true);
  397. SetVSSAvailable(false);
  398. return;
  399. }
  400. Assert (VSSRoot.Childs.Size() > 0);
  401. SetVSSAvailable(true);
  402. IFileService* pFS = (IFileService*)api->GetService("FileService");
  403. IIniFile* pEngineIni = pFS->OpenIniFile(api->GetVarString("Ini"), _FL_);
  404. if (pEngineIni)
  405. {
  406. pEngineIni->SetString("VSS", "Login", VSSUserName.c_str());
  407. static char CurrentMachineNameToSave[8192];
  408. DWORD dwMachineBufferSize = 8000;
  409. HRESULT hr = GetComputerName(CurrentMachineNameToSave, &dwMachineBufferSize);
  410. pEngineIni->SetString("VSS", "MachineName", CurrentMachineNameToSave);
  411. pEngineIni->Release();
  412. }
  413. */
  414. }
  415. void MissionEditor::SetVSSAvailable (bool bEnabled)
  416. {
  417. /*
  418. if (bEnabled)
  419. {
  420. bVSSAvailable = true;
  421. } else
  422. {
  423. bVSSAvailable = false;
  424. }
  425. PanelWindow->btnLoadMissionFromVSS->bEnabled = bVSSAvailable;
  426. */
  427. //PanelWindow->btnLoadMissionFromVSS->bEnabled = false;
  428. /*
  429. PanelWindow->btnAddToVSS->bEnabled = false;
  430. PanelWindow->btnCheckOut->bEnabled = false;
  431. PanelWindow->btnCheckIn->bEnabled = false;
  432. PanelWindow->btnUndoCheckOut->bEnabled = false;
  433. PanelWindow->btnGetLatestVersion->bEnabled = false;
  434. */
  435. }
  436. long MissionEditor::GetCreatedMissionObjectIndex (MOSafePointer obj)
  437. {
  438. if(!obj.Validate()) return -1;
  439. for (dword n = 0; n < CreatedMOReal.Size(); n++)
  440. {
  441. if (CreatedMOReal[n]->pObject.Ptr() == obj.Ptr())
  442. {
  443. return n;
  444. }
  445. }
  446. return -1;
  447. /*
  448. DWORD total_nodes = CreatedMO.Size();
  449. for (DWORD n = 0; n < total_nodes; n++)
  450. {
  451. MissionEditor::tCreatedMO* cObj = &CreatedMO[n];
  452. if (cObj->pObject == obj)
  453. {
  454. return n;
  455. }
  456. }
  457. return -1;
  458. */
  459. }
  460. dword MissionEditor::GetCreatedMissionObjectsCount ()
  461. {
  462. return CreatedMOReal.Size();
  463. //return CreatedMO.Size();
  464. }
  465. MOSafePointer MissionEditor::GetCreatedMissionObjectByIndex (dword dwIndex)
  466. {
  467. return CreatedMOReal[dwIndex]->pObject;
  468. //return CreatedMO[dwIndex].pObject;
  469. }
  470. MissionEditor::tCreatedMO& MissionEditor::GetCreatedMissionObjectStructByIndex (dword dwIndex)
  471. {
  472. return *CreatedMOReal[dwIndex];
  473. //return CreatedMO[dwIndex];
  474. }
  475. MissionEditor::tCreatedMO& MissionEditor::AddCreatedMissionObjectStruct()
  476. {
  477. /*
  478. for (dword n = 0; n < CreatedMO.Size(); n++)
  479. {
  480. if (CreatedMO[n].bDeleted)
  481. {
  482. CreatedMOReal.Add(&CreatedMO[n]);
  483. return CreatedMO[n];
  484. }
  485. }
  486. */
  487. //Если больше произойдет переаллокация в массиве и все поинтеры станут невалидные
  488. Assert (CreatedMO.Size() < 39999);
  489. MissionEditor::tCreatedMO& ref = CreatedMO[CreatedMO.Add()];
  490. CreatedMOReal.Add(&ref);
  491. return ref;
  492. }
  493. void MissionEditor::DeleteCreatedMissionObject(dword dwIndex)
  494. {
  495. tCreatedMO* p = CreatedMOReal[dwIndex];
  496. for (dword n = 0; n < CreatedMO.Size(); n++)
  497. {
  498. if (&CreatedMO[n] == p)
  499. {
  500. CreatedMO[n].bDeleted = true;
  501. CreatedMOReal.DelIndex(dwIndex);
  502. }
  503. }
  504. }
  505. void MissionEditor::DeleteAllCreatedMissionObjects()
  506. {
  507. CreatedMO.DelAll();
  508. CreatedMOReal.DelAll();
  509. }
  510. void MissionEditor::ConvertXML2MIS (const char* xmlName)
  511. {
  512. api->Trace("Convert XML '%s' to MIS file", xmlName);
  513. PanelWindow->StartLoad(xmlName);
  514. PanelWindow->Export(NULL);
  515. api->Trace("Mission converted !!!");
  516. }