You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
746 lines
20 KiB
746 lines
20 KiB
// ref: 0x1000B7A0 |
|
_uiheroinfo *__cdecl SelHero_GetCurrentHeroInfo() |
|
{ |
|
return sgpHeroInfo; |
|
} |
|
|
|
// ref: 0x1000B7A6 |
|
int __cdecl SelHero_GetNumHeroesLeft() |
|
{ |
|
return selhero_numheroesleft; |
|
} |
|
// 1002A428: using guessed type int selhero_numheroesleft; |
|
|
|
// ref: 0x1000B7AC |
|
void __fastcall SelHero_SetHeroDifficulty(int diff) |
|
{ |
|
selhero_difficulty = diff; |
|
} |
|
// 1002A420: using guessed type int selhero_difficulty; |
|
|
|
// ref: 0x1000B7B3 |
|
char *__cdecl SelHero_GetHeroNameStr() |
|
{ |
|
return selhero_heronamestr; |
|
} |
|
|
|
// ref: 0x1000B7B9 |
|
_uiheroinfo *__cdecl SelHero_AllocHeroInfo() |
|
{ |
|
return (_uiheroinfo *)SMemAlloc(0x2Cu, "C:\\Src\\Diablo\\DiabloUI\\SelHero.cpp", 123, 0); |
|
} |
|
|
|
// ref: 0x1000B7CA |
|
int __cdecl SelHero_GetHeroIsGood() |
|
{ |
|
return selhero_is_good; |
|
} |
|
|
|
// ref: 0x1000B7D0 |
|
int __fastcall SelHero_SetClassStats(int heroclass, _uidefaultstats *pStats) |
|
{ |
|
return selhero_fnstats(heroclass, pStats); |
|
} |
|
|
|
// ref: 0x1000B7DE |
|
void __cdecl SelHero_cpp_init() |
|
{ |
|
SelHero_cpp_float = SelHero_cpp_float_value; |
|
} |
|
// 1001F460: using guessed type int SelHero_cpp_float_value; |
|
// 1002A414: using guessed type int SelHero_cpp_float; |
|
|
|
// ref: 0x1000B899 |
|
void __fastcall SelHero_SetStaticBMP(HWND hWnd, int adjust_size) |
|
{ |
|
HWND v3; // esi |
|
struct tagRECT Rect; // [esp+8h] [ebp-10h] |
|
|
|
v3 = GetDlgItem(hWnd, 1040); |
|
InvalidateRect(v3, 0, 0); |
|
GetClientRect(v3, &Rect); |
|
local_AdjustRectSize(&Rect, 0, adjust_size * Rect.bottom); |
|
SDlgSetBitmapI(v3, 0, "Static", -1, 1, selhero_buffer, (int)&Rect, selhero_sizedata[0], selhero_sizedata[1], -1); |
|
} |
|
|
|
// ref: 0x1000B905 |
|
void __fastcall SelHero_PrintHeroInfo(HWND hWnd, _uiheroinfo *pInfo) |
|
{ |
|
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 v15; // ebp |
|
int v16; // eax |
|
HWND v17; // ST1C_4 |
|
int v18; // eax |
|
HWND v19; // ST1C_4 |
|
int v20; // eax |
|
HWND v21; // ST1C_4 |
|
int v22; // eax |
|
HWND v23; // ST1C_4 |
|
int v24; // eax |
|
|
|
if (pInfo->level) { |
|
selhero_hero_hassaved = pInfo->hassaved; |
|
strcpy(selhero_heronamestr, pInfo->name); |
|
v15 = GetDlgItem(hWnd, 1014); |
|
wsprintfA(selhero_herolevel, "%d", pInfo->level); |
|
v16 = GetWindowLongA(v15, -21); |
|
local_SetWndLongStr(v16, selhero_herolevel); |
|
v17 = GetDlgItem(hWnd, 1018); |
|
wsprintfA(selhero_herostr, "%d", pInfo->strength); |
|
v18 = GetWindowLongA(v17, -21); |
|
local_SetWndLongStr(v18, selhero_herostr); |
|
v19 = GetDlgItem(hWnd, 1017); |
|
wsprintfA(selhero_heromag, "%d", pInfo->magic); |
|
v20 = GetWindowLongA(v19, -21); |
|
local_SetWndLongStr(v20, selhero_heromag); |
|
v21 = GetDlgItem(hWnd, 1016); |
|
wsprintfA(selhero_herodex, "%d", pInfo->dexterity); |
|
v22 = GetWindowLongA(v21, -21); |
|
local_SetWndLongStr(v22, selhero_herodex); |
|
v23 = GetDlgItem(hWnd, 1015); |
|
wsprintfA(selhero_herovit, "%d", pInfo->vitality); |
|
v24 = GetWindowLongA(v23, -21); |
|
local_SetWndLongStr(v24, selhero_herovit); |
|
SelHero_SetStaticBMP(hWnd, pInfo->heroclass); |
|
Doom_ParseWndProc4(hWnd, selhero_msgtbl_info, AF_SMALLGRAY); |
|
} else { |
|
selhero_hero_hassaved = 0; |
|
selhero_heronamestr[0] = 0; |
|
v3 = GetDlgItem(hWnd, 1014); |
|
v4 = GetWindowLongA(v3, -21); |
|
local_SetWndLongStr(v4, "--"); |
|
v5 = GetDlgItem(hWnd, 1018); |
|
v6 = GetWindowLongA(v5, -21); |
|
local_SetWndLongStr(v6, "--"); |
|
v7 = GetDlgItem(hWnd, 1017); |
|
v8 = GetWindowLongA(v7, -21); |
|
local_SetWndLongStr(v8, "--"); |
|
v9 = GetDlgItem(hWnd, 1016); |
|
v10 = GetWindowLongA(v9, -21); |
|
local_SetWndLongStr(v10, "--"); |
|
v11 = GetDlgItem(hWnd, 1015); |
|
v12 = GetWindowLongA(v11, -21); |
|
local_SetWndLongStr(v12, "--"); |
|
SelHero_SetStaticBMP(hWnd, 3); |
|
Doom_ParseWndProc4(hWnd, selhero_msgtbl_info, AF_SMALLGRAY); |
|
} |
|
} |
|
// 1002A424: using guessed type int selhero_hero_hassaved; |
|
|
|
// ref: 0x1000BA7B |
|
void __fastcall SelHero_SetStringWithMsg(HWND hWnd, const char *str) |
|
{ |
|
HWND v4; // eax |
|
int v5; // eax |
|
|
|
v4 = GetDlgItem(hWnd, 1038); |
|
if (v4) { |
|
v5 = GetWindowLongA(v4, -21); |
|
local_SetWndLongStr(v5, str); |
|
Doom_ParseWndProc4(hWnd, selhero_msgtbl_string, AF_BIGGRAY); |
|
} |
|
} |
|
|
|
// ref: 0x1000BAB4 |
|
BOOL __fastcall SelHero_IsNameReserved(const char *name) |
|
{ |
|
UINT v1; // esi |
|
BOOL result; // eax |
|
char SrcStr[128]; // [esp+4h] [ebp-90h] |
|
char Buffer[16]; // [esp+84h] [ebp-10h] |
|
|
|
strcpy(SrcStr, name); |
|
_strlwr(SrcStr); |
|
v1 = 19; |
|
while (1) { |
|
LoadStringA(ghUiInst, v1, Buffer, 15); |
|
SelHero_SetLastNamePos(Buffer); |
|
_strlwr(Buffer); |
|
result = (BOOL)strstr(SrcStr, Buffer); |
|
if (result) |
|
break; |
|
if ((signed int)++v1 > 26) |
|
return result; |
|
} |
|
return 1; |
|
} |
|
|
|
// ref: 0x1000BB26 |
|
void __fastcall SelHero_SetLastNamePos(char *name) |
|
{ |
|
while (*name) |
|
--*name++; |
|
} |
|
|
|
// ref: 0x1000BB34 |
|
BOOL __fastcall SelHero_NameHasChar(const char *name, char *illegalchrs) |
|
{ |
|
char v5; // al |
|
|
|
if (strpbrk(name, ",<>%&\\\"?*#/:") || strpbrk(name, illegalchrs)) |
|
return 1; |
|
while (1) { |
|
v5 = *name; |
|
if (!*name) |
|
break; |
|
if ((unsigned char)v5 < 0x20u || (unsigned char)v5 > 0x7Eu && (unsigned char)v5 < 0xC0u) |
|
return 1; |
|
++name; |
|
} |
|
return 0; |
|
} |
|
|
|
// ref: 0x1000BB75 |
|
BOOL __fastcall UiValidPlayerName(const char *name) |
|
{ |
|
BOOL v2; // edi |
|
|
|
v2 = 1; |
|
if (!strlen(name)) |
|
v2 = 0; |
|
if (selhero_is_good == 1 && (SelHero_IsNameReserved(name) || SelHero_NameHasChar(name, " "))) |
|
v2 = 0; |
|
return v2; |
|
} |
|
|
|
// ref: 0x1000BBB4 |
|
BOOL __stdcall UiSelHeroMultDialog( |
|
BOOL(__stdcall *fninfo)(BOOL(__stdcall *fninfofunc)(_uiheroinfo *)), |
|
BOOL(__stdcall *fncreate)(_uiheroinfo *), |
|
BOOL(__stdcall *fnremove)(_uiheroinfo *), |
|
BOOL(__stdcall *fnstats)(unsigned int, _uidefaultstats *), |
|
int *dlgresult, |
|
int *hero_is_created, |
|
char *name) |
|
{ |
|
int v7; // eax |
|
int v8; // eax |
|
|
|
artfont_LoadAllFonts(); |
|
selhero_fninfo = fninfo; |
|
selhero_fncreate = fncreate; |
|
selhero_fnremove = fnremove; |
|
selhero_fnstats = fnstats; |
|
sgpHeroInfo = 0; |
|
selhero_is_good = 1; |
|
selhero_is_created = 0; |
|
v7 = (int)SDrawGetFrameWindow(NULL); |
|
v8 = SDlgDialogBoxParam(ghUiInst, "SELHERO_DIALOG", v7, SelHero_WndProc, 0); |
|
if (dlgresult) |
|
*dlgresult = v8; |
|
if (name) |
|
strcpy(name, selhero_heronamestr); |
|
if (hero_is_created) |
|
*hero_is_created = selhero_is_created; |
|
return 1; |
|
} |
|
// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow(); |
|
// 1002A45C: using guessed type int selhero_is_created; |
|
|
|
// ref: 0x1000BC46 |
|
LRESULT __stdcall SelHero_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) |
|
{ |
|
HWND v4; // eax |
|
int v6; // edx |
|
HWND v7; // ecx |
|
signed int v8; // [esp-4h] [ebp-8h] |
|
|
|
if (Msg > 0xBD2) { |
|
switch (Msg) { |
|
case 0xBD3u: |
|
SelHero_DoSelLoad(hWnd); |
|
return 0; |
|
case 0xBD4u: |
|
SelHero_DoSelDiff(hWnd); |
|
return 0; |
|
case 0xBD5u: |
|
v7 = hWnd; |
|
if (selhero_is_good != 1) { |
|
v8 = 2; |
|
goto LABEL_30; |
|
} |
|
break; |
|
case 0xBD6u: |
|
strcpy(selhero_heronamestr, heroinfo_create.name); |
|
v6 = 1; |
|
v7 = hWnd; |
|
if (selhero_is_good != 1) { |
|
selhero_difficulty = 0; |
|
LABEL_31: |
|
SelHero_DoHeroEndFade(v7, v6); |
|
return 0; |
|
} |
|
break; |
|
case 0xBD7u: |
|
SelHero_DoStuffWithStrings(hWnd); |
|
return 0; |
|
default: |
|
return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam); |
|
} |
|
v8 = 3; |
|
LABEL_30: |
|
v6 = v8; |
|
goto LABEL_31; |
|
} |
|
if (Msg == 3026) { |
|
SelHero_DoEnterName(hWnd); |
|
return 0; |
|
} |
|
if (Msg == 2) { |
|
SelHero_DeleteAndFree(hWnd); |
|
return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam); |
|
} |
|
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); |
|
} |
|
switch (Msg) { |
|
case 0x110u: |
|
SelHero_LoadHeroGFX(hWnd); |
|
PostMessageA(hWnd, 0x7E8u, 0, 0); |
|
return 0; |
|
case 0x7E8u: |
|
if (!Fade_CheckRange5()) |
|
Fade_SetFadeTimer((int)hWnd); |
|
return 0; |
|
case 0xBD0u: |
|
SelHero_DoHeroSelList(hWnd); |
|
return 0; |
|
} |
|
if (Msg != 3025) |
|
return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam); |
|
SelHero_DoHeroSelClass(hWnd); |
|
return 0; |
|
} |
|
// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow(); |
|
// 1002A420: using guessed type int selhero_difficulty; |
|
|
|
// ref: 0x1000BDAD |
|
void __fastcall SelHero_DoStuffWithStrings(HWND hWnd) |
|
{ |
|
_uiheroinfo *v1; // eax |
|
char dialogstr[80]; // [esp+Ch] [ebp-B4h] |
|
char string64[64]; // [esp+5Ch] [ebp-64h] |
|
char Buffer[32]; // [esp+9Ch] [ebp-24h] |
|
|
|
if (SelHero_GetHeroIsGood() == 1) |
|
LoadStringA(ghUiInst, 0x23u, Buffer, 31); |
|
else |
|
LoadStringA(ghUiInst, 0x22u, Buffer, 31); |
|
LoadStringA(ghUiInst, 7u, string64, 63); |
|
wsprintfA(dialogstr, string64, selhero_heronamestr); |
|
if (SelYesNo_YesNoDialog(hWnd, dialogstr, Buffer, 1) != 2) { |
|
v1 = SelHero_GetHeroSlotFromName(sgpHeroInfo, selhero_heronamestr); |
|
if (v1) { |
|
if (selhero_fnremove(v1)) { |
|
sgpHeroInfo = SelHero_GetNextHeroFromStr(sgpHeroInfo, selhero_heronamestr); |
|
--selhero_numheroesleft; |
|
LoadStringA(ghUiInst, 0x1Eu, string64, 15); |
|
if (!strcmp(string64, sgpHeroInfo->name)) { |
|
PostMessageA(hWnd, 0xBD1u, 0, 0); |
|
return; |
|
} |
|
SelHero_PrintHeroInfo(hWnd, sgpHeroInfo); |
|
} else { |
|
LoadStringA(ghUiInst, 0x11u, string64, 63); |
|
SelYesNo_SelOkDialog(hWnd, string64, Buffer, 1); |
|
} |
|
} |
|
} |
|
PostMessageA(hWnd, 0xBD0u, 0, 0); |
|
} |
|
// 1002A428: using guessed type int selhero_numheroesleft; |
|
|
|
// ref: 0x1000BEDB |
|
_uiheroinfo *__fastcall SelHero_GetNextHeroFromStr(_uiheroinfo *pInfo, char *name) |
|
{ |
|
_uiheroinfo *v2; // ebx |
|
_uiheroinfo *v3; // ebp |
|
_uiheroinfo *v4; // edi |
|
|
|
v2 = pInfo; |
|
v3 = 0; |
|
v4 = 0; |
|
if (pInfo) { |
|
while (!v4) { |
|
if (!strcmp(pInfo->name, name)) { |
|
v4 = pInfo; |
|
} else { |
|
v3 = pInfo; |
|
pInfo = pInfo->next; |
|
} |
|
if (!pInfo) { |
|
if (!v4) |
|
return v2; |
|
break; |
|
} |
|
} |
|
if (v3) |
|
v3->next = v4->next; |
|
else |
|
v2 = v4->next; |
|
SelHero_FreeSomeMemory(v4); |
|
} |
|
return v2; |
|
} |
|
|
|
// ref: 0x1000BF33 |
|
void __fastcall SelHero_FreeSomeMemory(void *ptr) |
|
{ |
|
if (ptr) |
|
SMemFree(ptr, "C:\\Src\\Diablo\\DiabloUI\\SelHero.cpp", 131, 0); |
|
} |
|
|
|
// ref: 0x1000BF4A |
|
_uiheroinfo *__fastcall SelHero_GetHeroSlotFromName(_uiheroinfo *pInfo, const char *name) |
|
{ |
|
_uiheroinfo *i; // esi |
|
|
|
for (i = pInfo; i && _strcmpi(i->name, name); i = i->next) |
|
; |
|
return i; |
|
} |
|
|
|
// ref: 0x1000BF6D |
|
void __fastcall SelHero_DoHeroSelList(HWND hWnd) |
|
{ |
|
BOOL v2; // eax |
|
int v3; // edx |
|
|
|
v2 = SDlgDialogBoxParam(ghUiInst, "SELLIST_DIALOG", (int)hWnd, SelList_WndProc, 0); |
|
if (v2 == 1) { |
|
if (!strlen(selhero_heronamestr)) { |
|
PostMessageA(hWnd, 0xBD1u, 0, 0); |
|
return; |
|
} |
|
if (selhero_is_good == 1) { |
|
PostMessageA(hWnd, 0xBD5u, 0, 0); |
|
return; |
|
} |
|
if (selhero_hero_hassaved) { |
|
PostMessageA(hWnd, 0xBD3u, 0, 0); |
|
return; |
|
} |
|
selhero_difficulty = 0; |
|
v3 = 1; |
|
LABEL_13: |
|
SelHero_DoHeroEndFade(hWnd, v3); |
|
return; |
|
} |
|
if (v2 != 1006) { |
|
v3 = 4; |
|
goto LABEL_13; |
|
} |
|
PostMessageA(hWnd, 0xBD7u, 0, 0); |
|
} |
|
// 1002A420: using guessed type int selhero_difficulty; |
|
// 1002A424: using guessed type int selhero_hero_hassaved; |
|
|
|
// ref: 0x1000BFF9 |
|
void __fastcall SelHero_DoHeroSelClass(HWND hWnd) |
|
{ |
|
BOOL v2; // eax |
|
int v3; // eax |
|
char Buffer[32]; // [esp+8h] [ebp-20h] |
|
|
|
v2 = SDlgDialogBoxParam(ghUiInst, "SELCLASS_DIALOG", (int)hWnd, SelClass_WndProc, 0); |
|
if (v2 == -1 || v2 == 2) { |
|
LoadStringA(ghUiInst, 0x1Eu, Buffer, 31); |
|
if (!strcmp(Buffer, sgpHeroInfo->name)) |
|
SelHero_DoHeroEndFade(hWnd, 4); |
|
else |
|
PostMessageA(hWnd, 0xBD0u, 0, 0); |
|
} else { |
|
v3 = v2 - 1063; |
|
if (v3) { |
|
if (v3 == 1) |
|
heroinfo_create.heroclass = 2; |
|
else |
|
heroinfo_create.heroclass = 0; |
|
} else { |
|
heroinfo_create.heroclass = 1; |
|
} |
|
PostMessageA(hWnd, 0xBD2u, 0, 0); |
|
} |
|
} |
|
|
|
// ref: 0x1000C09B |
|
void __fastcall SelHero_DoEnterName(HWND hWnd) |
|
{ |
|
char namestr[16]; // [esp+8h] [ebp-10h] |
|
|
|
if (SDlgDialogBoxParam(ghUiInst, "ENTERNAME_DIALOG", (int)hWnd, EntName_WndProc, (int)namestr) == 1) { |
|
namestr[15] = 0; |
|
if (SelHero_CreateHero(hWnd, namestr)) |
|
PostMessageA(hWnd, 0xBD6u, 0, 0); |
|
else |
|
PostMessageA(hWnd, 0xBD2u, 0, 0); |
|
} else { |
|
PostMessageA(hWnd, 0xBD1u, 0, 0); |
|
} |
|
} |
|
|
|
// ref: 0x1000C0F9 |
|
BOOL __fastcall SelHero_CreateHero(HWND hWnd, char *name) |
|
{ |
|
_uiheroinfo *v2; // edi |
|
char dialogstr[144]; // [esp+Ch] [ebp-138h] |
|
char v5[128]; // [esp+9Ch] [ebp-A8h] |
|
char Buffer[32]; // [esp+11Ch] [ebp-28h] |
|
|
|
if (SelHero_GetHeroIsGood() == 1) |
|
LoadStringA(ghUiInst, 0x20u, Buffer, 31); |
|
else |
|
LoadStringA(ghUiInst, 0x1Fu, Buffer, 31); |
|
if (!UiValidPlayerName(name)) { |
|
LoadStringA(ghUiInst, 0xFu, v5, 127); |
|
SelYesNo_SelOkDialog(hWnd, v5, Buffer, 1); |
|
return 0; |
|
} |
|
v2 = SelHero_GetHeroSlotFromName(sgpHeroInfo, name); |
|
if (v2) { |
|
LoadStringA(ghUiInst, 8u, v5, 127); |
|
wsprintfA(dialogstr, v5, v2->name); |
|
if (SelYesNo_YesNoDialog(hWnd, dialogstr, Buffer, 1) == 2) |
|
return 0; |
|
} |
|
strcpy(heroinfo_create.name, name); |
|
heroinfo_create.hassaved = 0; |
|
if (!selhero_fncreate(&heroinfo_create)) { |
|
LoadStringA(ghUiInst, 0x10u, v5, 127); |
|
OkCancel_DoOkDialog(hWnd, v5, 1); |
|
return 0; |
|
} |
|
selhero_is_created = 1; |
|
return 1; |
|
} |
|
// 1002A45C: using guessed type int selhero_is_created; |
|
|
|
// ref: 0x1000C21A |
|
void __fastcall SelHero_DoSelLoad(HWND hWnd) |
|
{ |
|
BOOL v2; // eax |
|
|
|
v2 = SDlgDialogBoxParam(ghUiInst, "SELLOAD_DIALOG", (int)hWnd, SelLoad_WndProc, 0); |
|
if (v2 == -1 || v2 == 2) { |
|
PostMessageA(hWnd, 0xBD0u, 0, 0); |
|
} else if (v2 == 1106) { |
|
PostMessageA(hWnd, 0xBD5u, 0, 0); |
|
} else { |
|
PostMessageA(hWnd, 0xBD4u, 0, 0); |
|
} |
|
} |
|
|
|
// ref: 0x1000C269 |
|
void __fastcall SelHero_DoSelDiff(HWND hWnd) |
|
{ |
|
_uiheroinfo *v3; // eax |
|
int v4; // eax |
|
char Buffer[256]; // [esp+4h] [ebp-208h] |
|
char v6[128]; // [esp+104h] [ebp-108h] |
|
char v7[128]; // [esp+184h] [ebp-88h] |
|
_gamedata gameData; // [esp+204h] [ebp-8h] |
|
|
|
if (!SelHero_GetHeroIsGood()) { |
|
SelHero_SetHeroDifficulty(0); |
|
LABEL_3: |
|
SelHero_DoHeroEndFade(hWnd, 1); |
|
return; |
|
} |
|
CreaDung_SetDelSpin(1); |
|
if (SDlgDialogBoxParam(ghUiInst, "SELDIFF_DIALOG", (int)hWnd, CreaDung_WndProc, selhero_is_good) == 1) { |
|
v3 = SelHero_GetHeroSlotFromName(sgpHeroInfo, selhero_heronamestr); |
|
UiCreatePlayerDescription(v3, 'DBLO', v7); |
|
gameData.bDiff = selhero_difficulty; |
|
Connect_SetDiffString(&gameData, selhero_heronamestr, v7, v6, 128); |
|
v4 = UiAuthCallback(2, selhero_heronamestr, v7, 0, v6, Buffer, 256); |
|
if (v4) |
|
goto LABEL_3; |
|
SelYesNo_SelOkDialog(hWnd, Buffer, 0, 1); |
|
PostMessageA(hWnd, 0xBD4u, 0, 0); |
|
} else { |
|
PostMessageA(hWnd, 0xBD3u, 0, 0); |
|
} |
|
} |
|
// 1002A420: using guessed type int selhero_difficulty; |
|
|
|
// ref: 0x1000C364 |
|
void __fastcall SelHero_DeleteAndFree(HWND hWnd) |
|
{ |
|
void **v2; // eax |
|
|
|
Doom_DeleteFreeProcs(hWnd, selhero_msgtbl_info); |
|
Doom_DeleteFreeProcs(hWnd, selhero_msgtbl_3); |
|
Doom_DeleteFreeProcs(hWnd, selhero_msgtbl_string); |
|
Title_KillTitleTimer(hWnd); |
|
SelHero_FreeAllHeroes(sgpHeroInfo); |
|
if (selhero_buffer) { |
|
SMemFree(selhero_buffer, "C:\\Src\\Diablo\\DiabloUI\\SelHero.cpp", 744, 0); |
|
selhero_buffer = 0; |
|
} |
|
v2 = (void **)GetWindowLongA(hWnd, -21); |
|
local_FreeMemPtr(v2); |
|
} |
|
|
|
// ref: 0x1000C3CE |
|
void __fastcall SelHero_FreeAllHeroes(_uiheroinfo *pInfo) |
|
{ |
|
_uiheroinfo *v1; // esi |
|
|
|
if (pInfo) { |
|
do { |
|
v1 = pInfo->next; |
|
SelHero_FreeSomeMemory(pInfo); |
|
pInfo = v1; |
|
} while (v1); |
|
} |
|
} |
|
|
|
// ref: 0x1000C3E2 |
|
void __fastcall SelHero_DoHeroEndFade(HWND hWnd, int a2) |
|
{ |
|
void *v2; // edi |
|
|
|
v2 = (void *)a2; |
|
Fade_Range5SetZero(); |
|
Fade_UpdatePaletteRange(10); |
|
SDlgEndDialog(hWnd, v2); |
|
} |
|
|
|
// ref: 0x1000C3FF |
|
void __fastcall SelHero_LoadHeroGFX(HWND hWnd) |
|
{ |
|
HWND v1; // eax |
|
int v2; // eax |
|
HWND v3; // eax |
|
int v4; // eax |
|
HWND v5; // eax |
|
int v6; // eax |
|
HWND v7; // eax |
|
int v8; // eax |
|
HWND v9; // eax |
|
int v10; // eax |
|
DWORD *v12; // eax MAPDST |
|
|
|
SelHero_SelectHeroRegion(hWnd); |
|
v12 = local_AllocWndLongData(); |
|
if (v12) { |
|
SetWindowLongA(hWnd, -21, (LONG)v12); |
|
local_LoadArtWithPal(hWnd, 0, &nullcharacter, -1, 1, "ui_art\\selhero.pcx", (BYTE **)v12, v12 + 1, 0); |
|
Fade_NoInputAndArt(hWnd, 1); |
|
} |
|
local_LoadArtImage("ui_art\\heros.pcx", &selhero_buffer, selhero_sizedata); |
|
SetActiveWindow(hWnd); |
|
Title_LoadImgSetTimer(hWnd, "ui_art\\smlogo.pcx"); |
|
Doom_ParseWndProc3(hWnd, selhero_msgtbl_string, AF_BIGGRAY); |
|
Doom_ParseWndProc3(hWnd, selhero_msgtbl_3, AF_SMALLGRAY); |
|
Doom_ParseWndProc3(hWnd, selhero_msgtbl_info, AF_SMALLGRAY); |
|
selhero_hero_hassaved = 0; |
|
selhero_heronamestr[0] = 0; |
|
v1 = GetDlgItem(hWnd, 1014); |
|
v2 = GetWindowLongA(v1, -21); |
|
local_SetWndLongStr(v2, "--"); |
|
v3 = GetDlgItem(hWnd, 1018); |
|
v4 = GetWindowLongA(v3, -21); |
|
local_SetWndLongStr(v4, "--"); |
|
v5 = GetDlgItem(hWnd, 1017); |
|
v6 = GetWindowLongA(v5, -21); |
|
local_SetWndLongStr(v6, "--"); |
|
v7 = GetDlgItem(hWnd, 1016); |
|
v8 = GetWindowLongA(v7, -21); |
|
local_SetWndLongStr(v8, "--"); |
|
v9 = GetDlgItem(hWnd, 1015); |
|
v10 = GetWindowLongA(v9, -21); |
|
local_SetWndLongStr(v10, "--"); |
|
SelHero_SetStaticBMP(hWnd, 3); |
|
Doom_ParseWndProc4(hWnd, selhero_msgtbl_info, AF_SMALLGRAY); |
|
} |
|
// 1002A424: using guessed type int selhero_hero_hassaved; |
|
|
|
// ref: 0x1000C49F |
|
void __fastcall SelHero_SelectHeroRegion(HWND hWnd) |
|
{ |
|
_uiheroinfo *v2; // esi |
|
_uiheroinfo *v3; // [esp+10h] [ebp-44h] |
|
char Buffer[64]; // [esp+14h] [ebp-40h] |
|
|
|
v2 = SelHero_AllocHeroInfo(); |
|
v2->next = 0; |
|
LoadStringA(ghUiInst, 0x1Eu, v2->name, 15); |
|
v2->level = 0; |
|
sgpHeroInfo = SelRegn_SetNextHero(sgpHeroInfo, v2); |
|
v3 = sgpHeroInfo; |
|
selhero_numheroesleft = 1; |
|
if (!selhero_fninfo(SelHero_GetHeroInfo)) { |
|
LoadStringA(ghUiInst, 0x12u, Buffer, 64); |
|
OkCancel_DoOkDialog(hWnd, Buffer, 1); |
|
} |
|
if (v3 == sgpHeroInfo) |
|
PostMessageA(hWnd, 0xBD1u, 0, 0); |
|
else |
|
PostMessageA(hWnd, 0xBD0u, 0, 0); |
|
} |
|
// 1002A428: using guessed type int selhero_numheroesleft; |
|
|
|
// ref: 0x1000C541 |
|
BOOL __stdcall SelHero_GetHeroInfo(_uiheroinfo *pInfo) |
|
{ |
|
_uiheroinfo *v1; // esi |
|
_uiheroinfo *v2; // eax |
|
|
|
v1 = SelHero_AllocHeroInfo(); |
|
memcpy(v1, pInfo, 0x2Cu); |
|
v1->next = 0; |
|
v2 = SelRegn_SetNextHero(sgpHeroInfo, v1); |
|
++selhero_numheroesleft; |
|
sgpHeroInfo = v2; |
|
return 1; |
|
} |
|
// 1002A428: using guessed type int selhero_numheroesleft; |
|
|
|
// ref: 0x1000C57A |
|
BOOL __stdcall UiSelHeroSingDialog( |
|
BOOL(__stdcall *fninfo)(BOOL(__stdcall *fninfofunc)(_uiheroinfo *)), |
|
BOOL(__stdcall *fncreate)(_uiheroinfo *), |
|
BOOL(__stdcall *fnremove)(_uiheroinfo *), |
|
BOOL(__stdcall *fnstats)(unsigned int, _uidefaultstats *), |
|
int *dlgresult, |
|
char *name, |
|
int *difficulty) |
|
{ |
|
int v7; // eax |
|
int v8; // edi |
|
|
|
artfont_LoadAllFonts(); |
|
selhero_fninfo = fninfo; |
|
selhero_fncreate = fncreate; |
|
selhero_fnremove = fnremove; |
|
selhero_fnstats = fnstats; |
|
sgpHeroInfo = 0; |
|
selhero_is_good = 0; |
|
v7 = (int)SDrawGetFrameWindow(NULL); |
|
v8 = SDlgDialogBoxParam(ghUiInst, "SELHERO_DIALOG", v7, SelHero_WndProc, 0); |
|
if (dlgresult) |
|
*dlgresult = v8; |
|
if (name) |
|
strcpy(name, selhero_heronamestr); |
|
if (difficulty) |
|
*difficulty = selhero_difficulty; |
|
if (v8 != 4) |
|
artfont_FreeAllFonts(); |
|
return 1; |
|
} |
|
// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow(); |
|
// 1002A420: using guessed type int selhero_difficulty;
|
|
|