Files
devilution/DiabloUI/selhero.cpp
2020-10-25 15:37:51 +01:00

747 lines
20 KiB
C++

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