save.cpp 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. #include "save.h"
  2. #include "forms\mainwindow.h"
  3. #include "forms\panel.h"
  4. #include "attributes\AttributeList.h"
  5. #include "..\common_h\tinyxml\tinyxml.h"
  6. #include "textfile.h"
  7. extern TMainWindow* MainWindow;
  8. extern TPanelWindow* PanelWindow;
  9. MissionSave::MissionSave (MissionEditor* _editor)
  10. {
  11. editor = _editor;
  12. }
  13. MissionSave::~MissionSave ()
  14. {
  15. }
  16. void MissionSave::SaveMSR (const char* input_filename)
  17. {
  18. char filename[MAX_PATH];
  19. if (strstr(input_filename, ".msr") == NULL)
  20. {
  21. crt_snprintf (filename, MAX_PATH, "%s.msr", input_filename);
  22. } else
  23. {
  24. crt_snprintf (filename, MAX_PATH, "%s", input_filename);
  25. }
  26. string backFile = filename;
  27. backFile.AddExtention(".bak");
  28. DeleteFile(backFile);
  29. MoveFile(filename, backFile);
  30. IFileService* pFS = (IFileService*)api->GetService("FileService");
  31. IFile* pFile = pFS->OpenFile(filename, file_create_always, _FL_);
  32. // Невозможно создать файл...
  33. if (pFile == NULL) return;
  34. DWORD written = 0;
  35. written = pFile->Write("MSRC", 4);
  36. Assert (written == 4);
  37. written = pFile->Write ("v2.5", 4);
  38. Assert (written == 4);
  39. //------------- mission name------------------
  40. string MissionName = PanelWindow->MissionName->Text;
  41. DWORD string_len = MissionName.Size();
  42. DWORD slen2save = string_len+1;
  43. written = pFile->Write(&slen2save, sizeof (DWORD));
  44. Assert (written == sizeof (DWORD));
  45. written = pFile->Write(MissionName.GetBuffer(), string_len);
  46. Assert (written == string_len);
  47. BYTE Zero = 0;
  48. written = pFile->Write(&Zero, sizeof (BYTE));
  49. Assert (written == sizeof (BYTE));
  50. //------------- mission name------------------
  51. //------------------- save cam position
  52. IRender* rs = (IRender*)api->GetService("DX9Render");
  53. Matrix matCamera = rs->GetView ();
  54. Matrix matInvCamera = matCamera.Inverse ();
  55. Vector camSource = matInvCamera.pos;
  56. Vector camTarget = camSource + matInvCamera.vz;
  57. written = pFile->Write(&camSource.x, sizeof (float));
  58. Assert (written == sizeof (float));
  59. written = pFile->Write(&camSource.y, sizeof (float));
  60. Assert (written == sizeof (float));
  61. written = pFile->Write(&camSource.z, sizeof (float));
  62. Assert (written == sizeof (float));
  63. written = pFile->Write(&camTarget.x, sizeof (float));
  64. Assert (written == sizeof (float));
  65. written = pFile->Write(&camTarget.y, sizeof (float));
  66. Assert (written == sizeof (float));
  67. written = pFile->Write(&camTarget.z, sizeof (float));
  68. Assert (written == sizeof (float));
  69. //------------------- save cam position
  70. WriteTree (pFile, MainWindow->TreeView1);
  71. DWORD total_objects = editor->GetCreatedMissionObjectsCount();
  72. written = pFile->Write(&total_objects, sizeof (DWORD));
  73. Assert (written == sizeof (DWORD));
  74. for (DWORD n = 0; n < total_objects; n++)
  75. {
  76. MissionEditor::tCreatedMO* cObject = &editor->GetCreatedMissionObjectStructByIndex(n);
  77. DWORD slen = strlen (cObject->ClassName);
  78. written = pFile->Write(&slen, sizeof (DWORD));
  79. Assert (written == sizeof (DWORD));
  80. written = pFile->Write(cObject->ClassName, slen);
  81. Assert (written == slen);
  82. //-add
  83. slen = strlen (cObject->PathInTree);
  84. // api->Trace ("Name : '%s', PathLen - %d, Path - '%s'", cObject->pObject->GetObjectID (), slen, cObject->PathInTree);
  85. written = pFile->Write(&slen, sizeof (DWORD));
  86. Assert (written == sizeof (DWORD));
  87. written = pFile->Write(cObject->PathInTree, slen);
  88. Assert (written == slen);
  89. //-add
  90. written = pFile->Write(&cObject->Level, sizeof (long));
  91. Assert (written == sizeof (long));
  92. written = pFile->Write(&cObject->Version, sizeof (dword));
  93. Assert (written == sizeof (dword));
  94. slen = strlen (cObject->pObject.Ptr()->GetObjectID ().c_str());
  95. written = pFile->Write(&slen, sizeof (DWORD));
  96. Assert (written == sizeof (DWORD));
  97. written = pFile->Write(cObject->pObject.Ptr()->GetObjectID ().c_str(), slen);
  98. Assert (written == slen);
  99. DWORD attrCount = cObject->AttrList->GetCountForSave();
  100. written = pFile->Write(&attrCount, sizeof (DWORD));
  101. Assert (written == sizeof (DWORD));
  102. for (DWORD i = 0; i < (DWORD)cObject->AttrList->GetCount(); i++)
  103. {
  104. IMOParams::Type t = cObject->AttrList->Get(i)->GetType ();
  105. DWORD dwType = (DWORD)t;
  106. written = pFile->Write(&dwType, sizeof (DWORD));
  107. Assert (written == sizeof (DWORD));
  108. cObject->AttrList->Get(i)->WriteToFile (pFile);
  109. }
  110. }
  111. pFile->Release();
  112. }
  113. void MissionSave::WriteTree (IFile* pFile, GUITreeView* TreeView)
  114. {
  115. DWORD written = 0;
  116. int RootNodes = TreeView->Items->GetCount ();
  117. written = pFile->Write(&RootNodes, sizeof (int));
  118. Assert (written == sizeof (int));
  119. for (int n = 0; n < RootNodes; n++)
  120. {
  121. GUITreeNode* node = TreeView->Items->Get (n);
  122. WriteNode (pFile, node);
  123. }
  124. }
  125. void MissionSave::WriteNode (IFile* pFile, GUITreeNode* node)
  126. {
  127. // api->Trace ("Write node %s, (%d), '%s'", node->Text.GetBuffer (), node->Tag, node->Image->GetName ());
  128. DWORD written = 0;
  129. DWORD tlen = crt_strlen(node->GetText());
  130. written = pFile->Write(&tlen, sizeof (DWORD));
  131. Assert (written == sizeof (DWORD));
  132. written = pFile->Write(node->GetText(), tlen);
  133. Assert (written == tlen);
  134. tlen = strlen (node->Image->GetName ());
  135. written = pFile->Write(&tlen, sizeof (DWORD));
  136. Assert (written == sizeof (DWORD));
  137. written = pFile->Write(node->Image->GetName (), tlen);
  138. Assert (written == tlen);
  139. written = pFile->Write(&node->Tag, sizeof (int));
  140. Assert (written == sizeof (int));
  141. int ch_count = node->Childs.GetCount ();
  142. int real_ch_count = 0;
  143. for (int n =0; n < ch_count; n++)
  144. {
  145. if (node->Childs.Get (n)->Tag != TAG_ATTRIBUTE) real_ch_count++;
  146. }
  147. written = pFile->Write(&real_ch_count, sizeof (int));
  148. Assert (written == sizeof (int));
  149. for (int i = 0; i < ch_count; i++)
  150. {
  151. if (node->Childs.Get (i)->Tag != TAG_ATTRIBUTE)
  152. {
  153. WriteNode (pFile, node->Childs.Get (i));
  154. }
  155. }
  156. }
  157. void MissionSave::SaveXML (const char* filename)
  158. {
  159. string SavedFile = filename;
  160. SavedFile.AddExtention(".xmlz");
  161. string backFile = filename;
  162. backFile.AddExtention(".bak");
  163. DeleteFile(backFile);
  164. MoveFile(filename, backFile);
  165. TextFile file(SavedFile.c_str());
  166. file.Write(0, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
  167. string MissionName = "";
  168. MissionName = PanelWindow->MissionName->Text;
  169. file.Write(1, "<mission val=\"%s\">\n", MissionName.c_str());
  170. IRender* rs = (IRender*)api->GetService("DX9Render");
  171. Matrix matCamera = rs->GetView ();
  172. Matrix matInvCamera = matCamera.Inverse ();
  173. Vector camSource = matInvCamera.pos;
  174. Vector camTarget = camSource + matInvCamera.vz;
  175. array<string> & list = sMission->GetImportList();
  176. file.Write(2, "<include>\n");
  177. for (dword i = 0; i < list.Size(); i++)
  178. {
  179. file.Write(3, "<inc val = \"%s\" />\n", list[i].c_str());
  180. }
  181. file.Write(2, "</include>\n");
  182. /*
  183. TiXmlElement* incNode = MisNode->FirstChildElement("include");
  184. if (incNode)
  185. {
  186. for(TiXmlElement* child = incNode->FirstChildElement(); child; child = child->NextSiblingElement())
  187. {
  188. const char* missName = child->Attribute("val");
  189. array<string> & list = sMission->GetImportList();
  190. list.Add(missName);
  191. }
  192. }
  193. */
  194. file.Write(2, "<camera>\n");
  195. file.Write(3, "<src_x val = \"%3.2f\" />\n", camSource.x);
  196. file.Write(3, "<src_y val = \"%3.2f\" />\n", camSource.y);
  197. file.Write(3, "<src_z val = \"%3.2f\" />\n", camSource.z);
  198. file.Write(3, "<tgt_x val = \"%3.2f\" />\n", camTarget.x);
  199. file.Write(3, "<tgt_y val = \"%3.2f\" />\n", camTarget.y);
  200. file.Write(3, "<tgt_z val = \"%3.2f\" />\n", camTarget.z);
  201. file.Write(2, "</camera>\n");
  202. file.Write(2, "<objects>\n");
  203. WriteTreeToXML (file, MainWindow->TreeView1);
  204. file.Write(2, "</objects>\n");
  205. file.Write(1, "</mission>\n");
  206. //doc.RootElement();
  207. //doc.SaveFile();
  208. }
  209. void MissionSave::WriteTreeToXML (TextFile &file, GUITreeView* TreeView)
  210. {
  211. int RootNodes = TreeView->Items->GetCount ();
  212. for (int n = 0; n < RootNodes; n++)
  213. {
  214. GUITreeNode* node = TreeView->Items->Get (n);
  215. if (node->bReadOnly)
  216. {
  217. continue;
  218. }
  219. WriteTreeNodeToXML (file, node, 2);
  220. }
  221. }
  222. void MissionSave::WriteTreeNodeToXML (TextFile &file, GUITreeNode* node, int level)
  223. {
  224. string NodeType = "folder";
  225. if (node->Tag == TAG_FOLDER) NodeType = "folder";
  226. if (node->Tag == TAG_OBJECT) NodeType = "object";
  227. if (node->Tag == TAG_ATTRIBUTE) NodeType = "attribute";
  228. if (node->Tag == TAG_EVENT) NodeType = "event";
  229. if (node->Tag == TAG_ARRAYITEM) NodeType = "array_item";
  230. file.Write(level, "<%s val = \"%s\">\n", NodeType.c_str(), node->GetText());
  231. if (node->Tag == TAG_OBJECT && !node->bReadOnly)
  232. {
  233. MissionEditor::tCreatedMO* pMo = (MissionEditor::tCreatedMO*)node->Data;
  234. WriteObject (file, pMo, level+1);
  235. }
  236. //
  237. //node->Image->GetName ()
  238. int ch_count = node->Childs.GetCount();
  239. for (int i = 0; i < ch_count; i++)
  240. {
  241. if (node->Childs.Get (i)->Tag == TAG_ATTRIBUTE) continue;
  242. if (node->Childs.Get (i)->bReadOnly) continue;
  243. WriteTreeNodeToXML (file, node->Childs.Get (i), level+1);
  244. }
  245. file.Write(level, "</%s>\n", NodeType.c_str());
  246. }
  247. void MissionSave::WriteObject(TextFile &file, MissionEditor::tCreatedMO* pObject, int level)
  248. {
  249. file.Write(level, "<class_name val = \"%s\" />\n", pObject->ClassName);
  250. file.Write(level, "<version val = \"0x%08X\" />\n", pObject->Version);
  251. pObject->AttrList->WriteToXML (file, level);
  252. }