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