mirror of
https://github.com/galaxyhaxz/devilution
synced 2025-02-23 12:44:54 +00:00
231 lines
5.3 KiB
C++
231 lines
5.3 KiB
C++
|
// ref: 0x10008164
|
||
|
void __cdecl MainMenu_cpp_init()
|
||
|
{
|
||
|
mainmenu_cpp_float = mainmenu_cpp_float_value;
|
||
|
}
|
||
|
// 1001F434: using guessed type int mainmenu_cpp_float_value;
|
||
|
// 1002A0D4: using guessed type int mainmenu_cpp_float;
|
||
|
|
||
|
// ref: 0x1000816F
|
||
|
BOOL __stdcall UiMainMenuDialog(char *name, int *pdwResult, void (__stdcall *fnSound)(const char *file), int a4)
|
||
|
{
|
||
|
int v4; // eax
|
||
|
int v5; // esi
|
||
|
|
||
|
menu_item_timer = a4;
|
||
|
TitleSnd_SetSoundFunction(fnSound);
|
||
|
artfont_LoadAllFonts();
|
||
|
menu_version_str[0] = 0;
|
||
|
if ( name )
|
||
|
strncpy(menu_version_str, name, 0x40u);
|
||
|
v4 = (int)SDrawGetFrameWindow(NULL);
|
||
|
v5 = SDlgDialogBoxParam(ghUiInst, "MAINMENU_DIALOG", v4, MainMenu_WndProc, 0);
|
||
|
if ( v5 == 5 )
|
||
|
artfont_FreeAllFonts();
|
||
|
if ( pdwResult )
|
||
|
*pdwResult = v5;
|
||
|
return 1;
|
||
|
}
|
||
|
// 10010382: using guessed type _DWORD __stdcall SDrawGetFrameWindow();
|
||
|
// 1002A118: using guessed type int menu_item_timer;
|
||
|
|
||
|
// ref: 0x100081E3
|
||
|
LRESULT __stdcall MainMenu_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
HWND v5; // eax
|
||
|
|
||
|
if ( Msg <= 0x113 )
|
||
|
{
|
||
|
if ( Msg != 275 )
|
||
|
{
|
||
|
if ( Msg == 2 )
|
||
|
{
|
||
|
MainMenu_KillAndFreeMenu(hWnd);
|
||
|
}
|
||
|
else if ( Msg > 0x103 )
|
||
|
{
|
||
|
if ( Msg <= 0x105 )
|
||
|
{
|
||
|
v5 = (HWND)SDrawGetFrameWindow(NULL);
|
||
|
SendMessageA(v5, Msg, wParam, lParam);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if ( Msg == 272 )
|
||
|
{
|
||
|
MainMenu_LoadMenuGFX(hWnd);
|
||
|
PostMessageA(hWnd, 0x7E8u, 0, 0);
|
||
|
return 1;
|
||
|
}
|
||
|
if ( Msg == 273 )
|
||
|
{
|
||
|
MainMenu_SetMenuTimer(hWnd);
|
||
|
switch ( HIWORD(wParam) )
|
||
|
{
|
||
|
case 7:
|
||
|
Focus_GetAndBlitSpin(hWnd, lParam);
|
||
|
break;
|
||
|
case 6:
|
||
|
Focus_CheckPlayMove(lParam);
|
||
|
Focus_DoBlitSpinIncFrame(hWnd, (HWND)lParam);
|
||
|
break;
|
||
|
case 0:
|
||
|
MainMenu_CheckWParamFocus(hWnd, (unsigned short)wParam);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);
|
||
|
}
|
||
|
if ( wParam == 3 && !DiabloUI_GetSpawned() )
|
||
|
{
|
||
|
if ( app_is_active )
|
||
|
MainMenu_DoOptions(hWnd, 6, 0);
|
||
|
else
|
||
|
MainMenu_SetMenuTimer(hWnd);
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
if ( Msg >= 0x200 )
|
||
|
{
|
||
|
if ( Msg <= 0x202 )
|
||
|
goto LABEL_34;
|
||
|
if ( Msg <= 0x203 )
|
||
|
return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);
|
||
|
if ( Msg <= 0x205 )
|
||
|
{
|
||
|
LABEL_34:
|
||
|
MainMenu_SetMenuTimer(hWnd);
|
||
|
return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);
|
||
|
}
|
||
|
if ( Msg == 2024 )
|
||
|
{
|
||
|
if ( !Fade_CheckRange5() )
|
||
|
Fade_SetFadeTimer((int)hWnd);
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);
|
||
|
}
|
||
|
// 10010382: using guessed type _DWORD __stdcall SDrawGetFrameWindow();
|
||
|
// 10029728: using guessed type int app_is_active;
|
||
|
|
||
|
// ref: 0x10008354
|
||
|
void __fastcall MainMenu_KillAndFreeMenu(HWND hWnd)
|
||
|
{
|
||
|
void **v2; // eax
|
||
|
|
||
|
Title_KillTitleTimer(hWnd);
|
||
|
Focus_KillFocusTimer(hWnd);
|
||
|
Doom_DeleteFreeProcs(hWnd, menumsgs_5options);
|
||
|
Doom_DeleteFreeProcs(hWnd, menumsgs_1option);
|
||
|
v2 = (void **)GetWindowLongA(hWnd, -21);
|
||
|
local_FreeMemPtr(v2);
|
||
|
local_SetCursorDefault();
|
||
|
}
|
||
|
|
||
|
// ref: 0x10008391
|
||
|
void __fastcall MainMenu_SetMenuTimer(HWND hWnd)
|
||
|
{
|
||
|
SDlgSetTimer((int)hWnd, 3, 1000 * menu_item_timer, 0);
|
||
|
}
|
||
|
// 1002A118: using guessed type int menu_item_timer;
|
||
|
|
||
|
// ref: 0x100083A8
|
||
|
void __fastcall MainMenu_LoadMenuGFX(HWND hWnd)
|
||
|
{
|
||
|
DWORD *v2; // eax MAPDST
|
||
|
unsigned char v4; // zf
|
||
|
const char *v5; // eax
|
||
|
HWND v6; // eax
|
||
|
|
||
|
v2 = local_AllocWndLongData();
|
||
|
if ( v2 )
|
||
|
{
|
||
|
SetWindowLongA(hWnd, -21, (LONG)v2);
|
||
|
v4 = DiabloUI_GetSpawned() == 0;
|
||
|
v5 = "ui_art\\swmmenu.pcx";
|
||
|
if ( v4 )
|
||
|
v5 = "ui_art\\mainmenu.pcx";
|
||
|
local_LoadArtWithPal(hWnd, 0, &nullcharacter, -1, 1, v5, (BYTE **)v2, v2 + 1, 0);
|
||
|
Fade_NoInputAndArt(hWnd, 1);
|
||
|
}
|
||
|
v6 = GetDlgItem(hWnd, 1042);
|
||
|
SetWindowTextA(v6, menu_version_str);
|
||
|
Doom_ParseWndProc3(hWnd, menumsgs_1option, 1);
|
||
|
Doom_ParseWndProcs(hWnd, menumsgs_5options, 6, 1);
|
||
|
Focus_SetFocusTimer(hWnd, "ui_art\\focus42.pcx");
|
||
|
Title_LoadImgSetTimer(hWnd, "ui_art\\smlogo.pcx");
|
||
|
MainMenu_SetMenuTimer(hWnd);
|
||
|
local_DoUiWndProc2(hWnd, (DWORD *)menumsgs_5options);
|
||
|
}
|
||
|
|
||
|
// ref: 0x1000845A
|
||
|
void __fastcall MainMenu_DoOptions(HWND hWnd, int option, int PlaySelect)
|
||
|
{
|
||
|
SDlgKillTimer((int)hWnd, 3);
|
||
|
if ( DiabloUI_GetSpawned() && option == 3 )
|
||
|
{
|
||
|
SelYesNo_SpawnErrDialog(hWnd, 70, 1);
|
||
|
LABEL_7:
|
||
|
SDlgSetTimer((int)hWnd, 3, 1000 * menu_item_timer, 0);
|
||
|
return;
|
||
|
}
|
||
|
if ( option == 2 && !MainMenu_CheckEnoughMemory() )
|
||
|
{
|
||
|
SelYesNo_SpawnErrDialog(hWnd, 78, 1);
|
||
|
goto LABEL_7;
|
||
|
}
|
||
|
Fade_Range5SetZero();
|
||
|
if ( PlaySelect )
|
||
|
TitleSnd_PlaySelectSound();
|
||
|
Fade_UpdatePaletteRange(10);
|
||
|
SDlgEndDialog(hWnd, (HANDLE)option);
|
||
|
}
|
||
|
// 1002A118: using guessed type int menu_item_timer;
|
||
|
|
||
|
// ref: 0x100084D5
|
||
|
BOOL __cdecl MainMenu_CheckEnoughMemory()
|
||
|
{
|
||
|
struct _MEMORYSTATUS Buffer; // [esp+0h] [ebp-20h]
|
||
|
|
||
|
Buffer.dwLength = 32;
|
||
|
GlobalMemoryStatus(&Buffer);
|
||
|
return Buffer.dwTotalPhys > 0xDAC000;
|
||
|
}
|
||
|
|
||
|
// ref: 0x100084FA
|
||
|
void __fastcall MainMenu_CheckWParamFocus(HWND hWnd, WPARAM wParam)
|
||
|
{
|
||
|
HWND v3; // eax
|
||
|
LONG v4; // eax
|
||
|
int v5; // [esp-8h] [ebp-Ch]
|
||
|
|
||
|
switch ( wParam )
|
||
|
{
|
||
|
case 1u:
|
||
|
v3 = GetFocus();
|
||
|
v4 = GetWindowLongA(v3, -12);
|
||
|
SendMessageA(hWnd, 0x111u, v4, 0);
|
||
|
return;
|
||
|
case 2u:
|
||
|
v5 = 5;
|
||
|
goto LABEL_12;
|
||
|
case 0x3E9u:
|
||
|
v5 = 2;
|
||
|
goto LABEL_12;
|
||
|
case 0x3EAu:
|
||
|
v5 = 3;
|
||
|
goto LABEL_12;
|
||
|
case 0x3EBu:
|
||
|
v5 = 4;
|
||
|
LABEL_12:
|
||
|
MainMenu_DoOptions(hWnd, v5, 1);
|
||
|
return;
|
||
|
case 0x414u:
|
||
|
MainMenu_DoOptions(hWnd, 1, 1);
|
||
|
break;
|
||
|
}
|
||
|
}
|