From 1df2dabe52e5817077827254086df98f6d924819 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Sat, 2 Aug 2025 14:22:56 -0500 Subject: [PATCH] for legacy scenarios, help open readme or load prefab --- src/game/boe.dlgutil.cpp | 50 ++++++++++++++++++++++++++++++++++++++-- src/game/boe.fileio.cpp | 24 +++++++++++++++++++ src/game/boe.fileio.hpp | 3 +++ 3 files changed, 75 insertions(+), 2 deletions(-) diff --git a/src/game/boe.dlgutil.cpp b/src/game/boe.dlgutil.cpp index 5082be22..abd15c52 100644 --- a/src/game/boe.dlgutil.cpp +++ b/src/game/boe.dlgutil.cpp @@ -31,6 +31,7 @@ #include "utility.hpp" #include "mathutil.hpp" #include "dialogxml/dialogs/strdlog.hpp" +#include "dialogxml/dialogs/btnpanel.hpp" #include "dialogxml/dialogs/choicedlog.hpp" #include "gfx/render_shapes.hpp" #include "tools/winutil.hpp" @@ -63,8 +64,10 @@ extern std::shared_ptr text_sbar,item_sbar,shop_sbar; extern std::shared_ptr done_btn, help_btn; extern bool map_visible; extern cUniverse univ; +extern cCustomGraphics spec_scen_g; extern std::map skill_max; extern void give_help_and_record(short help1, short help2, bool help_forced = false); +extern void post_load(); short sign_mode,person_graphic,store_person_graphic,store_sign_mode; long num_talk_entries; @@ -1837,12 +1840,55 @@ class cChooseScenario { prefab.prog_make_ver[1] = 0; prefab.prog_make_ver[2] = 0; me.setResult(prefab); + me.toast(true); } else { int scen_hit = which + (page - 1) * 3; if(scen_hit >= scen_headers.size()) return false; - me.setResult(scen_headers[scen_hit]); + + // Show text files, Offer to load prefab party + auto scen = scen_headers[scen_hit]; + std::vector files = extra_files(locate_scenario(scen.file)); + if(!files.empty()){ + std::vector choices; + std::vector> handlers; + + for(fs::path file : files){ + std::string ext = file.extension().string(); + std::transform(ext.begin(), ext.end(), ext.begin(), tolower); + if(ext == ".sav"){ + choices.push_back("Load premade party: " + file.filename().string()); + handlers.push_back([file](cButtonPanel&) -> void { + if(!load_party(file, univ, spec_scen_g)) { + std::cout << "Failed to load save file: " << file << std::endl; + }else{ + finish_load_party(); + if(overall_mode != MODE_STARTUP) + post_load(); + } + }); + }else{ + choices.push_back("Open file: " + file.filename().string()); + handlers.push_back([file](cButtonPanel&) -> void { + launchURL("file://" + file.string()); + }); + } + } + + cButtonPanel panel(choices, handlers, scen.name, "Launch", &me); + dynamic_cast(panel->getControl("pic")).setPict(scen.intro_pic,PIC_SCEN); + if(panel.show()){ + // Launch pressed. + me.setResult(scen); + me.toast(true); + }; + } + // No extra files. Just launch + else{ + me.setResult(scen); + me.toast(true); + } + } - me.toast(true); return true; } diff --git a/src/game/boe.fileio.cpp b/src/game/boe.fileio.cpp index 48d0c66b..2833b8ec 100644 --- a/src/game/boe.fileio.cpp +++ b/src/game/boe.fileio.cpp @@ -553,3 +553,27 @@ void try_auto_save(std::string reason) { } print_buf(); } + +std::vector extra_extensions = {".sav", ".txt", ".rtf", ".htm", ".html"}; + +std::vector extra_files(fs::path scen_file) { + std::vector files; + + std::string scen_extension = scen_file.extension().string(); + std::transform(scen_extension.begin(), scen_extension.end(), scen_extension.begin(), tolower); + if(scen_extension != ".exs") return files; + + fs::path directory = scen_file.parent_path(); + + fs::recursive_directory_iterator file_iter(directory); + for(; file_iter != fs::recursive_directory_iterator(); file_iter++) { + fs::path file = *file_iter; + std::string extension = file.extension().string(); + std::transform(extension.begin(), extension.end(), extension.begin(), tolower); + if(std::find(extra_extensions.begin(), extra_extensions.end(), extension) != extra_extensions.end()){ + files.push_back(file); + } + } + + return files; +} diff --git a/src/game/boe.fileio.hpp b/src/game/boe.fileio.hpp index 4300a3d2..4016147b 100644 --- a/src/game/boe.fileio.hpp +++ b/src/game/boe.fileio.hpp @@ -37,4 +37,7 @@ void try_auto_save(std::string reason); // Turn lower-case and strip articles from the front of a scenario title, for alphabetization std::string name_alphabetical(std::string scenario_name); +// Find extra files packaged with legacy scenarios (such as readme, prefab party): +std::vector extra_files(fs::path scen_file); + #endif