// ref: 0x1000722B
void __fastcall Fade_ApplyPaletteRange(int range1, int range2)
{
	tagPALETTEENTRY *v4; // eax MAPDST
	BYTE *v6; // esi
	BYTE v7; // al

	v4 = local_GetArtPalEntry(0);
	if ( range1 == range2 )
	{
		memcpy(fadepal, v4, 0x400u);
	}
	else if ( range2 )
	{
		v6 = &fadepal[0].peGreen;
		do
		{
			v7 = range2 * v4->peRed / range1;
			++v4;
			*(v6 - 1) = v7;
			*v6 = range2 * v4[-1].peGreen / range1;
			v6 += 4;
			*(v6 - 3) = range2 * v4[-1].peBlue / range1;
		}
		while ( (signed int)v6 < (signed int)&fadepal[256].peGreen );
	}
	else
	{
		memcpy(fadepal, v4, 0x400u);
		local_ClearPalette(fadepal);
	}
	SDrawUpdatePalette(0, 0x100u, fadepal, 1);
}

// ref: 0x100072BE
void __fastcall Fade_UpdatePaletteRange(int range)
{
	tagPALETTEENTRY *v2; // eax
	tagPALETTEENTRY *v3; // edi
	BYTE *v4; // ecx
	BYTE v5; // al
	HPALETTE v6; // ebx
	int v7; // [esp+10h] [ebp-4h]

	v2 = local_GetArtPalEntry(0);
	memcpy(fadepal, v2, 0x400u);
	if ( range > 0 )
	{
		v7 = range;
		do
		{
			v3 = local_GetArtPalEntry(0);
			v4 = &fadepal[0].peGreen;
			do
			{
				v5 = v3->peRed / range;
				++v3;
				*(v4 - 1) -= v5;
				*v4 -= v3[-1].peGreen / range;
				v4 += 4;
				*(v4 - 3) -= v3[-1].peBlue / range;
			}
			while ( (signed int)v4 < (signed int)&fadepal[256].peGreen );
			SDrawUpdatePalette(0, 0x100u, fadepal, 1);
			--v7;
		}
		while ( v7 );
	}
	local_ClearPalette(fadepal);
	SDrawUpdatePalette(0, 0x100u, fadepal, 1);
	local_SetCursorDefault();
	SDrawClearSurface(0);
	v6 = (HPALETTE)GetStockObject(15);
	GetPaletteEntries(v6, 0, 0xAu, fadepal);
	GetPaletteEntries(v6, 0xAu, 0xAu, &fadepal[246]);
	SDrawUpdatePalette(0, 0x100u, fadepal, 1);
}
// 1001043C: using guessed type int __stdcall SDrawClearSurface(_DWORD);

// ref: 0x1000739F
BOOL __cdecl Fade_CheckRange5()
{
	BOOL result; // eax

	result = 0;
	if ( sgbIsFading )
	{
		if ( sgbFadeRange <= 5 )
			result = 1;
	}
	return result;
}
// 10029C70: using guessed type int sgbIsFading;

// ref: 0x100073B4
void __cdecl Fade_Range5SetZero()
{
	if ( Fade_CheckRange5() )
		sgbIsFading = 0;
}
// 10029C70: using guessed type int sgbIsFading;

// ref: 0x100073C5
void __fastcall Fade_NoInputAndArt(HWND hWnd, BOOL bShowCurs)
{
	HWND v3; // eax

	v3 = GetParent(hWnd);
	local_DisableKeyWaitMouse(v3);
	if ( bShowCurs )
		local_SetCursorArt();
	sgbIsFading = 0;
	sgbFadeRange = 0;
}
// 10029C70: using guessed type int sgbIsFading;

// ref: 0x100073EF
void __fastcall Fade_SetInputWindow(HWND hWnd)
{
	HWND v1; // eax

	v1 = GetParent(hWnd);
	local_DisableKeyWaitMouse(v1);
}

// ref: 0x100073FD
void __fastcall Fade_SetFadeTimer(int nTime)
{
	if ( !sgbIsFading )
	{
		SDlgSetTimer(nTime, 16, 50, Fade_TimerFunctionDlg);
		sgbIsFading = 1;
	}
}
// 10029C70: using guessed type int sgbIsFading;

// ref: 0x10007420
void __stdcall Fade_TimerFunctionDlg(int a1, int a2, int a3, int a4)
{
	if ( sgbFadeRange > 5 )
	{
		SDlgKillTimer(a1, 16);
	}
	else
	{
		Fade_ApplyPaletteRange(5, sgbFadeRange);
		++sgbFadeRange;
	}
}

// ref: 0x1000744D
void __cdecl Fade_cpp_init()
{
	fade_cpp_float = fade_cpp_float_value;
}
// 1001F428: using guessed type int fade_cpp_float_value;
// 10029868: using guessed type int fade_cpp_float;
