From 50149e728eba660ccb03f5796a3af0159017b569 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Fri, 29 Aug 2025 12:55:19 -0500 Subject: [PATCH] you can manually insert extra files in scenario pack --- src/fileio/fileio.hpp | 4 ++++ src/game/boe.fileio.cpp | 45 ++++++++++++++++++++++++++---------- src/scenedit/scen.fileio.cpp | 15 ++++++++++++ 3 files changed, 52 insertions(+), 12 deletions(-) diff --git a/src/fileio/fileio.hpp b/src/fileio/fileio.hpp index e67854ba..07028ab2 100644 --- a/src/fileio/fileio.hpp +++ b/src/fileio/fileio.hpp @@ -40,6 +40,10 @@ fs::path os_file_picker(bool saving); extern fs::path run_file_picker(bool saving); const std::set save_extensions = {".exg", ".boe", ".SAV", ".mac"}; + +// Extra files you can package with a scenario +const std::vector extra_extensions = {".sav", ".txt", ".rtf", ".htm", ".html", ".exg"}; + // Return a directory's files sorted by last modified time std::vector> sorted_file_mtimes(fs::path dir, std::set valid_extensions = save_extensions); diff --git a/src/game/boe.fileio.cpp b/src/game/boe.fileio.cpp index bb0b0248..40f025be 100644 --- a/src/game/boe.fileio.cpp +++ b/src/game/boe.fileio.cpp @@ -24,6 +24,8 @@ #include #include #include +#include "fileio/tarball.hpp" +#include "gzstream.h" #define DONE_BUTTON_ITEM 1 @@ -552,24 +554,43 @@ 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; + if(scen_extension == ".boes"){ + tarball pack; + igzstream gzin(scen_file.string().c_str()); + pack.readFrom(gzin); + if(gzin.bad()) { + showError("There was an error checking for extra files"); + return files; + } + for(auto file : pack){ + fs::path path = file.filename; + if(path.parent_path() == "scenario/extra" && find(extra_extensions.begin(), extra_extensions.end(), path.extension()) != extra_extensions.end()){ + extern fs::path tempDir; + // extract the extra file temporarily + std::istream& f = file.contents; + std::ofstream fout((tempDir / path.filename()).string(), std::ios::binary); + fout << f.rdbuf(); + fout.close(); + // Return that path + files.push_back(tempDir / path.filename()); + } + } + }else if(scen_extension == ".exs"){ + fs::path directory = scen_file.parent_path(); - 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); + 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); + } } } diff --git a/src/scenedit/scen.fileio.cpp b/src/scenedit/scen.fileio.cpp index efea8ebc..132f0e3a 100644 --- a/src/scenedit/scen.fileio.cpp +++ b/src/scenedit/scen.fileio.cpp @@ -1236,6 +1236,21 @@ void save_scenario(bool rename, bool autosave) { return; } + // Extra files! (Like readme.txt or a prefab party) + fs::path extraPath = tempDir/scenario_temp_dir_name/"extra"; + if(fs::exists(extraPath) && fs::is_directory(extraPath)) { + fs::directory_iterator iter(extraPath); + for(; iter != fs::directory_iterator(); iter++) { + fs::path extra = iter->path(); + if(find(extra_extensions.begin(), extra_extensions.end(), extra.extension()) != extra_extensions.end()){ + std::ostream& extra_out = scen_file.newFile("scenario/extra/" + extra.filename().string()); + std::ifstream fin(iter->path().string(), std::ios::binary); + extra_out << fin.rdbuf(); + fin.close(); + } + } + } + // Now, custom graphics. if(spec_scen_g.is_old) { spec_scen_g.convert_sheets();