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/credits.cpp
PrisonOfMirrors b720183846 initial up
2020-11-28 18:24:54 -06:00

254 lines
6.3 KiB
C++

// ref: 0x10005297
void __cdecl credits_cpp_init()
{
credits_cpp_float = credits_cpp_float_value;
}
// 1001F408: using guessed type int credits_cpp_float_value;
// 100296EC: using guessed type int credits_cpp_float;
// ref: 0x100052A2
BOOL __stdcall UiCreditsDialog(int a1)
{
int v1; // eax
v1 = (int)SDrawGetFrameWindow(NULL);
SDlgDialogBoxParam(ghUiInst, "CREDITS_DIALOG", v1, credits_WndProc, 25);
return 1;
}
// 10010382: using guessed type _DWORD __stdcall SDrawGetFrameWindow();
// ref: 0x100052C7
LRESULT __stdcall credits_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
HWND v5; // eax
if ( Msg > 0x111 )
{
if ( Msg == 275 )
{
credits_CalcPosROP3(hWnd);
return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);
}
if ( Msg == 513 || Msg == 516 )
goto LABEL_12;
if ( Msg != 528 )
{
if ( Msg == 2024 )
{
if ( !Fade_CheckRange5() )
Fade_SetFadeTimer((int)hWnd);
return 0;
}
return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);
}
if ( (_WORD)wParam != 513 && (_WORD)wParam != 516 )
return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);
LABEL_25:
Title_KillAndFadeDlg(hWnd);
return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);
}
if ( Msg == 273 )
goto LABEL_25;
if ( Msg != 2 )
{
if ( Msg == 135 )
return 4;
if ( Msg != 256 )
{
if ( Msg > 0x103 )
{
if ( Msg <= 0x105 )
{
v5 = (HWND)SDrawGetFrameWindow(NULL);
SendMessageA(v5, Msg, wParam, lParam);
}
else if ( Msg == 272 )
{
credits_LoadImgCreditTxt(hWnd, lParam);
PostMessageA(hWnd, 0x7E8u, 0, 0);
return 1;
}
}
return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);
}
if ( wParam != 32 )
return 0;
LABEL_12:
Title_KillAndFadeDlg(hWnd);
return 0;
}
credits_FreeCreditResrc(hWnd);
return (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);
}
// 10010382: using guessed type _DWORD __stdcall SDrawGetFrameWindow();
// ref: 0x100053D9
void __fastcall credits_FreeCreditResrc(HWND hWnd)
{
void **v2; // eax
if ( creditsobj )
{
SGdiDeleteObject(creditsobj);
creditsobj = 0;
}
if ( credit_back_img )
{
SMemFree(credit_back_img, "C:\\Src\\Diablo\\DiabloUI\\credits.cpp", 46, 0);
credit_back_img = 0;
}
v2 = (void **)GetWindowLongA(hWnd, -21);
local_FreeMemPtr(v2);
if ( credittext_rsrc )
{
FreeResource(credittext_rsrc);
credittext_rsrc = 0;
}
}
// ref: 0x1000543A
void __fastcall credits_LoadImgCreditTxt(HWND hWnd, LPARAM lParam)
{
signed int v2; // eax
HRSRC v3; // eax
HRSRC v4; // eax
DWORD *v5; // eax
DWORD *v6; // esi
int v7; // ebx
int v8; // esi
HFONT v9; // eax MAPDST
BOOL v11; // ebx
struct tagRECT Rect; // [esp+Ch] [ebp-18h]
HWND v13; // [esp+1Ch] [ebp-8h]
if ( lParam )
v2 = 1000 / lParam;
else
v2 = 50;
SDlgSetTimer((int)hWnd, 1, v2, 0);
v3 = FindResourceA(ghUiInst, "IDR_CREDITS", "TEXT_FILES");
credittext_rsrc = LoadResource(ghUiInst, v3);
v4 = FindResourceA(ghUiInst, "IDR_CREDITS", "TEXT_FILES");
credittext_size = SizeofResource(ghUiInst, v4);
v5 = local_AllocWndLongData();
v6 = v5;
if ( v5 )
{
SetWindowLongA(hWnd, -21, (LONG)v5);
local_LoadArtWithPal(hWnd, 0, &nullcharacter, -1, 1, "ui_art\\credits.pcx", (BYTE **)v6, v6 + 1, 0);
Fade_NoInputAndArt(hWnd, 0);
}
v13 = GetDlgItem(hWnd, 1000);
GetWindowRect(v13, &Rect);
v7 = Rect.right - Rect.left;
v8 = Rect.bottom - Rect.top + 60;
credit_back_img = SMemAlloc((Rect.right - Rect.left) * v8, "C:\\Src\\Diablo\\DiabloUI\\credits.cpp", 122, 0);
credit_horz_pos = v7;
credit_vertical_pos1 = v8;
local_AdjustRectSize(&Rect, 0, 30);
SDlgSetBitmapI(v13, 0, 0, -1, 1, credit_back_img, (int)&Rect, v7, v8, -1);
credit_vertical_pos2 = v8 - 30;
credits_CalcPosROP3(hWnd);
v9 = CreateFontA(-17, 0, 0, 0, 700, 0, 0, 0, 0, 0, 0, 0, 0x12u, "Times New Roman");
if ( !v9 || (v11 = SGdiImportFont(v9, (int)&creditsobj), DeleteObject(v9), !v11) )
Title_KillAndFadeDlg(hWnd);
}
// 100296E8: using guessed type int credittext_size;
// 100296FC: using guessed type int credit_vertical_pos1;
// ref: 0x100055C0
void __fastcall credits_CalcPosROP3(HWND hWnd)
{
_DWORD *v2; // edi
struct tagRECT Rect; // [esp+Ch] [ebp-14h]
HWND hWnda; // [esp+1Ch] [ebp-4h]
hWnda = GetDlgItem(hWnd, 1000);
v2 = (_DWORD *)GetWindowLongA(hWnd, -21);
GetWindowRect(hWnda, &Rect);
ScreenToClient(hWnd, (LPPOINT)&Rect);
ScreenToClient(hWnd, (LPPOINT)&Rect.right);
SBltROP3(
(char *)credit_back_img + 30 * credit_horz_pos,
(void *)(Rect.left + *v2 + Rect.top * v2[1]),
credit_horz_pos,
Rect.bottom - Rect.top,
credit_horz_pos,
v2[1],
0,
0xCC0020u);
--credit_vertical_pos2;
credits_PrintCredLines(hWnd);
InvalidateRect(hWnda, 0, 0);
UpdateWindow(hWnda);
}
// ref: 0x10005660
void __fastcall credits_PrintCredLines(HWND hWnd)
{
char *v1; // esi
int i; // edi
int v3; // ebp
int v4; // ebx
v1 = (char *)LockResource(credittext_rsrc);
credit_line_count = credittext_size;
SGdiSelectObject((int)creditsobj);
SGdiSetPitch(credit_horz_pos);
for ( i = credit_vertical_pos2; credit_line_count > 0; v1 = credits_GetAdjustText(v1, v4) )
{
v3 = 0;
while ( *v1 == 9 )
{
v3 += 40;
++v1;
--credit_line_count;
}
v4 = credits_GetCredLineBreak(v1);
if ( v4 == -1 )
break;
if ( i >= 0 )
{
if ( i > credit_vertical_pos1 - 30 )
break;
if ( v4 )
{
SGdiTextOut(credit_back_img, v3 + 2, i + 2, 0x1000000, v1, v4);
SGdiTextOut(credit_back_img, v3, i, 16777440, v1, v4);
}
}
i += 22;
}
if ( i < 0 )
Title_KillAndFadeDlg(hWnd);
}
// 100103A6: using guessed type int __stdcall SGdiSetPitch(_DWORD);
// 100103AC: using guessed type int __stdcall SGdiSelectObject(_DWORD);
// 100296E8: using guessed type int credittext_size;
// 100296FC: using guessed type int credit_vertical_pos1;
// 10029700: using guessed type int credit_line_count;
// ref: 0x10005736
int __fastcall credits_GetCredLineBreak(char *str)
{
int result; // eax
result = 0;
while ( *str != 13 && *str != 10 )
{
++result;
++str;
if ( result > credit_line_count )
return -1;
}
return result;
}
// 10029700: using guessed type int credit_line_count;
// ref: 0x10005755
char *__fastcall credits_GetAdjustText(char *str, int len)
{
credit_line_count += -2 - len;
return &str[len + 2];
}
// 10029700: using guessed type int credit_line_count;