420 lines
14 KiB
C++
420 lines
14 KiB
C++
// AUTO-GENERATED FILE, MOVE TO 'gh_fix' FOLDER PREVENT OVERWRITING!!!!!
|
|
|
|
#include <gh_auto_binder.h>
|
|
#include "../gh_global.h"
|
|
|
|
extern undefined r3_initEngine(void); // 00401220 // r3_initEngine
|
|
extern undefined r3_module0_init(void); // 00401000 // r3_module0_init
|
|
extern uint32_t r3_containsCmdLine(
|
|
uint *param_1, char *param_2); // 004028e0 // r3_containsCmdLine
|
|
extern undefined FUN_004010b0(void); // 004010b0 // FUN_004010b0
|
|
extern undefined FUN_004464f0(void); // 004464f0 // FUN_004464f0
|
|
extern undefined FUN_00503710(void); // 00503710 // FUN_00503710
|
|
extern undefined r3_setupWindow(
|
|
HINSTANCE hInstance, undefined4 param_2,
|
|
undefined4 param_3); // 00402140 // r3_setupWindow
|
|
extern undefined FUN_00401320(void); // 00401320 // FUN_00401320
|
|
extern undefined spawnThread(void); // 004477d0 // spawnThread
|
|
extern undefined FUN_005038e0(void); // 005038e0 // FUN_005038e0
|
|
extern undefined FUN_004fb300(void); // 004fb300 // FUN_004fb300
|
|
extern void g_setInitVar0(void); // 00401310 // g_setInitVar0
|
|
extern void r3_noop(void *p_cTxt1,
|
|
void *p_cTxt2); // 00401100 // r3_noop
|
|
extern undefined r3_checkDisc(void); // 004464f0 // r3_checkDisc
|
|
extern undefined gfx_init2(void); // 00470be0 // gfx_init2
|
|
extern undefined4 __cdecl r3_get_gli_width(
|
|
void); // 0047baf0 // r3_get_gli_width
|
|
extern undefined FUN_00472150(void); // 00472150 // FUN_00472150
|
|
extern undefined FUN_00470db0(void); // 00470db0 // FUN_00470db0
|
|
extern int __cdecl r3_get_gli_height(void); // 0047bb00 // r3_get_gli_height
|
|
extern undefined FUN_0043e540(undefined4 param_1, undefined4 param_2,
|
|
undefined4 param_3); // 0043e540 // FUN_0043e540
|
|
extern undefined FUN_004725a0(void); // 004725a0 // FUN_004725a0
|
|
|
|
// 00401630
|
|
|
|
int r3_main(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR *cmdline,
|
|
int showCmd)
|
|
|
|
{
|
|
char cVar1;
|
|
undefined4 uVar2;
|
|
undefined4 uVar3;
|
|
undefined4 uVar4;
|
|
undefined2 uVar5;
|
|
undefined2 uVar6;
|
|
LPSTR pCVar7;
|
|
char *pcVar8;
|
|
FILE *file;
|
|
LONG LVar9;
|
|
HMODULE hLibModule;
|
|
DWORD DVar10;
|
|
HANDLE hTargetProcessHandle;
|
|
HANDLE hSourceHandle;
|
|
HANDLE hSourceProcessHandle;
|
|
LPSTR *ppCVar11;
|
|
uint32_t hasCCarg;
|
|
HWND hWnd;
|
|
int iVar12;
|
|
int iVar13;
|
|
int iVar14;
|
|
int iVar15;
|
|
uint uVar16;
|
|
void *unaff_ESI;
|
|
undefined4 *puVar17;
|
|
void *unaff_EDI;
|
|
undefined4 *puVar18;
|
|
char *pcVar19;
|
|
HANDLE *lpTargetHandle;
|
|
BOOL BVar20;
|
|
DWORD dwOptions;
|
|
tagRECT *lpRect;
|
|
undefined4 uStack_83c;
|
|
HKEY pHStack_838;
|
|
HANDLE pvStack_834;
|
|
UINT UStack_830;
|
|
BYTE aBStack_82c[4];
|
|
DWORD DStack_828;
|
|
DWORD DStack_824;
|
|
tagRECT tStack_820;
|
|
char acStack_810[260];
|
|
CHAR languageStr[256];
|
|
CHAR pathToUbi_ini[260];
|
|
char acStack_508[260];
|
|
CHAR windowsDir[260];
|
|
char acStack_300[256];
|
|
char acStack_200[256];
|
|
char acStack_100[256];
|
|
|
|
/* Append windows dir / ubi.ini */
|
|
GetWindowsDirectoryA(pathToUbi_ini, 0x104);
|
|
iVar15 = -1;
|
|
pcVar8 = pathToUbi_ini;
|
|
do {
|
|
pcVar19 = pcVar8;
|
|
if (iVar15 == 0)
|
|
break;
|
|
iVar15 = iVar15 + -1;
|
|
pcVar19 = pcVar8 + 1;
|
|
cVar1 = *pcVar8;
|
|
pcVar8 = pcVar19;
|
|
} while (cVar1 != '\0');
|
|
*(undefined4 *)(pcVar19 + -1) = s_UbiSoft_Ubi_ini + Field<0, 4>();
|
|
*(undefined4 *)(pcVar19 + 3) = s_UbiSoft_Ubi_ini + Field<4, 4>();
|
|
*(undefined4 *)(pcVar19 + 7) = s_UbiSoft_Ubi_ini + Field<8, 4>();
|
|
*(undefined4 *)(pcVar19 + 0xb) = s_UbiSoft_Ubi_ini + Field<12, 4>();
|
|
pcVar19[0xf] = s_UbiSoft_Ubi_ini[0x10];
|
|
pCVar7 = GetCommandLineA();
|
|
pcVar8 = pCVar7 + 1;
|
|
iVar15 = -(int)pcVar8;
|
|
do {
|
|
cVar1 = *pcVar8;
|
|
pcVar8[(int)(acStack_810 + iVar15)] = cVar1;
|
|
pcVar8 = pcVar8 + 1;
|
|
} while (cVar1 != '\0');
|
|
pcVar8 = strrchr(acStack_810, 0x5c);
|
|
if (pcVar8 == (char *)0x0) {
|
|
/* Read from ubi.ini */
|
|
GetPrivateProfileStringA(lpAppName_005b68f0, s_Directory_005b68f8, s_None,
|
|
acStack_810, 0xff, pathToUbi_ini);
|
|
iVar15 = strcmpi(acStack_810, s_None);
|
|
} else {
|
|
pcVar8 = strrchr(acStack_810, 0x5c);
|
|
*pcVar8 = '\0';
|
|
iVar15 = chdir(acStack_810);
|
|
if (iVar15 != -1)
|
|
goto LAB_00401765;
|
|
/* Read from ubi.ini */
|
|
GetPrivateProfileStringA(lpAppName_005b68f0, s_Directory_005b68f8, s_None,
|
|
acStack_810, 0xff, pathToUbi_ini);
|
|
iVar15 = strcmpi(acStack_810, s_None);
|
|
}
|
|
if (iVar15 != 0) {
|
|
chdir(acStack_810);
|
|
}
|
|
LAB_00401765:
|
|
/* strcpy */
|
|
iVar15 = 0;
|
|
do {
|
|
cVar1 = acStack_810[iVar15];
|
|
r3_main_data_005d28b6.gameDataDir[iVar15] = cVar1;
|
|
iVar15 = iVar15 + 1;
|
|
} while (cVar1 != '\0');
|
|
strlwr(r3_main_data_005d28b6.gameDataDir);
|
|
iVar15 = -1;
|
|
pcVar8 = r3_main_data_005d28b6.gameDataDir;
|
|
do {
|
|
if (iVar15 == 0)
|
|
break;
|
|
iVar15 = iVar15 + -1;
|
|
cVar1 = *pcVar8;
|
|
pcVar8 = pcVar8 + 1;
|
|
} while (cVar1 != '\0');
|
|
joined_r0x00401792:
|
|
if (iVar15 != -2) {
|
|
uVar16 = 0xffffffff;
|
|
pcVar8 = r3_main_data_005d28b6.gameDataDir;
|
|
do {
|
|
if (uVar16 == 0)
|
|
break;
|
|
uVar16 = uVar16 - 1;
|
|
cVar1 = *pcVar8;
|
|
pcVar8 = pcVar8 + 1;
|
|
} while (cVar1 != '\0');
|
|
if (r3_main_data_005d28b6.gameDataDir[~uVar16 - 2] != '\\')
|
|
goto LAB_004017ce;
|
|
uVar16 = 0xffffffff;
|
|
pcVar8 = r3_main_data_005d28b6.gameDataDir;
|
|
do {
|
|
if (uVar16 == 0)
|
|
break;
|
|
uVar16 = uVar16 - 1;
|
|
cVar1 = *pcVar8;
|
|
pcVar8 = pcVar8 + 1;
|
|
} while (cVar1 != '\0');
|
|
r3_main_data_005d28b6.gameDataDir[~uVar16 - 2] = '\0';
|
|
iVar15 = -1;
|
|
pcVar8 = r3_main_data_005d28b6.gameDataDir;
|
|
do {
|
|
if (iVar15 == 0)
|
|
break;
|
|
iVar15 = iVar15 + -1;
|
|
cVar1 = *pcVar8;
|
|
pcVar8 = pcVar8 + 1;
|
|
} while (cVar1 != '\0');
|
|
goto joined_r0x00401792;
|
|
}
|
|
LAB_004017ce:
|
|
file = fopen(pathToUbi_ini, fopen_mode_r_text);
|
|
GetPrivateProfileStringA(lpAppName_005b68f0, s_Adapter_005b68e4,
|
|
(LPCSTR)&lpDefault_005cf96c, acStack_300, 0xff,
|
|
pathToUbi_ini);
|
|
if ((file == (FILE *)0x0) || (acStack_300[0] == '\0')) {
|
|
/* Concat game data dir with r3 setup exe */
|
|
iVar15 = 0;
|
|
do {
|
|
cVar1 = r3_main_data_005d28b6.gameDataDir[iVar15];
|
|
acStack_508[iVar15] = cVar1;
|
|
iVar15 = iVar15 + 1;
|
|
} while (cVar1 != '\0');
|
|
iVar15 = -1;
|
|
pcVar8 = acStack_508;
|
|
do {
|
|
pcVar19 = pcVar8;
|
|
if (iVar15 == 0)
|
|
break;
|
|
iVar15 = iVar15 + -1;
|
|
pcVar19 = pcVar8 + 1;
|
|
cVar1 = *pcVar8;
|
|
pcVar8 = pcVar19;
|
|
} while (cVar1 != '\0');
|
|
*(undefined4 *)(pcVar19 + -1) =
|
|
s__R3_Setup_DX8_exe_005b68d0 + Field<0, 4>();
|
|
*(undefined4 *)(pcVar19 + 3) = s__R3_Setup_DX8_exe_005b68d0 + Field<4, 4>();
|
|
*(undefined4 *)(pcVar19 + 7) = s__R3_Setup_DX8_exe_005b68d0 + Field<8, 4>();
|
|
*(undefined4 *)(pcVar19 + 0xb) =
|
|
s__R3_Setup_DX8_exe_005b68d0 + Field<12, 4>();
|
|
*(undefined2 *)(pcVar19 + 0xf) = 0;
|
|
auto &q = (s__R3_Setup_DX8_exe_005b68d0 + Field<16, 2>());
|
|
file = fopen(acStack_508, fopen_mode_r_binary);
|
|
if (file == (FILE *)0x0) {
|
|
MessageBoxA((HWND)0x0, s_Unable_to_find_R3_Setup_DX8_exe__005b6880,
|
|
s_Rayman_3_Error_005b68bc, 0x10);
|
|
return -1;
|
|
}
|
|
fclose(file);
|
|
spawnl(0, acStack_508, acStack_508, 0);
|
|
file = fopen(pathToUbi_ini, fopen_mode_r_text);
|
|
if (file == (FILE *)0x0) {
|
|
return -1;
|
|
}
|
|
}
|
|
fclose(file);
|
|
/* Open reg key
|
|
HKEY_LOCAL_MACHINE\\SOFTWARE\\UBI SOFT\\RAYMAN 3 */
|
|
LVar9 = RegOpenKeyExA((HKEY)0x80000002, s_SOFTWARE_UBI_SOFT_RAYMAN_3_005b6864,
|
|
0, 0x20019, &pHStack_838);
|
|
if (LVar9 == 0) {
|
|
LVar9 =
|
|
RegQueryValueExA(pHStack_838, s_CompleteInstall_005b6854, (LPDWORD)0x0,
|
|
&DStack_824, aBStack_82c, &DStack_828);
|
|
DAT_007d9cc4 = (uint)(LVar9 == 0);
|
|
if (pHStack_838 != (HKEY)0x0) {
|
|
RegCloseKey(pHStack_838);
|
|
}
|
|
} else {
|
|
DAT_007d9cc4 = 0;
|
|
}
|
|
GetPrivateProfileStringA(lpAppName_005b68f0, s_Language_005b6840,
|
|
s_English_005b684c, languageStr, 0xff,
|
|
pathToUbi_ini);
|
|
sprintf(g_mutexName_Rayman3, s_percents, lpAppName_005b68f0);
|
|
sprintf(g_windowTitle, s_percents, s_windowTitle);
|
|
/* Setup localized quiting/restoring strings */
|
|
sprintf(s_windowTitleRestoring, s__s___Restoring_data____005b664c,
|
|
s_windowTitle);
|
|
uVar2 = s_QUIT + Field<0, 4>();
|
|
puVar17 = (undefined4 *)s_or_press_ESC_to_quit_Rayman_3__005b662c;
|
|
puVar18 = (undefined4 *)&DAT_007825c0;
|
|
for (iVar15 = 7; cVar1 = s_QUIT[4], iVar15 != 0; iVar15 = iVar15 + -1) {
|
|
*puVar18 = *puVar17;
|
|
puVar17 = puVar17 + 1;
|
|
puVar18 = puVar18 + 1;
|
|
}
|
|
*(undefined2 *)puVar18 = *(undefined2 *)puVar17;
|
|
*(undefined *)((int)puVar18 + 2) = *(undefined *)((int)puVar17 + 2);
|
|
strcpy(s_wndStrQuiting, s_QUIT);
|
|
sprintf(lpString_0077d2c0, s__s___Pause_005b67c4, s_windowTitle);
|
|
strcpy(s_wndStrRestoring, s_Restoring_data_____005b6610);
|
|
/* Create draw semaphore
|
|
Initial count = 1
|
|
Maximum count = 1 */
|
|
g_drawSemaphore =
|
|
CreateSemaphoreA((LPSECURITY_ATTRIBUTES)0x0, 1, 1, s_DRAWSEM_005b6608);
|
|
if (hPrevInstance != (HINSTANCE)0x0) {
|
|
return -1;
|
|
}
|
|
/* Load DirectPlay probably unused */
|
|
hLibModule = LoadLibraryA(s_dpnhpast_dll_005b65f8);
|
|
if (hLibModule == (HMODULE)0x0) {
|
|
iVar15 = strcmpi(languageStr, s_French_005b6828);
|
|
if (iVar15 == 0) {
|
|
MessageBoxA((HWND)0x0, lpText_005b6598, s_Erreur_Rayman_3_005b65e4, 0x10);
|
|
return -1;
|
|
}
|
|
iVar15 = strcmpi(languageStr, s_Spanish_005b67a0);
|
|
if (iVar15 == 0) {
|
|
MessageBoxA((HWND)0x0, lpText_005b6540, s_Rayman_3_005b6588, 0x10);
|
|
return -1;
|
|
}
|
|
iVar15 = strcmpi(languageStr, s_Italian_005b6730);
|
|
if (iVar15 == 0) {
|
|
MessageBoxA((HWND)0x0, lpText_005b64f0, s_Rayman_3_005b6588, 0x10);
|
|
return -1;
|
|
}
|
|
iVar15 = strcmpi(languageStr, s_German_005b66c4);
|
|
if (iVar15 != 0) {
|
|
MessageBoxA((HWND)0x0, s_Check_your_version_of_DirectX__V_005b6430,
|
|
s_Rayman_3_Error_005b68bc, 0x10);
|
|
return -1;
|
|
}
|
|
MessageBoxA((HWND)0x0, lpText_005b6478, s_Rayman_3_005b6588, 0x10);
|
|
return -1;
|
|
}
|
|
FreeLibrary(hLibModule);
|
|
CreateMutexA((LPSECURITY_ATTRIBUTES)0x0, 1, g_mutexName_Rayman3);
|
|
DVar10 = GetLastError();
|
|
if (DVar10 == 0xb7) {
|
|
/* Mutex already exists */
|
|
return -1;
|
|
}
|
|
GetWindowsDirectoryA(windowsDir, 0x104);
|
|
iVar15 = -1;
|
|
/* Append ubi.ini */
|
|
pcVar8 = windowsDir;
|
|
do {
|
|
pcVar19 = pcVar8;
|
|
if (iVar15 == 0)
|
|
break;
|
|
iVar15 = iVar15 + -1;
|
|
pcVar19 = pcVar8 + 1;
|
|
cVar1 = *pcVar8;
|
|
pcVar8 = pcVar19;
|
|
} while (cVar1 != '\0');
|
|
*(undefined4 *)(pcVar19 + -1) = s_UbiSoft_Ubi_ini + Field<0, 4>();
|
|
*(undefined4 *)(pcVar19 + 3) = s_UbiSoft_Ubi_ini + Field<4, 4>();
|
|
*(undefined4 *)(pcVar19 + 7) = s_UbiSoft_Ubi_ini + Field<8, 4>();
|
|
*(undefined4 *)(pcVar19 + 0xb) = s_UbiSoft_Ubi_ini + Field<12, 4>();
|
|
pcVar19[0xf] = s_UbiSoft_Ubi_ini[0x10];
|
|
/* Read graphics settings */
|
|
GetPrivateProfileStringA(lpAppName_005b68f0, s_Adapter_005b68e4,
|
|
(LPCSTR)&lpDefault_005cf96c, acStack_300, 0xff,
|
|
windowsDir);
|
|
GetPrivateProfileStringA(lpAppName_005b68f0, s_Identifier_005b6420,
|
|
(LPCSTR)&lpDefault_005cf96c, acStack_100, 0xff,
|
|
windowsDir);
|
|
GetPrivateProfileStringA(lpAppName_005b68f0, s_Gli_Mode_005b6414,
|
|
(LPCSTR)&lpDefault_005cf96c, acStack_200, 0xff,
|
|
windowsDir);
|
|
/* If they're all set */
|
|
if (((acStack_300[0] != '\0') && (acStack_100[0] != '\0')) &&
|
|
(acStack_200[0] != '\0')) {
|
|
/* always true */
|
|
hasGLIMode = (uint)(acStack_200[0] != '0');
|
|
// r3_checkDisc();
|
|
dwOptions = 0;
|
|
BVar20 = 0;
|
|
lpTargetHandle = &pvStack_834;
|
|
DVar10 = 0x1f03ff;
|
|
g_hinstance = hInstance;
|
|
hTargetProcessHandle = GetCurrentProcess();
|
|
hSourceHandle = GetCurrentThread();
|
|
hSourceProcessHandle = GetCurrentProcess();
|
|
DuplicateHandle(hSourceProcessHandle, hSourceHandle, hTargetProcessHandle,
|
|
lpTargetHandle, DVar10, BVar20, dwOptions);
|
|
g_mainThreadHandle = pvStack_834;
|
|
/* Copy cmdline */
|
|
ppCVar11 = cmdline;
|
|
do {
|
|
cVar1 = *(char *)ppCVar11;
|
|
*(char *)(((int)g_appCmdLine - (int)cmdline) + (int)ppCVar11) = cVar1;
|
|
ppCVar11 = (LPSTR *)((int)ppCVar11 + 1);
|
|
} while (cVar1 != '\0');
|
|
SetErrorMode(1);
|
|
hasCCarg = r3_containsCmdLine((uint *)cmdline, s_dashCC);
|
|
if (hasCCarg == 0) {
|
|
r3_module0_init();
|
|
iVar15 = r3_setupWindow(hInstance, showCmd, hasGLIMode);
|
|
if (iVar15 == 0) {
|
|
return -1;
|
|
}
|
|
g_setInitVar0();
|
|
FUN_00401320();
|
|
spawnThread();
|
|
r3_noop(unaff_EDI, unaff_ESI);
|
|
gfx_init2();
|
|
lpRect = &tStack_820;
|
|
hWnd = GetDesktopWindow();
|
|
GetWindowRect(hWnd, lpRect);
|
|
BVar20 = 1;
|
|
iVar15 = r3_get_gli_height();
|
|
iVar15 = iVar15 + 0x20;
|
|
iVar12 = r3_get_gli_width();
|
|
iVar12 = iVar12 + 0xc;
|
|
iVar13 = r3_get_gli_height();
|
|
iVar13 = (tStack_820.bottom - iVar13) / 2;
|
|
iVar14 = r3_get_gli_width();
|
|
MoveWindow(g_gameHWND, (tStack_820.right - iVar14) / 2, iVar13, iVar12,
|
|
iVar15, BVar20);
|
|
FUN_004010b0();
|
|
SystemParametersInfoA(0x10, 0, &UStack_830, 0);
|
|
SystemParametersInfoA(0x11, 0, (PVOID)0x0, 0);
|
|
ShowCursor(0);
|
|
uStack_83c = 0;
|
|
SystemParametersInfoA(0x61, 1, &uStack_83c, 0);
|
|
g_engineRunning = 1;
|
|
r3_initEngine();
|
|
FUN_004725a0();
|
|
FUN_005038e0();
|
|
FUN_00503710();
|
|
FUN_004fb300();
|
|
FUN_00472150();
|
|
FUN_00470db0();
|
|
uStack_83c = 0;
|
|
SystemParametersInfoA(0x61, 0, &uStack_83c, 0);
|
|
ShowCursor(1);
|
|
SystemParametersInfoA(0x11, UStack_830, (PVOID)0x0, 0);
|
|
CloseHandle(pvStack_834);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
// Please run the setup
|
|
sprintf(acStack_810, s_Please_run_the__s_setup__005b63f4, s_windowTitle);
|
|
sprintf(acStack_508, s__s_not_initialized__005b63e0, s_windowTitle);
|
|
// FUN_0043e540(acStack_810, acStack_508, 0);
|
|
MessageBoxA(g_gameHWND, acStack_810, acStack_508,
|
|
0 | 0x10000);
|
|
exit(1);
|
|
}
|