// ref: 0x10004C33
void __fastcall CreaDung_SetDelSpin(int a1)
{
	creadung_delspinners = a1;
}
// 100296CC: using guessed type int creadung_delspinners;

// ref: 0x10004C3F
void __cdecl CreaDung_cpp_init()
{
	CreaDung_cpp_float = CreaDung_cpp_float_value;
}
// 1001F400: using guessed type int CreaDung_cpp_float_value;
// 100296C4: using guessed type int CreaDung_cpp_float;

// ref: 0x10004C4A
LRESULT __stdcall CreaDung_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
	HWND v4; // eax
	HWND v6; // eax

	if ( Msg == 2 )
	{
		CreaDung_FreeDungProcs(hWnd);
	}
	else if ( Msg > 0x103 )
	{
		if ( Msg > 0x105 )
		{
			if ( Msg == 272 )
			{
				creadung_dword_100296D8 = lParam;
				CreaDung_LoadDungGFX(hWnd);
			}
			else
			{
				if ( Msg == 273 )
				{
					if ( HIWORD(wParam) == 7 )
					{
						Focus_GetAndBlitSpin(hWnd, lParam);
					}
					else if ( HIWORD(wParam) == 6 )
					{
						Focus_CheckPlayMove(lParam);
						Focus_DoBlitSpinIncFrame(hWnd, (HWND)lParam);
						CreaDung_ParseDungProcs(hWnd, (unsigned short)wParam);
					}
					else if ( HIWORD(wParam) == 5 || (_WORD)wParam == 1 )
					{
						CreaDung_DoAllPlaySnd(hWnd);
					}
					else if ( (_WORD)wParam == 2 )
					{
						CreaDung_PlaySndAndKill(hWnd, 2);
					}
					return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);
				}
				if ( Msg != 275 )
				{
					if ( Msg == 513 )
						CreaDung_CheckDlgForSnd(hWnd, (unsigned short)lParam, (unsigned int)lParam >> 16);
					return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);
				}
				if ( wParam == 1 )
				{
					v4 = GetFocus();
					Focus_DoBlitSpinIncFrame(hWnd, v4);
				}
			}
			return 0;
		}
		v6 = (HWND)SDrawGetFrameWindow(NULL);
		SendMessageA(v6, Msg, wParam, lParam);
	}
	return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);
}
// 10010382: using guessed type _DWORD __stdcall SDrawGetFrameWindow();
// 100296D8: using guessed type int creadung_dword_100296D8;

// ref: 0x10004D75
void __fastcall CreaDung_ParseDungProcs(HWND hWnd, int dlg)
{
	HWND v3; // eax
	int v4; // eax
	HWND v5; // eax
	int v6; // eax
	char Buffer[256]; // [esp+4h] [ebp-100h]

	LoadStringA(ghUiInst, dlg - 1055, Buffer, 255);
	v3 = GetDlgItem(hWnd, 1097);
	if ( v3 )
	{
		v4 = GetWindowLongA(v3, -21);
		local_SetWndLongStr(v4, Buffer);
	}
	Doom_ParseWndProc4(hWnd, creadung_msgtbl2, 5);
	LoadStringA(ghUiInst, dlg - 65, Buffer, 255);
	v5 = GetDlgItem(hWnd, 1099);
	if ( v5 )
	{
		v6 = GetWindowLongA(v5, -21);
		local_SetWndLongStr(v6, Buffer);
	}
	Doom_ParseWndProc4(hWnd, creadung_msgtbl3, 1);
}

// ref: 0x10004E2E
void __fastcall CreaDung_FreeDungProcs(HWND hWnd)
{
	void **v2; // eax

	Doom_DeleteFreeProcs(hWnd, creadung_msgtbl5);
	Doom_DeleteFreeProcs(hWnd, creadung_msgtbl4);
	Doom_DeleteFreeProcs(hWnd, creadung_msgtbl3);
	Doom_DeleteFreeProcs(hWnd, creadung_msgtbl2);
	Doom_DeleteFreeProcs(hWnd, creadung_msgtbl1);
	v2 = (void **)GetWindowLongA(hWnd, -21);
	local_FreeMemPtr(v2);
	if ( creadung_delspinners )
		Focus_DeleteSpinners();
}
// 100296CC: using guessed type int creadung_delspinners;

// ref: 0x10004E8B
void __fastcall CreaDung_LoadDungGFX(HWND hWnd)
{
	DWORD *v2; // eax MAPDST

	if ( creadung_delspinners )
		Focus_LoadSpinner("ui_art\\focus16.pcx");
	else
		Focus_ResetSpinToZero();
	SDlgSetTimer((int)hWnd, 1, 55, 0);
	v2 = local_AllocWndLongData();
	if ( v2 )
	{
		SetWindowLongA(hWnd, -21, (LONG)v2);
		local_LoadArtWithPal(hWnd, 0, "popup", -1, 1, "ui_art\\seldiff.pcx", (BYTE **)v2, v2 + 1, 0);
	}
	local_DoUiWndProc(hWnd, (DWORD *)creadung_msgtbl5);
	Doom_ParseWndProc3(hWnd, creadung_msgtbl1, 5);
	Doom_ParseWndProc3(hWnd, creadung_msgtbl2, 5);
	Doom_ParseWndProc3(hWnd, creadung_msgtbl3, 1);
	Doom_ParseWndProcs(hWnd, creadung_msgtbl4, 4, 0);
	Doom_ParseWndProcs(hWnd, creadung_msgtbl5, 2, 1);
}
// 100296CC: using guessed type int creadung_delspinners;

// ref: 0x10004F40
void __fastcall CreaDung_PlaySndAndKill(HWND hWnd, int a2)
{
	TitleSnd_PlaySelectSound();
	SDlgKillTimer((int)hWnd, 1);
	SDlgEndDialog(hWnd, (HANDLE)a2);
}

// ref: 0x10004F5D
void __fastcall CreaDung_DoAllPlaySnd(HWND hWnd)
{
	//int v1; // ebp
	HWND v2; // esi
	HWND v3; // eax
	LONG v4; // eax
	HWND v5; // edi
	HWND v6; // eax
	int v7; // [esp-288h] [ebp-28Ch]
	int v8; // [esp-188h] [ebp-18Ch]
	char *v9; // [esp-108h] [ebp-10Ch]
	char *v10; // [esp-88h] [ebp-8Ch]
	int v11; // [esp-8h] [ebp-Ch]
	char v12; // [esp-4h] [ebp-8h]
	//int v13; // [esp+0h] [ebp-4h]

	/* note: stack is hosed, fix me */
	v2 = hWnd;
	if ( creadung_dword_100296D8 == 1 )
	{
		//v13 = v1;
		v5 = hWnd;
		Connect_CopyPlrDescStrings((char *)&v10, 128, (char *)&v9, 128);
		v6 = GetFocus();
		v12 = GetWindowLongA(v6, -12) - 70;
		Connect_SetDiffString((_gamedata *)&v11, (const char *)&v10, (char *)&v9, (char *)&v8, 128);
		if ( UiAuthCallback(2, (char *)&v10, (char *)&v9, 0, (char *)&v8, (LPSTR)&v7, 256) )
			CreaDung_DoSnetCreaGame(v5);
		else
			SelYesNo_SelOkDialog(v5, (char *)&v7, 0, 0);
	}
	else
	{
		v3 = GetFocus();
		v4 = GetWindowLongA(v3, -12);
		SelHero_SetHeroDifficulty(v4 - 1094);
		CreaDung_PlaySndAndKill(v2, 1);
	}
}
// 10004F5D: could not find valid save-restore pair for ebp
// 100296D8: using guessed type int creadung_dword_100296D8;

// ref: 0x10005037
void __fastcall CreaDung_DoSnetCreaGame(HWND hWnd)
{
	HWND v1; // ebx
	DWORD *v2; // eax
	DWORD v3; // edi
	char a4[256]; // [esp+8h] [ebp-34Ch]
	char v5[128]; // [esp+108h] [ebp-24Ch]
	char Buffer[192]; // [esp+188h] [ebp-1CCh]
	char a3[128]; // [esp+248h] [ebp-10Ch]
	char a2[128]; // [esp+2C8h] [ebp-8Ch]
	_gamedata a1; // [esp+348h] [ebp-Ch]

	v1 = GetFocus();
	if ( hWnd == GetParent(v1) )
	{
		Connect_CopyPlrDescStrings(a2, 128, a3, 128);
		a1.bDiff = GetWindowLongA(v1, -12) - 70;
		Connect_SetDiffString(&a1, a2, a3, a4, 256);
		v2 = crea_somegamestruct;
		if ( crea_somegamestruct[8] >= 8 )
		{
			v3 = crea_somegamestruct[7];
			*(_BYTE *)(v3 + 4) = GetWindowLongA(v1, -12) - 70;
			v2 = crea_somegamestruct;
		}
		if ( SNetCreateGame(
				 creadung_gamename,
				 0,
				 a4,
				 0,
				 (char *)v2[7],
				 v2[8],
				 *(_DWORD *)(creadung_playername + 8),
				 a2,
				 0,
				 (DWORD *)creadung_playerID) )
		{
			CreaDung_PlaySndAndKill(hWnd, 1);
		}
		else
		{
			creadung_lasterror = SErrGetLastError();
			if ( creadung_lasterror == 183 )
			{
				LoadStringA(ghUiInst, 0x49u, v5, 127);
				wsprintfA(Buffer, v5, creadung_gamename);
			}
			else
			{
				LoadStringA(ghUiInst, 0x26u, Buffer, 191);
			}
			SelYesNo_SelOkDialog(hWnd, Buffer, 0, 0);
		}
	}
}
// 10010406: using guessed type _DWORD __stdcall SErrGetLastError();
// 100296BC: using guessed type int creadung_playername;
// 100296D4: using guessed type int creadung_lasterror;

// ref: 0x1000517E
void __fastcall CreaDung_CheckDlgForSnd(HWND hWnd, int a2, int a3)
{
	HWND v6; // eax
	HWND v7; // eax

	v6 = GetDlgItem(hWnd, 1056);
	if ( local_GetBottomRect(hWnd, v6, a2, a3) )
	{
		CreaDung_DoAllPlaySnd(hWnd);
	}
	else
	{
		v7 = GetDlgItem(hWnd, 1054);
		if ( local_GetBottomRect(hWnd, v7, a2, a3) )
			CreaDung_PlaySndAndKill(hWnd, 2);
	}
}

// ref: 0x100051D8
BOOL __fastcall CreaDung_SelDungDiff(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
{
	int v8; // ST10_4
	BOOL result; // eax

	creadung_playername = a1;
	creadung_dword_100296C8 = a3;
	creadung_playerID = (int *)a6;
	creadung_delspinners = a7;
	crea_somegamestruct = (DWORD *)a2;
	creadung_gamename = (char *)a8;
	v8 = SelHero_GetHeroIsGood();
	result = SDlgDialogBoxParam(ghUiInst, "SELDIFF_DIALOG", *(_DWORD *)(a4 + 8), CreaDung_WndProc, v8);
	if ( result != 1 )
	{
		SErrSetLastError(creadung_lasterror);
		result = 0;
	}
	return result;
}
// 1001041E: using guessed type int __stdcall SErrSetLastError(_DWORD);
// 100296BC: using guessed type int creadung_playername;
// 100296C8: using guessed type int creadung_dword_100296C8;
// 100296CC: using guessed type int creadung_delspinners;
// 100296D4: using guessed type int creadung_lasterror;
