mirror of
https://github.com/diasurgical/devilution.git
synced 2025-07-23 12:33:00 +02:00
212 lines
5.5 KiB
C++
212 lines
5.5 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(const char *name, int *pdwResult, void(__stdcall *fnSound)(const char *file), int attractTimeOut)
|
|
{
|
|
int v4; // eax
|
|
int v5; // esi
|
|
|
|
menu_item_timer = attractTimeOut;
|
|
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
|
|
bool 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, AF_SMALLGRAY);
|
|
Doom_ParseWndProcs(hWnd, menumsgs_5options, AF_HUGE, 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;
|
|
}
|
|
}
|