From f9cac45996dfd92fb635b8f3b6f922fb644d041f Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Sun, 23 Feb 2025 11:20:55 -0800 Subject: [PATCH] allow including shared files via .include_native --- src/Main.cc | 2 +- src/Quest.cc | 3 +-- src/QuestScript.cc | 17 ++++++++++++++--- src/QuestScript.hh | 2 +- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/Main.cc b/src/Main.cc index d2f108a9..851dbb8f 100644 --- a/src/Main.cc +++ b/src/Main.cc @@ -1525,7 +1525,7 @@ Action a_assemble_quest_script( ? phosg::dirname(input_filename) : "."; - string result = assemble_quest_script(text, include_dir); + string result = assemble_quest_script(text, {include_dir, "system/client-functions/System"}); bool compress = !args.get("decompressed"); if (compress) { if (args.get("optimal")) { diff --git a/src/Quest.cc b/src/Quest.cc index 640a160a..32d7a316 100644 --- a/src/Quest.cc +++ b/src/Quest.cc @@ -637,8 +637,7 @@ QuestIndex::QuestIndex( file_data = decode_dlq_data(phosg::load_file(file_path)); filename.resize(filename.size() - 4); } else if (phosg::ends_with(filename, ".bin.txt")) { - string include_dir = phosg::dirname(file_path); - file_data = assemble_quest_script(phosg::load_file(file_path), include_dir); + file_data = assemble_quest_script(phosg::load_file(file_path), {phosg::dirname(file_path), "system/client-functions/System"}); filename.resize(filename.size() - 4); if (phosg::ends_with(filename, ".bin")) { filename.push_back('d'); diff --git a/src/QuestScript.cc b/src/QuestScript.cc index e413d7fa..9e2fc55d 100644 --- a/src/QuestScript.cc +++ b/src/QuestScript.cc @@ -3989,7 +3989,7 @@ struct RegisterAssigner { array, 0x100> numbered_regs; }; -std::string assemble_quest_script(const std::string& text, const std::string& include_directory) { +std::string assemble_quest_script(const std::string& text, const vector& include_directories) { auto lines = phosg::split(text, '\n'); // Strip comments and whitespace @@ -4198,6 +4198,17 @@ std::string assemble_quest_script(const std::string& text, const std::string& in }; // Assemble code segment + + auto get_include = [&](const std::string& filename) -> std::string { + for (const auto& include_dir : include_directories) { + string path = include_dir + "/" + filename; + if (phosg::isfile(path)) { + return phosg::load_file(path); + } + } + throw runtime_error("data not found for include: " + filename); + }; + bool version_has_args = F_HAS_ARGS & v_flag(quest_version); const auto& opcodes = opcodes_by_name_for_version(quest_version); phosg::StringWriter code_w; @@ -4232,12 +4243,12 @@ std::string assemble_quest_script(const std::string& text, const std::string& in } else if (phosg::starts_with(line, ".include_bin ")) { string filename = line.substr(13); phosg::strip_whitespace(filename); - code_w.write(phosg::load_file(include_directory + "/" + filename)); + code_w.write(get_include(filename)); } else if (phosg::starts_with(line, ".include_native ")) { #ifdef HAVE_RESOURCE_FILE string filename = line.substr(16); phosg::strip_whitespace(filename); - string native_text = phosg::load_file(include_directory + "/" + filename); + string native_text = get_include(filename); string code; if (is_ppc(quest_version)) { code = std::move(ResourceDASM::PPC32Emulator::assemble(native_text).code); diff --git a/src/QuestScript.hh b/src/QuestScript.hh index 0762891b..05cc9cf2 100644 --- a/src/QuestScript.hh +++ b/src/QuestScript.hh @@ -91,6 +91,6 @@ std::string disassemble_quest_script( uint8_t override_language = 0xFF, bool reassembly_mode = false, bool use_qedit_names = false); -std::string assemble_quest_script(const std::string& text, const std::string& include_directory); +std::string assemble_quest_script(const std::string& text, const std::vector& include_directories); Episode find_quest_episode_from_script(const void* data, size_t size, Version version);