Browse Source

Clean up gmenu_draw_menu_item

pull/133/head
Anders Jenbo 7 years ago
parent
commit
457b9186da
  1. 40
      Source/gamemenu.cpp
  2. 166
      Source/gmenu.cpp
  3. 8
      Source/gmenu.h
  4. 3
      defs.h

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

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

8
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();

3
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

Loading…
Cancel
Save