3
0
mirror of https://github.com/CrazyRedMachine/popnhax.git synced 2024-11-23 22:00:57 +01:00

fix local favorites, tachi rivals, rework score challenge

This commit is contained in:
CrazyRedMachine 2024-10-02 21:17:09 +02:00
parent 44886c4a48
commit e7484fad5e
3 changed files with 58 additions and 11 deletions

View File

@ -27,7 +27,8 @@ typedef struct songlist_s {
} songlist_t;
uint8_t g_game_version;
uint32_t g_playerdata_ptr_addr; //pointer to the playerdata memory zone (offset 0x08 is popn friend ID as ascii (12 char long), offset 0x1A5 is "is logged in" flag)
uint32_t g_playerdata_ptr_addr; //pointer to the playerdata memory zone (offset 0x08 is popn friend ID as ascii (12 char long), offset g_loggedin_offset is "is logged in" flag)
uint32_t g_loggedin_offset;
char *g_current_friendid;
uint32_t g_current_songid;
@ -212,12 +213,13 @@ void categ_inject_favorites()
__asm("mov ecx, dword ptr [_g_playerdata_ptr_addr]\n");
__asm("mov edx, [ecx]\n");
__asm("add edx, 0x1A5\n"); //offset where result screen is checking to decide if the favorite option should be displayed/handled
__asm("add edx, [_g_loggedin_offset]\n"); //offset where result screen is checking to decide if the favorite option should be displayed/handled
__asm("mov ecx, [edx]\n");
__asm("cmp ecx, 0\n");
__asm("jne skip_fake_login\n");
__asm("mov dword ptr [edx], 0xFF000001\n");
__asm("sub edx, 0x19D\n"); //back to popn friendid offset
__asm("sub edx, [_g_loggedin_offset]\n");
__asm("add edx, 8\n"); //back to popn friendid offset
__asm("mov dword ptr [edx], 0x61666564\n"); // "defa"
__asm("add edx, 0x04\n");
__asm("mov dword ptr [edx], 0x00746C75\n"); // "ult"
@ -728,7 +730,10 @@ void hook_remove_fake_login()
__asm("jne skip_remove_login\n");
//fake login detected, cleanup
__asm("lea ecx, [eax+0x1A5]\n"); //login status offset
__asm("push ebx\n");
__asm("mov ebx, [_g_loggedin_offset]\n");
__asm("lea ecx, [eax+ebx]\n"); //login status offset
__asm("pop ebx\n");
__asm("mov dword ptr [ecx], 0x00000000\n");
__asm("skip_remove_login:\n");
@ -753,6 +758,20 @@ static bool patch_favorite_categ(const char *game_dll_fn, bool with_numpad9_patc
add_song_in_list = (void (*)())(data + pattern_offset - 0x12);
}
//retrieve logged in status offset from playerdata
{
int64_t pattern_offset = _search(data, dllSize, "\xBF\x07\x00\x00\x00\xC6\x85", 7, 0);
if (pattern_offset == -1) {
LOG("popnhax: local_favorites: cannot find result screen function\n");
return false;
}
uint64_t function_call_addr = (int64_t)(data + pattern_offset + 0x1D);
uint32_t function_offset = *((uint32_t*)(function_call_addr +0x01));
uint64_t function_addr = function_call_addr+5+function_offset;
g_loggedin_offset = *(uint32_t*)(function_addr+2);
//LOG("LOGGED IN OFFSET IS %x\n",g_loggedin_offset); // 0x1A5 for popn27-, 0x22D for popn28
}
// patch category handling jumptable to add our processing
{
int64_t pattern_offset = _search(data, dllSize, "\x83\xF8\x10\x77\x75\xFF\x24\x85", 8, 0);

View File

@ -4744,7 +4744,8 @@ void score_challenge_retrieve_addr()
void (*score_challenge_prep_songdata)();
void (*score_challenge_song_inject)();
void (*score_challenge_test_if_logged1)();
void (*score_challenge_retrieve_player_data)();
void (*score_challenge_is_logged_in)();
void (*score_challenge_test_if_normal_mode)();
void (*real_make_score_challenge_category)();
@ -4756,8 +4757,8 @@ void make_score_challenge_category()
if (g_course_id_ptr && *g_course_id_ptr != 0)
{
score_challenge_test_if_logged1();
__asm("mov al, byte ptr ds:[eax+0x1A5]\n"); /* or look for this function 8A 80 A5 01 00 00 C3 CC */
score_challenge_retrieve_player_data();
score_challenge_is_logged_in();
__asm("test al, al\n");
__asm("je leave_score_challenge\n");
@ -4837,7 +4838,18 @@ static bool patch_score_challenge()
uint64_t patch_addr = (int64_t)data + pattern_offset + 0x24;
score_challenge_test_if_logged1 = (void(*)())patch_addr;
score_challenge_retrieve_player_data = (void(*)())patch_addr;
}
{
int64_t pattern_offset = _search(data, dllSize, "\xE8\xDB\xFF\xFF\xFF\x33\xC9\x84\xC0\x0F\x94", 11, 0);
if (pattern_offset == -1) {
LOG("popnhax: score challenge: cannot find check if logged function\n");
return false;
}
uint64_t patch_addr = (int64_t)data + pattern_offset - 0x20;
score_challenge_is_logged_in = (void(*)())patch_addr;
}
{
int64_t pattern_offset = _search(data, dllSize, "\xF7\xD8\x1B\xC0\x40\xC3\xE8", 7, 0);

View File

@ -204,7 +204,8 @@ struct MemoryStruct g_curl_data;
score_info_t *g_score_info;
song_info_t *g_song_info;
uint32_t *g_song_info_zone;
uint32_t g_playerdata_zone_addr; //pointer to the playerdata memory zone (offset 0x08 is popn friend ID as ascii (12 char long), offset 0x44 is rival count, offset 0x1A5 is "is logged in" flag)
uint32_t g_playerdata_zone_addr; //pointer to the playerdata memory zone (offset 0x08 is popn friend ID as ascii (12 char long), offset 0x44 is rival count, g_tachi_loggedin_offset is "is logged in" flag)
uint32_t g_tachi_loggedin_offset;
uint16_t g_stage_offset = 0x504; // 0x508 in later games, overwritten when setting up the patches
uint32_t g_need_conf_load = 1;
uint32_t g_hidden_is_offset = 0; // mask "hidden" value behavior in score send
@ -925,12 +926,13 @@ void hook_mode_select_rival_inject()
/* fake login to prevent rival handling bypass */
__asm("mov ecx, dword ptr [_g_playerdata_zone_addr]\n");
__asm("mov edx, [ecx]\n");
__asm("add edx, 0x1A5\n"); //offset where result screen is checking to decide if the favorite option should be displayed/handled
__asm("add edx, [_g_tachi_loggedin_offset]\n"); //offset where result screen is checking to decide if the favorite option should be displayed/handled
__asm("mov ecx, [edx]\n");
__asm("cmp ecx, 0\n");
__asm("jne skip_fake_login_tachi\n");
__asm("mov dword ptr [edx], 0xFF000001\n");
__asm("sub edx, 0x19D\n"); //back to popn friendid offset
__asm("sub edx, [_g_tachi_loggedin_offset]\n");
__asm("add edx, 8\n"); //back to popn friendid offset
__asm("mov dword ptr [edx], 0x61666564\n"); // "defa"
__asm("add edx, 0x04\n");
__asm("mov dword ptr [edx], 0x00746C75\n"); // "ult"
@ -1138,6 +1140,20 @@ bool patch_tachi_rivals(const char *dllFilename, bool scorehook)
}
/* hook after mode select logged in check */
//retrieve logged in status offset from playerdata
{
int64_t pattern_offset = _search(data, dllSize, "\xBF\x07\x00\x00\x00\xC6\x85", 7, 0);
if (pattern_offset == -1) {
LOG("popnhax: tachi rivals: cannot find result screen function\n");
return false;
}
uint64_t function_call_addr = (int64_t)(data + pattern_offset + 0x1D);
uint32_t function_offset = *((uint32_t*)(function_call_addr +0x01));
uint64_t function_addr = function_call_addr+5+function_offset;
g_tachi_loggedin_offset = *(uint32_t*)(function_addr+2);
//LOG("LOGGED IN OFFSET IS %x\n",g_tachi_loggedin_offset); // 0x1A5 for popn27-, 0x22D for popn28
}
{
int64_t pattern_offset = _search(data, dllSize, "\x8B\xE5\x5D\xC3\x8B\xC6\xE8", 7, 0);