You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
236 lines
6.2 KiB
236 lines
6.2 KiB
// ref: 0x10007458 |
|
void __fastcall Focus_CheckPlayMove(LPARAM lParam) |
|
{ |
|
if (sgbSpinnersLoaded && lParam != dword_10029CA8) { |
|
if (dword_10029CAC) |
|
TitleSnd_PlayMoveSound(); |
|
dword_10029CA8 = lParam; |
|
} |
|
} |
|
// 10029CA4: using guessed type int sgbSpinnersLoaded; |
|
// 10029CA8: using guessed type int dword_10029CA8; |
|
// 10029CAC: using guessed type int dword_10029CAC; |
|
|
|
// ref: 0x10007482 |
|
int __cdecl Focus_GetSpinWidthOrZero() |
|
{ |
|
return sgbSpinnersLoaded != 0 ? focus_spin_width : 0; |
|
} |
|
// 10029CA4: using guessed type int sgbSpinnersLoaded; |
|
|
|
// ref: 0x10007492 |
|
void __fastcall Focus_BlitSpinner(HWND hWnd1, HWND hWnd2) |
|
{ |
|
DWORD *v2; // edi |
|
LONG v3; // eax MAPDST |
|
int v5; // eax MAPDST |
|
int v7; // eax |
|
struct tagRECT Rect; // [esp+8h] [ebp-18h] |
|
char *v9; // [esp+18h] [ebp-8h] |
|
|
|
v9 = (char *)hWnd1; |
|
v2 = (DWORD *)GetWindowLongA(hWnd1, -21); |
|
v3 = GetWindowLongA(hWnd2, -21); |
|
if (v2 && v3 && *v2) { |
|
if (*(DWORD *)v3) { |
|
GetWindowRect(hWnd2, &Rect); |
|
ScreenToClient((HWND)v9, (LPPOINT)&Rect); |
|
ScreenToClient((HWND)v9, (LPPOINT)&Rect.right); |
|
SBltROP3( |
|
*(void **)v3, |
|
(void *)(Rect.left + *v2 + Rect.top * v2[1]), |
|
focus_spin_width, |
|
*(DWORD *)(v3 + 8), |
|
*(DWORD *)(v3 + 4), |
|
v2[1], |
|
0, |
|
0xCC0020u); |
|
v5 = v2[1]; |
|
v7 = *v2 + Rect.top * v5; |
|
v9 = *(char **)(v3 + 4); |
|
SBltROP3( |
|
&v9[*(DWORD *)v3 - focus_spin_width], |
|
&v9[v7 - focus_spin_width + Rect.left], |
|
focus_spin_width, |
|
*(DWORD *)(v3 + 8), |
|
(int)v9, |
|
v5, |
|
0, |
|
0xCC0020u); |
|
Focus_CenterSpinFromSide(hWnd2); |
|
} |
|
} |
|
} |
|
|
|
// ref: 0x10007566 |
|
void __fastcall Focus_CenterSpinFromSide(HWND hWnd) |
|
{ |
|
struct tagRECT Rect; // [esp+8h] [ebp-10h] |
|
|
|
GetClientRect(hWnd, &Rect); |
|
--Rect.bottom; |
|
Rect.left = --Rect.right - focus_spin_width; |
|
InvalidateRect(hWnd, &Rect, 0); |
|
Rect.left = 0; |
|
Rect.right = focus_spin_width - 1; |
|
InvalidateRect(hWnd, &Rect, 0); |
|
} |
|
|
|
// ref: 0x100075B7 |
|
void __fastcall Focus_GetAndBlitSpin(HWND hWnd, LPARAM lParam) |
|
{ |
|
HWND v2; // esi |
|
|
|
v2 = (HWND)lParam; |
|
GetWindowLongA((HWND)lParam, -12); |
|
Focus_BlitSpinner(hWnd, v2); |
|
dword_10029CAC = 1; |
|
} |
|
// 10029CAC: using guessed type int dword_10029CAC; |
|
|
|
// ref: 0x100075DC |
|
BOOL __fastcall Focus_DoBlitSpinIncFrame(HWND hWnd1, HWND hWnd2) |
|
{ |
|
void **v4; // eax |
|
void **v5; // esi |
|
int v7; // edi |
|
struct tagRECT Rect; // [esp+Ch] [ebp-14h] |
|
|
|
if (!sgbSpinnersLoaded) |
|
return 0; |
|
if (!hWnd2) |
|
return 0; |
|
GetWindowLongA(hWnd2, -12); |
|
if (hWnd1 != GetParent(hWnd2)) |
|
return 0; |
|
Focus_BlitSpinner(hWnd1, hWnd2); |
|
v4 = (void **)GetWindowLongA(hWnd2, -21); |
|
v5 = v4; |
|
if (!v4 || !*v4) |
|
return 0; |
|
GetWindowRect(hWnd2, &Rect); |
|
ScreenToClient(hWnd1, (LPPOINT)&Rect); |
|
ScreenToClient(hWnd1, (LPPOINT)&Rect.right); |
|
if (SpinnerTransOut[sgnSpinnerFrame]) { |
|
v7 = ((signed int)v5[2] - focus_spin_height) / 2; |
|
STransBlt(*v5, 0, v7, (int)v5[1], SpinnerTransOut[sgnSpinnerFrame]); |
|
STransBlt(*v5, (int)v5[1] - focus_spin_width, v7, (int)v5[1], SpinnerTransOut[sgnSpinnerFrame]); |
|
Focus_CenterSpinFromSide(hWnd2); |
|
} |
|
if (++sgnSpinnerFrame >= 8) |
|
sgnSpinnerFrame = 0; |
|
return 1; |
|
} |
|
// 10029C9C: using guessed type int focus_spin_height; |
|
// 10029CA4: using guessed type int sgbSpinnersLoaded; |
|
// 10029CB0: using guessed type int sgnSpinnerFrame; |
|
|
|
// ref: 0x100076C3 |
|
void __cdecl Focus_DeleteSpinners() |
|
{ |
|
HANDLE *v0; // esi |
|
|
|
v0 = SpinnerTransOut; |
|
do { |
|
if (*v0) { |
|
STransDelete(*v0); |
|
*v0 = 0; |
|
} |
|
++v0; |
|
} while ((signed int)v0 < (signed int)&SpinnerTransOut[8]); |
|
dword_10029CAC = 0; |
|
dword_10029CA8 = 0; |
|
sgbSpinnersLoaded = 0; |
|
} |
|
// 10029CA4: using guessed type int sgbSpinnersLoaded; |
|
// 10029CA8: using guessed type int dword_10029CA8; |
|
// 10029CAC: using guessed type int dword_10029CAC; |
|
|
|
// ref: 0x100076FA |
|
void __cdecl Focus_ResetSpinToZero() |
|
{ |
|
dword_10029CAC = 0; |
|
dword_10029CA8 = 0; |
|
} |
|
// 10029CA8: using guessed type int dword_10029CA8; |
|
// 10029CAC: using guessed type int dword_10029CAC; |
|
|
|
// ref: 0x1000770E |
|
void __cdecl Focus_cpp_init() |
|
{ |
|
focus_cpp_float = focus_cpp_float_value; |
|
} |
|
// 1001F42C: using guessed type int focus_cpp_float_value; |
|
// 10029CA0: using guessed type int focus_cpp_float; |
|
|
|
// ref: 0x10007719 |
|
void __fastcall Focus_LoadSpinner(const char *pszFileName) |
|
{ |
|
HANDLE *v1; // esi |
|
int v2; // ecx |
|
int v3; // eax |
|
int v4; // ebx |
|
int a5[4]; // [esp+4h] [ebp-1Ch] |
|
DWORD data[2]; // [esp+14h] [ebp-Ch] |
|
BYTE *pBuffer; // [esp+1Ch] [ebp-4h] |
|
|
|
if (!sgbSpinnersLoaded) { |
|
pBuffer = 0; |
|
dword_10029CAC = 0; |
|
dword_10029CA8 = 0; |
|
local_LoadArtImage(pszFileName, &pBuffer, data); |
|
v1 = SpinnerTransOut; |
|
memset(SpinnerTransOut, 0, 0x20u); |
|
if (pBuffer) { |
|
v2 = data[0]; |
|
focus_spin_width = data[0]; |
|
v3 = (signed int)data[1] / 8; |
|
v4 = 0; |
|
focus_spin_height = (signed int)data[1] / 8; |
|
while (1) { |
|
a5[2] = v2 - 1; |
|
a5[1] = v4 * v3; |
|
a5[0] = 0; |
|
a5[3] = v3 + v4 * v3 - 1; |
|
STransCreateI(pBuffer, v2, v3, 8, (int)a5, 16777466, v1); |
|
++v1; |
|
++v4; |
|
if ((signed int)v1 >= (signed int)&SpinnerTransOut[8]) |
|
break; |
|
v3 = focus_spin_height; |
|
v2 = focus_spin_width; |
|
} |
|
SMemFree(pBuffer, "C:\\Src\\Diablo\\DiabloUI\\Focus.cpp", 246, 0); |
|
} |
|
sgnSpinnerFrame = 0; |
|
sgbSpinnersLoaded = 1; |
|
} |
|
} |
|
// 10029C9C: using guessed type int focus_spin_height; |
|
// 10029CA4: using guessed type int sgbSpinnersLoaded; |
|
// 10029CA8: using guessed type int dword_10029CA8; |
|
// 10029CAC: using guessed type int dword_10029CAC; |
|
// 10029CB0: using guessed type int sgnSpinnerFrame; |
|
|
|
// ref: 0x100077E9 |
|
void __fastcall Focus_SetFocusTimer(HWND hWnd, const char *pszFileName) |
|
{ |
|
Focus_LoadSpinner(pszFileName); |
|
SDlgSetTimer((int)hWnd, 1, 55, Focus_SetFocusAndBlit); |
|
} |
|
|
|
// ref: 0x10007804 |
|
void __stdcall Focus_SetFocusAndBlit(int hWnd, int a2, int a3, int a4) |
|
{ |
|
HWND v1; // eax |
|
|
|
v1 = GetFocus(); |
|
Focus_DoBlitSpinIncFrame((HWND)hWnd, v1); |
|
} |
|
|
|
// ref: 0x10007818 |
|
void __fastcall Focus_KillFocusTimer(HWND hWnd) |
|
{ |
|
SDlgKillTimer((int)hWnd, 1); |
|
Focus_DeleteSpinners(); |
|
}
|
|
|