1
0
Fork 0
mirror of https://github.com/galaxyhaxz/devilution synced 2025-02-22 12:34:59 +00:00
devilution/2020_03_31/DiabloUI/title.cpp
PrisonOfMirrors b720183846 initial up
2020-11-28 18:24:54 -06:00

296 lines
6.6 KiB
C++

// ref: 0x1000FDEE
void __fastcall Title_BlitTitleBuffer(HWND hWnd)
{
_DWORD *v2; // edi
int v3; // eax
HANDLE v4; // esi
struct tagRECT Rect; // [esp+Ch] [ebp-18h]
HWND hWnda; // [esp+20h] [ebp-4h]
v2 = (_DWORD *)GetWindowLongA(hWnd, -21);
hWnda = GetDlgItem(hWnd, 1043);
if ( IsWindowVisible(hWnd) && hWnda && v2 && *v2 && titlePHTrans[0] )
{
v3 = titleTransIdx + 1;
titleTransIdx = v3;
if ( !titlePHTrans[v3] || v3 >= 30 )
titleTransIdx = 0;
GetWindowRect(hWnda, &Rect);
ScreenToClient(hWnd, (LPPOINT)&Rect);
ScreenToClient(hWnd, (LPPOINT)&Rect.right);
v4 = GetPropA(hWnd, "TITLE_BUFFER");
if ( v4 )
{
SBltROP3(
*(void **)v4,
(void *)(Rect.left + *v2 + Rect.top * v2[1]),
*((_DWORD *)v4 + 1),
*((_DWORD *)v4 + 2),
*((_DWORD *)v4 + 1),
v2[1],
0,
0xCC0020u);
STransBlt(*(void **)v4, 0, 0, *((_DWORD *)v4 + 1), (HANDLE)titlePHTrans[titleTransIdx]);
InvalidateRect(hWnda, 0, 0);
}
}
}
// 1002A58C: using guessed type int titleTransIdx;
// ref: 0x1000FEED
void __cdecl Title_DeletePhTrans()
{
int *v0; // esi
v0 = (int *)titlePHTrans;
do
{
if ( *v0 )
{
STransDelete((HANDLE)*v0);
*v0 = 0;
}
++v0;
}
while ( (signed int)v0 < (signed int)&titlePHTrans[30] );
}
// ref: 0x1000FF0F
void __fastcall Title_FreeTransMem(HWND hWnd)
{
void **v2; // eax MAPDST
void *v4; // eax
Title_DeletePhTrans();
v2 = (void **)RemovePropA(hWnd, "TITLE_BUFFER");
if ( v2 )
{
v4 = *v2;
if ( v4 )
{
SMemFree(v4, "C:\\Src\\Diablo\\DiabloUI\\Title.cpp", 114, 0);
*v2 = 0;
}
SMemFree(v2, "C:\\Src\\Diablo\\DiabloUI\\Title.cpp", 117, 0);
}
}
// ref: 0x1000FF51
void __fastcall Title_SetTitleBMP(HWND hWnd)
{
HWND v1; // eax MAPDST
_DWORD *v2; // esi
void *v3; // eax
struct tagRECT Rect; // [esp+0h] [ebp-18h]
Title_FreeTransMem(hWnd);
v1 = GetDlgItem(hWnd, 1043);
if ( v1 )
{
GetClientRect(v1, &Rect);
v2 = (unsigned int *)SMemAlloc(0xCu, "C:\\Src\\Diablo\\DiabloUI\\Title.cpp", 134, 0);
v3 = SMemAlloc(Rect.right * Rect.bottom, "C:\\Src\\Diablo\\DiabloUI\\Title.cpp", 136, 8);
*v2 = (unsigned int)v3;
v2[1] = Rect.right;
v2[2] = Rect.bottom;
SDlgSetBitmapI(v1, 0, 0, -1, 1, v3, 0, Rect.right, Rect.bottom, -1);
SetPropA(hWnd, "TITLE_BUFFER", v2);
}
}
// ref: 0x1000FFE8
void __fastcall Title_LoadTitleImage(HWND hWnd, const char *pszFileName)
{
int v3; // edi
_DWORD *v4; // eax
_DWORD *v5; // esi
int v6; // ebx
int a5[4]; // [esp+8h] [ebp-20h]
int data[2]; // [esp+18h] [ebp-10h]
HANDLE *phTransOut; // [esp+20h] [ebp-8h]
BYTE *pBuffer; // [esp+24h] [ebp-4h]
v3 = 0;
pBuffer = 0;
local_LoadArtImage(pszFileName, &pBuffer, (DWORD *)data);
v4 = (unsigned int *)GetPropA(hWnd, "TITLE_BUFFER");
v5 = v4;
if ( pBuffer )
{
if ( v4 )
{
v6 = data[1] / v4[2];
if ( v6 > 30 )
v6 = 30;
if ( v6 > 0 )
{
phTransOut = (HANDLE *)titlePHTrans;
do
{
a5[0] = 0;
a5[2] = v5[1] - 1;
a5[1] = v3 * v5[2];
a5[3] = v5[2] + a5[1] - 1;
STransCreateI(pBuffer, v5[1], v5[2], 8, (int)a5, 16777466, phTransOut);
++phTransOut;
++v3;
}
while ( v3 < v6 );
}
}
SMemFree(pBuffer, "C:\\Src\\Diablo\\DiabloUI\\Title.cpp", 197, 0);
}
titleTransIdx = 0;
}
// 1002A58C: using guessed type int titleTransIdx;
// ref: 0x1001009E
void __fastcall Title_LoadImgSetTimer(HWND hWnd, const char *pszFileName)
{
Title_SetTitleBMP(hWnd);
Title_LoadTitleImage(hWnd, pszFileName);
Title_BlitTitleBuffer(hWnd);
SDlgSetTimer((int)hWnd, 2, 55, Title_BlitTitleBufFnc);
}
// ref: 0x100100CB
void __stdcall Title_BlitTitleBufFnc(int hWnd, int a2, int a3, int a4)
{
Title_BlitTitleBuffer((HWND)hWnd);
}
// ref: 0x100100DC
void __cdecl Title_cpp_init()
{
Title_cpp_float = Title_cpp_float_value;
}
// 1001F47C: using guessed type int Title_cpp_float_value;
// 1002A588: using guessed type int Title_cpp_float;
// ref: 0x100100E7
void __fastcall Title_KillTitleTimer(HWND hWnd)
{
HWND v1; // esi
v1 = hWnd;
SDlgKillTimer((int)hWnd, 2);
Title_FreeTransMem(v1);
}
// ref: 0x100100FA
BOOL __stdcall UiTitleDialog(int a1)
{
int v1; // eax
artfont_LoadAllFonts();
v1 = (int)SDrawGetFrameWindow(NULL);
SDlgDialogBoxParam(ghUiInst, "TITLESCREEN_DIALOG", v1, Title_MainProc, a1);
return 1;
}
// 10010382: using guessed type _DWORD __stdcall SDrawGetFrameWindow();
// ref: 0x10010126
LRESULT __stdcall Title_MainProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HWND v5; // eax
if ( uMsg <= 0x111 )
{
if ( uMsg != 273 )
{
if ( uMsg != 2 )
{
if ( uMsg == 135 )
return 4;
if ( uMsg != 256 )
{
if ( uMsg > 0x103 )
{
if ( uMsg <= 0x105 )
{
v5 = (HWND)SDrawGetFrameWindow(NULL);
SendMessageA(v5, uMsg, wParam, lParam);
}
else if ( uMsg == 272 )
{
Title_LoadAllTitleImgs(hWnd, lParam);
PostMessageA(hWnd, 0x7E8u, 0, 0);
return 1;
}
}
return (LRESULT)SDlgDefDialogProc(hWnd, uMsg, (HDC)wParam, (HWND)lParam);
}
goto LABEL_25;
}
Title_KillTimerAndFree(hWnd);
return (LRESULT)SDlgDefDialogProc(hWnd, uMsg, (HDC)wParam, (HWND)lParam);
}
goto LABEL_25;
}
if ( uMsg != 275 )
{
if ( uMsg != 513 && uMsg != 516 )
{
if ( uMsg == 528 )
{
if ( (_WORD)wParam == 513 || (_WORD)wParam == 516 )
Title_KillAndFadeDlg(hWnd);
}
else if ( uMsg == 2024 )
{
if ( !Fade_CheckRange5() )
Fade_SetFadeTimer((int)hWnd);
return 0;
}
return (LRESULT)SDlgDefDialogProc(hWnd, uMsg, (HDC)wParam, (HWND)lParam);
}
LABEL_25:
Title_KillAndFadeDlg(hWnd);
return 0;
}
if ( wParam == 1 )
goto LABEL_25;
return 0;
}
// 1001037C: using guessed type int __stdcall SDlgDefDialogProc(_DWORD, _DWORD, _DWORD, _DWORD);
// 10010382: using guessed type _DWORD __stdcall SDrawGetFrameWindow();
// ref: 0x10010235
void __fastcall Title_KillTimerAndFree(HWND hWnd)
{
void **v2; // eax
Title_KillTitleTimer(hWnd);
Doom_DeleteFreeProcs(hWnd, titlemsgtbl);
v2 = (void **)GetWindowLongA(hWnd, -21);
local_FreeMemPtr(v2);
}
// ref: 0x1001025A
void __fastcall Title_LoadAllTitleImgs(HWND hWnd, int time)
{
DWORD *v4; // edi
v4 = local_AllocWndLongData();
SetWindowLongA(hWnd, -21, (LONG)v4);
if ( v4 )
{
local_LoadArtWithPal(hWnd, 0, &nullcharacter, -1, 1, "ui_art\\title.pcx", (BYTE **)v4, v4 + 1, 0);
Fade_NoInputAndArt(hWnd, 0);
}
Doom_ParseWndProc3(hWnd, titlemsgtbl, 3);
Title_LoadImgSetTimer(hWnd, "ui_art\\logo.pcx");
if ( time )
SDlgSetTimer((int)hWnd, 1, 1000 * time, 0);
else
SDlgSetTimer((int)hWnd, 1, 5000, 0);
}
// ref: 0x100102D7
void __fastcall Title_KillAndFadeDlg(HWND hWnd)
{
Fade_Range5SetZero();
SDlgKillTimer((int)hWnd, 1);
Fade_UpdatePaletteRange(10);
SDlgEndDialog(hWnd, (void *)HANDLE_FLAG_INHERIT);
}