From 8f500c7dd0bda393bc2ef0b99d0fd43a4b836f2e Mon Sep 17 00:00:00 2001 From: CrazyRedMachine Date: Wed, 2 Oct 2024 21:17:09 +0200 Subject: [PATCH] fix custom categ, quick retry --- .../tex/system28/ms_ifs/cate_cc.png | Bin 0 -> 11470 bytes popnhax/custom_categs.cc | 121 +++++++++++++----- popnhax/dllmain.cc | 39 ++++-- util/patch.cc | 6 +- util/patch.h | 2 +- 5 files changed, 125 insertions(+), 43 deletions(-) create mode 100644 dist/popnhax/data_mods/_popnhax_assets/tex/system28/ms_ifs/cate_cc.png diff --git a/dist/popnhax/data_mods/_popnhax_assets/tex/system28/ms_ifs/cate_cc.png b/dist/popnhax/data_mods/_popnhax_assets/tex/system28/ms_ifs/cate_cc.png new file mode 100644 index 0000000000000000000000000000000000000000..d17adcd182e9dee98daa9a758254a911c5e8159a GIT binary patch literal 11470 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 %d)", min_id); diff --git a/popnhax/dllmain.cc b/popnhax/dllmain.cc index 1449157..d88e6a9 100644 --- a/popnhax/dllmain.cc +++ b/popnhax/dllmain.cc @@ -1929,8 +1929,11 @@ static bool patch_normal0() { int64_t pattern_offset = search(data, dllSize, "\x83\xC4\x08\x8B\xF8\x89\x7C\x24\x3C", 9, 0); if (pattern_offset == -1) { - LOG("popnhax: Couldn't find song list display function\n"); - return false; + pattern_offset = search(data, dllSize, "\x83\xC4\x08\x8B\xF8\x89\x7C\x24\x44", 9, 0); + if (pattern_offset == -1) { + LOG("popnhax: normal0: Couldn't find song list display function\n"); + return false; + } } uint64_t patch_addr = (int64_t)data + pattern_offset; @@ -3536,12 +3539,18 @@ static bool patch_quick_retire(bool pfree) /* retrieve songstart function pointer for quick retry */ { int64_t pattern_offset = search(data, dllSize, "\xE9\x0C\x01\x00\x00\x8B\x85", 7, 0); + int delta = -4; if (pattern_offset == -1) { - LOG("popnhax: quick retry: cannot retrieve song start function\n"); - return false; + delta = 18; + pattern_offset = search(data, dllSize, "\x6A\x00\xB8\x17\x00\x00\x00\xE8", 8, 0); + if (pattern_offset == -1) { + LOG("popnhax: quick retry: cannot retrieve song start function\n"); + return false; + } } - uint64_t patch_addr = (int64_t)data + pattern_offset - 4; + + uint64_t patch_addr = (int64_t)data + pattern_offset + delta; g_startsong_addr = *(uint32_t*)(patch_addr); } @@ -4834,8 +4843,11 @@ static bool patch_score_challenge() { int64_t pattern_offset = search(data, dllSize, "\x83\xF8\x10\x77\x75\xFF\x24\x85", 8, 0); if (pattern_offset == -1) { - LOG("popnhax: score challenge: cannot find category building loop\n"); - return false; + pattern_offset = search(data, dllSize, "\x83\xF8\x11\x77\x7C\xFF\x24\x85", 8, 0); // jam&fizz + if (pattern_offset == -1) { + LOG("popnhax: score challenge: cannot find category building loop\n"); + return false; + } } uint64_t patch_addr = (int64_t)data + pattern_offset + 0x66; @@ -6973,12 +6985,19 @@ static bool patch_record_mode(bool quickretire) { int64_t pattern_offset = search(data, dllSize, "\xE9\x0C\x01\x00\x00\x8B\x85", 7, 0); + int delta = -4; + if (pattern_offset == -1) { - LOG("popnhax: record reload: cannot retrieve song start function\n"); - return false; + delta = 18; + pattern_offset = search(data, dllSize, + "\x6A\x00\xB8\x17\x00\x00\x00\xE8", 8, 0); + if (pattern_offset == -1) { + LOG("popnhax: record reload: cannot retrieve song start function\n"); + return false; + } } - uint64_t patch_addr = (int64_t)data + pattern_offset - 4; + uint64_t patch_addr = (int64_t)data + pattern_offset + delta; g_startsong_addr = *(uint32_t*)(patch_addr); } /* instant launch song with numpad 8 on option select (hold 8 during song for quick retry) */ diff --git a/util/patch.cc b/util/patch.cc index 2a231a8..bfc162a 100644 --- a/util/patch.cc +++ b/util/patch.cc @@ -101,13 +101,13 @@ void find_and_patch_string(const char *dllFilename, const char *input_string, co } } -bool find_and_patch_hex(const char *dllFilename, const char *find, uint8_t find_size, int64_t shift, const char *replace, uint8_t replace_size) { +int64_t find_and_patch_hex(const char *dllFilename, const char *find, uint8_t find_size, int64_t shift, const char *replace, uint8_t replace_size) { DWORD dllSize = 0; char *data = getDllData(dllFilename, &dllSize); int64_t pattern_offset = search(data, dllSize, find, find_size, 0); if (pattern_offset == -1) { - return false; + return 0; } #if DEBUG == 1 @@ -137,6 +137,6 @@ bool find_and_patch_hex(const char *dllFilename, const char *find, uint8_t find_ } #endif - return true; + return pattern_offset; } \ No newline at end of file diff --git a/util/patch.h b/util/patch.h index a31bddd..010743c 100644 --- a/util/patch.h +++ b/util/patch.h @@ -14,7 +14,7 @@ bool offset_to_rva(const char *dllFilename, uint32_t offset, uint32_t *rva); void patch_memory(uint64_t patch_addr, char *data, size_t len); -bool find_and_patch_hex(const char *dllFilename, const char *find, uint8_t find_size, int64_t shift, const char *replace, uint8_t replace_size); +int64_t find_and_patch_hex(const char *dllFilename, const char *find, uint8_t find_size, int64_t shift, const char *replace, uint8_t replace_size); void find_and_patch_string(const char *dllFilename, const char *input_string, const char *new_string); #endif \ No newline at end of file