diff --git a/Source/gamemenu.cpp b/Source/gamemenu.cpp index 96dcb9eac..103f66095 100644 --- a/Source/gamemenu.cpp +++ b/Source/gamemenu.cpp @@ -3,33 +3,33 @@ TMenuItem sgSingleMenu[6] = { // clang-format off // dwFlags, pszStr, fnMenu - { 0x80000000, "Save Game", &gamemenu_save_game }, - { 0x80000000, "Options", &gamemenu_options }, - { 0x80000000, "New Game", &gamemenu_new_game }, - { 0x80000000, "Load Game", &gamemenu_load_game }, - { 0x80000000, "Quit Diablo", &gamemenu_quit_game }, - { 0x80000000, NULL, NULL } + { GMENU_ENABLED, "Save Game", &gamemenu_save_game }, + { GMENU_ENABLED, "Options", &gamemenu_options }, + { GMENU_ENABLED, "New Game", &gamemenu_new_game }, + { GMENU_ENABLED, "Load Game", &gamemenu_load_game }, + { GMENU_ENABLED, "Quit Diablo", &gamemenu_quit_game }, + { GMENU_ENABLED, NULL, NULL } // clang-format on }; TMenuItem sgMultiMenu[5] = { // clang-format off // dwFlags, pszStr, fnMenu - { 0x80000000, "Options", &gamemenu_options }, - { 0x80000000, "New Game", &gamemenu_new_game }, - { 0x80000000, "Restart In Town", &gamemenu_restart_town }, - { 0x80000000, "Quit Diablo", &gamemenu_quit_game }, - { 0x80000000, NULL, NULL } + { GMENU_ENABLED, "Options", &gamemenu_options }, + { GMENU_ENABLED, "New Game", &gamemenu_new_game }, + { GMENU_ENABLED, "Restart In Town", &gamemenu_restart_town }, + { GMENU_ENABLED, "Quit Diablo", &gamemenu_quit_game }, + { GMENU_ENABLED, NULL, NULL } // clang-format on }; TMenuItem sgOptionMenu[6] = { // clang-format off - // dwFlags, pszStr, fnMenu - { 0xC0000000, NULL, &gamemenu_music_volume }, - { 0xC0000000, NULL, &gamemenu_sound_volume }, - { 0xC0000000, "Gamma", &gamemenu_gamma }, - { 0x80000000, NULL, &gamemenu_color_cycling }, - { 0x80000000, "Previous Menu", &j_gamemenu_previous }, - { 0x80000000, NULL, NULL } + // dwFlags, pszStr, fnMenu + { GMENU_ENABLED | GMENU_SLIDER, NULL, &gamemenu_music_volume }, + { GMENU_ENABLED | GMENU_SLIDER, NULL, &gamemenu_sound_volume }, + { GMENU_ENABLED | GMENU_SLIDER, "Gamma", &gamemenu_gamma }, + { GMENU_ENABLED , NULL, &gamemenu_color_cycling }, + { GMENU_ENABLED , "Previous Menu", &j_gamemenu_previous }, + { GMENU_ENABLED , NULL, NULL } // clang-format on }; char *music_toggle_names[] = { "Music", "Music Disabled" }; @@ -177,14 +177,14 @@ void gamemenu_get_music() void gamemenu_sound_music_toggle(char **names, TMenuItem *menu_item, int volume) { if (gbSndInited) { - menu_item->dwFlags |= 0xC0000000; + menu_item->dwFlags |= GMENU_ENABLED | GMENU_SLIDER; menu_item->pszStr = *names; gmenu_slider_steps(menu_item, 17); gmenu_slider_set(menu_item, VOLUME_MIN, VOLUME_MAX, volume); return; } - menu_item->dwFlags &= 0x3FFFFFFF; + menu_item->dwFlags &= ~(GMENU_ENABLED | GMENU_SLIDER); menu_item->pszStr = names[1]; } diff --git a/Source/gmenu.cpp b/Source/gmenu.cpp index 07155430c..f4917d461 100644 --- a/Source/gmenu.cpp +++ b/Source/gmenu.cpp @@ -1,17 +1,17 @@ #include "diablo.h" -void *optbar_cel; -BOOLEAN mouseNavigation; // weak -void *PentSpin_cel; +BYTE *optbar_cel; +BOOLEAN mouseNavigation; +BYTE *PentSpin_cel; TMenuItem *sgpCurrItem; -void *BigTGold_cel; -int PentSpin_tick; // weak -char PentSpin_frame; // weak -void(*dword_63447C)(TMenuItem *); -TMenuItem *sgpCurrentMenu; // idb -void *option_cel; -void *sgpLogo; -int sgCurrentMenuIdx; // weak +BYTE *BigTGold_cel; +int PentSpin_tick; +BYTE PentSpin_frame; +void (*dword_63447C)(TMenuItem *); +TMenuItem *sgpCurrentMenu; +BYTE *option_cel; +BYTE *sgpLogo; +int sgCurrentMenuIdx; const unsigned char lfontframe[127] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -46,7 +46,6 @@ void gmenu_draw_pause() gmenu_print_text(316, 336, "Pause"); } } -// 69BEF8: using guessed type int light_table_index; void gmenu_print_text(int x, int y, char *pszStr) { @@ -56,7 +55,7 @@ void gmenu_print_text(int x, int y, char *pszStr) c = gbFontTransTbl[(BYTE)*pszStr++]; c = lfontframe[c]; if (c) - CelDecodeLightOnly(x, y, (BYTE *)BigTGold_cel, c, 46); + CelDecodeLightOnly(x, y, BigTGold_cel, c, 46); x += lfontkern[c] + 2; } } @@ -77,16 +76,13 @@ void gmenu_init_menu() sgpCurrItem = 0; dword_63447C = 0; sgCurrentMenuIdx = 0; - mouseNavigation = 0; + mouseNavigation = FALSE; sgpLogo = LoadFileInMem("Data\\Diabsmal.CEL", 0); BigTGold_cel = LoadFileInMem("Data\\BigTGold.CEL", 0); PentSpin_cel = LoadFileInMem("Data\\PentSpin.CEL", 0); option_cel = LoadFileInMem("Data\\option.CEL", 0); optbar_cel = LoadFileInMem("Data\\optbar.CEL", 0); } -// 634464: using guessed type char mouseNavigation; -// 634478: using guessed type char PentSpin_frame; -// 63448C: using guessed type int sgCurrentMenuIdx; BOOL gmenu_exception() { @@ -136,7 +132,7 @@ void gmenu_up_down(BOOL isDown) sgpCurrItem = &sgpCurrentMenu[sgCurrentMenuIdx]; sgpCurrItem--; } - if ((sgpCurrItem->dwFlags & 0x80000000) != 0) { + if ((sgpCurrItem->dwFlags & GMENU_ENABLED) != 0) { if (i) PlaySFX(IS_TITLEMOV); return; @@ -144,8 +140,6 @@ void gmenu_up_down(BOOL isDown) } } } -// 634464: using guessed type char mouseNavigation; -// 63448C: using guessed type int sgCurrentMenuIdx; void gmenu_draw() { @@ -156,7 +150,7 @@ void gmenu_draw() if (sgpCurrentMenu) { if (dword_63447C) dword_63447C(sgpCurrentMenu); - CelDecodeOnly(236, 262, (BYTE *)sgpLogo, 1, 296); + CelDecodeOnly(236, 262, sgpLogo, 1, 296); y = 320; i = sgpCurrentMenu; if (sgpCurrentMenu->fnMenu) { @@ -177,53 +171,30 @@ void gmenu_draw() } } -void gmenu_draw_menu_item(TMenuItem *pItem, int a2) +void gmenu_draw_menu_item(TMenuItem *pItem, int y) { - int v2; // edi - TMenuItem *v3; // ebx - unsigned int v4; // eax - unsigned int v5; // ebp - int v6; // esi - unsigned int v7; // ecx - unsigned int v8; // eax - int v9; // ecx - unsigned int v10; // ebp - int v11; // esi - int v12; // eax - int v13; // edi - unsigned int v14; // [esp+10h] [ebp-4h] - - v2 = a2; - v3 = pItem; - v4 = gmenu_get_lfont(pItem); - v5 = v4; - v14 = v4; - if (v3->dwFlags & 0x40000000) { - v6 = (v4 >> 1) + 80; - CelDecodeOnly(v6, v2 - 10, (BYTE *)optbar_cel, 1, 287); - v7 = (v3->dwFlags >> 12) & 0xFFF; - if (v7 < 2) - v7 = 2; - v8 = ((v3->dwFlags & 0xFFF) << 8) / v7; - v9 = (v5 >> 1) + 82; - v10 = v8; - gmenu_clear_buffer(v9, v2 - 12, v8 + 13, 28); - CelDecodeOnly(v6 + v10 + 2, v2 - 12, (BYTE *)option_cel, 1, 27); - v5 = v14; + DWORD x, w, nSteps, step, pos; + + w = gmenu_get_lfont(pItem); + if (pItem->dwFlags & GMENU_SLIDER) { + x = 16 + w / 2 + SCREEN_X; + CelDecodeOnly(x, y - 10, optbar_cel, 1, 287); + nSteps = (pItem->dwFlags & 0xFFF000) >> 12; + if (nSteps < 2) + nSteps = 2; + step = pItem->dwFlags & 0xFFF; + pos = step * 256 / nSteps; + gmenu_clear_buffer(x + 2, y - 12, pos + 13, 28); + CelDecodeOnly(x + 2 + pos, y - 12, option_cel, 1, 27); } - v11 = 384 - (v5 >> 1); - v12 = -((v3->dwFlags & 0x80000000) != 0); - _LOBYTE(v12) = v12 & 0xF1; - light_table_index = v12 + 15; - gmenu_print_text(384 - (v5 >> 1), v2, v3->pszStr); - if (v3 == sgpCurrItem) { - v13 = v2 + 1; - CelDecodeOnly(v11 - 54, v13, (BYTE *)PentSpin_cel, (unsigned char)PentSpin_frame, 48); - CelDecodeOnly(v11 + v5 + 4, v13, (BYTE *)PentSpin_cel, (unsigned char)PentSpin_frame, 48); + x = SCREEN_WIDTH - w / 2 + SCREEN_X; + light_table_index = (pItem->dwFlags & GMENU_ENABLED) ? 0 : 15; + gmenu_print_text(x, y, pItem->pszStr); + if (pItem == sgpCurrItem) { + CelDecodeOnly(x - 54, y + 1, PentSpin_cel, PentSpin_frame, 48); + CelDecodeOnly(x + 4 + w, y + 1, PentSpin_cel, PentSpin_frame, 48); } } -// 634478: using guessed type char PentSpin_frame; -// 69BEF8: using guessed type int light_table_index; void gmenu_clear_buffer(int x, int y, int width, int height) { @@ -241,7 +212,7 @@ int gmenu_get_lfont(TMenuItem *pItem) int i; BYTE c; - if (pItem->dwFlags & 0x40000000) + if (pItem->dwFlags & GMENU_SLIDER) return 490; text = pItem->pszStr; i = 0; @@ -258,7 +229,7 @@ BOOL gmenu_presskeys(int a1) return 0; switch (a1) { case VK_RETURN: - if ((sgpCurrItem->dwFlags & 0x80000000) != 0) { + if ((sgpCurrItem->dwFlags & GMENU_ENABLED) != 0) { PlaySFX(IS_TITLEMOV); sgpCurrItem->fnMenu(TRUE); } @@ -287,39 +258,38 @@ BOOL gmenu_presskeys(int a1) void gmenu_left_right(BOOL isRight) { - int plOffset; + int step; - if (sgpCurrItem->dwFlags & 0x40000000) { - plOffset = sgpCurrItem->dwFlags & 0xFFF; + if (sgpCurrItem->dwFlags & GMENU_SLIDER) { + step = sgpCurrItem->dwFlags & 0xFFF; if (isRight) { - if (plOffset == (int)(sgpCurrItem->dwFlags & 0xFFF000) >> 12) + if (step == (int)(sgpCurrItem->dwFlags & 0xFFF000) >> 12) return; - plOffset++; + step++; } else { - if (!plOffset) + if (!step) return; - plOffset--; + step--; } sgpCurrItem->dwFlags &= 0xFFFFF000; - sgpCurrItem->dwFlags |= plOffset; + sgpCurrItem->dwFlags |= step; sgpCurrItem->fnMenu(FALSE); } } BOOL gmenu_on_mouse_move() { - int plOffset, v; + int step, nSteps; if (!mouseNavigation) return FALSE; - gmenu_valid_mouse_pos(&plOffset); - v = (sgpCurrItem->dwFlags & 0xFFF000); - v >>= 12; - plOffset *= v; - plOffset /= 256; + gmenu_valid_mouse_pos(&step); + nSteps = (int)(sgpCurrItem->dwFlags & 0xFFF000) >> 12; + step *= nSteps; + step /= 256; sgpCurrItem->dwFlags &= 0xFFFFF000; - sgpCurrItem->dwFlags |= plOffset; + sgpCurrItem->dwFlags |= step; sgpCurrItem->fnMenu(FALSE); return TRUE; } @@ -342,13 +312,13 @@ BOOLEAN gmenu_valid_mouse_pos(int *plOffset) BOOL gmenu_left_mouse(BOOL isDown) { BOOL result; - TMenuItem *v3; - DWORD v4, v5; + TMenuItem *pItem; + DWORD i, w; int dummy; if (!isDown) { if (mouseNavigation) { - mouseNavigation = 0; + mouseNavigation = FALSE; result = TRUE; } else { result = FALSE; @@ -363,17 +333,16 @@ BOOL gmenu_left_mouse(BOOL isDown) return FALSE; } if (MouseY - 117 >= 0) { - v4 = (MouseY - 117) / 45; - //v4 /= 45; - if (v4 < sgCurrentMenuIdx) { - v3 = &sgpCurrentMenu[v4]; - if ((sgpCurrentMenu[v4].dwFlags & 0x80000000) != 0) { - v5 = gmenu_get_lfont(v3); - if (MouseX >= 320 - (v5 >> 1)) { - if (MouseX <= (v5 >> 1) + 320) { - sgpCurrItem = v3; + i = (MouseY - 117) / 45; + if (i < sgCurrentMenuIdx) { + pItem = &sgpCurrentMenu[i]; + if ((sgpCurrentMenu[i].dwFlags & GMENU_ENABLED) != 0) { + w = gmenu_get_lfont(pItem); + if (MouseX >= 320 - (w >> 1)) { + if (MouseX <= (w >> 1) + 320) { + sgpCurrItem = pItem; PlaySFX(IS_TITLEMOV); - if (v3->dwFlags & 0x40000000) { + if (pItem->dwFlags & GMENU_SLIDER) { mouseNavigation = gmenu_valid_mouse_pos(&dummy); gmenu_on_mouse_move(); } else { @@ -399,13 +368,12 @@ BOOL gmenu_left_mouse(BOOL isDown) return result; } - void gmenu_enable(TMenuItem *pMenuItem, BOOL enable) { if (enable) - pMenuItem->dwFlags |= 0x80000000; + pMenuItem->dwFlags |= GMENU_ENABLED; else - pMenuItem->dwFlags &= ~0x80000000; + pMenuItem->dwFlags &= ~GMENU_ENABLED; } /** @@ -431,9 +399,7 @@ int gmenu_slider_get(TMenuItem *pItem, int min, int max) int nSteps, step; step = pItem->dwFlags & 0xFFF; - nSteps = pItem->dwFlags; - nSteps >>= 12; - nSteps &= 0xFFF; + nSteps = (int)(pItem->dwFlags & 0xFFF000) >> 12; if (nSteps < 2) nSteps = 2; return min + (step * (max - min) + (nSteps - 1) / 2) / nSteps; diff --git a/Source/gmenu.h b/Source/gmenu.h index 8c2be2277..4a0c2ca44 100644 --- a/Source/gmenu.h +++ b/Source/gmenu.h @@ -2,15 +2,15 @@ #ifndef __GMENU_H__ #define __GMENU_H__ -extern void *optbar_cel; +extern BYTE *optbar_cel; extern BOOLEAN mouseNavigation; // weak -extern void *PentSpin_cel; -extern void *BigTGold_cel; +extern BYTE *PentSpin_cel; +extern BYTE *BigTGold_cel; extern int dword_634474; // weak extern char byte_634478; // weak extern void(*dword_63447C)(TMenuItem *); extern TMenuItem *sgpCurrentMenu; // idb -extern void *option_cel; +extern BYTE *option_cel; extern int sgCurrentMenuIdx; // weak void gmenu_draw_pause(); diff --git a/defs.h b/defs.h index fbaa30a7f..d0a827502 100644 --- a/defs.h +++ b/defs.h @@ -5,6 +5,9 @@ #define LIGHTSIZE 6912 // 27 * 256 +#define GMENU_SLIDER (DWORD)1 << 30 +#define GMENU_ENABLED (DWORD)1 << 31 + // must be unsigned to generate unsigned comparisons with pnum #define MAX_PLRS 4