From b30b2d3a5813dc737ab39ea763ef4d1883ff52a8 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Wed, 24 Jun 2015 11:21:34 -0400 Subject: [PATCH] Improve loading time for custom scenarios list --- src/boe.fileio.cpp | 2 +- src/tools/fileio.hpp | 2 +- src/tools/fileio_scen.cpp | 19 +++++++++++-------- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/boe.fileio.cpp b/src/boe.fileio.cpp index 74c87882..dd27a5d3 100644 --- a/src/boe.fileio.cpp +++ b/src/boe.fileio.cpp @@ -530,7 +530,7 @@ bool load_scenario_header(fs::path file/*,short header_entry*/){ // So file is (probably) OK, so load in string data and close it. cScenario temp_scenario; - if(!load_scenario(file, temp_scenario)) + if(!load_scenario(file, temp_scenario, true)) return false; scen_header_type scen_head; diff --git a/src/tools/fileio.hpp b/src/tools/fileio.hpp index 1bfeecdb..beaac579 100644 --- a/src/tools/fileio.hpp +++ b/src/tools/fileio.hpp @@ -17,7 +17,7 @@ class cUniverse; namespace fs = boost::filesystem; // TODO: Centralize this alias! -bool load_scenario(fs::path file_to_load, cScenario& scenario); +bool load_scenario(fs::path file_to_load, cScenario& scenario, bool only_header = false); bool load_party(fs::path file_to_load, cUniverse& univ); bool save_party(fs::path dest_file, const cUniverse& univ); diff --git a/src/tools/fileio_scen.cpp b/src/tools/fileio_scen.cpp index 502b2295..cd867660 100644 --- a/src/tools/fileio_scen.cpp +++ b/src/tools/fileio_scen.cpp @@ -37,13 +37,13 @@ void load_spec_graphics_v1(fs::path scen_file); void load_spec_graphics_v2(int num_sheets); void reload_core_graphics(); // Load old scenarios (town talk is handled by the town loading function) -static bool load_scenario_v1(fs::path file_to_load, cScenario& scenario); +static bool load_scenario_v1(fs::path file_to_load, cScenario& scenario, bool only_header); static bool load_outdoors_v1(fs::path scen_file, location which_out,cOutdoors& the_out, legacy::scenario_data_type& scenario); static bool load_town_v1(fs::path scen_file,short which_town,cTown& the_town,legacy::scenario_data_type& scenario,std::vector& shops); // Load new scenarios -static bool load_scenario_v2(fs::path file_to_load, cScenario& scenario); +static bool load_scenario_v2(fs::path file_to_load, cScenario& scenario, bool only_header); -bool load_scenario(fs::path file_to_load, cScenario& scenario) { +bool load_scenario(fs::path file_to_load, cScenario& scenario, bool only_header) { // Before loading a scenario, we may need to pop scenario resource paths. fs::path graphics_path = ResMgr::popPath(); for(auto p : graphics_path) { @@ -64,9 +64,9 @@ bool load_scenario(fs::path file_to_load, cScenario& scenario) { std::transform(fname.begin(), fname.end(), fname.begin(), tolower); size_t dot = fname.find_last_of('.'); if(fname.substr(dot) == ".boes") - return load_scenario_v2(file_to_load, scenario); + return load_scenario_v2(file_to_load, scenario, only_header); else if(fname.substr(dot) == ".exs") - return load_scenario_v1(file_to_load, scenario); + return load_scenario_v1(file_to_load, scenario, only_header); giveError("That is not a Blades of Exile scenario."); return false; } @@ -91,7 +91,7 @@ template static void port_shop_spec_node(cSpecial& spec, std spec.ex2a = spec.ex2b = -1; } -bool load_scenario_v1(fs::path file_to_load, cScenario& scenario){ +bool load_scenario_v1(fs::path file_to_load, cScenario& scenario, bool only_header){ short i,n; bool file_ok = false; long len; @@ -126,7 +126,7 @@ bool load_scenario_v1(fs::path file_to_load, cScenario& scenario){ file_ok = true; } else if(scenario.format.flag1 == 'O' && scenario.format.flag2 == 'B' && scenario.format.flag3 == 'O' && scenario.format.flag4 == 'E') { // This means we're looking at the scenario header file of an unpacked new-format scenario. - return load_scenario_v2(file_to_load.parent_path(), scenario); + return load_scenario_v2(file_to_load.parent_path(), scenario, only_header); } if(!file_ok) { fclose(file_id); @@ -182,6 +182,7 @@ bool load_scenario_v1(fs::path file_to_load, cScenario& scenario){ scenario.ter_types[23].fly_over = false; scenario.scen_file = file_to_load; + if(only_header) return true; load_spec_graphics_v1(scenario.scen_file); // Now load all the outdoor sectors @@ -1781,7 +1782,7 @@ static void readSpecialNodesFromStream(std::istream& stream, std::vector