From 90de57145736752f75338c1fb3c2c6d06c6706f1 Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Sun, 12 Oct 2025 23:37:42 -0700 Subject: [PATCH] document contents of BugFixes patch --- notes/patch-ports.txt | 2 +- src/FunctionCompiler.cc | 177 ++-- src/Main.cc | 16 +- .../BugFixes/BugFixes.3__0.patch.s | 590 ------------ .../BugFixes/BugFixes.3__1.patch.s | 554 ----------- .../BugFixes/BugFixes.3___.patch.s | 882 ++++++++++++++++++ 6 files changed, 1000 insertions(+), 1221 deletions(-) delete mode 100644 system/client-functions/BugFixes/BugFixes.3__0.patch.s delete mode 100644 system/client-functions/BugFixes/BugFixes.3__1.patch.s create mode 100644 system/client-functions/BugFixes/BugFixes.3___.patch.s diff --git a/notes/patch-ports.txt b/notes/patch-ports.txt index cd6d2454..7d3e7f39 100644 --- a/notes/patch-ports.txt +++ b/notes/patch-ports.txt @@ -557,7 +557,7 @@ BugFixes 8000C6E8 807F0024 8000C6E8 807F0024 8000C6E8 807F0024 8000C6E8 807F0024 8000C6E8 807F0024 8000C6E8 807F0024 8000C6E8 807F0024 8000C6E8 807F0024 lwz r3, [r31 + 0x0024] 8000C6EC 48165AA0 8000C6EC 482147D4 8000C6EC 482156C0 8000C6EC 48215474 8000C6EC 482146F4 8000C6EC 482146F4 8000C6EC 482157A8 8000C6EC 48215040 b +0x002146F4 /* 80220DE0 */ 8021D098 4BDEF638 8021D9FC 4BDEECD4 8021E8E8 4BDEDDE8 8021E69C 4BDEE034 8021D91C 4BDEEDB4 8021D91C 4BDEEDB4 8021E9D0 4BDEDD00 8021E268 4BDEE468 b -0x0021124C /* 8000C6D0 */ -80172188 4BE9A558 80220EBC 4BDEB824 80221DA8 4BDEA938 80221B5C 4BDEAB84 80220DDC 4BDEB904 80220DDC 4BDEB904 80221E90 4BDEA850 80221728 4BDEAFB8 b -0x002146FC /* 8000C6E0 */ +80220528 4BE9A558 80220EBC 4BDEB824 80221DA8 4BDEA938 80221B5C 4BDEAB84 80220DDC 4BDEB904 80220DDC 4BDEB904 80221E90 4BDEA850 80221728 4BDEAFB8 b -0x002146FC /* 8000C6E0 */ Dropped Mag Colour Bug Fix BugFixes diff --git a/src/FunctionCompiler.cc b/src/FunctionCompiler.cc index 87766e23..068bfcc7 100644 --- a/src/FunctionCompiler.cc +++ b/src/FunctionCompiler.cc @@ -108,6 +108,111 @@ bool CompiledFunctionCode::is_big_endian() const { return this->arch == Architecture::POWERPC; } +static unordered_map preprocess_function_code(const std::string& text) { + auto parse_specific_version_list = +[](std::string&& text) -> vector { + phosg::strip_whitespace(text); + vector ret; + for (auto& vers_token : phosg::split(text, ' ')) { + phosg::strip_whitespace(vers_token); + if (vers_token.empty()) { + continue; + } + if (vers_token.size() != 4) { + throw std::runtime_error("invalid specific_version: " + vers_token); + } + ret.emplace_back(*reinterpret_cast(vers_token.data())); + } + return ret; + }; + + // Find a .versions directive and populate specific_versions + vector specific_versions; + auto lines = phosg::split(text, '\n'); + for (auto& line : lines) { + if (line.starts_with(".versions ")) { + if (!specific_versions.empty()) { + throw std::runtime_error("multiple .versions directives in file"); + } + specific_versions = parse_specific_version_list(line.substr(10)); + if (specific_versions.empty()) { + throw std::runtime_error(".versions directive does not specify any versions"); + } + line.clear(); + } + } + + // If there's no .versions directive, just return the text as-is + if (specific_versions.empty()) { + return {{0, std::move(text)}}; + } + + vector> version_lines; + version_lines.resize(specific_versions.size()); + + size_t line_num = 1; + vector current_only_versions; + unordered_set current_only_versions_set; + for (auto& line : lines) { + phosg::strip_whitespace(line); + if (line.starts_with(".only_versions ")) { + current_only_versions = parse_specific_version_list(line.substr(15)); + current_only_versions_set.clear(); + for (uint32_t specific_version : current_only_versions) { + current_only_versions_set.emplace(specific_version); + } + + } else if (line == ".all_versions") { + current_only_versions.clear(); + current_only_versions_set.clear(); + + } else { + size_t vers_offset = line.find("', vers_offset + 6); + if (end_offset == string::npos) { + throw runtime_error(std::format("(line {}) unterminated replacement", line_num)); + } + auto tokens = phosg::split(version_line.substr(vers_offset + 6, end_offset - vers_offset - 6), ' '); + if (tokens.size() <= token_index) { + throw runtime_error(std::format("(line {}) invalid replacement", line_num)); + } + version_line = version_line.substr(0, vers_offset) + tokens.at(token_index) + version_line.substr(end_offset + 1); + vers_offset = version_line.find(" ret; + for (size_t z = 0; z < specific_versions.size(); z++) { + ret.emplace(specific_versions[z], phosg::join(version_lines.at(z), "\n")); + } + return ret; +} + static vector> compile_function_code( CompiledFunctionCode::Architecture arch, const string& function_directory, @@ -169,78 +274,10 @@ static vector> compile_function_code( throw runtime_error("data not found for include: " + name + " (from " + asm_filename + " or " + bin_filename + ")"); }; - // Handle VERS tokens - vector specific_versions; - auto lines = phosg::split(text, '\n'); - for (auto& line : lines) { - if (line.starts_with(".versions ")) { - if (!specific_versions.empty()) { - throw std::runtime_error("multiple .versions directives in file"); - } - for (auto& vers_token : phosg::split(line.substr(10), ' ')) { - phosg::strip_whitespace(vers_token); - if (vers_token.empty()) { - continue; - } - if (vers_token.size() != 4) { - throw std::runtime_error("invalid token in .version directive: " + vers_token); - } - specific_versions.emplace_back(*reinterpret_cast(vers_token.data())); - } - line.clear(); - } - } - - // Preprocess tokens in the text if a .versions directive was given - vector version_texts; - if (specific_versions.empty()) { - specific_versions.emplace_back(0); - version_texts.emplace_back(text); - - } else { - vector> version_lines; - version_lines.resize(specific_versions.size()); - - size_t line_num = 1; - for (const auto& line : lines) { - size_t vers_offset = line.find("', vers_offset + 6); - if (end_offset == string::npos) { - throw runtime_error(std::format("(line {}) unterminated replacement", line_num)); - } - auto tokens = phosg::split(version_line.substr(vers_offset + 6, end_offset - vers_offset - 6), ' '); - if (tokens.size() != specific_versions.size()) { - throw runtime_error(std::format("(line {}) invalid replacement", line_num)); - } - version_line = version_line.substr(0, vers_offset) + tokens.at(vers_index) + version_line.substr(end_offset + 1); - vers_offset = version_line.find("> ret; - for (size_t vers_index = 0; vers_index < specific_versions.size(); vers_index++) { - uint32_t specific_version = specific_versions[vers_index]; - const auto& version_text = version_texts.at(vers_index); - + for (const auto& [specific_version, version_text] : version_texts) { try { ResourceDASM::EmulatorBase::AssembleResult assembled; if (arch == CompiledFunctionCode::Architecture::POWERPC) { diff --git a/src/Main.cc b/src/Main.cc index 7ca6d198..54d473cd 100644 --- a/src/Main.cc +++ b/src/Main.cc @@ -1714,19 +1714,23 @@ Action a_assemble_quest_script( Action a_assemble_all_patches( "assemble-all-patches", "\ - assemble-all-patches\n\ + assemble-all-patches [--skip-encrypted]\n\ Assemble all patches in the system/client-functions directory, and produce\n\ two compiled .bin files for each patch (one unencrypted, for most PSO\n\ versions, and one encrypted, for PSO GC JP v1.4, JP Ep3, and Ep3 Trial\n\ Edition). The output files are saved in system/client-functions.\n", - +[](phosg::Arguments&) { + +[](phosg::Arguments& args) { auto fci = make_shared("system/client-functions"); - auto process_code = +[](shared_ptr code, - uint32_t checksum_addr, - uint32_t checksum_size, - uint32_t override_start_addr) -> void { + bool skip_encrypted = args.get("skip-encrypted"); + auto process_code = [&](shared_ptr code, + uint32_t checksum_addr, + uint32_t checksum_size, + uint32_t override_start_addr) -> void { for (uint8_t encrypted = 0; encrypted < 2; encrypted++) { + if (encrypted && skip_encrypted) { + continue; + } phosg::StringWriter w; string data = prepare_send_function_call_data( code, {}, nullptr, 0, checksum_addr, checksum_size, override_start_addr, encrypted); diff --git a/system/client-functions/BugFixes/BugFixes.3__0.patch.s b/system/client-functions/BugFixes/BugFixes.3__0.patch.s deleted file mode 100644 index 11f50e80..00000000 --- a/system/client-functions/BugFixes/BugFixes.3__0.patch.s +++ /dev/null @@ -1,590 +0,0 @@ -.meta name="Bug fixes" -.meta description="Fixes many minor\ngameplay, sound,\nand graphical bugs" -# Original code by Ralf @ GC-Forever and Aleron Ives -# https://www.gc-forever.com/forums/viewtopic.php?t=2050 -# https://www.gc-forever.com/forums/viewtopic.php?t=2049 - -.versions 3OE0 3OE1 3OJ2 - -entry_ptr: -reloc0: - .offsetof start -start: - .include WriteCodeBlocksGC - - .data 0x8000B088 - .data 0x00000058 - .data 0x7FA3EB78 - .data 0x38800000 - .data - .data 0x7FA3EB78 - .data - .data 0x881F0000 - .data 0x28090001 - .data 0x4082000C - .data 0x881F0001 - .data 0x3BFF0002 - .data - .data 0x39200000 - .data - .data 0x7F43D378 - .data 0x7F64DB78 - .data 0x7F85E378 - .data 0x7FA6EB78 - .data 0x7FC7F378 - .data 0x7FE8FB78 - .data 0x39200001 - .data - .data - - .data 0x8000B5C8 - .data 0x00000014 - .data 0x80630098 - .data - .data 0x807F042C - .data 0x809F0430 - .data - - .data 0x8000BBD0 - .data 0x00000020 - .data 0x809F0370 - .data 0x3884FC00 - .data 0x909F0370 - .data 0x807F0014 - .data 0x28030000 - .data 0x41820008 - .data 0x90830060 - .data - - .data 0x8000C3F8 - .data 0x0000007C - .data 0x28040000 - .data 0x4D820020 - .data 0x9421FFF0 - .data - .data 0x9421FFE0 - .data 0x7C0802A6 - .data 0x90010024 - .data 0xBF410008 - .data 0x7C7F1B78 - .data 0x4BFFFFDD - .data 0x3BC00000 - .data 0x3BBF0D04 - .data 0x837F032C - .data 0x839D0000 - .data 0x7F83E379 - .data 0x41820018 - .data 0x38800001 - .data - .data 0x7F83E378 - .data 0x38800001 - .data - .data 0x3BBD0004 - .data 0x3BDE0001 - .data 0x2C1E000D - .data 0x4180FFD4 - .data 0x937F032C - .data 0xBB410008 - .data 0x80010024 - .data 0x7C0803A6 - .data 0x38210020 - .data 0x4E800020 - - .data 0x8000C640 - .data 0x00000014 - .data 0x54800673 - .data 0x41820008 - .data 0x38800000 - .data 0x38040009 - .data - - .data 0x8000C6D0 - .data 0x00000020 - .data 0x38000001 - .data 0x901D0054 - .data 0x807D0024 - .data - .data 0x38000001 - .data 0x901F0378 - .data 0x807F0024 - .data - - .data 0x8000C8A0 - .data 0x00000014 - .data 0x1C00000A - .data 0x57E407BD - .data 0x41820008 - .data 0x7FA00734 - .data - - .data 0x8000C8C0 - .data 0x00000010 - .data 0x7000000F - .data 0x7000004F - .data 0x2C000004 - .data 0x4E800020 - - .data 0x8000D980 - .data 0x00000014 - .data 0x807C0000 - .data 0x2C030013 - .data 0x40820008 - .data 0x38600002 - .data - - .data 0x8000D9A0 - .data 0x00000018 - .data - .data 0x807E0030 - .data 0x70630020 - .data 0x41820008 - .data - .data - - .data 0x8000E1E0 - .data 0x0000001C - .data 0x7FC802A6 - .data 0x38A00000 - .data 0x38C0001E - .data 0x38E00040 - .data - .data 0x7FC803A6 - .data 0x4E800020 - - .data - .data 0x00000004 - .data 0x4BFFFCC0 - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data - - .data - .data 0x00000008 - .data 0x4800024D - .data 0xB3C3032C - - .data - .data 0x00000004 - .data 0x48000010 - - .data - .data 0x00000004 - .data 0x60000000 - - .data - .data 0x00000004 - .data 0x4182000C - - .data - .data 0x00000004 - .data 0x4800000C - - .data - .data 0x00000004 - .data 0x7C030378 - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data 0x38000012 - - .data - .data 0x00000004 - .data 0x88040016 - - .data - .data 0x00000004 - .data 0x88040017 - - .data - .data 0x00000004 - .data - - .data - .data 0x0000000C - .data 0x7C030378 - .data 0x3863FFFF - .data 0x4BFFFFE8 - - .data - .data 0x0000000C - .data 0x7C030378 - .data 0x3863FFFF - .data 0x4BFFFFE8 - - .data - .data 0x0000000C - .data 0x7C040378 - .data 0x3884FFFF - .data 0x4BFFFFE8 - - .data - .data 0x00000008 - .data 0x3C604005 - .data 0x4800009C - - .data - .data 0x00000004 - .data 0x4800001C - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data 0x60800420 - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data 0x60000000 - - .data - .data 0x00000004 - .data 0x60000000 - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data 0x2C000001 - - .data - .data 0x00000004 - .data 0x3880FF00 - - .data - .data 0x00000004 - .data 0x3880FE80 - - .data - .data 0x00000004 - .data 0x3880FDB0 - - .data - .data 0x00000004 - .data 0x60000000 - - .data - .data 0x00000004 - .data 0x41810630 - - .data - .data 0x00000004 - .data 0x4181033C - - .data - .data 0x00000004 - .data 0x41810248 - - .data - .data 0x00000004 - .data 0x3880FF00 - - .data - .data 0x00000004 - .data 0x3880FE80 - - .data - .data 0x00000004 - .data 0x3880FDB0 - - .data - .data 0x00000004 - .data 0x3880FF00 - - .data - .data 0x00000004 - .data 0x3880FE80 - - .data - .data 0x00000004 - .data 0x3880FDB0 - - .data - .data 0x00000004 - .data 0x3880FF00 - - .data - .data 0x00000004 - .data 0x3880FE80 - - .data - .data 0x00000004 - .data 0x3880FDB0 - - .data - .data 0x00000004 - .data 0x3880FF00 - - .data - .data 0x00000004 - .data 0x3880FE80 - - .data - .data 0x00000004 - .data 0x3880FDB0 - - .data - .data 0x00000004 - .data 0x3880FF00 - - .data - .data 0x00000004 - .data 0x3880FE80 - - .data - .data 0x00000004 - .data 0x3880FDB0 - - .data - .data 0x00000004 - .data 0x3880FF00 - - .data - .data 0x00000004 - .data 0x3880FE80 - - .data - .data 0x00000004 - .data 0x3880FDB0 - - .data - .data 0x00000004 - .data 0x3880FF00 - - .data - .data 0x00000004 - .data 0x3880FE80 - - .data - .data 0x00000004 - .data 0x3880FDB0 - - .data - .data 0x00000004 - .data 0x3880FF00 - - .data - .data 0x00000004 - .data 0x3880FE80 - - .data - .data 0x00000004 - .data 0x3880FDB0 - - .data - .data 0x00000004 - .data 0x3880FF00 - - .data - .data 0x00000004 - .data 0x3880FE80 - - .data - .data 0x00000004 - .data 0x3880FDB0 - - .data - .data 0x00000004 - .data 0x3880FF00 - - .data - .data 0x00000004 - .data 0x3880FE80 - - .data - .data 0x00000004 - .data 0x3880FDB0 - - .data - .data 0x00000004 - .data 0x3880FF00 - - .data - .data 0x00000004 - .data 0x3880FE80 - - .data - .data 0x00000004 - .data 0x3880FDB0 - - .data - .data 0x00000004 - .data 0x60000000 - - .data - .data 0x00000004 - .data 0x60000000 - - .data - .data 0x00000004 - .data 0x3884AAFA - - .data - .data 0x00000004 - .data 0x3863AAFA - - .data - .data 0x00000004 - .data 0x3883AAFA - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data 0x2C030001 - - .data - .data 0x0000001C - .data 0x48000020 - .data 0x3863A830 - .data - .data 0x2C000023 - .data 0x40820008 - .data 0x3863FB28 - .data 0x4800008C - - .data - .data 0x00000004 - .data 0x4BFFFF64 - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data 0x388001E8 - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data 0x388001E8 - - .data - .data 0x00000004 - .data - - .data - .data 0x00000008 - .data 0x70808080 - .data 0x60707070 - - .data - .data 0x00000004 - .data 0x0000001E - - .data - .data 0x00000004 - .data 0x00000028 - - .data - .data 0x00000004 - .data 0x00000032 - - .data - .data 0x00000004 - .data 0x0000003C - - .data - .data 0x00000004 - .data 0x0018003C - - .data - .data 0x00000004 - .data 0x00000028 - - .data - .data 0x00000004 - .data 0xFF0074EE - - .data - .data 0x00000004 - .data 0x435C0000 - - .data - .data 0x00000004 - .data 0x46AFC800 - - .data - .data 0x00000004 - .data 0x43480000 - - # Belra arm bug fix (this part by fuzziqersoftware) - .data - .data 0x00000004 - .address - bl belra_bugfix_hook1 - .data - .data 0x00000004 - .address - bl belra_bugfix_hook2 - - .data 0x8000B06C - .deltaof belra_bugfix_hook1, belra_bugfix_end - .address 0x8000B06C -belra_bugfix_hook1: - li r0, 1 - stw [r13 - ], r0 # Anchor: 80039388 @ 3OE1 - b [] -belra_bugfix_hook2: - li r4, 0 - stw [r13 - ], r4 - lwz r4, [r28 + 0x04] - blr -belra_bugfix_end: - - .data 0x00000000 - .data 0x00000000 diff --git a/system/client-functions/BugFixes/BugFixes.3__1.patch.s b/system/client-functions/BugFixes/BugFixes.3__1.patch.s deleted file mode 100644 index 0f10175f..00000000 --- a/system/client-functions/BugFixes/BugFixes.3__1.patch.s +++ /dev/null @@ -1,554 +0,0 @@ -.meta name="Bug fixes" -.meta description="Fixes many minor\ngameplay, sound,\nand graphical bugs" -# Original code by Ralf @ GC-Forever and Aleron Ives -# https://www.gc-forever.com/forums/viewtopic.php?t=2050 -# https://www.gc-forever.com/forums/viewtopic.php?t=2049 - -.versions 3OE2 3OJ3 3OJ4 3OJ5 3OP0 - -entry_ptr: -reloc0: - .offsetof start -start: - .include WriteCodeBlocksGC - - .data 0x8000B088 - .data 0x00000058 - .data 0x7FA3EB78 - .data 0x38800000 - .data - .data 0x7FA3EB78 - .data - .data 0x881F0000 - .data 0x28090001 - .data 0x4082000C - .data 0x881F0001 - .data 0x3BFF0002 - .data - .data 0x39200000 - .data - .data 0x7F43D378 - .data 0x7F64DB78 - .data 0x7F85E378 - .data 0x7FA6EB78 - .data 0x7FC7F378 - .data 0x7FE8FB78 - .data 0x39200001 - .data - .data - - .data 0x8000B5C8 - .data 0x00000014 - .data 0x80630098 - .data - .data 0x807F042C - .data 0x809F0430 - .data - - .data 0x8000BBD0 - .data 0x00000020 - .data 0x809F0370 - .data 0x3884FC00 - .data 0x909F0370 - .data 0x807F0014 - .data 0x28030000 - .data 0x41820008 - .data 0x90830060 - .data - - .data 0x8000C3F8 - .data 0x0000007C - .data 0x28040000 - .data 0x4D820020 - .data 0x9421FFF0 - .data - .data 0x9421FFE0 - .data 0x7C0802A6 - .data 0x90010024 - .data 0xBF410008 - .data 0x7C7F1B78 - .data 0x4BFFFFDD - .data 0x3BC00000 - .data 0x3BBF0D04 - .data 0x837F032C - .data 0x839D0000 - .data 0x7F83E379 - .data 0x41820018 - .data 0x38800001 - .data - .data 0x7F83E378 - .data 0x38800001 - .data - .data 0x3BBD0004 - .data 0x3BDE0001 - .data 0x2C1E000D - .data 0x4180FFD4 - .data 0x937F032C - .data 0xBB410008 - .data 0x80010024 - .data 0x7C0803A6 - .data 0x38210020 - .data 0x4E800020 - - .data 0x8000C640 - .data 0x00000014 - .data 0x54800673 - .data 0x41820008 - .data 0x38800000 - .data 0x38040009 - .data - - .data 0x8000C6D0 - .data 0x00000020 - .data 0x38000001 - .data 0x901D0054 - .data 0x807D0024 - .data - .data 0x38000001 - .data 0x901F0378 - .data 0x807F0024 - .data - - .data 0x8000C8A0 - .data 0x00000014 - .data 0x1C00000A - .data 0x57E407BD - .data 0x41820008 - .data 0x7FA00734 - .data - - .data 0x8000C8C0 - .data 0x00000010 - .data 0x7000000F - .data 0x7000004F - .data 0x2C000004 - .data 0x4E800020 - - .data 0x8000D980 - .data 0x00000014 - .data 0x807C0000 - .data 0x2C030013 - .data 0x40820008 - .data 0x38600002 - .data - - .data 0x8000D9A0 - .data 0x00000018 - .data - .data 0x807E0030 - .data 0x70630020 - .data 0x41820008 - .data - .data - - .data 0x8000E1E0 - .data 0x0000001C - .data 0x7FC802A6 - .data 0x38A00000 - .data 0x38C0001E - .data 0x38E00040 - .data - .data 0x7FC803A6 - .data 0x4E800020 - - .data - .data 0x00000004 - .data 0x4BFFFCC0 - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data - - .data - .data 0x00000008 - .data 0x4800024D - .data 0xB3C3032C - - .data - .data 0x00000004 - .data 0x48000010 - - .data - .data 0x00000004 - .data 0x4182000C - - .data - .data 0x00000004 - .data 0x4800000C - - .data - .data 0x00000004 - .data 0x7C030378 - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data 0x38000012 - - .data - .data 0x00000004 - .data 0x88040016 - - .data - .data 0x00000004 - .data 0x88040017 - - .data - .data 0x00000004 - .data - - .data - .data 0x0000000C - .data 0x7C030378 - .data 0x3863FFFF - .data 0x4BFFFFE8 - - .data - .data 0x0000000C - .data 0x7C030378 - .data 0x3863FFFF - .data 0x4BFFFFE8 - - .data - .data 0x0000000C - .data 0x7C040378 - .data 0x3884FFFF - .data 0x4BFFFFE8 - - .data - .data 0x00000008 - .data 0x3C604005 - .data 0x4800009C - - .data - .data 0x00000004 - .data 0x4800001C - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data 0x60800420 - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data 0x60000000 - - .data - .data 0x00000004 - .data 0x60000000 - - .data - .data 0x00000004 - .data 0x60000000 - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data 0x389F02FC - - .data - .data 0x00000004 - .data 0x48000010 - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data 0x2C000001 - - .data - .data 0x00000004 - .data 0x3880FF00 - - .data - .data 0x00000004 - .data 0x3880FE80 - - .data - .data 0x00000004 - .data 0x3880FDB0 - - .data - .data 0x00000004 - .data 0x60000000 - - .data - .data 0x00000004 - .data 0x41810630 - - .data - .data 0x00000004 - .data 0x3880FF00 - - .data - .data 0x00000004 - .data 0x3880FE80 - - .data - .data 0x00000004 - .data 0x3880FDB0 - - .data - .data 0x00000004 - .data 0x3880FF00 - - .data - .data 0x00000004 - .data 0x3880FE80 - - .data - .data 0x00000004 - .data 0x3880FDB0 - - .data - .data 0x00000004 - .data 0x3880FF00 - - .data - .data 0x00000004 - .data 0x3880FE80 - - .data - .data 0x00000004 - .data 0x3880FDB0 - - .data - .data 0x00000004 - .data 0x3880FF00 - - .data - .data 0x00000004 - .data 0x3880FE80 - - .data - .data 0x00000004 - .data 0x3880FDB0 - - .data - .data 0x00000004 - .data 0x3880FF00 - - .data - .data 0x00000004 - .data 0x3880FE80 - - .data - .data 0x00000004 - .data 0x3880FDB0 - - .data - .data 0x00000004 - .data 0x3880FF00 - - .data - .data 0x00000004 - .data 0x3880FE80 - - .data - .data 0x00000004 - .data 0x3880FDB0 - - .data - .data 0x00000004 - .data 0x3880FF00 - - .data - .data 0x00000004 - .data 0x3880FE80 - - .data - .data 0x00000004 - .data 0x3880FDB0 - - .data - .data 0x00000004 - .data 0x3880FF00 - - .data - .data 0x00000004 - .data 0x3880FE80 - - .data - .data 0x00000004 - .data 0x3880FDB0 - - .data - .data 0x00000004 - .data 0x3880FF00 - - .data - .data 0x00000004 - .data 0x3880FE80 - - .data - .data 0x00000004 - .data 0x3880FDB0 - - .data - .data 0x00000004 - .data 0x3880FF00 - - .data - .data 0x00000004 - .data 0x3880FE80 - - .data - .data 0x00000004 - .data 0x3880FDB0 - - .data - .data 0x00000004 - .data 0x3880FF00 - - .data - .data 0x00000004 - .data 0x3880FE80 - - .data - .data 0x00000004 - .data 0x3880FDB0 - - .data - .data 0x00000004 - .data 0x60000000 - - .data - .data 0x00000004 - .data 0x60000000 - - .data - .data 0x00000004 - .data 0x3884AAFA - - .data - .data 0x00000004 - .data 0x3863AAFA - - .data - .data 0x00000004 - .data 0x3883AAFA - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data 0x2C030001 - - .data - .data 0x0000001C - .data 0x48000020 - .data 0x3863A830 - .data - .data 0x2C000023 - .data 0x40820008 - .data 0x3863FB28 - .data 0x4800008C - - .data - .data 0x00000004 - .data 0x4BFFFF64 - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data 0x388001E8 - - .data - .data 0x00000004 - .data - - .data - .data 0x00000004 - .data 0x388001E8 - - .data - .data 0x00000004 - .data - - .data - .data 0x00000008 - .data 0x70808080 - .data 0x60707070 - - .data - .data 0x00000004 - .data 0x0000001E - - .data - .data 0x00000004 - .data 0x00000028 - - .data - .data 0x00000004 - .data 0x00000032 - - .data - .data 0x00000004 - .data 0x0000003C - - .data - .data 0x00000004 - .data 0x0018003C - - .data - .data 0x00000004 - .data 0x00000028 - - .data - .data 0x00000004 - .data 0xFF0074EE - - .data - .data 0x00000004 - .data 0x435C0000 - - .data - .data 0x00000004 - .data 0x46AFC800 - - .data - .data 0x00000004 - .data 0x43480000 - - .data 0x00000000 - .data 0x00000000 diff --git a/system/client-functions/BugFixes/BugFixes.3___.patch.s b/system/client-functions/BugFixes/BugFixes.3___.patch.s new file mode 100644 index 00000000..416d2c8f --- /dev/null +++ b/system/client-functions/BugFixes/BugFixes.3___.patch.s @@ -0,0 +1,882 @@ +.meta name="Bug fixes" +.meta description="Fixes many minor\ngameplay, sound,\nand graphical bugs" +# Most original codes by Ralf @ GC-Forever and Aleron Ives, except where noted +# https://www.gc-forever.com/forums/viewtopic.php?t=2050 +# https://www.gc-forever.com/forums/viewtopic.php?t=2049 + +.versions 3OJ2 3OJ3 3OJ4 3OJ5 3OE0 3OE1 3OE2 3OP0 + +entry_ptr: +reloc0: + .offsetof start +start: + .include WriteCodeBlocksGC + + + + # Olga Flow Barta Bug Fix (makes barta work on ice weakness Olga Flow instead of damaging player) + + .label g1_hook_call, + .label g1_hook_loc, 0x8000D980 + .data g1_hook_loc + .deltaof g1_hook_start, g1_hook_end + .address g1_hook_loc +g1_hook_start: + lwz r3, [r28] + cmpwi r3, 19 + bnelr + li r3, 0x0002 + blr +g1_hook_end: + + .data g1_hook_call + .data 4 + .address g1_hook_call + bl g1_hook_loc + + + + # Morfos Frozen Player Bug Fix (stops Morfos Laser multi-hitting when player is frozen) + + .label g2_hook_call, + .label g2_hook_loc, 0x8000D9A0 + .data g2_hook_loc + .deltaof g2_hook_start, g2_hook_end + .address g2_hook_loc +g2_hook_start: + lfs f2, [r2 - ] + lwz r3, [r30 + 0x0030] + andi. r3, r3, 0x0020 + beqlr + lfs f2, [r2 - ] + blr +g2_hook_end: + + .data g2_hook_call + .data 4 + .address g2_hook_call + bl g2_hook_loc + + + + # Tiny Grass Assassins Bug Fix + + .data + .data 4 + b +0x10 + + + + # Bulclaw HP Bug Fix + + .data + .data 8 + bl +0x024C + sth [r3 + 0x032C], r30 + + + + # Control Tower: Delbiter Death SFX Bug Fix + + .label g3_patch_loc, + .data g3_patch_loc + .deltaof g3_code_start, g3_code_end + .address g3_patch_loc +g3_code_start: + b +0x20 + subi r3, r3, 0x57D0 + lwz r0, [r13 - ] + cmpwi r0, 35 + bne g3_skip + subi r3, r3, 0x04D8 +g3_skip: + b +0x8C +g3_code_end: + + .data + .data 0x00000004 + b -0x9C + + + + # Weapon Attributes Patch (allows attributes to work on minibosses and Olga Flow) + + .label g4_hook_call1, + .label g4_hook_call2, + .label g4_hook_loc, 0x8000C8C0 + .data g4_hook_loc + .deltaof g4_hook_start, g4_hook_end + .address g4_hook_loc +g4_hook_start: + andi. r0, r0, 0x000F +g4_hook_entry2: + andi. r0, r0, 0x004F + cmpwi r0, 4 + blr +g4_hook_end: + + .data g4_hook_call1 + .data 4 + .address g4_hook_call1 + bl g4_hook_start + + .data g4_hook_call2 + .data 4 + .address g4_hook_call2 + bl g4_hook_entry2 + + + + # Ruins Laser Fence SFX Bug Fix + + .data + .data 8 + lis r3, 0x4005 + b +0x9C + + .data + .data 4 + b +0x1C + + + + # SFX Cancellation Distance Bug Fix + + .data + .data 4 + .float 22500 + + .data + .data 4 + .float 200 + + + + # Foie SFX Pitch Bug Fix + + .data + .data 4 + li r4, 0xFFFFFF00 + + .data + .data 4 + li r4, 0xFFFFFE80 + + .data + .data 4 + li r4, 0xFFFFFDB0 + + + + # Gifoie SFX Pitch Bug Fix + + .data + .data 4 + li r4, 0xFFFFFF00 + + .data + .data 4 + li r4, 0xFFFFFE80 + + .data + .data 4 + li r4, 0xFFFFFDB0 + + + + # Rafoie SFX Pitch Bug Fix + + .data + .data 4 + li r4, 0xFFFFFF00 + + .data + .data 4 + li r4, 0xFFFFFE80 + + .data + .data 4 + li r4, 0xFFFFFDB0 + + .data + .data 4 + li r4, 0xFFFFFF00 + + .data + .data 4 + li r4, 0xFFFFFE80 + + .data + .data 4 + li r4, 0xFFFFFDB0 + + + + # Barta SFX Pitch Bug Fix + + .data + .data 4 + li r4, 0xFFFFFF00 + + .data + .data 4 + li r4, 0xFFFFFE80 + + .data + .data 4 + li r4, 0xFFFFFDB0 + + + + # Gibarta SFX Pitch Bug Fix + + .data + .data 4 + li r4, 0xFFFFFF00 + + .data + .data 4 + li r4, 0xFFFFFE80 + + .data + .data 4 + li r4, 0xFFFFFDB0 + + + + # Rabarta SFX Pitch Bug Fix + + .data + .data 4 + li r4, 0xFFFFFF00 + + .data + .data 4 + li r4, 0xFFFFFE80 + + .data + .data 4 + li r4, 0xFFFFFDB0 + + + + # Zonde SFX Pitch Bug Fix + + .data + .data 4 + li r4, 0xFFFFFF00 + + .data + .data 4 + li r4, 0xFFFFFE80 + + .data + .data 4 + li r4, 0xFFFFFDB0 + + + + # Gizonde SFX Pitch Bug Fix + + .data + .data 4 + li r4, 0xFFFFFF00 + + .data + .data 4 + li r4, 0xFFFFFE80 + + .data + .data 4 + li r4, 0xFFFFFDB0 + + + + # Razonde SFX Pitch Bug Fix + + .data + .data 4 + li r4, 0xFFFFFF00 + + .data + .data 4 + li r4, 0xFFFFFE80 + + .data + .data 4 + li r4, 0xFFFFFDB0 + + + + # Grants SFX Pitch Bug Fix + + .data + .data 4 + li r4, 0xFFFFFF00 + + .data + .data 4 + li r4, 0xFFFFFE80 + + .data + .data 4 + li r4, 0xFFFFFDB0 + + + + # Megid SFX Pitch Bug Fix + + .data + .data 4 + li r4, 0xFFFFFF00 + + .data + .data 4 + li r4, 0xFFFFFE80 + + .data + .data 4 + li r4, 0xFFFFFDB0 + + + + # Anti SFX Pitch Bug Fix + + .data + .data 4 + cmpwi r0, 1 + + + + # Shield DFP/EVP Bug Fix (allows shields to reach true max DFP/EVP values) + + .data + .data 4 + lbz r0, [r4 + 0x0016] + + .data + .data 4 + lbz r0, [r4 + 0x0017] + + + + # VR Spaceship Item Drop Bug Fix (allows items to drop from enemies above a certain Y position) + + .data + .data 4 + .float 220 + + + + # Invalid Items Bug Fix + + .data + .data 0x0C + mr r3, r0 + subi r3, r3, 0x0001 + b -0x18 + + .data + .data 0x0C + mr r3, r0 + subi r3, r3, 0x0001 + b -0x18 + + .data + .data 0x0C + mr r4, r0 + subi r4, r4, 0x0001 + b -0x18 + + + + # Item Removal Maxed Stats Bug Fix + + .label g5_hook1_call, + .label g5_hook1_ret, + .label g5_hook2_call, + .label g5_hook3_call, + .label g5_hook3_ret, + .label g5_hook3_apply_bonuses, + .label g5_hooks_loc, 0x8000B088 + .data g5_hooks_loc + .deltaof g5_hook1_start, g5_hooks_end + .address g5_hooks_loc +g5_hook1_start: + mr r3, r29 + li r4, 0x0000 + bl [] + mr r3, r29 + b g5_hook1_ret +g5_hook2_start: + lbz r0, [r31] + cmplwi r9, 1 + bnelr + lbz r0, [r31 + 1] + addi r31, r31, 2 + blr +g5_hook3_start: + li r9, 0x0000 + bl g5_hook3_apply_bonuses + mr r3, r26 + mr r4, r27 + mr r5, r28 + mr r6, r29 + mr r7, r30 + mr r8, r31 + li r9, 1 + bl g5_hook3_apply_bonuses + b g5_hook3_ret +g5_hooks_end: + + .data g5_hook1_call + .data 4 + .address g5_hook1_call + b g5_hook1_start + + .data g5_hook2_call + .data 4 + .address g5_hook2_call + bl g5_hook2_start + + .data g5_hook3_call + .data 4 + .address g5_hook3_call + b g5_hook3_start + + .label g5_hook4_loc, 0x8000C3F8 + .label g5_hook4_call, + .label g5_hook4_ret, + .label TItemEquipBase_v16, + .label TItemEquipBase_v17, + .data g5_hook4_loc + .deltaof g5_hook4_start, g5_hook4_end + .address g5_hook4_loc +g5_hook4_start: + cmplwi r4, 0 + beqlr + stwu [r1 - 0x0010], r1 + b g5_hook4_ret +g5_hook4_entry: + stwu [r1 - 0x20], r1 + mflr r0 + stw [r1 + 0x24], r0 + stmw [r1 + 0x08], r26 + mr r31, r3 + bl g5_hook4_start + li r30, 0 + addi r29, r31, 0x0D04 + lwz r27, [r31 + 0x032C] +g5_hook4_again: + lwz r28, [r29] + mr. r3, r28 + beq g5_hook4_skip + li r4, 1 + bl TItemEquipBase_v17 + mr r3, r28 + li r4, 1 + bl TItemEquipBase_v16 +g5_hook4_skip: + addi r29, r29, 4 + addi r30, r30, 1 + cmpwi r30, 13 + blt g5_hook4_again + stw [r31 + 0x032C], r27 + lmw r26, [r1 + 0x08] + lwz r0, [r1 + 0x24] + mtlr r0 + addi r1, r1, 0x0020 + blr +g5_hook4_end: + + .data g5_hook4_call + .data 4 + .address g5_hook4_call + b g5_hook4_entry + + + + # Unit Present Bug Fix + + .label g6_hook_loc, 0x8000C640 + .label g6_hook_call, + .data g6_hook_loc + .deltaof g6_hook_start, g6_hook_end + .address g6_hook_loc +g6_hook_start: + rlwinm. r0, r4, 0, 25, 25 + beq g6_hook_skip + li r4, 0x0000 +g6_hook_skip: + addi r0, r4, 0x0009 + blr +g6_hook_end: + + .data g6_hook_call + .data 4 + .address g6_hook_call + bl g6_hook_start + + + + # Bank Item Stacking Bug Fix + + .label g7_hook1_loc, 0x8000C6D0 + .label g7_hook1_call, + .label g7_hook2_call, + .data g7_hook1_loc + .deltaof g7_hook1_start, g7_hooks_end + .address g7_hook1_loc +g7_hook1_start: + li r0, 1 + stw [r29 + 0x54], r0 + lwz r3, [r29 + 0x24] + blr +g7_hook2_start: + li r0, 1 + stw [r31 + 0x0378], r0 + lwz r3, [r31 + 0x24] + blr +g7_hooks_end: + + .data g7_hook1_call + .data 4 + .address g7_hook1_call + bl g7_hook1_start + + .data g7_hook2_call + .data 4 + .address g7_hook2_call + bl g7_hook2_start + + + + # Dropped Mag Color Bug Fix + + .data + .data 4 + li r0, 0x12 + + + + # Meseta Drop System Bug Fix + + .data + .data 4 + b +0x0C + + .data + .data 4 + mr r3, r0 + + + + # Present Color Bug Fix + + .only_versions 3OJ2 3OE0 3OE1 + .data + .data 4 + nop + .all_versions + + + + # Offline Quests Drop Table Bug Fix + + .data + .data 4 + beq +0x0C + + + + # Mag Revival Priority Bug Fix + + .label g8_hook_loc, 0x8000C8A0 + .label g8_hook_call, + .data g8_hook_loc + .deltaof g8_hook_start, g8_hook_end + .address g8_hook_loc +g8_hook_start: + mulli r0, r0, 10 + rlwinm. r4, r31, 0, 30, 30 + beqlr + extsh r0, r29 + blr +g8_hook_end: + + .data g8_hook_call + .data 4 + .address g8_hook_call + bl g8_hook_start + + + + # Mag Revival Challenge & Quest Mode Bug Fix + + .data + .data 4 + b +0x10 + + + + # Chat Bubble Window TAB Bug Fix + + .data + .data 4 + nop + + + + # Chat Log Window LF/Tab Bug Fix + + .data + .data 4 + nop + + + + # Dark/Hell Special GFX Bug Fix (makes Dark/Hell display graphic on success like in PSO BB) + + .label g9_hook_loc, 0x8000E1E0 + .label g9_hook_call1, + .label g9_hook_call2, + .data g9_hook_loc + .deltaof g9_hook_start, g9_hook_end + .address g9_hook_loc +g9_hook_start: + mflr r30 + li r5, 0x0000 + li r6, 0x001E + li r7, 0x0040 + bl [] + mtlr r30 + blr +g9_hook_end: + + .data g9_hook_call1 + .data 4 + .address g9_hook_call1 + bl g9_hook_start + + .data g9_hook_call2 + .data 4 + .address g9_hook_call2 + bl g9_hook_start + + .data + .data 4 + li r4, 0x01E8 + + .data + .data 4 + li r4, 0x01E8 + + + + # Gol Dragon Camera Bug Fix (makes the camera after Gol Dragon display "normally") + + .data + .data 4 + cmpwi r3, 1 + + + + # Box/Fence Fadeout Bug Fix (stops boxes and other environmental objects fading in and out as you approach) + + .data + .data 4 + nop + + .data + .data 4 + nop + + + + # TP Bar Color Bug Fix + + .data + .data 4 + subi r4, r4, 0x5506 + + .data + .data 4 + subi r3, r3, 0x5506 + + .data + .data 4 + subi r4, r3, 0x5506 + + .data + .data 4 + .data 0xFF0074EE + + + + # Devil's and Demon's Special Damage Display Bug Fix + + .data + .data 4 + b -0x0340 + + + + # Christmas Trees Bug Fix + + .label g10_hook_loc, 0x8000B5C8 + .label g10_hook_call, + .label g10_hook_ret, + .data g10_hook_loc + .deltaof g10_hook_start, g10_hook_end + .address g10_hook_loc +g10_hook_start: + lwz r3, [r3 + 0x98] + bl [] + lwz r3, [r31 + 0x042C] + lwz r4, [r31 + 0x0430] + b g10_hook_ret +g10_hook_end: + + .data g10_hook_call + .data 4 + .address g10_hook_call + b g10_hook_start + + .data + .data 4 + nop + + + + # Rain Drops Color Bug Fix + + .data + .data 8 + .data 0x70808080 + .data 0x60707070 + + + + # Reverser Target Lock Bug Fix + + .data + .data 4 + addi r4, r31, 0x02FC + + + + # Deband/Shifta/Resta Target Bug Fix + + .data + .data 4 + bgt +0x0630 + + .only_versions 3OJ2 3OE0 3OE1 + .data + .data 4 + bgt +0x033C + + .data + .data 4 + bgt +0x0248 + .all_versions + + + + # Tech Auto Targeting Bug Fix + + .data + .data 4 + nop + + .data + .data 4 + .data 0x0000001E + + .data + .data 4 + .data 0x00000028 + + .data + .data 4 + .data 0x00000032 + + .data + .data 4 + .data 0x0000003C + + .data + .data 4 + .data 0x0018003C + + .data + .data 4 + .data 0x00000028 + + + + # Enable Trap Animations + + .label g11_hook_loc, 0x8000BBD0 + .label g11_hook_call, + .data g11_hook_loc + .deltaof g11_hook_start, g11_hook_end + .address g11_hook_loc +g11_hook_start: + lwz r4, [r31 + 0x0370] + subi r4, r4, 0x0400 + stw [r31 + 0x0370], r4 + lwz r3, [r31 + 0x14] + cmplwi r3, 0 + beqlr + stw [r3 + 0x0060], r4 + blr +g11_hook_end: + + .data g11_hook_call + .data 4 + .address g11_hook_call + bl g11_hook_start + + .data + .data 4 + ori r0, r4, 0x0420 + + + + # Belra arm bug fix (this part by fuzziqersoftware) + + .only_versions 3OJ2 3OE0 3OE1 + .label g12_hook1_call, + .label g12_hook2_call, + .label g12_hook_loc, 0x8000B06C + .data g12_hook_loc + .deltaof g12_hook1_start, g12_hook_end + .address g12_hook_loc +g12_hook1_start: + li r0, 1 + stw [r13 - ], r0 # Anchor: 80039388 @ 3OE1 + b [] +g12_hook2_start: + li r4, 0 + stw [r13 - ], r4 + lwz r4, [r28 + 0x04] + blr +g12_hook_end: + + .data g12_hook1_call + .data 4 + .address g12_hook1_call + bl g12_hook1_start + + .data g12_hook2_call + .data 4 + .address g12_hook2_call + bl g12_hook2_start + + .all_versions + + + + .data 0 + .data 0