From 27bbb2c7e4b636f7b64ddf60348496b5c7687acb Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Sun, 5 May 2024 09:03:08 -0700 Subject: [PATCH] add --language option to disassemble_quest_script --- src/Main.cc | 4 ++-- src/QuestScript.cc | 26 ++++++++++++++++++++++---- src/QuestScript.hh | 2 +- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/Main.cc b/src/Main.cc index 55014063..86d1c1ee 100644 --- a/src/Main.cc +++ b/src/Main.cc @@ -1163,9 +1163,9 @@ Action a_disassemble_quest_script( if (!args.get("decompressed")) { data = prs_decompress(data); } - uint8_t language = args.get("japanese") ? 0 : 1; + uint8_t override_language = args.get("language", 0xFF); bool reassembly_mode = args.get("reassembly"); - string result = disassemble_quest_script(data.data(), data.size(), version, language, reassembly_mode); + string result = disassemble_quest_script(data.data(), data.size(), version, override_language, reassembly_mode); write_output_data(args, result.data(), result.size(), "txt"); }); Action a_disassemble_quest_map( diff --git a/src/QuestScript.cc b/src/QuestScript.cc index 7a6dd41a..ad69154c 100644 --- a/src/QuestScript.cc +++ b/src/QuestScript.cc @@ -900,7 +900,7 @@ opcodes_by_name_for_version(Version v) { return index; } -std::string disassemble_quest_script(const void* data, size_t size, Version version, uint8_t language, bool reassembly_mode) { +std::string disassemble_quest_script(const void* data, size_t size, Version version, uint8_t override_language, bool reassembly_mode) { StringReader r(data, size); deque lines; lines.emplace_back(string_printf(".version %s", name_for_enum(version))); @@ -908,6 +908,7 @@ std::string disassemble_quest_script(const void* data, size_t size, Version vers bool use_wstrs = false; size_t code_offset = 0; size_t function_table_offset = 0; + uint8_t language; switch (version) { case Version::DC_NTE: { const auto& header = r.get(); @@ -923,8 +924,12 @@ std::string disassemble_quest_script(const void* data, size_t size, Version vers const auto& header = r.get(); code_offset = header.code_offset; function_table_offset = header.function_table_offset; - if (header.language < 5) { + if (override_language != 0xFF) { + language = override_language; + } else if (header.language < 5) { language = header.language; + } else { + language = 1; } lines.emplace_back(string_printf(".quest_num %hu", header.quest_number.load())); lines.emplace_back(string_printf(".language %hhu", header.language)); @@ -939,8 +944,12 @@ std::string disassemble_quest_script(const void* data, size_t size, Version vers const auto& header = r.get(); code_offset = header.code_offset; function_table_offset = header.function_table_offset; - if (header.language < 8) { + if (override_language != 0xFF) { + language = override_language; + } else if (header.language < 8) { language = header.language; + } else { + language = 1; } lines.emplace_back(string_printf(".quest_num %hu", header.quest_number.load())); lines.emplace_back(string_printf(".language %hhu", header.language)); @@ -957,8 +966,12 @@ std::string disassemble_quest_script(const void* data, size_t size, Version vers const auto& header = r.get(); code_offset = header.code_offset; function_table_offset = header.function_table_offset; - if (header.language < 5) { + if (override_language != 0xFF) { + language = override_language; + } else if (header.language < 5) { language = header.language; + } else { + language = 1; } lines.emplace_back(string_printf(".quest_num %hhu", header.quest_number)); lines.emplace_back(string_printf(".language %hhu", header.language)); @@ -973,6 +986,11 @@ std::string disassemble_quest_script(const void* data, size_t size, Version vers const auto& header = r.get(); code_offset = header.code_offset; function_table_offset = header.function_table_offset; + if (override_language != 0xFF) { + language = override_language; + } else { + language = 1; + } lines.emplace_back(string_printf(".quest_num %hu", header.quest_number.load())); lines.emplace_back(string_printf(".episode %s", name_for_header_episode_number(header.episode))); lines.emplace_back(string_printf(".max_players %hhu", header.episode)); diff --git a/src/QuestScript.hh b/src/QuestScript.hh index a8363a91..b03efa9b 100644 --- a/src/QuestScript.hh +++ b/src/QuestScript.hh @@ -82,7 +82,7 @@ struct PSOQuestHeaderBB { Episode episode_for_quest_episode_number(uint8_t episode_number); -std::string disassemble_quest_script(const void* data, size_t size, Version version, uint8_t language, bool reassembly_mode); +std::string disassemble_quest_script(const void* data, size_t size, Version version, uint8_t override_language = 0xFF, bool reassembly_mode = false); std::string assemble_quest_script(const std::string& text); Episode find_quest_episode_from_script(const void* data, size_t size, Version version);