Files
devilution/DiabloUI/mainmenu.cpp
2020-10-25 15:37:51 +01:00

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;
}
}