// ref: 0x100099B5
void __cdecl Sbar_cpp_init()
{
	Sbar_cpp_float = Sbar_cpp_float_value;
}
// 1001F448: using guessed type int Sbar_cpp_float_value;
// 1002A338: using guessed type int Sbar_cpp_float;

// ref: 0x100099C0
BOOL __fastcall Sbar_CheckIfNextHero(HWND hWnd)
{
	_uiheroinfo *v1; // eax

	v1 = (_uiheroinfo *)GetWindowLongA(hWnd, -21);
	if ( !v1 || !v1->next )
		return 0;
	v1->next = 0;
	return 1;
}

// ref: 0x100099DC
int __fastcall Sbar_NumScrollLines(HWND hWnd, int width, int height)
{
	_DWORD *v4; // eax
	_DWORD *v5; // esi
	int result; // eax
	signed int v7; // ecx
	LONG v8; // ebx
	LONG v9; // edi
	int v10; // [esp-4h] [ebp-1Ch]
	struct tagPOINT Point; // [esp+Ch] [ebp-Ch]

	Point.x = width;
	Point.y = height;
	if ( !hWnd )
		return 0;
	if ( !IsWindowVisible(hWnd) )
		return 0;
	v4 = (_DWORD *)GetWindowLongA(hWnd, -21);
	v5 = v4;
	if ( !v4 )
		return 0;
	v7 = v4[13];
	if ( v7 <= 1 )
		v8 = 22;
	else
		v8 = v4[14] * (v4[3] - v4[9] - 44) / (v7 - 1) + 22;
	v9 = v8 + v4[9];
	ScreenToClient(hWnd, &Point);
	if ( Point.y >= 22 )
	{
		if ( Point.y >= v8 )
		{
			if ( Point.y >= v9 )
			{
				if ( Point.y >= v5[3] - 22 )
				{
					*v5 = 4;
					v10 = 2;
				}
				else
				{
					*v5 = 8;
					v10 = 4;
				}
			}
			else
			{
				*v5 = 16;
				v10 = 5;
			}
		}
		else
		{
			*v5 = 2;
			v10 = 3;
		}
		result = v10;
	}
	else
	{
		result = 1;
		*v5 = 1;
	}
	return result;
}

// ref: 0x10009A99
void __fastcall Sbar_DrawScrollBar(HWND hWnd, int nIDDlgItem, int width, int height)
{
	HWND v4; // eax
	LONG v5; // eax MAPDST
	unsigned char v7; // zf
	int v8; // eax
	tagRECT DstRect; // [esp+Ch] [ebp-24h]
	tagRECT SrcBuffer; // [esp+1Ch] [ebp-14h]
	HWND hWnda; // [esp+2Ch] [ebp-4h]

	v4 = GetDlgItem(hWnd, nIDDlgItem);
	hWnda = v4;
	if ( v4 )
	{
		v5 = GetWindowLongA(v4, -21);
		if ( v5 )
		{
			if ( *(_DWORD *)(v5 + 4) )
			{
				v7 = *(_DWORD *)(v5 + 16) == 0;
				*(_DWORD *)(v5 + 52) = width;
				*(_DWORD *)(v5 + 56) = height;
				if ( !v7 )
				{
					SrcBuffer.left = 0;
					DstRect.left = 0;
					SrcBuffer.top = 0;
					DstRect.top = 0;
					DstRect.right = *(_DWORD *)(v5 + 8) - 1;
					DstRect.bottom = *(_DWORD *)(v5 + 12) - 1;
					SrcBuffer.right = *(_DWORD *)(v5 + 8) - 1;
					SrcBuffer.bottom = *(_DWORD *)(v5 + 24) - 1;
					SBltROP3Tiled(
						*(void **)(v5 + 4),
						&DstRect,
						*(POINT **)(v5 + 8),
						*(_DWORD *)(v5 + 16),
						&SrcBuffer,
						*(RECT **)(v5 + 20),
						0,
						0,
						0,
						0xCC0020u);
					if ( *(_DWORD *)(v5 + 28) )
					{
						if ( width <= 1 )
							v8 = 22;
						else
							v8 = height * (*(_DWORD *)(v5 + 12) - *(_DWORD *)(v5 + 36) - 44) / (width - 1) + 22;
						SBltROP3(
							(void *)(v8 * *(_DWORD *)(v5 + 8) + *(_DWORD *)(v5 + 4) + 3),
							*(void **)(v5 + 28),
							18,
							*(_DWORD *)(v5 + 36),
							*(_DWORD *)(v5 + 8),
							*(_DWORD *)(v5 + 32),
							0,
							0xCC0020u);
						SBltROP3(
							*(void **)(v5 + 4),
							(void *)(*(_DWORD *)(v5 + 40) + 22 * (~*(_BYTE *)v5 & 1) * *(_DWORD *)(v5 + 44)),
							*(_DWORD *)(v5 + 8),
							22,
							*(_DWORD *)(v5 + 8),
							*(_DWORD *)(v5 + 44),
							0,
							0xCC0020u);
						SBltROP3(
							(void *)(*(_DWORD *)(v5 + 4) + *(_DWORD *)(v5 + 8) * (*(_DWORD *)(v5 + 12) - 22)),
							(void *)(*(_DWORD *)(v5 + 40) + 22 * ((~*(_BYTE *)v5 & 4 | 8u) >> 2) * *(_DWORD *)(v5 + 44)),
							*(_DWORD *)(v5 + 8),
							22,
							*(_DWORD *)(v5 + 8),
							*(_DWORD *)(v5 + 44),
							0,
							0xCC0020u);
						InvalidateRect(hWnda, 0, 0);
					}
				}
			}
		}
	}
}

// ref: 0x10009BF1
void __fastcall Sbar_LoadScrBarGFX(HWND hWnd, int nIDDlgItem)
{
	DWORD *v2; // eax MAPDST
	void *v4; // eax
	struct tagRECT Rect; // [esp+Ch] [ebp-14h]
	HWND hWnda; // [esp+1Ch] [ebp-4h]

	hWnda = GetDlgItem(hWnd, nIDDlgItem);
	if ( hWnda )
	{
		v2 = (DWORD *)SMemAlloc(0x3Cu, "C:\\Src\\Diablo\\DiabloUI\\Sbar.cpp", 221, 0);
		if ( v2 )
		{
			SetWindowLongA(hWnda, -21, (LONG)v2);
			*v2 = 0;
			GetClientRect(hWnda, &Rect);
			v2[2] = Rect.right;
			v2[3] = Rect.bottom;
			v4 = SMemAlloc(Rect.right * Rect.bottom, "C:\\Src\\Diablo\\DiabloUI\\Sbar.cpp", 230, 0);
			v2[1] = (DWORD)v4;
			if ( v4 )
			{
				SDlgSetBitmapI(hWnda, 0, &nullcharacter, -1, 1, v4, 0, v2[2], v2[3], -1);
				local_LoadArtImage("ui_art\\sb_bg.pcx", (BYTE **)v2 + 4, v2 + 5);
				local_LoadArtImage("ui_art\\sb_thumb.pcx", (BYTE **)v2 + 7, v2 + 8);
				local_LoadArtImage("ui_art\\sb_arrow.pcx", (BYTE **)v2 + 10, v2 + 11);
			}
		}
	}
}

// ref: 0x10009CC7
void __cdecl Sbar_cpp_init2()
{
	Sbar_cpp_float2 = Sbar_cpp_float_value2;
}
// 1001F44C: using guessed type int Sbar_cpp_float_value2;
// 1002A344: using guessed type int Sbar_cpp_float2;

// ref: 0x10009CD2
void __fastcall Sbar_FreeScrollBar(HWND hWnd, int nIDDlgItem)
{
	HWND v2; // eax MAPDST
	_DWORD *v4; // eax MAPDST
	void *v6; // eax
	void *v7; // eax
	void *v8; // eax
	void *v9; // eax

	v2 = GetDlgItem(hWnd, nIDDlgItem);
	if ( v2 )
	{
		v4 = (_DWORD *)GetWindowLongA(v2, -21);
		if ( v4 )
		{
			v6 = (void *)v4[1];
			if ( v6 )
				SMemFree(v6, "C:\\Src\\Diablo\\DiabloUI\\Sbar.cpp", 267, 0);
			v7 = (void *)v4[4];
			if ( v7 )
				SMemFree(v7, "C:\\Src\\Diablo\\DiabloUI\\Sbar.cpp", 269, 0);
			v8 = (void *)v4[7];
			if ( v8 )
				SMemFree(v8, "C:\\Src\\Diablo\\DiabloUI\\Sbar.cpp", 271, 0);
			v9 = (void *)v4[10];
			if ( v9 )
				SMemFree(v9, "C:\\Src\\Diablo\\DiabloUI\\Sbar.cpp", 273, 0);
			SMemFree(v4, "C:\\Src\\Diablo\\DiabloUI\\Sbar.cpp", 275, 0);
			SetWindowLongA(v2, -21, 0);
		}
	}
}
