1
0
Fork 0
mirror of https://github.com/galaxyhaxz/devilution synced 2025-02-22 12:34:59 +00:00
devilution/2020_03_31/DiabloUI/sellist.cpp
PrisonOfMirrors b720183846 initial up
2020-11-28 18:24:54 -06:00

743 lines
15 KiB
C++

// ref: 0x1000D769
void __cdecl SelList_cpp_init()
{
SelList_cpp_float = SelList_cpp_float_value;
}
// 1001F468: using guessed type int SelList_cpp_float_value;
// 1002A4C0: using guessed type int SelList_cpp_float;
// ref: 0x1000D774
LRESULT __stdcall SelList_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
HWND v4; // eax
char *v5; // eax
int v6; // edx
HWND v8; // eax
HWND v9; // eax
if ( Msg > 0x111 )
{
if ( Msg == 275 )
{
v9 = GetFocus();
Focus_DoBlitSpinIncFrame(hWnd, v9);
return 0;
}
if ( Msg != 513 )
{
if ( Msg == 514 )
{
v8 = GetDlgItem(hWnd, 1105);
if ( !Sbar_CheckIfNextHero(v8) )
return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);
goto LABEL_23;
}
if ( Msg != 515 )
return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);
}
SelList_ChooseDlgFromSize(hWnd, (unsigned short)lParam, (unsigned int)lParam >> 16);
return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);
}
switch ( Msg )
{
case 0x111u:
if ( HIWORD(wParam) == 7 )
{
Focus_GetAndBlitSpin(hWnd, lParam);
return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);
}
if ( HIWORD(wParam) != 6 )
{
v6 = 1;
if ( HIWORD(wParam) != 5 && (_WORD)wParam != 1 )
{
v6 = 2;
if ( (_WORD)wParam != 2 )
return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);
}
LABEL_25:
OkCancel_PlaySndEndDlg(hWnd, v6);
return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);
}
Focus_CheckPlayMove(lParam);
Focus_DoBlitSpinIncFrame(hWnd, (HWND)lParam);
SelList_GetHeroStats(hWnd, (unsigned short)wParam);
LABEL_23:
SelList_CountHeroList(hWnd);
return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);
case 2u:
SelList_DeleteFreeProcs(hWnd);
return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);
case 6u:
if ( (_WORD)wParam == 1 || (_WORD)wParam == 2 )
SelList_LoadFocus16(hWnd);
else
SelList_KillFocus16(hWnd);
return 0;
case 0x100u:
if ( wParam != 46 )
return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);
v5 = SelHero_GetHeroNameStr();
if ( !strlen(v5) )
return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);
v6 = 1006;
goto LABEL_25;
}
if ( Msg <= 0x103 )
return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);
if ( Msg <= 0x105 )
{
v4 = (HWND)SDrawGetFrameWindow(NULL);
SendMessageA(v4, Msg, wParam, lParam);
return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);
}
if ( Msg != 272 )
return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);
SelList_ShowListWindow(hWnd);
return 0;
}
// 10010382: using guessed type _DWORD __stdcall SDrawGetFrameWindow();
// ref: 0x1000D916
void __fastcall SelList_DeleteFreeProcs(HWND hWnd)
{
HWND v2; // eax
Sbar_FreeScrollBar(hWnd, 1105);
Doom_DeleteFreeProcs(hWnd, sellist_msgtbl4);
Doom_DeleteFreeProcs(hWnd, sellist_msgtbl3);
Doom_DeleteFreeProcs(hWnd, sellist_msgtbl2);
Doom_DeleteFreeProcs(hWnd, sellist_msgtbl1);
v2 = GetParent(hWnd);
SelHero_SetStringWithMsg(v2, 0);
}
// ref: 0x1000D964
void __fastcall SelList_GetHeroStats(HWND hWnd, int nIDDlgItem)
{
HWND v2; // ebp
HWND v3; // eax
int v4; // eax
HWND v5; // eax
int v6; // eax
HWND v7; // eax
int v8; // eax
HWND v9; // eax
int v10; // eax
HWND v11; // eax
int v12; // eax
HWND v14; // eax
LONG v15; // eax
_uiheroinfo *v16; // edi
HWND v17; // eax
HWND v18; // eax
v14 = GetDlgItem(hWnd, nIDDlgItem);
if ( v14 )
{
v15 = GetWindowLongA(v14, -21);
if ( v15 )
{
v16 = *(_uiheroinfo **)(v15 + 12);
if ( v16 )
{
if ( v16->level )
Doom_ParseWndProc2(hWnd, sellist_msgtbl3, 4, 0);
else
Doom_ParseWndProc2(hWnd, sellist_msgtbl3, 5, 0);
v17 = GetParent(hWnd);
SelHero_PrintHeroInfo(v17, v16);
}
else
{
Doom_ParseWndProc2(hWnd, sellist_msgtbl3, 5, 0);
v18 = GetParent(hWnd);
selhero_hero_hassaved = 0;
selhero_heronamestr[0] = 0;
v2 = v18;
v3 = GetDlgItem(v18, 1014);
v4 = GetWindowLongA(v3, -21);
local_SetWndLongStr(v4, "--");
v5 = GetDlgItem(v2, 1018);
v6 = GetWindowLongA(v5, -21);
local_SetWndLongStr(v6, "--");
v7 = GetDlgItem(v2, 1017);
v8 = GetWindowLongA(v7, -21);
local_SetWndLongStr(v8, "--");
v9 = GetDlgItem(v2, 1016);
v10 = GetWindowLongA(v9, -21);
local_SetWndLongStr(v10, "--");
v11 = GetDlgItem(v2, 1015);
v12 = GetWindowLongA(v11, -21);
local_SetWndLongStr(v12, "--");
SelHero_SetStaticBMP(v2, 3);
Doom_ParseWndProc4(v2, selhero_msgtbl_info, 1);
}
}
}
}
// 1002A424: using guessed type int selhero_hero_hassaved;
// ref: 0x1000D9CF
void __fastcall SelList_CountHeroList(HWND hWnd)
{
HWND v2; // eax
int v3; // ST04_4
int v4; // eax
v2 = GetFocus();
v3 = SelList_GetNextHeroLong(v2);
v4 = SelHero_GetNumHeroesLeft();
Sbar_DrawScrollBar(hWnd, 1105, v4, v3);
}
// ref: 0x1000D9F4
int __fastcall SelList_GetNextHeroLong(HWND hWnd)
{
LONG v1; // esi
_uiheroinfo *v2; // eax
_uiheroinfo *v3; // esi
int v5; // ecx
if ( !hWnd )
return 0;
v1 = GetWindowLongA(hWnd, -21);
if ( !v1 )
return 0;
v2 = SelHero_GetCurrentHeroInfo();
if ( !v2 )
return 0;
v3 = *(_uiheroinfo **)(v1 + 12);
if ( !v3 )
return 0;
v5 = 0;
do
{
if ( v2 == v3 )
break;
v2 = v2->next;
++v5;
}
while ( v2 );
return v5;
}
// ref: 0x1000DA2D
void __fastcall SelList_LoadFocus16(HWND hWnd)
{
Focus_LoadSpinner("ui_art\\focus16.pcx");
SDlgSetTimer((int)hWnd, 1, 55, 0);
}
// ref: 0x1000DA48
void __fastcall SelList_KillFocus16(HWND hWnd)
{
SDlgKillTimer((int)hWnd, 1);
Focus_DeleteSpinners();
}
// ref: 0x1000DA55
void __fastcall SelList_ShowListWindow(HWND hWnd)
{
HWND v2; // edi
LONG v3; // eax
HWND v4; // eax
char Buffer[32]; // [esp+8h] [ebp-20h]
v2 = GetParent(hWnd);
SelList_DoListOldProc(hWnd);
if ( SelHero_GetHeroIsGood() == 1 )
LoadStringA(ghUiInst, 0x1Cu, Buffer, 31);
else
LoadStringA(ghUiInst, 0x1Du, Buffer, 31);
SelHero_SetStringWithMsg(v2, Buffer);
v3 = GetWindowLongA(v2, -21);
SetWindowLongA(hWnd, -21, v3);
Doom_ParseWndProc3(hWnd, sellist_msgtbl1, 5);
Doom_ParseWndProcs(hWnd, sellist_msgtbl2, 4, 0);
Doom_ParseWndProcs(hWnd, sellist_msgtbl3, 4, 0);
Doom_ParseWndProcs(hWnd, sellist_msgtbl4, 2, 1);
sellist_pheroinfo = SelHero_GetCurrentHeroInfo();
SelList_SetHeroDlgLong(hWnd, sellist_pheroinfo);
Sbar_LoadScrBarGFX(hWnd, 1105);
if ( SelHero_GetNumHeroesLeft() <= 6 )
{
v4 = GetDlgItem(hWnd, 1105);
ShowWindow(v4, 0);
}
}
// ref: 0x1000DB2C
void __fastcall SelList_SetHeroDlgLong(HWND hWnd, _uiheroinfo *pInfo)
{
int *i; // ebp
HWND v4; // eax MAPDST
int v6; // esi
for ( i = sellist_msgtbl4; *i; ++i )
{
v4 = GetDlgItem(hWnd, *i);
if ( v4 )
{
if ( pInfo )
{
EnableWindow(v4, 1);
v6 = GetWindowLongA(v4, -21);
local_SetWndLongStr(v6, pInfo->name);
if ( v6 )
*(_DWORD *)(v6 + 12) = (unsigned int)pInfo;
pInfo = pInfo->next;
}
else
{
EnableWindow(v4, 0);
}
}
}
Doom_ParseWndProc2(hWnd, sellist_msgtbl4, 2, 1);
}
// ref: 0x1000DBAC
void __fastcall SelList_DoListOldProc(HWND hWnd)
{
int *i; // edi
HWND v3; // eax MAPDST
void *v5; // eax
for ( i = sellist_msgtbl4; *i; ++i )
{
v3 = GetDlgItem(hWnd, *i);
if ( v3 )
{
v5 = (void *)GetWindowLongA(v3, -4);
SetPropA(v3, "UIOLDPROC", v5);
SetWindowLongA(v3, -4, (LONG)SelList_OldListWndProc);
}
}
}
// ref: 0x1000DBFE
LRESULT __stdcall SelList_OldListWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
LRESULT (__stdcall *v4)(HWND, UINT, WPARAM, LPARAM); // edi
HWND v5; // eax
UINT v7; // [esp-Ch] [ebp-18h]
WPARAM v8; // [esp-8h] [ebp-14h]
LPARAM v9; // [esp-4h] [ebp-10h]
v4 = (LRESULT (__stdcall *)(HWND, UINT, WPARAM, LPARAM))GetPropA(hWnd, "UIOLDPROC");
switch ( Msg )
{
case 2u:
RemovePropA(hWnd, "UIOLDPROC");
if ( !v4 )
return DefWindowProcA(hWnd, Msg, wParam, lParam);
SetWindowLongA(hWnd, -4, (LONG)v4);
break;
case 0xFu:
local_DlgDoPaint(hWnd);
return 0;
case 0x87u:
return 4;
case 0x100u:
if ( wParam > 0x21 )
{
if ( wParam == 34 )
{
SelList_HeroesWithBigDialogs(hWnd);
return 0;
}
if ( wParam > 0x24 )
{
if ( wParam <= 0x26 )
{
SelList_HeroDlgWithSnd2(hWnd);
return 0;
}
if ( wParam <= 0x28 )
{
SelList_HeroDlgWithSound(hWnd);
return 0;
}
if ( wParam == 46 )
{
v9 = lParam;
v8 = 46;
v7 = 256;
goto LABEL_24;
}
}
}
else
{
switch ( wParam )
{
case 0x21u:
SelList_HeroesWithHugeDlg(hWnd);
break;
case 9u:
if ( GetKeyState(16) >= 0 )
SelList_ShiftHeroDlgItems(hWnd);
else
SelList_ShiftHeroDlgItm2(hWnd);
return 0;
case 0xDu:
goto LABEL_38;
case 0x1Bu:
v9 = 0;
v8 = 2;
goto LABEL_12;
case 0x20u:
LABEL_38:
v9 = 0;
v8 = 1;
LABEL_12:
v7 = 273;
LABEL_24:
v5 = GetParent(hWnd);
SendMessageA(v5, v7, v8, v9);
return 0;
}
}
return 0;
}
if ( v4 )
return CallWindowProcA(v4, hWnd, Msg, wParam, lParam);
return DefWindowProcA(hWnd, Msg, wParam, lParam);
}
// ref: 0x1000DD36
void __fastcall SelList_ShiftHeroDlgItems(HWND hWnd)
{
HWND v2; // ebx
int nIDDlgItem[1053]; // [esp+0h] [ebp-1074h]
nIDDlgItem[1047] = 1048;
nIDDlgItem[1048] = 1049;
nIDDlgItem[1049] = 1050;
nIDDlgItem[1050] = 1051;
nIDDlgItem[1051] = 1052;
nIDDlgItem[1052] = 1047;
v2 = GetParent(hWnd);
do
{
nIDDlgItem[1044] = nIDDlgItem[GetWindowLongA(hWnd, -12)];
hWnd = GetDlgItem(v2, nIDDlgItem[1044]);
}
while ( !IsWindowEnabled(hWnd) );
SetFocus(hWnd);
}
// ref: 0x1000DDA7
void __fastcall SelList_ShiftHeroDlgItm2(HWND hWnd)
{
HWND v2; // ebx
int nIDDlgItem[1053]; // [esp+0h] [ebp-1074h]
nIDDlgItem[1047] = 1052;
nIDDlgItem[1048] = 1047;
nIDDlgItem[1049] = 1048;
nIDDlgItem[1050] = 1049;
nIDDlgItem[1051] = 1050;
nIDDlgItem[1052] = 1051;
v2 = GetParent(hWnd);
do
{
nIDDlgItem[1044] = nIDDlgItem[GetWindowLongA(hWnd, -12)];
hWnd = GetDlgItem(v2, nIDDlgItem[1044]);
}
while ( !IsWindowEnabled(hWnd) );
SetFocus(hWnd);
}
// ref: 0x1000DE18
void __fastcall SelList_HeroesWithBigDialogs(HWND hWnd)
{
HWND v1; // eax MAPDST
HWND v3; // ebp
HWND v4; // eax
LONG v5; // eax
_uiheroinfo *v6; // eax
int v7; // esi
_uiheroinfo *v8; // esi
int v9; // eax
v1 = GetParent(hWnd);
if ( v1 )
{
v3 = GetDlgItem(v1, 1047);
if ( v3 )
{
v4 = GetDlgItem(v1, 1052);
v5 = GetWindowLongA(v4, -21);
if ( v5 )
{
v6 = *(_uiheroinfo **)(v5 + 12);
if ( v6 && v6->next )
{
v7 = SelList_GetNextHeroLong(v3) + 6;
if ( v7 > SelHero_GetNumHeroesLeft() - 6 )
v7 = SelHero_GetNumHeroesLeft() - 6;
v8 = SelList_GetHeroFromNum(v7);
if ( v8 )
{
TitleSnd_PlayMoveSound();
SelList_SetHeroDlgLong(v1, v8);
v9 = GetWindowLongA(hWnd, -12);
SelList_GetHeroStats(v1, v9);
SelList_CountHeroList(v1);
}
}
else
{
SelList_ShiftHeroDlgItm2(v3);
}
}
}
}
}
// ref: 0x1000DEDD
_uiheroinfo *__fastcall SelList_GetHeroFromNum(int heronum)
{
_uiheroinfo *result; // eax
result = SelHero_GetCurrentHeroInfo();
while ( result && heronum )
{
result = result->next;
--heronum;
}
return result;
}
// ref: 0x1000DEF4
void __fastcall SelList_HeroesWithHugeDlg(HWND hWnd)
{
HWND v1; // eax MAPDST
HWND v3; // eax MAPDST
LONG v5; // eax
_uiheroinfo *v6; // ebp
HWND v7; // eax
int v8; // eax
_uiheroinfo *v9; // edi
int v10; // eax
v1 = GetParent(hWnd);
if ( v1 )
{
v3 = GetDlgItem(v1, 1047);
if ( v3 )
{
v5 = GetWindowLongA(v3, -21);
if ( v5 )
{
v6 = *(_uiheroinfo **)(v5 + 12);
if ( v6 )
{
if ( v6 == SelHero_GetCurrentHeroInfo() )
{
v7 = GetDlgItem(v1, 1052);
SelList_ShiftHeroDlgItems(v7);
}
else
{
v8 = SelList_GetNextHeroLong(v3) - 6;
if ( v8 < 0 )
v8 = 0;
v9 = SelList_GetHeroFromNum(v8);
if ( v9 )
{
TitleSnd_PlayMoveSound();
SelList_SetHeroDlgLong(v1, v9);
v10 = GetWindowLongA(hWnd, -12);
SelList_GetHeroStats(v1, v10);
SelList_CountHeroList(v1);
}
}
}
}
}
}
}
// ref: 0x1000DFAB
void __fastcall SelList_HeroDlgWithSound(HWND hWnd)
{
LONG v2; // eax
_uiheroinfo *v3; // eax
HWND v4; // eax
HWND v5; // eax
LONG v6; // eax
_uiheroinfo *v7; // ebp
HWND v8; // eax
int v9; // ebx
HWND v10; // eax
HWND v11; // eax
v2 = GetWindowLongA(hWnd, -21);
if ( v2 )
{
v3 = *(_uiheroinfo **)(v2 + 12);
if ( v3 )
{
if ( v3->next )
{
if ( GetWindowLongA(hWnd, -12) >= 1052 )
{
v4 = GetParent(hWnd);
v5 = GetDlgItem(v4, 1048);
if ( v5 )
{
v6 = GetWindowLongA(v5, -21);
if ( v6 )
{
v7 = *(_uiheroinfo **)(v6 + 12);
if ( v7 )
{
TitleSnd_PlayMoveSound();
v8 = GetParent(hWnd);
SelList_SetHeroDlgLong(v8, v7);
v9 = GetWindowLongA(hWnd, -12);
v10 = GetParent(hWnd);
SelList_GetHeroStats(v10, v9);
v11 = GetParent(hWnd);
SelList_CountHeroList(v11);
}
}
}
}
else
{
SelList_ShiftHeroDlgItems(hWnd);
}
}
}
}
}
// ref: 0x1000E043
void __fastcall SelList_HeroDlgWithSnd2(HWND hWnd)
{
LONG v2; // eax
_uiheroinfo *v3; // esi
_uiheroinfo *v4; // ebx
HWND v5; // eax
int v6; // ebx
HWND v7; // eax
HWND v8; // eax
if ( GetWindowLongA(hWnd, -12) <= 1047 )
{
v2 = GetWindowLongA(hWnd, -21);
if ( v2 )
{
v3 = *(_uiheroinfo **)(v2 + 12);
if ( v3 )
{
v4 = SelHero_GetCurrentHeroInfo();
if ( v3 != v4 )
{
while ( v4 && v4->next != v3 )
v4 = v4->next;
TitleSnd_PlayMoveSound();
v5 = GetParent(hWnd);
SelList_SetHeroDlgLong(v5, v4);
v6 = GetWindowLongA(hWnd, -12);
v7 = GetParent(hWnd);
SelList_GetHeroStats(v7, v6);
v8 = GetParent(hWnd);
SelList_CountHeroList(v8);
}
}
}
}
else
{
SelList_ShiftHeroDlgItm2(hWnd);
}
}
// ref: 0x1000E0CA
void __fastcall SelList_ChooseDlgFromSize(HWND hWnd, int width, int height)
{
HWND v6; // eax
int v7; // edx
HWND v8; // eax
HWND v9; // eax
char *v10; // eax
HWND v11; // eax
HWND v12; // eax
int v13; // eax
int v14; // eax
int v15; // eax
HWND v16; // eax
HWND v17; // eax
HWND v18; // eax
HWND v19; // eax
v6 = GetDlgItem(hWnd, 1056);
if ( local_GetBottomRect(hWnd, v6, width, height) )
{
v7 = 1;
LABEL_3:
OkCancel_PlaySndEndDlg(hWnd, v7);
return;
}
v8 = GetDlgItem(hWnd, 1054);
if ( local_GetBottomRect(hWnd, v8, width, height) )
{
v7 = 2;
goto LABEL_3;
}
v9 = GetDlgItem(hWnd, 1006);
if ( local_GetBottomRect(hWnd, v9, width, height) )
{
v10 = SelHero_GetHeroNameStr();
if ( strlen(v10) )
{
v7 = 1006;
goto LABEL_3;
}
}
else
{
v11 = GetDlgItem(hWnd, 1105);
if ( local_GetBottomRect(hWnd, v11, width, height) )
{
v12 = GetDlgItem(hWnd, 1105);
v13 = Sbar_NumScrollLines(v12, width, height) - 1;
if ( v13 )
{
v14 = v13 - 1;
if ( v14 )
{
v15 = v14 - 1;
if ( v15 )
{
if ( v15 == 1 )
{
v16 = GetFocus();
SelList_HeroesWithBigDialogs(v16);
}
}
else
{
v17 = GetFocus();
SelList_HeroesWithHugeDlg(v17);
}
}
else
{
v18 = GetFocus();
SelList_HeroDlgWithSound(v18);
}
}
else
{
v19 = GetFocus();
SelList_HeroDlgWithSnd2(v19);
}
}
}
}