// 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, 1);
	}
	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, 1);
	}
}
// 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, 5);
	}
}

// ref: 0x1000BAB4
BOOL __fastcall SelHero_IsNameReserved(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(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(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)(int, _uidefaultstats *), int *dlgresult, int *a6, 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 ( a6 )
		*a6 = 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, 5);
	Doom_ParseWndProc3(hWnd, selhero_msgtbl_3, 1);
	Doom_ParseWndProc3(hWnd, selhero_msgtbl_info, 1);
	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, 1);
}
// 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)(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;
