diff --git a/game_re/gh_fix/entry.cxx b/game_re/gh_fix/entry.cxx index 54b1bc13..c49c6d78 100644 --- a/game_re/gh_fix/entry.cxx +++ b/game_re/gh_fix/entry.cxx @@ -51,7 +51,10 @@ void gh_pre_main(void) { // pvStack_14 = ExceptionList; // local_1c = &stack0xffffff88; // ExceptionList = &pvStack_14; + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdeprecated-declarations" DVar1 = GetVersion(); + #pragma clang diagnostic pop DWORD_005cf980 = DVar1 >> 8 & 0xff; DWORD_005cf97c = DVar1 & 0xff; DWORD_005cf978 = DWORD_005cf97c * 0x100 + DWORD_005cf980; diff --git a/game_re/gh_fix/r3_main.cxx b/game_re/gh_fix/r3_main.cxx index e59d9ac1..a01408a3 100644 --- a/game_re/gh_fix/r3_main.cxx +++ b/game_re/gh_fix/r3_main.cxx @@ -69,8 +69,7 @@ int r3_main(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR *cmdline, CHAR pathToUbi_ini[228]; char acStack_528[16]; char acStack_518[244]; - char acStack_424[16]; - CHAR aCStack_414[244]; + char acStack_424[0x104]; char acStack_320[16]; char acStack_310[240]; char acStack_220[256]; @@ -544,9 +543,9 @@ LAB_004017ce: return -1; } p_cTxt2 = (void *)0x401e5a; - GetWindowsDirectoryA(aCStack_414, 0x104); - iVar13 = -1; #if RE_AUTHENTIC == 0 + GetWindowsDirectoryA(acStack_424, 0x104); + iVar13 = -1; /* Append ubi.ini */ pcVar4 = acStack_424; do { @@ -566,6 +565,7 @@ LAB_004017ce: #else strcpy(acStack_424, config.gameRootDir.c_str()); strcat(acStack_424, "/ubi.ini"); + instance = hInstance; #endif /* Read graphics settings */ GetPrivateProfileStringA(lpAppName_005b68f0, s_Adapter_005b68e4, @@ -596,13 +596,6 @@ LAB_004017ce: DuplicateHandle(hSourceProcessHandle, hSourceHandle, hTargetProcessHandle, &duplicatedHandle, DVar7, BVar18, dwOptions); /* Copy cmdline */ - ppCVar8 = puStack_14; - g_mainThreadHandle = duplicatedHandle; - // do { - // uVar14 = *ppCVar8; - // *(char *)(((int)g_appCmdLine - (int)puStack_14) + (int)ppCVar8) = - // (char)uVar14; ppCVar8 = (uint *)((int)ppCVar8 + 1); - // } while ((char)uVar14 != '\0'); LPSTR cmdline = GetCommandLineA(); strncpy(g_appCmdLine, cmdline, std::size(g_appCmdLine)); /* SEM_FAILCRITICALERRORS */ @@ -610,7 +603,7 @@ LAB_004017ce: pcVar4 = strstr(cmdline, s_dashCC); if (pcVar4 == (char *)0x0) { r3_initAllModules(); - iVar13 = setupWindow(instance, uStack_10, g_runMaximized); + iVar13 = setupWindow(instance, 0, g_runMaximized); if (iVar13 == 0) { return -1; } @@ -628,17 +621,19 @@ LAB_004017ce: iVar10 = r3_get_gli_width1(); iVar10 = iVar10 + 0xc; iVar11 = r3_get_gli_height1(); - iVar11 = (int)(rect.top - iVar11) / 2; + iVar11 = (int)(rect.bottom - iVar11) / 2; iVar12 = r3_get_gli_width1(); - MoveWindow(g_gameHWND, (int)(rect.right - iVar12) / 2, iVar11, iVar10, + MoveWindow(g_gameHWND, 0, 0, iVar10, iVar13, BVar18); FUN_004010b0(); +#if RE_AUTHENTIC == 0 DWORD screensaveActive; SystemParametersInfoA(SPI_GETSCREENSAVEACTIVE, 0, &screensaveActive, 0); SystemParametersInfoA(SPI_SETSCREENSAVEACTIVE, 0, (PVOID)0x0, 0); ShowCursor(0); uStack_85c = 0; SystemParametersInfoA(0x61, 1, &uStack_85c, 0); +#endif g_engineRunning = 1; r3_engineLoop(); /* cleanup starts here */ @@ -648,11 +643,13 @@ LAB_004017ce: FUN_004fb300(); FUN_00472150(); FUN_00470db0(); +#if RE_AUTHENTIC == 0 uStack_85c = 0; SystemParametersInfoA(0x61, 0, &uStack_85c, 0); ShowCursor(1); SystemParametersInfoA(0x11, uiParam, (PVOID)0x0, 0); - CloseHandle(lpBuffer); +#endif + CloseHandle(duplicatedHandle); } return 0; } diff --git a/game_re/gh_fix/r3_read_gli_config.cxx b/game_re/gh_fix/r3_read_gli_config.cxx new file mode 100644 index 00000000..3c849d3b --- /dev/null +++ b/game_re/gh_fix/r3_read_gli_config.cxx @@ -0,0 +1,106 @@ +// AUTO-GENERATED FILE, MOVE TO 'gh_fix' FOLDER PREVENT OVERWRITING!!!!! + +#include +#include +#include + +extern "C" { +undefined +r3_config_setIdentifier(char *param_1); // 00470570 // r3_config_setIdentifier +void r3_set_GameDataPath(char *param_1); // 0055a8d0 // r3_set_GameDataPath +void r3_config_setTexturesMem( + char *param_1); // 00470f30 // r3_config_setTexturesMem +void r3_noop(void *p_cTxt1, void *p_cTxt2); // 00401100 // r3_noop +undefined +r3_read_game_config_udp_port(void); // 00446040 // r3_read_game_config_udp_port +undefined +r3_config_setGLIMode(char *param_1); // 004704e0 // r3_config_setGLIMode +undefined r3_read_game_config_modem_quality( + void); // 00445fc0 // r3_read_game_config_modem_quality + +// 004460c0 +/* WARNING: Inlined function: r3_config_set_adapter */ +/* WARNING: Inlined function: r3_config_setTexturesCompressed */ +/* WARNING: Inlined function: r3_config_setTnl */ +/* WARNING: Inlined function: r3_config_setTrilinearFiltering */ + +void r3_read_gli_config(void) + +{ + UINT tempOutVal; + void *pcVar2; + void *pcVar3; + HANDLE hProcess; + int iVar4; + char *pcVar1; + char *pcVar4; + void *in_stack_fffffce0; + char *ptr0; + char *ptr1; + char local_218[20]; + char local_204[168]; + char local_15c[32]; + char stringBuffer[256]; + char cVar1; + DWORD_PTR dwProcessAffinityMask; + + const char *iniPath = getIniPath(); + + GetPrivateProfileStringA(lpAppName_005b68f0, s_GLI_Mode_005be3e0, + g_default_display_mode, stringBuffer, 0xff, iniPath); + r3_config_setGLIMode(stringBuffer); + g_GLI_adapter = + GetPrivateProfileIntA(lpAppName_005b68f0, s_Adapter_005b68e4, 0, iniPath); + /* set adapter */ + GetPrivateProfileStringA(lpAppName_005b68f0, s_Identifier_005b6420, + (LPCSTR)&lpDefault_005cf96c, stringBuffer, 0xff, + iniPath); + r3_config_setIdentifier(stringBuffer); + tempOutVal = GetPrivateProfileIntA(lpAppName_005b68f0, + s_TexturesCompressed_005be3cc, 0, iniPath); + g_config_tex_compressed = (undefined1)tempOutVal; + tempOutVal = + GetPrivateProfileIntA(lpAppName_005b68f0, (LPCSTR)&s_Tnl, 0, iniPath); + g_GLI_tnl = (undefined1)tempOutVal; + tempOutVal = GetPrivateProfileIntA(lpAppName_005b68f0, s_TriLinear_005be3bc, + 0, iniPath); + g_GLI_trilinear = (undefined1)tempOutVal; + pcVar2 = (void *)GetPrivateProfileIntA(lpAppName_005b68f0, + s_DynamicShadows_005be3ac, 0, iniPath); + pcVar3 = (void *)GetPrivateProfileIntA(lpAppName_005b68f0, + s_StaticShadows_005be39c, 0, iniPath); + //r3_noop(pcVar2, pcVar3); + pcVar2 = (void *)GetPrivateProfileIntA(lpAppName_005b68f0, s_Outline_005be394, + 0, iniPath); + //r3_noop(pcVar2, in_stack_fffffce0); + GetPrivateProfileStringA(lpAppName_005b68f0, s_TexturesMem_005be384, + (LPCSTR)&s_Agp, stringBuffer, 0xff, iniPath); + r3_config_setTexturesMem(stringBuffer); + GetPrivateProfileStringA(lpAppName_005b68f0, s_SoundOnHD_005be374, "0", + stringBuffer, 0x104, iniPath); + sscanf(stringBuffer, s_percent_d, &g_soundOnHD); + GetPrivateProfileStringA(lpAppName_005b68f0, s_Complete_005be364, "1", + stringBuffer, 0x104, iniPath); + sscanf(stringBuffer, s_percent_d, &g_complete); + g_config_unused0 = 0; + g_config_camera_hor_axis = GetPrivateProfileIntA( + lpAppName_005b68f0, s_Camera_HorizontalAxis_005be34c, 2, iniPath); + g_config_camera_ver_axis = GetPrivateProfileIntA( + lpAppName_005b68f0, s_Camera_VerticalAxis_005be338, 5, iniPath); + GetPrivateProfileStringA(lpAppName_005b68f0, s_StartDirectory_005be31c, + s_Gamedata_005be32c, stringBuffer, 0x104, iniPath); + r3_set_GameDataPath(stringBuffer); + GetPrivateProfileStringA(lpAppName_005b68f0, s_SingleProcessor_005be308, "No", + stringBuffer, 0x104, iniPath); + /* Set single processor mode */ + iVar4 = strcmpi(stringBuffer, (char *)&s_Yes); + if (iVar4 == 0) { + dwProcessAffinityMask = 1; + hProcess = GetCurrentProcess(); + SetProcessAffinityMask(hProcess, dwProcessAffinityMask); + } + r3_read_game_config_modem_quality(); + r3_read_game_config_udp_port(); + return; +} +} diff --git a/game_re/gh_fix/r3_windowProc.cxx b/game_re/gh_fix/r3_windowProc.cxx new file mode 100644 index 00000000..a422a675 --- /dev/null +++ b/game_re/gh_fix/r3_windowProc.cxx @@ -0,0 +1,63 @@ +// AUTO-GENERATED FILE, MOVE TO 'gh_fix' FOLDER PREVENT OVERWRITING!!!!! + +#include +#include + +extern "C" { +undefined r3_windowUnlockCursor(void); // 004013a0 // r3_windowUnlockCursor +undefined FUN_00401320(void); // 00401320 // FUN_00401320 + +// 004025e0 +long CALLBACK r3_windowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) + +{ + long lVar1; + + if (uMsg < WM_SETCURSOR + 1) { + if (uMsg == WM_SETCURSOR) { + if (((g_engineShouldRun != 0) && (g_engineRunning != 0)) && (g_runMaximized != 0)) { + FUN_00401320(); + return 1; + } + } + else { + if (uMsg == WM_CLOSE) { + r3_windowUnlockCursor(); + g_windowCloseRequested = 1; + if (g_drawSemaphore != (HANDLE)0x0) { + CloseHandle(g_drawSemaphore); + } + g_drawSemaphore = (HANDLE)0x0; + PostQuitMessage(0); + return 0; + } + if (uMsg == WM_ACTIVATEAPP) { + g_engineShouldRun = wParam; + } + } + } + else { + if (uMsg != WM_NCHITTEST) { + if (uMsg != WM_SYSCOMMAND) goto LAB_004026ab; + /* handle SYSCOMMAND */ + if (wParam < SC_MAXIMIZE + 1) { + if ((wParam != SC_MAXIMIZE) && ((wParam != SC_SIZE && (wParam != SC_MOVE)))) + goto LAB_004026ab; + } + else if ((wParam != SC_KEYMENU) && (wParam != SC_MONITORPOWER)) goto LAB_004026ab; + } + /* WM_NCHITTEST + */ + if (g_runMaximized != 0) { + return 1; + } + } +LAB_004026ab: + /* WARNING: Could not recover jumptable at 0x004026b3. Too many branches */ + /* WARNING: Treating indirect jump as call */ + lVar1 = DefWindowProcA(hwnd,uMsg,wParam,lParam); + return lVar1; +} + +} + diff --git a/game_re/gh_fix/setupWindow.cxx b/game_re/gh_fix/setupWindow.cxx new file mode 100644 index 00000000..23dae1cc --- /dev/null +++ b/game_re/gh_fix/setupWindow.cxx @@ -0,0 +1,105 @@ +// AUTO-GENERATED FILE, MOVE TO 'gh_fix' FOLDER PREVENT OVERWRITING!!!!! + +#include +#include + +extern "C" { +long CALLBACK r3_windowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); // 004025e0 // r3_windowProc +undefined fn_bCreateMainDisplayScreen(void); // 004022f0 // fn_bCreateMainDisplayScreen +void loadSplashBitmap(HWND unused); // 00402450 // loadSplashBitmap +void setGameHWND3(HWND wnd); // 0043e620 // setGameHWND3 + +// 00402140 +int setupWindow(HINSTANCE instance,undefined4 param_2,int windowedParam) + +{ + ATOM AVar1; + int windowHeight; + int yCaption; + HWND hWnd; + HWND pHVar2; + int r0; + BOOL success; + bool windowed; + GLD_DeviceAttributes *windowParams; + DWORD dwStyle; + WNDCLASSA wndClass; + int showWindow; + int windowWidth; + + g_windowInitialized = 1; + /* WindowClassA (overlaps usage below) */ + wndClass.style = 0x3003; + wndClass.lpfnWndProc = r3_windowProc; + wndClass.cbClsExtra = 0; + wndClass.cbWndExtra = 0; + wndClass.hInstance = instance; + wndClass.hIcon = LoadIconA(instance,(LPCSTR)0x65); + wndClass.hCursor = LoadCursorA((HINSTANCE)0x0,(LPCSTR)0x7f00); + wndClass.hbrBackground = (HBRUSH)COLOR_WINDOWFRAME; + wndClass.lpszMenuName = (LPCSTR)0x0; + wndClass.lpszClassName = g_windowTitle; + AVar1 = RegisterClassA(&wndClass); + if (AVar1 != 0) { + windowed = windowedParam == 0; + if (windowed) { + /* SM_CXSIZEFRAME */ + windowWidth = GetSystemMetrics(32); + /* x*2 + 320 */ + windowWidth = windowWidth * 2 + 320; + /* SM_CYSIZEFRAME, retrieves the size of the vertical resizing border */ + windowHeight = GetSystemMetrics(33); + /* SM_CYCAPTION, The height of a caption area, in pixels */ + yCaption = GetSystemMetrics(4); + /* ebp still 0 at this point */ + windowHeight = yCaption + 240 + windowHeight * 2; + dwStyle = 0x90cf0000; + } + else { + windowHeight = 0xf0; + windowWidth = 0x140; + dwStyle = 0x91000000; + } + hWnd = CreateWindowExA(0,g_windowTitle,g_windowTitle,dwStyle,(uint)windowed,(uint)windowed, + windowWidth,windowHeight,(HWND)0x0,(HMENU)0x0,instance,(LPVOID)0x0); + g_gameHWND1 = hWnd; + if (hWnd != (HWND)0x0) { + g_gameHWND = hWnd; + SetWindowTextA(hWnd,s_windowTitle); + if (windowedParam == 0) { + /* SW_NORMAL */ + showWindow = 1; + } + else { + /* SW_MAXIMIZE */ + showWindow = 3; + } + ShowWindow(hWnd,showWindow); + SetWindowPos(hWnd,(HWND)0x0,0,0,0,0,0x43); + EnableWindow(hWnd,1); + SetFocus(hWnd); + UpdateWindow(hWnd); + SetForegroundWindow(hWnd); + pHVar2 = GetFocus(); + while (pHVar2 != hWnd) { + SetWindowPos(hWnd,(HWND)0x0,0,0,0,0,0x43); + EnableWindow(hWnd,1); + SetFocus(hWnd); + UpdateWindow(hWnd); + SetForegroundWindow(hWnd); + pHVar2 = GetFocus(); + } + setGameHWND3(hWnd); + loadSplashBitmap(hWnd); + /* unused? */ + g_windowInitialized = 1; + r0 = fn_bCreateMainDisplayScreen(); + return r0; + } + } + /* Failed */ + return 0; +} + +} + diff --git a/game_re/gh_global.cxx b/game_re/gh_global.cxx index 6cf12e79..e047e535 100644 --- a/game_re/gh_global.cxx +++ b/game_re/gh_global.cxx @@ -59,6 +59,7 @@ char(&lpAppName_005b68f0)[8] = reinterpret_cast(GH_MEM(0x005b68f0)); const char* s_Directory_005b68f8 = "Directory"; // 005b68f8 const char* s_None = "None"; // 005b6904 const char* s_UbiSoft_Ubi_ini = "/UbiSoft/Ubi.ini"; // 005b690c +const char* s_percent_d = "%d"; // 005bad58 undefined1& g_errModDInput= (undefined1&) GH_MEM(0x005bd29c); undefined4& DAT_005bd454= (undefined4&) GH_MEM(0x005bd454); const char* s__jc_z_d__s_005bd460 = "\\jc\\z%d:%s"; // 005bd460 @@ -70,6 +71,27 @@ const char* s_Die__s_DVDROM_kann_nicht_gelesen_005be130 = "Die %s DVDROM kann ni const char* s_Impossibile_trovare_il_DVD____s_005be198 = "Impossibile trovare il DVD : %s"; // 005be198 const char* s_DVD_s_no_v_lido_005be1ec = "DVD %s no v£lido "; // 005be1ec const char* s_Impossible_de_trouver_le_DVD_____005be238 = "Impossible de trouver le DVD : %s"; // 005be238 +pointer& s_Yes= (pointer&) GH_MEM(0x005be304); +const char* s_SingleProcessor_005be308 = "SingleProcessor"; // 005be308 +const char* lpDefault_005be318 = "No"; // 005be318 +const char* s_StartDirectory_005be31c = "StartDirectory"; // 005be31c +const char* s_Gamedata_005be32c = "Gamedata"; // 005be32c +const char* s_Camera_VerticalAxis_005be338 = "Camera_VerticalAxis"; // 005be338 +const char* s_Camera_HorizontalAxis_005be34c = "Camera_HorizontalAxis"; // 005be34c +const char* s_Complete_005be364 = "Complete"; // 005be364 +const char* lpDefault_005be370 = "1"; // 005be370 +const char* s_SoundOnHD_005be374 = "SoundOnHD"; // 005be374 +const char* lpDefault_005be380 = "0"; // 005be380 +const char* s_TexturesMem_005be384 = "TexturesMem"; // 005be384 +pointer& s_Agp= (pointer&) GH_MEM(0x005be390); +const char* s_Outline_005be394 = "Outline"; // 005be394 +const char* s_StaticShadows_005be39c = "StaticShadows"; // 005be39c +const char* s_DynamicShadows_005be3ac = "DynamicShadows"; // 005be3ac +const char* s_TriLinear_005be3bc = "TriLinear"; // 005be3bc +pointer& s_Tnl= (pointer&) GH_MEM(0x005be3c8); +const char* s_TexturesCompressed_005be3cc = "TexturesCompressed"; // 005be3cc +const char* s_GLI_Mode_005be3e0 = "GLI_Mode"; // 005be3e0 +const char* g_default_display_mode = "1 - 640 x 480 x 16"; // 005be3ec const char* s_Please_insert_the_DVD_in_the_DVD_005be400 = "Please insert the DVD in the DVD-Rom drive."; // 005be400 const char* s_Bitte_legen_Sie_DVD_von_Rayman_3_005be438 = "Bitte legen Sie DVD von Rayman 3 in Ihr DVD-ROM Laufwerk ein."; // 005be438 const char* s_Inserisci_il_DVD_di_Rayman_3_nel_005be484 = "Inserisci il DVD di Rayman 3 nel lettore DVD-ROM."; // 005be484 @@ -78,6 +100,8 @@ const char* s_Veuillez_ins_rer_le_DVD_dans_vot_005be500 = "Veuillez ins←rer le const char* s_fmt_c_colon_s = "%c:%s"; // 005be540 const char* s_r3_program_files = "\\program files\\Ubi Soft\\Rayman3"; // 005be548 const char* s_driveLetterTemplate = "A:\\"; // 005be568 +undefined4& g_config_camera_hor_axis= (undefined4&) GH_MEM(0x005c67c8); +undefined4& g_config_camera_ver_axis= (undefined4&) GH_MEM(0x005c67cc); HWND& g_gameHWND1= (HWND&) GH_MEM(0x005cf964); long& lpDefault_005cf96c= (long&) GH_MEM(0x005cf96c); dword& DWORD_005cf974= (dword&) GH_MEM(0x005cf974); @@ -88,8 +112,13 @@ char *& PTR_005cf9b4= (char *&) GH_MEM(0x005cf9b4); GameStructure& g_currentBinkMovie= (GameStructure&) GH_MEM(0x005d2660); char(&s_volumeNameBuffer)[128] = reinterpret_cast(GH_MEM(0x005d27b0)); r3_main_data& r3_main_data_005d28b6= (r3_main_data&) GH_MEM(0x005d28b6); +undefined4& g_soundOnHD= (undefined4&) GH_MEM(0x005d29bc); +undefined4& g_complete= (undefined4&) GH_MEM(0x005d29c0); +int& g_windowInitialized= (int&) GH_MEM(0x0077d0a4); int& g_runMaximized= (int&) GH_MEM(0x0077d0a8); +undefined4& g_engineShouldRun= (undefined4&) GH_MEM(0x0077d0b0); undefined4& g_engineRunning= (undefined4&) GH_MEM(0x0077d0b4); +undefined4& g_windowCloseRequested= (undefined4&) GH_MEM(0x0077d0b8); HANDLE& g_drawSemaphore= (HANDLE&) GH_MEM(0x0077d0bc); char(&g_mutexName_Rayman3)[256] = reinterpret_cast(GH_MEM(0x0077d0c0)); char(&g_windowTitle)[256] = reinterpret_cast(GH_MEM(0x0077d1c0)); @@ -104,4 +133,9 @@ char *& g_crt_cmdLine= (char *&) GH_MEM(0x0077ea84); char(&s_quitting1)[64] = reinterpret_cast(GH_MEM(0x007825c0)); char(&s_wndStrQuiting)[56] = reinterpret_cast(GH_MEM(0x00782600)); undefined4& DAT_007d9cc4= (undefined4&) GH_MEM(0x007d9cc4); +undefined4& g_config_unused0= (undefined4&) GH_MEM(0x007d9df0); char(&g_driveLetter)[4] = reinterpret_cast(GH_MEM(0x007d9e70)); +undefined4& g_GLI_adapter= (undefined4&) GH_MEM(0x007edd60); +undefined1& g_GLI_tnl= (undefined1&) GH_MEM(0x007edd64); +undefined1& g_config_tex_compressed= (undefined1&) GH_MEM(0x007edd65); +undefined1& g_GLI_trilinear= (undefined1&) GH_MEM(0x007edd66); diff --git a/game_re/gh_global.h b/game_re/gh_global.h index 059918ce..b1901cc5 100644 --- a/game_re/gh_global.h +++ b/game_re/gh_global.h @@ -64,6 +64,7 @@ extern char(&lpAppName_005b68f0)[8]; // 005b68f0 extern const char* s_Directory_005b68f8; // 005b68f8 extern const char* s_None; // 005b6904 extern const char* s_UbiSoft_Ubi_ini; // 005b690c +extern const char* s_percent_d; // 005bad58 extern undefined1& g_errModDInput; // 005bd29c extern undefined4& DAT_005bd454; // 005bd454 extern const char* s__jc_z_d__s_005bd460; // 005bd460 @@ -75,6 +76,27 @@ extern const char* s_Die__s_DVDROM_kann_nicht_gelesen_005be130; // 005be130 extern const char* s_Impossibile_trovare_il_DVD____s_005be198; // 005be198 extern const char* s_DVD_s_no_v_lido_005be1ec; // 005be1ec extern const char* s_Impossible_de_trouver_le_DVD_____005be238; // 005be238 +extern pointer& s_Yes; // 005be304 +extern const char* s_SingleProcessor_005be308; // 005be308 +extern const char* lpDefault_005be318; // 005be318 +extern const char* s_StartDirectory_005be31c; // 005be31c +extern const char* s_Gamedata_005be32c; // 005be32c +extern const char* s_Camera_VerticalAxis_005be338; // 005be338 +extern const char* s_Camera_HorizontalAxis_005be34c; // 005be34c +extern const char* s_Complete_005be364; // 005be364 +extern const char* lpDefault_005be370; // 005be370 +extern const char* s_SoundOnHD_005be374; // 005be374 +extern const char* lpDefault_005be380; // 005be380 +extern const char* s_TexturesMem_005be384; // 005be384 +extern pointer& s_Agp; // 005be390 +extern const char* s_Outline_005be394; // 005be394 +extern const char* s_StaticShadows_005be39c; // 005be39c +extern const char* s_DynamicShadows_005be3ac; // 005be3ac +extern const char* s_TriLinear_005be3bc; // 005be3bc +extern pointer& s_Tnl; // 005be3c8 +extern const char* s_TexturesCompressed_005be3cc; // 005be3cc +extern const char* s_GLI_Mode_005be3e0; // 005be3e0 +extern const char* g_default_display_mode; // 005be3ec extern const char* s_Please_insert_the_DVD_in_the_DVD_005be400; // 005be400 extern const char* s_Bitte_legen_Sie_DVD_von_Rayman_3_005be438; // 005be438 extern const char* s_Inserisci_il_DVD_di_Rayman_3_nel_005be484; // 005be484 @@ -83,6 +105,8 @@ extern const char* s_Veuillez_ins_rer_le_DVD_dans_vot_005be500; // 005be500 extern const char* s_fmt_c_colon_s; // 005be540 extern const char* s_r3_program_files; // 005be548 extern const char* s_driveLetterTemplate; // 005be568 +extern undefined4& g_config_camera_hor_axis; // 005c67c8 +extern undefined4& g_config_camera_ver_axis; // 005c67cc extern HWND& g_gameHWND1; // 005cf964 extern long& lpDefault_005cf96c; // 005cf96c extern dword& DWORD_005cf974; // 005cf974 @@ -93,8 +117,13 @@ extern char *& PTR_005cf9b4; // 005cf9b4 extern GameStructure& g_currentBinkMovie; // 005d2660 extern char(&s_volumeNameBuffer)[128]; // 005d27b0 extern r3_main_data& r3_main_data_005d28b6; // 005d28b6 +extern undefined4& g_soundOnHD; // 005d29bc +extern undefined4& g_complete; // 005d29c0 +extern int& g_windowInitialized; // 0077d0a4 extern int& g_runMaximized; // 0077d0a8 +extern undefined4& g_engineShouldRun; // 0077d0b0 extern undefined4& g_engineRunning; // 0077d0b4 +extern undefined4& g_windowCloseRequested; // 0077d0b8 extern HANDLE& g_drawSemaphore; // 0077d0bc extern char(&g_mutexName_Rayman3)[256]; // 0077d0c0 extern char(&g_windowTitle)[256]; // 0077d1c0 @@ -109,5 +138,10 @@ extern char *& g_crt_cmdLine; // 0077ea84 extern char(&s_quitting1)[64]; // 007825c0 extern char(&s_wndStrQuiting)[56]; // 00782600 extern undefined4& DAT_007d9cc4; // 007d9cc4 +extern undefined4& g_config_unused0; // 007d9df0 extern char(&g_driveLetter)[4]; // 007d9e70 +extern undefined4& g_GLI_adapter; // 007edd60 +extern undefined1& g_GLI_tnl; // 007edd64 +extern undefined1& g_config_tex_compressed; // 007edd65 +extern undefined1& g_GLI_trilinear; // 007edd66 #endif // GH_GENERATED_GLOBALS_H diff --git a/game_re/gh_stub/setupWindow.cxx b/game_re/gh_stub/fn_bCreateMainDisplayScreen.cxx similarity index 52% rename from game_re/gh_stub/setupWindow.cxx rename to game_re/gh_stub/fn_bCreateMainDisplayScreen.cxx index 815225a4..cb0d7207 100644 --- a/game_re/gh_stub/setupWindow.cxx +++ b/game_re/gh_stub/fn_bCreateMainDisplayScreen.cxx @@ -6,8 +6,8 @@ #include #include -// 00402140 -// setupWindow -extern "C" int setupWindow(HINSTANCE instance, undefined4 param_2, int windowedParam) { - return gh_stub_impl_stdcall((void*)0x00402140, instance, param_2, windowedParam); +// 004022f0 +// fn_bCreateMainDisplayScreen +extern "C" undefined fn_bCreateMainDisplayScreen(void) { + return gh_stub_impl_cdecl((void*)0x004022f0); } diff --git a/game_re/gh_stub/loadSplashBitmap.cxx b/game_re/gh_stub/loadSplashBitmap.cxx new file mode 100644 index 00000000..76626a93 --- /dev/null +++ b/game_re/gh_stub/loadSplashBitmap.cxx @@ -0,0 +1,13 @@ +// AUTO-GENERATED FILE!!!! +// This function has yet to be decompiled using 'Dump Current Function' in ghidra +// with possible manualy fixes + +#include +#include +#include + +// 00402450 +// loadSplashBitmap +extern "C" void loadSplashBitmap(HWND unused) { + gh_stub_impl_stdcall((void*)0x00402450, unused); +} diff --git a/game_re/gh_stub/r3_config_setGLIMode.cxx b/game_re/gh_stub/r3_config_setGLIMode.cxx new file mode 100644 index 00000000..afd7f5e5 --- /dev/null +++ b/game_re/gh_stub/r3_config_setGLIMode.cxx @@ -0,0 +1,13 @@ +// AUTO-GENERATED FILE!!!! +// This function has yet to be decompiled using 'Dump Current Function' in ghidra +// with possible manualy fixes + +#include +#include +#include + +// 004704e0 +// r3_config_setGLIMode +extern "C" undefined r3_config_setGLIMode(char * param_1) { + return gh_stub_impl_cdecl((void*)0x004704e0, param_1); +} diff --git a/game_re/gh_stub/r3_config_setIdentifier.cxx b/game_re/gh_stub/r3_config_setIdentifier.cxx new file mode 100644 index 00000000..d6575d77 --- /dev/null +++ b/game_re/gh_stub/r3_config_setIdentifier.cxx @@ -0,0 +1,13 @@ +// AUTO-GENERATED FILE!!!! +// This function has yet to be decompiled using 'Dump Current Function' in ghidra +// with possible manualy fixes + +#include +#include +#include + +// 00470570 +// r3_config_setIdentifier +extern "C" undefined r3_config_setIdentifier(char * param_1) { + return gh_stub_impl_cdecl((void*)0x00470570, param_1); +} diff --git a/game_re/gh_stub/r3_config_setTexturesMem.cxx b/game_re/gh_stub/r3_config_setTexturesMem.cxx new file mode 100644 index 00000000..80567a59 --- /dev/null +++ b/game_re/gh_stub/r3_config_setTexturesMem.cxx @@ -0,0 +1,13 @@ +// AUTO-GENERATED FILE!!!! +// This function has yet to be decompiled using 'Dump Current Function' in ghidra +// with possible manualy fixes + +#include +#include +#include + +// 00470f30 +// r3_config_setTexturesMem +extern "C" void r3_config_setTexturesMem(char * param_1) { + gh_stub_impl_cdecl((void*)0x00470f30, param_1); +} diff --git a/game_re/gh_stub/r3_read_game_config_modem_quality.cxx b/game_re/gh_stub/r3_read_game_config_modem_quality.cxx new file mode 100644 index 00000000..ffc181ef --- /dev/null +++ b/game_re/gh_stub/r3_read_game_config_modem_quality.cxx @@ -0,0 +1,13 @@ +// AUTO-GENERATED FILE!!!! +// This function has yet to be decompiled using 'Dump Current Function' in ghidra +// with possible manualy fixes + +#include +#include +#include + +// 00445fc0 +// r3_read_game_config_modem_quality +extern "C" undefined r3_read_game_config_modem_quality(void) { + return gh_stub_impl_cdecl((void*)0x00445fc0); +} diff --git a/game_re/gh_stub/r3_read_game_config_udp_port.cxx b/game_re/gh_stub/r3_read_game_config_udp_port.cxx new file mode 100644 index 00000000..01439ae8 --- /dev/null +++ b/game_re/gh_stub/r3_read_game_config_udp_port.cxx @@ -0,0 +1,13 @@ +// AUTO-GENERATED FILE!!!! +// This function has yet to be decompiled using 'Dump Current Function' in ghidra +// with possible manualy fixes + +#include +#include +#include + +// 00446040 +// r3_read_game_config_udp_port +extern "C" undefined r3_read_game_config_udp_port(void) { + return gh_stub_impl_cdecl((void*)0x00446040); +} diff --git a/game_re/gh_stub/r3_set_GameDataPath.cxx b/game_re/gh_stub/r3_set_GameDataPath.cxx new file mode 100644 index 00000000..18818ffa --- /dev/null +++ b/game_re/gh_stub/r3_set_GameDataPath.cxx @@ -0,0 +1,13 @@ +// AUTO-GENERATED FILE!!!! +// This function has yet to be decompiled using 'Dump Current Function' in ghidra +// with possible manualy fixes + +#include +#include +#include + +// 0055a8d0 +// r3_set_GameDataPath +extern "C" void r3_set_GameDataPath(char * param_1) { + gh_stub_impl_cdecl((void*)0x0055a8d0, param_1); +} diff --git a/game_re/gh_stub/r3_windowProc.cxx b/game_re/gh_stub/r3_windowProc.cxx new file mode 100644 index 00000000..09c14b90 --- /dev/null +++ b/game_re/gh_stub/r3_windowProc.cxx @@ -0,0 +1,13 @@ +// AUTO-GENERATED FILE!!!! +// This function has yet to be decompiled using 'Dump Current Function' in ghidra +// with possible manualy fixes + +#include +#include +#include + +// 004025e0 +// r3_windowProc +extern "C" long r3_windowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { + return gh_stub_impl_stdcall((void*)0x004025e0, hwnd, uMsg, wParam, lParam); +} diff --git a/game_re/gh_stub/r3_windowUnlockCursor.cxx b/game_re/gh_stub/r3_windowUnlockCursor.cxx new file mode 100644 index 00000000..0937a522 --- /dev/null +++ b/game_re/gh_stub/r3_windowUnlockCursor.cxx @@ -0,0 +1,13 @@ +// AUTO-GENERATED FILE!!!! +// This function has yet to be decompiled using 'Dump Current Function' in ghidra +// with possible manualy fixes + +#include +#include +#include + +// 004013a0 +// r3_windowUnlockCursor +extern "C" undefined r3_windowUnlockCursor(void) { + return gh_stub_impl_cdecl((void*)0x004013a0); +} diff --git a/game_re/gh_stub/setGameHWND3.cxx b/game_re/gh_stub/setGameHWND3.cxx new file mode 100644 index 00000000..0f7c98c5 --- /dev/null +++ b/game_re/gh_stub/setGameHWND3.cxx @@ -0,0 +1,13 @@ +// AUTO-GENERATED FILE!!!! +// This function has yet to be decompiled using 'Dump Current Function' in ghidra +// with possible manualy fixes + +#include +#include +#include + +// 0043e620 +// setGameHWND3 +extern "C" void setGameHWND3(HWND wnd) { + gh_stub_impl_stdcall((void*)0x0043e620, wnd); +} diff --git a/game_re/r3/binders/dbg_mem.cxx b/game_re/r3/binders/dbg_mem.cxx index a8e6fbe8..67309290 100644 --- a/game_re/r3/binders/dbg_mem.cxx +++ b/game_re/r3/binders/dbg_mem.cxx @@ -33,6 +33,12 @@ struct R3Bin { g_gh_translationOffset = translationOffset = uintptr_t(module) - GH_BASE_ADDR; + std::string msg = fmt::format("Rayman3.exe Base address: 0x{:x}\n", uintptr_t(module)); + OutputDebugStringA(msg.c_str()); + + msg = fmt::format("Rayman3.exe Translation offset: 0x{:x}\n", translationOffset); + OutputDebugStringA(msg.c_str()); + // Now we have to relocate the module to the new base address relocateModule(); patchFunctions(); diff --git a/game_re/r3/config/static.hpp b/game_re/r3/config/static.hpp index 1c66f793..6bbff0c8 100644 --- a/game_re/r3/config/static.hpp +++ b/game_re/r3/config/static.hpp @@ -33,6 +33,7 @@ struct R3Config { int cameraHorizontalAxis = 2; int cameraVerticalAxis = 5; std::string gameDataBinPath; + std::string iniPath; }; inline R3Config createDefaultConfig() { @@ -51,6 +52,7 @@ inline R3Config createDefaultConfig() { config.gfxTnl = true; config.gfxTexturesCompressed = false; config.gameDataBinPath = "Gamedatabin"; + config.iniPath = config.gameRootDir + "\\" + "ubi.ini"; return config; } @@ -59,4 +61,8 @@ inline R3Config &getDefaultConfig() { return config; } +inline const char *getIniPath() { + return getDefaultConfig().iniPath.c_str(); +} + #endif /* D9171C14_8ED0_407B_A289_4C75D30D9DCC */