DataInstaller.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541
  1. /*
  2. * Copyright (C) 2022 The V-Gears Team
  3. *
  4. * This file is part of V-Gears
  5. *
  6. * V-Gears is free software: you can redistribute it and/or modify it under
  7. * terms of the GNU General Public License as published by the Free Software
  8. * Foundation, version 3.0 (GPLv3) of the License.
  9. *
  10. * V-Gears is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. */
  15. #include <QtCore/QDir>
  16. #include <boost/filesystem.hpp>
  17. #include "DataInstaller.h"
  18. #include "DiskImage.h"
  19. float DataInstaller::LINE_SCALE_FACTOR = 0.0078124970964f;
  20. DataInstaller::DataInstaller(
  21. const DiskImage& disk_image, const std::string output_dir, AdvancedOptions options,
  22. std::function<void(std::string, int, bool)> write_output_line
  23. )
  24. #ifdef _DEBUG
  25. : application_("plugins_d.cfg", "resources_d.cfg", "install_d.log"),
  26. #else
  27. : application_("plugins.cfg", "resources.cfg", "install.log"),
  28. #endif
  29. disk_image_(disk_image), output_dir_(output_dir),
  30. options_(options), write_output_line_(write_output_line)
  31. {
  32. if (!application_.initOgre(true)) throw std::runtime_error("Ogre init failure");
  33. Ogre::Log* default_log(Ogre::LogManager::getSingleton().getDefaultLog());
  34. assert( default_log );
  35. default_log->setLogDetail(Ogre::LL_LOW);
  36. // Assign weights.
  37. for (int i = IDLE; i < STATE_COUNT; i ++) step_weight_[i] = 1;
  38. step_weight_[IDLE] = 0;
  39. step_weight_[BATTLE_MODELS_CONVERT] = 2;
  40. step_weight_[SPELL_MODELS_CONVERT] = 2;
  41. step_weight_[MEDIA_IMAGES] = 3;
  42. step_weight_[MEDIA_SOUNDS] = 8;
  43. step_weight_[MEDIA_MUSICS] = 9;
  44. step_weight_[MEDIA_MUSICS_HQ] = 2;
  45. step_weight_[FIELD_SPAWN_POINTS_AND_SCALE_FACTORS] = 3;
  46. step_weight_[FIELD_CONVERT] = 3;
  47. step_weight_[FIELD_WRITE] = 2;
  48. step_weight_[FIELD_CONVERT_MODELS] = 3;
  49. }
  50. DataInstaller::~DataInstaller(){}
  51. float DataInstaller::Progress(){
  52. switch (installation_state_){
  53. case IDLE:
  54. installation_state_ = CREATE_DIRECTORIES;
  55. return CalcProgress();
  56. case CREATE_DIRECTORIES:
  57. write_output_line_("Creating directories...", 2, true);
  58. CreateDirectories();
  59. installation_state_ = INITIALIZE;
  60. return CalcProgress();
  61. case INITIALIZE:{
  62. write_output_line_("Initializing installers...", 2, true);
  63. const auto input_dir = disk_image_.getContentPath();
  64. if (input_dir.empty()) throw std::runtime_error("Input data directory is empty");
  65. kernel_installer_ = std::make_unique<KernelDataInstaller>(disk_image_);
  66. media_installer_ = std::make_unique<MediaDataInstaller>(
  67. disk_image_, output_dir_, options_.keep_originals, options_.ffmpeg, options_.timidity
  68. );
  69. field_installer_ = std::make_unique<FieldDataInstaller>(
  70. disk_image_, output_dir_, [this](std::string log_message){
  71. write_output_line_(log_message, 2, true);
  72. }
  73. );
  74. battle_installer_ = std::make_unique<BattleDataInstaller>(disk_image_, output_dir_, application_.ResMgr());
  75. world_installer_ = std::make_unique<WorldInstaller>(
  76. disk_image_, output_dir_, options_.keep_originals, application_.ResMgr()
  77. );
  78. installation_state_ = BATTLE_SCENES_INIT;
  79. return CalcProgress();
  80. }
  81. case BATTLE_SCENES_INIT:
  82. // Skip kernel data if option is set.
  83. if (!options_.battle_data){
  84. write_output_line_("Skipping battle data installation...", 2, true);
  85. installation_state_ = BATTLE_MODELS_INIT;
  86. return CalcProgress();
  87. }
  88. write_output_line_("Parsing battle scenes...", 2, true);
  89. substeps_ = battle_installer_->InitializeScenes();
  90. cur_substep_ = 0;
  91. installation_state_ = BATTLE_SCENES_PROCESS;
  92. return CalcProgress();
  93. case BATTLE_SCENES_PROCESS:
  94. cur_substep_ = battle_installer_->ProcessScene();
  95. if (cur_substep_ >= substeps_) installation_state_ = BATTLE_SCENES_WRITE_ATTACKS;
  96. return CalcProgress();
  97. case BATTLE_SCENES_WRITE_ATTACKS:
  98. write_output_line_("Saving attacks...", 2, true);
  99. cur_substep_ = 0;
  100. substeps_ = 0;
  101. battle_installer_->WriteAttacks();
  102. installation_state_ = BATTLE_SCENES_WRITE_ENEMIES;
  103. return CalcProgress();
  104. case BATTLE_SCENES_WRITE_ENEMIES:
  105. write_output_line_("Saving enemies...", 2, true);
  106. cur_substep_ = 0;
  107. substeps_ = 0;
  108. battle_installer_->WriteEnemies();
  109. installation_state_ = BATTLE_SCENES_WRITE_FORMATIONS;
  110. return CalcProgress();
  111. case BATTLE_SCENES_WRITE_FORMATIONS:
  112. write_output_line_("Saving enemy formations...", 2, true);
  113. cur_substep_ = 0;
  114. substeps_ = 0;
  115. battle_installer_->WriteFormations();
  116. // TODO: DEBUG
  117. installation_state_ = BATTLE_MODELS_INIT; // NORMAL
  118. //installation_state_ = SPELL_MODELS_INIT; // SKIP BATTLE MODELS
  119. return CalcProgress();
  120. case BATTLE_MODELS_INIT:
  121. // Skip kernel data if option is set.
  122. if (!options_.battle_models){
  123. write_output_line_("Skipping battle models installation...", 2, true);
  124. installation_state_ = KERNEL_PRICES;
  125. return CalcProgress();
  126. }
  127. write_output_line_("Extracting battle models...", 2, true);
  128. substeps_ = battle_installer_->InitializeBattleModels();
  129. cur_substep_ = 0;
  130. installation_state_ = BATTLE_MODELS_PROCESS;
  131. return CalcProgress();
  132. case BATTLE_MODELS_PROCESS:
  133. cur_substep_ = battle_installer_->ProcessBattleModel();
  134. if (cur_substep_ >= substeps_) installation_state_ = BATTLE_MODELS_CONVERT_INIT;
  135. return CalcProgress();
  136. case BATTLE_MODELS_CONVERT_INIT:
  137. cur_substep_ = 0;
  138. substeps_ = battle_installer_->ConvertBattleModelsInit();
  139. installation_state_ = BATTLE_MODELS_CONVERT;
  140. return CalcProgress();
  141. case BATTLE_MODELS_CONVERT:
  142. cur_substep_ = battle_installer_->ConvertBattleModel();
  143. if (cur_substep_ >= substeps_) installation_state_ = BATTLE_MODELS_WRITE_CHARACTERS;
  144. return CalcProgress();
  145. case BATTLE_MODELS_WRITE_CHARACTERS:
  146. write_output_line_("Writing character data...", 2, true);
  147. battle_installer_->WriteCharacterData();
  148. installation_state_ = BATTLE_MODELS_WRITE_SCENES;
  149. return CalcProgress();
  150. case BATTLE_MODELS_WRITE_SCENES:
  151. write_output_line_("Writing battle scene data...", 2, true);
  152. battle_installer_->WriteSceneData();
  153. installation_state_ = SPELL_MODELS_INIT;
  154. return CalcProgress();
  155. case SPELL_MODELS_INIT:
  156. write_output_line_("Extracting attack models...", 2, true);
  157. substeps_ = battle_installer_->InitializeSpellModels();
  158. cur_substep_ = 0;
  159. installation_state_ = SPELL_MODELS_PROCESS;
  160. return CalcProgress();
  161. case SPELL_MODELS_PROCESS:
  162. cur_substep_ = battle_installer_->ProcessSpellModel();
  163. if (cur_substep_ >= substeps_) installation_state_ = SPELL_MODELS_CONVERT_INIT;
  164. return CalcProgress();
  165. case SPELL_MODELS_CONVERT_INIT:
  166. cur_substep_ = 0;
  167. substeps_ = battle_installer_->ConvertSpellModelsInit();
  168. installation_state_ = SPELL_MODELS_CONVERT;
  169. return CalcProgress();
  170. case SPELL_MODELS_CONVERT:
  171. cur_substep_ = battle_installer_->ConvertSpellModel();
  172. if (cur_substep_ >= substeps_) installation_state_ = KERNEL_PRICES;
  173. return CalcProgress();
  174. case KERNEL_PRICES:
  175. // Skip kernel data if option is set.
  176. if (!options_.kernel){
  177. write_output_line_("Skipping kernel data installation...", 2, true);
  178. installation_state_ = MEDIA_SOUNDS_INIT;
  179. return CalcProgress();
  180. }
  181. write_output_line_("Parsing item and materia prices...", 2, true);
  182. kernel_installer_->ReadPrices();
  183. installation_state_ = KERNEL_COMMANDS;
  184. return CalcProgress();
  185. case KERNEL_COMMANDS:
  186. write_output_line_("Extracting command data...", 2, true);
  187. kernel_installer_->ReadCommands();
  188. kernel_installer_->WriteCommands(output_dir_ + "gamedata/commands.lua");
  189. installation_state_ = KERNEL_ATTACKS;
  190. return CalcProgress();
  191. case KERNEL_ATTACKS:
  192. write_output_line_("Extracting attack data...", 2, true);
  193. kernel_installer_->ReadAttacks();
  194. kernel_installer_->WriteAttacks(output_dir_ + "gamedata/attacks.lua");
  195. installation_state_ = KERNEL_CHARACTERS;
  196. return CalcProgress();
  197. case KERNEL_CHARACTERS:
  198. write_output_line_("Extracting character data...", 2, true);
  199. kernel_installer_->ReadCharacters();
  200. kernel_installer_->WriteCharacters(output_dir_ + "gamedata/characters.lua");
  201. installation_state_ = KERNEL_ITEMS;
  202. return CalcProgress();
  203. case KERNEL_ITEMS:
  204. write_output_line_("Extracting item data...", 2, true);
  205. kernel_installer_->ReadItems();
  206. kernel_installer_->WriteItems(output_dir_ + "gamedata/items.lua");
  207. installation_state_ = KERNEL_GROWTH;
  208. return CalcProgress();
  209. case KERNEL_GROWTH:
  210. write_output_line_("Extracting growth data...", 2, true);
  211. kernel_installer_->ReadGrowth();
  212. kernel_installer_->WriteGrowth(output_dir_ + "gamedata/growth.lua");
  213. installation_state_ = KERNEL_WEAPONS;
  214. return CalcProgress();
  215. case KERNEL_WEAPONS:
  216. write_output_line_("Extracting weapon data...", 2, true);
  217. kernel_installer_->ReadWeapons();
  218. kernel_installer_->WriteWeapons(output_dir_ + "gamedata/weapons.lua");
  219. installation_state_ = KERNEL_ARMORS;
  220. return CalcProgress();
  221. case KERNEL_ARMORS:
  222. write_output_line_("Extracting armor data...", 2, true);
  223. kernel_installer_->ReadArmors();
  224. kernel_installer_->WriteArmors(output_dir_ + "gamedata/armors.lua");
  225. installation_state_ = KERNEL_ACCESSORIES;
  226. return CalcProgress();
  227. case KERNEL_ACCESSORIES:
  228. write_output_line_("Extracting accessory data...", 2, true);
  229. kernel_installer_->ReadAccessories();
  230. kernel_installer_->WriteAccessories(output_dir_ + "gamedata/accessories.lua");
  231. installation_state_ = KERNEL_MATERIA;
  232. return CalcProgress();
  233. case KERNEL_MATERIA:
  234. write_output_line_("Extracting materia data...", 2, true);
  235. kernel_installer_->ReadMateria();
  236. kernel_installer_->WriteMateria(output_dir_ + "gamedata/materia.lua");
  237. installation_state_ = KERNEL_KEY_ITEMS;
  238. return CalcProgress();
  239. case KERNEL_KEY_ITEMS:
  240. write_output_line_("Extracting key item data...", 2, true);
  241. kernel_installer_->ReadKeyItems();
  242. kernel_installer_->WriteKeyItems(output_dir_ + "gamedata/key_items.lua");
  243. installation_state_ = KERNEL_SUMMON_NAMES;
  244. return CalcProgress();
  245. case KERNEL_SUMMON_NAMES:
  246. write_output_line_("Extracting summon attack names data...", 2, true);
  247. kernel_installer_->ReadSummonNames();
  248. kernel_installer_->WriteSummonNames(output_dir_ + "gamedata/summons.lua");
  249. installation_state_ = KERNEL_SAVEMAP;
  250. return CalcProgress();
  251. case KERNEL_SAVEMAP:
  252. write_output_line_("Extracting the initial savemap...", 2, true);
  253. kernel_installer_->ReadInitialSaveMap();
  254. kernel_installer_->WriteInitialSaveMap(output_dir_ + "gamedata/initial_savemap.lua");
  255. installation_state_ = MEDIA_IMAGES;
  256. return CalcProgress();
  257. case MEDIA_IMAGES:
  258. // Skip images if option is set.
  259. if (!options_.images){
  260. write_output_line_("Skipping images installation...", 2, true);
  261. installation_state_ = MEDIA_SOUNDS_INIT;
  262. return CalcProgress();
  263. }
  264. write_output_line_("Extracting game images...", 2, true);
  265. media_installer_->InstallSprites();
  266. installation_state_ = MEDIA_SOUNDS_INIT;
  267. return CalcProgress();
  268. case MEDIA_SOUNDS_INIT:
  269. // Skip sounds if option is set.
  270. if (!options_.sounds){
  271. write_output_line_("Skipping sound effects installation...", 2, true);
  272. installation_state_ = MEDIA_MUSICS_INIT;
  273. return CalcProgress();
  274. }
  275. write_output_line_("Extracting sounds...", 2, true);
  276. substeps_ = media_installer_->InstallSoundsInit();
  277. installation_state_ = MEDIA_SOUNDS;
  278. cur_substep_ = 0;
  279. return CalcProgress();
  280. case MEDIA_SOUNDS:
  281. if (media_installer_->InstallSounds() == true) installation_state_ = MEDIA_SOUNDS_INDEX;
  282. else cur_substep_ ++;
  283. return CalcProgress();
  284. case MEDIA_SOUNDS_INDEX:
  285. write_output_line_("Building sound index...", 2, true);
  286. media_installer_->WriteSoundIndex();
  287. installation_state_ = MEDIA_MUSICS_INIT;
  288. return CalcProgress();
  289. case MEDIA_MUSICS_INIT:
  290. // Skip music if option is set.
  291. if (!options_.music){
  292. write_output_line_("Skipping music tracks installation...", 2, true);
  293. installation_state_ = FIELD_SPAWN_POINTS_AND_SCALE_FACTORS_INIT;
  294. return CalcProgress();
  295. }
  296. write_output_line_("Extracting music...", 2, true);
  297. substeps_ = media_installer_->InstallMusicsInit();
  298. installation_state_ = MEDIA_MUSICS;
  299. cur_substep_ = 0;
  300. return CalcProgress();
  301. case MEDIA_MUSICS:
  302. if (media_installer_->InstallMusics() == true) installation_state_ = MEDIA_MUSICS_HQ;
  303. else cur_substep_ ++;
  304. return CalcProgress();
  305. case MEDIA_MUSICS_HQ:
  306. substeps_ = 0;
  307. cur_substep_ = 0;
  308. media_installer_->InstallHQMusics();
  309. installation_state_ = MEDIA_MUSICS_INDEX;
  310. return CalcProgress();
  311. case MEDIA_MUSICS_INDEX:
  312. write_output_line_("Building music track index...", 2, true);
  313. media_installer_->WriteMusicsIndex();
  314. installation_state_ = FIELD_SPAWN_POINTS_AND_SCALE_FACTORS_INIT;
  315. return CalcProgress();
  316. case MEDIA_VIDEOS:
  317. // Skip videos if option is set.
  318. if (!options_.videos){
  319. write_output_line_("Skipping video installation...", 2, true);
  320. installation_state_ = FIELD_SPAWN_POINTS_AND_SCALE_FACTORS_INIT;
  321. return CalcProgress();
  322. }
  323. write_output_line_("Extracting videos...", 2, true);
  324. media_installer_->InstallVideos();
  325. installation_state_ = FIELD_SPAWN_POINTS_AND_SCALE_FACTORS_INIT;
  326. return CalcProgress();
  327. case FIELD_SPAWN_POINTS_AND_SCALE_FACTORS_INIT:
  328. // Skip fields if option is set.
  329. if (!options_.fields){
  330. write_output_line_("Skipping field maps installation...", 2, true);
  331. installation_state_ = WM_INIT;
  332. return CalcProgress();
  333. }
  334. write_output_line_("Collecting spawn points and scale factors...", 2, true);
  335. substeps_ = field_installer_->CollectSpawnAndScaleFactorsInit(application_.ResMgr());
  336. cur_substep_ = 0;
  337. installation_state_ = FIELD_SPAWN_POINTS_AND_SCALE_FACTORS;
  338. return CalcProgress();
  339. case FIELD_SPAWN_POINTS_AND_SCALE_FACTORS:
  340. field_installer_->CollectSpawnAndScaleFactors(cur_substep_);
  341. cur_substep_ ++;
  342. if (cur_substep_ == substeps_){
  343. installation_state_ = FIELD_CONVERT;
  344. cur_substep_ = 0;
  345. }
  346. return CalcProgress();
  347. case FIELD_CONVERT:
  348. field_installer_->Convert(cur_substep_);
  349. cur_substep_ ++;
  350. if (cur_substep_ == substeps_){
  351. installation_state_ = FIELD_WRITE_INIT;
  352. cur_substep_ = 0;
  353. }
  354. return CalcProgress();
  355. case FIELD_WRITE_INIT:
  356. write_output_line_("Writing fields...", 2, true);
  357. substeps_ = field_installer_->WriteInit();
  358. cur_substep_ = 0;
  359. installation_state_ = FIELD_WRITE;
  360. return CalcProgress();
  361. case FIELD_WRITE:
  362. field_installer_->Write(cur_substep_);
  363. cur_substep_ ++;
  364. if (cur_substep_ == substeps_){
  365. installation_state_ = FIELD_WRITE_END;
  366. cur_substep_ = 0;
  367. }
  368. return CalcProgress();
  369. case FIELD_WRITE_END:
  370. field_installer_->WriteEnd();
  371. installation_state_ = FIELD_CONVERT_MODELS_INIT;
  372. return CalcProgress();
  373. case FIELD_CONVERT_MODELS_INIT:
  374. // Skip fields if option is set.
  375. if (!options_.field_models){
  376. write_output_line_("Skipping field maps installation...", 2, true);
  377. installation_state_ = WM_INIT;
  378. return CalcProgress();
  379. }
  380. write_output_line_("Converting field models...", 2, true);
  381. field_model_names_ = field_installer_->ConvertModelsInit();
  382. substeps_ = field_model_names_.size();
  383. cur_substep_ = 0;
  384. installation_state_ = FIELD_CONVERT_MODELS;
  385. return CalcProgress();
  386. case FIELD_CONVERT_MODELS:
  387. field_installer_->ConvertModels(field_model_names_[cur_substep_]);
  388. cur_substep_ ++;
  389. if (cur_substep_ == substeps_){
  390. installation_state_ = WM_INIT;
  391. cur_substep_ = 0;
  392. }
  393. return CalcProgress();
  394. case WM_INIT:
  395. // Skip world map if option set
  396. if (!options_.wm){
  397. write_output_line_("Skipping world map data installation...", 2, true);
  398. installation_state_ = CLEAN;
  399. return CalcProgress();
  400. }
  401. write_output_line_("Extracting world map data...", 2, true);
  402. substeps_ = world_installer_->Initialize();
  403. cur_substep_ = 0;
  404. installation_state_ = WM_MATERIALS;
  405. return CalcProgress();
  406. case WM_MATERIALS:
  407. world_installer_->GenerateMaterials();
  408. installation_state_ = WM_MAPS;
  409. return CalcProgress();
  410. case WM_MAPS:
  411. if (world_installer_->ProcessMap() == false) cur_substep_ ++;
  412. else{
  413. std::string script_error;
  414. if (world_installer_->GenerateScripts(
  415. field_installer_->GetMapList(), field_installer_->GetFieldScaleFactors(),
  416. field_installer_->GetConvertedMapList(), script_error
  417. )){
  418. write_output_line_("Generated world-map scripts.", 2, true);
  419. }
  420. else{
  421. write_output_line_("Could not generate world-map scripts: " + script_error, 2, true);
  422. }
  423. installation_state_ = WM_MODELS;
  424. cur_substep_ = 0;
  425. }
  426. return CalcProgress();
  427. case WM_MODELS:
  428. if (!options_.wm_models) write_output_line_("Skipping world map model installation...", 2, true);
  429. else world_installer_->ProcessModels();
  430. installation_state_ = CLEAN;
  431. return CalcProgress();
  432. case CLEAN:
  433. write_output_line_("Cleaning up...", 2, true);
  434. if (!options_.keep_originals) CleanInstall();
  435. installation_state_ = DONE;
  436. return CalcProgress();
  437. case DONE:
  438. write_output_line_("Installation complete", 2, true);
  439. return 100;
  440. default:
  441. return 100;
  442. }
  443. }
  444. const float DataInstaller::CalcProgress(){
  445. float weight_total = 0; // Sum of every step weight.
  446. float weight_done = 0; // Sum of every previous step weight.
  447. float weight = static_cast<float>(step_weight_[installation_state_]); // Weight of current step.
  448. float weight_substeps = 0; // Weight of the already done substeps in current step.
  449. for (int i = IDLE; i < STATE_COUNT; i ++){
  450. weight_total += step_weight_[i];
  451. if (installation_state_ > i) weight_done += step_weight_[i];
  452. }
  453. if (substeps_ > 0 && cur_substep_ < substeps_) weight_substeps = (cur_substep_ * weight) / substeps_;
  454. float progress = 100 * (weight_done + weight_substeps) / weight_total;
  455. if (progress >= 100.0f) progress = 99.9f;
  456. return progress;
  457. }
  458. void DataInstaller::CreateDirectories(){
  459. CreateDir("audio/musics");
  460. CreateDir("audio/sounds");
  461. CreateDir("fields");
  462. CreateDir("fonts");
  463. CreateDir("temp");
  464. CreateDir("temp/char");
  465. CreateDir("temp/battle_models");
  466. CreateDir("temp/world_models");
  467. CreateDir("temp/spell_models");
  468. CreateDir("temp/wm");
  469. CreateDir("gamedata");
  470. CreateDir("gamedata/enemy");
  471. CreateDir("gamedata/attack");
  472. CreateDir("gamedata/formation");
  473. CreateDir("images/icons");
  474. CreateDir("images/other");
  475. CreateDir("images/characters");
  476. CreateDir("images/fonts");
  477. CreateDir("images/reels");
  478. CreateDir("images/window");
  479. CreateDir("screens");
  480. CreateDir("scripts");
  481. CreateDir("scripts/battle_models");
  482. CreateDir("system");
  483. CreateDir("texts");
  484. CreateDir("models/fields/");
  485. CreateDir("models/battle/characters");
  486. CreateDir("models/battle/scenes");
  487. CreateDir("models/battle/enemies");
  488. CreateDir("models/battle/attacks");
  489. CreateDir("models/world/terrain/0");
  490. CreateDir("models/world/terrain/1");
  491. CreateDir("models/world/terrain/2");
  492. CreateDir("models/world/elements/");
  493. CreateDir("world/0");
  494. CreateDir("world/1");
  495. CreateDir("world/2");
  496. application_.ResMgr()->addResourceLocation(output_dir_ + "temp/char/", "FileSystem", "FFVII", true, true);
  497. application_.ResMgr()->addResourceLocation(output_dir_ + "temp/battle_models/", "FileSystem", "FFVII", true, true);
  498. application_.ResMgr()->addResourceLocation(output_dir_ + "temp/world_models/", "FileSystem", "FFVII", true, true);
  499. application_.ResMgr()->addResourceLocation(output_dir_ + "models/", "FileSystem", "FFVII", true, true);
  500. application_.ResMgr()->addResourceLocation(
  501. output_dir_ + "models/fields/", "FileSystem", "FFVIITextures", true, true
  502. );
  503. application_.ResMgr()->addResourceLocation(
  504. output_dir_ + "models/battle/characters/", "FileSystem", "FFVIITextures", true, true
  505. );
  506. application_.ResMgr()->addResourceLocation(
  507. output_dir_ + "models/battle/scenes/", "FileSystem", "FFVIITextures", true, true
  508. );
  509. application_.ResMgr()->addResourceLocation(
  510. output_dir_ + "models/battle/enemies/", "FileSystem", "FFVIITextures", true, true
  511. );
  512. application_.ResMgr()->addResourceLocation(
  513. output_dir_ + "models/battle/attacks/", "FileSystem", "FFVIITextures", true, true
  514. );
  515. application_.ResMgr()->addResourceLocation(
  516. output_dir_ + "models/world/", "FileSystem", "FFVIITextures", true, true
  517. );
  518. const auto fields_lgp_path = disk_image_.filePath("data/field/flevel.lgp");
  519. if (!fields_lgp_path) throw std::runtime_error("Missing required file: data/field/flevel.lgp");
  520. fields_lgp_ = std::make_unique<ScopedLgp>(application_.getRoot(), *fields_lgp_path, "LGP", "FFVIIFields");
  521. }
  522. void DataInstaller::CleanInstall(){boost::filesystem::remove_all(output_dir_ + "data/temp/");}
  523. void DataInstaller::CreateDir(const std::string& path){
  524. QString target = QString::fromStdString(output_dir_ + path);
  525. QDir dir(target);
  526. if (!dir.mkpath(".")) throw std::runtime_error("Failed to mkpath");
  527. }