From 71c2149d4647b0081528342cc723ec657fcc4f20 Mon Sep 17 00:00:00 2001 From: galaxyhaxz Date: Tue, 18 Sep 2018 04:16:08 -0500 Subject: [PATCH] First "working" version of diabloui.dll ^_^ (#221) --- 3rdParty/Storm/Source/storm.cpp | 4 +- 3rdParty/Storm/Source/storm.def | 4 +- 3rdParty/Storm/Source/storm.h | 4 +- 3rdParty/Storm/Source/storm_gcc.def | 6 +- DiabloUI/DiabloUI.dsp | 4 + DiabloUI/_temp_data.cpp | 29 ++- DiabloUI/_temp_funcs.h | 76 +++--- DiabloUI/diabedit.cpp | 334 +++++++++++------------- DiabloUI/diabloui.cpp | 108 ++++---- DiabloUI/diabloui.h | 4 +- DiabloUI/diabloui.res | Bin 0 -> 110944 bytes DiabloUI/doom.cpp | 10 +- DiabloUI/fade.cpp | 2 +- DiabloUI/focus.cpp | 2 +- DiabloUI/local.cpp | 2 +- DiabloUI/title.cpp | 386 ++++++++++++---------------- MakefileVC | 2 +- 17 files changed, 439 insertions(+), 538 deletions(-) create mode 100644 DiabloUI/diabloui.res diff --git a/3rdParty/Storm/Source/storm.cpp b/3rdParty/Storm/Source/storm.cpp index 77d37d5f7..cfb7c17e5 100644 --- a/3rdParty/Storm/Source/storm.cpp +++ b/3rdParty/Storm/Source/storm.cpp @@ -243,5 +243,7 @@ void __stdcall SDlgBeginPaint(HWND hWnd, char *a2) rVoid; void __stdcall SDlgEndPaint(HWND hWnd, char *a2) rVoid; void __stdcall SDlgSetSystemCursor(BYTE *a1, BYTE *a2, int *a3, int a4) rVoid; void __stdcall SDlgSetCursor(HWND hWnd, HCURSOR a2, int a3, int *a4) rVoid; -BOOL __stdcall SDlgSetTimer(int a1, int a2, int a3, void (__stdcall *a4)(int)) rBool; +BOOL __stdcall SDlgSetTimer(int a1, int a2, int a3, void (__stdcall *a4)(int, int, int, int)) rBool; BOOL __stdcall SDlgKillTimer(int a1, int a2) rBool; +BOOL __stdcall SDlgDrawBitmap(HWND hWnd, int a2, int a3, int a4, int a5, int a6, int a7) rBool; +BOOL __stdcall SDlgDialogBoxParam(HINSTANCE hInst, char *szDialog, int a3, WNDPROC func, int a5) rBool; diff --git a/3rdParty/Storm/Source/storm.def b/3rdParty/Storm/Source/storm.def index f45652b04..da801e1e6 100644 --- a/3rdParty/Storm/Source/storm.def +++ b/3rdParty/Storm/Source/storm.def @@ -59,8 +59,8 @@ EXPORTS SDlgDefDialogProc @206 NONAME SDlgDialogBoxIndirectParam @208 NONAME - ;SDlgDialogBoxParam @209 NONAME - ;SDlgDrawBitmap @210 NONAME + SDlgDialogBoxParam @209 NONAME + SDlgDrawBitmap @210 NONAME SDlgEndDialog @211 NONAME SDlgEndPaint @212 NONAME SDlgKillTimer @213 NONAME diff --git a/3rdParty/Storm/Source/storm.h b/3rdParty/Storm/Source/storm.h index 26506ec84..b2fc9a868 100644 --- a/3rdParty/Storm/Source/storm.h +++ b/3rdParty/Storm/Source/storm.h @@ -1306,8 +1306,10 @@ void __stdcall SDlgBeginPaint(HWND hWnd, char *a2); void __stdcall SDlgEndPaint(HWND hWnd, char *a2); void __stdcall SDlgSetSystemCursor(BYTE *a1, BYTE *a2, int *a3, int a4); void __stdcall SDlgSetCursor(HWND hWnd, HCURSOR a2, int a3, int *a4); -BOOL __stdcall SDlgSetTimer(int a1, int a2, int a3, void (__stdcall *a4)(int)); +BOOL __stdcall SDlgSetTimer(int a1, int a2, int a3, void (__stdcall *a4)(int, int, int, int)); BOOL __stdcall SDlgKillTimer(int a1, int a2); +BOOL __stdcall SDlgDrawBitmap(HWND hWnd, int a2, int a3, int a4, int a5, int a6, int a7); +BOOL __stdcall SDlgDialogBoxParam(HINSTANCE hInst, char *szDialog, int a3, WNDPROC func, int a5); #ifdef __GNUC__ } diff --git a/3rdParty/Storm/Source/storm_gcc.def b/3rdParty/Storm/Source/storm_gcc.def index f25c16241..2df6ba6e4 100644 --- a/3rdParty/Storm/Source/storm_gcc.def +++ b/3rdParty/Storm/Source/storm_gcc.def @@ -78,8 +78,10 @@ EXPORTS SDlgDefDialogProc @206 NONAME SDlgDialogBoxIndirectParam @208 NONAME - ;SDlgDialogBoxParam @209 NONAME - ;SDlgDrawBitmap @210 NONAME + SDlgDialogBoxParam @209 NONAME + SDlgDialogBoxParam@20 @209 NONAME + SDlgDrawBitmap @210 NONAME + SDlgDrawBitmap@28 @210 NONAME SDlgEndDialog @211 NONAME SDlgEndPaint @212 NONAME SDlgEndPaint@8 @212 NONAME diff --git a/DiabloUI/DiabloUI.dsp b/DiabloUI/DiabloUI.dsp index 01b736b87..99817473a 100644 --- a/DiabloUI/DiabloUI.dsp +++ b/DiabloUI/DiabloUI.dsp @@ -89,5 +89,9 @@ LINK32=link.exe SOURCE=.\diabloui.cpp # End Source File +# Begin Source File + +SOURCE=.\diabloui.res +# End Source File # End Target # End Project diff --git a/DiabloUI/_temp_data.cpp b/DiabloUI/_temp_data.cpp index d04fff88d..01f521eb0 100644 --- a/DiabloUI/_temp_data.cpp +++ b/DiabloUI/_temp_data.cpp @@ -8,10 +8,13 @@ ProfileStruct bnprofiles[4] = }; int profilemsg1[6] = { 1125, 1127, 1129, 1131, 1133, 0 }; int profilemsg2[6] = { 1126, 1128, 1130, 1132, 1134, 0 }; +int DiabEdit_cpp_float_value = 2139095040; // weak +int DiabloUI_cpp_float_value = 2139095040; // weak int doom_cpp_float_value = 2139095040; // weak int fade_cpp_float_value = 2139095040; // weak int focus_cpp_float_value = 2139095040; // weak int local_cpp_float_value = 2139095040; // weak +int Title_cpp_float_value = 2139095040; // weak int titlesnd_cpp_float_value = 2139095040; // weak int dword_10022258 = 4; // weak ProfFntStruct proffnts[4] = @@ -87,7 +90,7 @@ int dword_10023260[3] = { 1056, 1054, 0 }; int dword_1002326C[7] = { 1135, 1136, 1137, 1138, 1139, 1140, 0 }; int dword_100232D4[2] = { 1026, 0 }; int dword_100232DC[3] = { 1109, 2, 0 }; -int dword_10023340[2] = { 1067, 0 }; +int titlemsgtbl[2] = { 1067, 0 }; //data+bss int artfont_cpp_float = 0; // weak @@ -115,7 +118,7 @@ void *dword_1002942C; // idb int (__stdcall *dword_10029430)(_DWORD, _DWORD, _DWORD, _DWORD); // weak void *dword_10029434; // idb int dword_10029438[4]; // weak -char *wndtext_pointer; /* check */ +char nullcharacter; /* check */ HGDIOBJ dword_10029450; // idb int dword_10029454; // weak int dword_10029458; // weak @@ -190,15 +193,15 @@ int dword_100296FC; // weak int dword_10029700; // weak void *dword_10029704; // idb int dword_10029708; // weak -int dword_1002970C; // weak -int dword_10029710; // weak +int DiabEdit_cpp_float; // weak +int DiabloUI_cpp_float; // weak int dword_10029714; // weak -HINSTANCE hInstance; // idb -int dword_1002971C; // weak -int dword_10029720; // weak -int dword_10029724; // weak -int dword_10029728; // weak -int dword_1002972C; // weak +HINSTANCE ghUiInst; // idb +int backbmp_flag1; // weak +int backbmp_flag2; // weak +int backbmp_flag3; // weak +int app_is_active; // weak +int sgbIsSpawn; // weak int dword_10029730; // weak int dword_10029738; // weak char byte_1002973C; // idb @@ -345,8 +348,8 @@ int dword_1002A500; // weak int dword_1002A504; // weak int (*dword_1002A508)(void); // weak int dword_1002A50C; // weak -HANDLE dword_1002A510; // idb -int dword_1002A588; // weak -int dword_1002A58C; // weak +HANDLE titlePHTrans[30]; +int Title_cpp_float; // weak +int titleTransIdx; // weak int titlesnd_cpp_float; // weak void (__stdcall *gfnSoundFunction)(char *file); diff --git a/DiabloUI/_temp_funcs.h b/DiabloUI/_temp_funcs.h index 499d8af34..7c124c3ab 100644 --- a/DiabloUI/_temp_funcs.h +++ b/DiabloUI/_temp_funcs.h @@ -143,27 +143,30 @@ signed int __fastcall credits_10005736(_BYTE *a1); int __fastcall credits_10005755(int a1, int a2); -BOOL UNKCALL DiabEdit_10005765(HWND hWnd); -signed int DiabEdit_1000579B(); -ATOM DiabEdit_100057A6(); -HANDLE __fastcall DiabEdit_100057E8(int a1, int a2, HWND hWnd, UINT Msg, HANDLE hData, LPARAM lParam); -LRESULT __fastcall DiabEdit_1000591C(LPARAM lParam, unsigned short a2); -LRESULT UNKCALL DiabEdit_1000594E(LPARAM lParam); -char *__fastcall DiabEdit_10005A0A(HWND a1, unsigned char a2, int a3); -int __fastcall DiabEdit_10005AF4(LPARAM lParam, int a2, int a3); -char *__fastcall DiabEdit_10005B70(HWND hWnd, char *a2); -BOOL __fastcall DiabEdit_10005B9F(HWND hWnd, int a2); -HANDLE UNKCALL DiabEdit_10005BE7(HWND hWnd); - - -int DiabloUI_10005C2A(); -//int __stdcall UiSetBackgroundBitmap(int a1, int a2, int a3, int a4, int a5); -//int __stdcall UiSetSpawned(int a1); -//BOOL UiInitialize(); -//void *UiDestroy(); -//int __stdcall UiAppActivate(int a1); +void __fastcall DiabEdit_DoPaintBMP(HWND hWnd); +void __cdecl j_DiabEdit_cpp_init(); +void __cdecl DiabEdit_cpp_init(); +void __cdecl DiabEdit_SetupWindow(); +LRESULT __stdcall DiabEdit_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); +void __fastcall DiabEdit_SendWndCommand(HWND hWnd, WORD a2); +void __fastcall DiabEdit_GetCursorProp(HWND hWnd); +void __fastcall DiabEdit_RestrictAndLimit(HWND hWnd, WPARAM wParam, LPARAM lParam); +void __fastcall DiabEdit_SetTextAndProp(HWND hWnd, WPARAM wParam, LPARAM lParam); +void __fastcall DiabEdit_SetRestrictString(HWND hWnd, LPARAM lParam); +void __fastcall DiabEdit_SetRestrictTimer(HWND hWnd); +void __fastcall DiabEdit_RemoveAllProps(HWND hWnd); + + +int __cdecl DiabloUI_GetSpawned(); +void __stdcall UiOnPaint(int a1); +void __stdcall UiSetBackgroundBitmap(int a1, PALETTEENTRY *a2, int a3, int a4, int a5); +void __stdcall UiSetSpawned(BOOL bSpawned); +void __cdecl UiInitialize(); +void __cdecl UiDestroy(); +void __stdcall UiAppActivate(BOOL bActive); BOOL __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved); -signed int DiabloUI_10005CEA(); +void __cdecl j_DiabloUI_cpp_init(); +void __cdecl DiabloUI_cpp_init(); signed int DirLink_10005CFA(); @@ -236,7 +239,7 @@ void __cdecl Fade_Range5SetZero(); void __fastcall Fade_NoInputAndArt(HWND hWnd, BOOL bShowCurs); void __fastcall Fade_SetInputWindow(HWND hWnd); void __fastcall Fade_SetFadeTimer(int nTime); -void __stdcall Fade_TimerFunctionDlg(int a1); +void __stdcall Fade_TimerFunctionDlg(int a1, int a2, int a3, int a4); void __cdecl j_Fade_cpp_init(); void __cdecl Fade_cpp_init(); @@ -253,7 +256,7 @@ void __cdecl j_Focus_cpp_init(); void __cdecl Focus_cpp_init(); void __fastcall Focus_LoadSpinner(const char *pszFileName); void __fastcall Focus_SetFocusTimer(HWND hWnd, const char *pszFileName); -void __stdcall Focus_SetFocusAndBlit(int hWnd); +void __stdcall Focus_SetFocusAndBlit(int hWnd, int a2, int a3, int a4); void __fastcall Focus_KillFocusTimer(HWND hWnd); @@ -595,20 +598,21 @@ int __fastcall SelYesNo_1000FD77(int a1, UINT a2, int a3); signed int SelYesNo_1000FDE3(); -_DWORD *UNKCALL Title_1000FDEE(HWND hWnd); -int Title_1000FEED(); -void **UNKCALL Title_1000FF0F(HWND hWnd); -HWND UNKCALL Title_1000FF51(HWND arg); -_DWORD *__fastcall Title_1000FFE8(HWND hWnd, const char *edx0); -int __fastcall Title_1001009E(HWND hWnd, const char *a2, HWND hWnda); -_DWORD *__stdcall Title_100100CB(HWND hWnd, int a2, int a3, int a4); -signed int Title_100100DC(); -void **UNKCALL Title_100100E7(HWND hWnd); -//signed int __stdcall UiTitleDialog(int a1); -int __stdcall Title_10010126(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); // idb -void UNKCALL Title_10010235(HWND hDlg); -int __fastcall Title_1001025A(HWND hWnd, int a2); -int UNKCALL Title_100102D7(void *arg); +void __fastcall Title_BlitTitleBuffer(HWND hWnd); +void __cdecl Title_DeletePhTrans(); +void __fastcall Title_FreeTransMem(HWND hWnd); +void __fastcall Title_SetTitleBMP(HWND hWnd); +void __fastcall Title_LoadTitleImage(HWND hWnd, const char *pszFileName); +void __fastcall Title_LoadImgSetTimer(HWND hWnd, const char *pszFileName); +void __stdcall Title_BlitTitleBufFnc(int hWnd, int a2, int a3, int a4); +void __cdecl j_Title_cpp_init(); +void __cdecl Title_cpp_init(); +void __fastcall Title_KillTitleTimer(HWND hWnd); +BOOL __stdcall UiTitleDialog(int a1); +LRESULT __stdcall Title_MainProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); +void __fastcall Title_KillTimerAndFree(HWND hWnd); +void __fastcall Title_LoadAllTitleImgs(HWND hWnd, int time); +void __fastcall Title_KillAndFadeDlg(HWND hWnd); void __fastcall TitleSnd_SetSoundFunction(void (__stdcall *func)(char *file)); diff --git a/DiabloUI/diabedit.cpp b/DiabloUI/diabedit.cpp index 541880be8..913695bc6 100644 --- a/DiabloUI/diabedit.cpp +++ b/DiabloUI/diabedit.cpp @@ -1,57 +1,51 @@ // ref: 0x10005765 -BOOL UNKCALL DiabEdit_10005765(HWND hWnd) { return 0; } -/* { - HWND v1; // esi +void __fastcall DiabEdit_DoPaintBMP(HWND hWnd) +{ struct tagPAINTSTRUCT Paint; // [esp+4h] [ebp-40h] - v1 = hWnd; BeginPaint(hWnd, &Paint); - SDlgDrawBitmap(v1, 1, 0, 0, 0, 0, 0); - return EndPaint(v1, &Paint); -} */ -// 1001042A: using guessed type int __stdcall SDlgDrawBitmap(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); + SDlgDrawBitmap(hWnd, 1, 0, 0, 0, 0, 0); + EndPaint(hWnd, &Paint); +} // ref: 0x1000579B -signed int DiabEdit_1000579B() { return 0; } -/* { - signed int result; // eax - - result = 2139095040; - dword_1002970C = 2139095040; - return result; -} */ -// 1002970C: using guessed type int dword_1002970C; +void __cdecl DiabEdit_cpp_init() +{ + DiabEdit_cpp_float = DiabEdit_cpp_float_value; +} +// 1001F40C: using guessed type int DiabEdit_cpp_float_value; +// 1002970C: using guessed type int DiabEdit_cpp_float; // ref: 0x100057A6 -ATOM DiabEdit_100057A6() { return 0; } -/* { +void __cdecl DiabEdit_SetupWindow() +{ WNDCLASSA WndClass; // [esp+0h] [ebp-28h] memset(&WndClass, 0, 0x28u); WndClass.style = 64; - WndClass.lpfnWndProc = (WNDPROC)DiabEdit_100057E8; + WndClass.lpfnWndProc = DiabEdit_WndProc; WndClass.hInstance = GetModuleHandleA(0); WndClass.lpszClassName = "DIABLOEDIT"; - return RegisterClassA(&WndClass); -} */ + RegisterClassA(&WndClass); +} // ref: 0x100057E8 -HANDLE __stdcall DiabEdit_100057E8(HWND hWnd, UINT Msg, HANDLE hData, LPARAM lParam) { return 0; } -/* { +LRESULT __stdcall DiabEdit_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) +{ if ( Msg <= 0x113 ) { if ( Msg == 275 ) { - DiabEdit_1000594E((LPARAM)hWnd); + DiabEdit_GetCursorProp(hWnd); return 0; } if ( Msg == 1 ) { - DiabEdit_10005B9F(hWnd); + DiabEdit_SetRestrictTimer(hWnd); } else if ( Msg == 2 ) { - DiabEdit_10005BE7(hWnd); + DiabEdit_RemoveAllProps(hWnd); } else { @@ -59,251 +53,215 @@ HANDLE __stdcall DiabEdit_100057E8(HWND hWnd, UINT Msg, HANDLE hData, LPARAM lPa { if ( Msg == 15 ) { - DiabEdit_10005765(hWnd); + DiabEdit_DoPaintBMP(hWnd); } else { if ( Msg == 135 ) - return (HANDLE)129; + return 129; if ( Msg != 256 ) { if ( Msg == 258 ) - DiabEdit_10005A0A(hWnd, (unsigned char)hData, lParam); - return (HANDLE)DefWindowProcA(hWnd, Msg, (WPARAM)hData, lParam); + DiabEdit_RestrictAndLimit(hWnd, wParam, lParam); + return DefWindowProcA(hWnd, Msg, wParam, lParam); } - DiabEdit_10005AF4((LPARAM)hWnd, (int)hData, lParam); + DiabEdit_SetTextAndProp(hWnd, wParam, lParam); } return 0; } - DiabEdit_1000591C((LPARAM)hWnd, 1u); + DiabEdit_SendWndCommand(hWnd, 1u); } - return (HANDLE)DefWindowProcA(hWnd, Msg, (WPARAM)hData, lParam); + return DefWindowProcA(hWnd, Msg, wParam, lParam); } switch ( Msg ) { case 0x201u: SetFocus(hWnd); - return (HANDLE)DefWindowProcA(hWnd, Msg, (WPARAM)hData, lParam); + return DefWindowProcA(hWnd, Msg, wParam, lParam); case 0x400u: - SetWindowTextA(hWnd, &byte_10029448); - DiabEdit_1000591C((LPARAM)hWnd, 3u); + SetWindowTextA(hWnd, &nullcharacter); + DiabEdit_SendWndCommand(hWnd, 3u); return 0; case 0x401u: - SetPropA(hWnd, "LIMIT", hData); + SetPropA(hWnd, "LIMIT", (HANDLE)wParam); return 0; case 0x402u: - return GetPropA(hWnd, "LIMIT"); + return (LRESULT)GetPropA(hWnd, "LIMIT"); } if ( Msg != 1027 ) { if ( Msg == 1028 ) { - DiabEdit_10005B70(hWnd, (char *)lParam); + DiabEdit_SetRestrictString(hWnd, lParam); return 0; } - return (HANDLE)DefWindowProcA(hWnd, Msg, (WPARAM)hData, lParam); + return DefWindowProcA(hWnd, Msg, wParam, lParam); } - return GetPropA(hWnd, "CURSOR"); -} */ + return (LRESULT)GetPropA(hWnd, "CURSOR"); +} // ref: 0x1000591C -LRESULT __fastcall DiabEdit_1000591C(LPARAM lParam, unsigned short a2) { return 0; } -/* { - HWND v2; // esi - LPARAM v3; // ST0C_4 +void __fastcall DiabEdit_SendWndCommand(HWND hWnd, WORD a2) +{ int v4; // ST08_4 HWND v5; // eax - v2 = (HWND)lParam; - v3 = lParam; - v4 = (a2 << 16) | (unsigned short)GetWindowLongA((HWND)lParam, -12); - v5 = GetParent(v2); - return SendMessageA(v5, 0x111u, v4, v3); -} */ + v4 = (a2 << 16) | (unsigned short)GetWindowLongA(hWnd, -12); + v5 = GetParent(hWnd); + SendMessageA(v5, 0x111u, v4, (LPARAM)hWnd); +} // ref: 0x1000594E -LRESULT UNKCALL DiabEdit_1000594E(LPARAM lParam) { return 0; } -/* { - HWND v1; // ebx - LRESULT result; // eax - size_t v3; // eax - CHAR *v4; // esi - CHAR String; // [esp+Ch] [ebp-100h] - char v6[252]; // [esp+Dh] [ebp-FFh] - short v7; // [esp+109h] [ebp-3h] - char v8; // [esp+10Bh] [ebp-1h] +void __fastcall DiabEdit_GetCursorProp(HWND hWnd) +{ + size_t v2; // eax + char *v3; // esi + char String[256]; // [esp+Ch] [ebp-100h] - v1 = (HWND)lParam; - String = byte_10029448; - memset(v6, 0, sizeof(v6)); - v7 = 0; - v8 = 0; - if ( GetPropA((HWND)lParam, "CURSOR") ) + String[0] = nullcharacter; + memset(&String[1], 0, 0xFCu); + *(_WORD *)&String[253] = 0; + String[255] = 0; + if ( GetPropA(hWnd, "CURSOR") ) { - SetPropA(v1, "CURSOR", 0); - result = DiabEdit_1000591C((LPARAM)v1, 3u); + SetPropA(hWnd, "CURSOR", 0); + DiabEdit_SendWndCommand(hWnd, 3u); } else { - SetPropA(v1, "CURSOR", HANDLE_FLAG_INHERIT); - GetWindowTextA(v1, &String, 255); - HIBYTE(v7) = 0; - v3 = strlen(&String); - v6[v3] = 0; - v4 = &String + v3; - *(&String + v3) = 124; - SetWindowTextA(v1, &String); - DiabEdit_1000591C((LPARAM)v1, 3u); - *v4 = 0; - result = SetWindowTextA(v1, &String); + SetPropA(hWnd, "CURSOR", (void *)HANDLE_FLAG_INHERIT); + GetWindowTextA(hWnd, String, 255); + String[254] = 0; + v2 = strlen(String); + String[v2 + 1] = 0; + v3 = &String[v2]; + String[v2] = 124; + SetWindowTextA(hWnd, String); + DiabEdit_SendWndCommand(hWnd, 3u); + *v3 = 0; + SetWindowTextA(hWnd, String); } - return result; -} */ -// 1000594E: using guessed type char var_FF[252]; +} // ref: 0x10005A0A -char *__fastcall DiabEdit_10005A0A(HWND a1, unsigned char a2, int a3) { return 0; } -/* { - char *result; // eax - unsigned char v4; // bl +void __fastcall DiabEdit_RestrictAndLimit(HWND hWnd, WPARAM wParam, LPARAM lParam) +{ + unsigned char v3; // bl + char *v4; // eax char v5; // cl signed int v6; // eax signed int v7; // esi - char v8; // [esp+7h] [ebp-105h] - CHAR String; // [esp+8h] [ebp-104h] - char v10[252]; // [esp+9h] [ebp-103h] - short v11; // [esp+105h] [ebp-7h] - char v12; // [esp+107h] [ebp-5h] - HWND hWnd; // [esp+108h] [ebp-4h] + //char v8; // [esp+7h] [ebp-105h] + char String[256]; // [esp+8h] [ebp-104h] - hWnd = a1; - String = byte_10029448; - result = 0; - v4 = a2; - memset(v10, 0, sizeof(v10)); - v11 = 0; - v12 = 0; - if ( a2 == 8 ) + String[0] = nullcharacter; + v3 = wParam; + memset(&String[1], 0, 0xFCu); + *(_WORD *)&String[253] = 0; + String[255] = 0; + if ( (_BYTE)wParam == 8 ) goto LABEL_9; - if ( a2 < 0x20u || a2 > 0x7Eu && a2 < 0xC0u ) - return result; - result = (char *)GetPropA(hWnd, "RESTRICTED"); - if ( !result || (v5 = *result) == 0 ) + if ( (unsigned char)wParam < 0x20u || (unsigned char)wParam > 0x7Eu && (unsigned char)wParam < 0xC0u ) + return; + v4 = (char *)GetPropA(hWnd, "RESTRICTED"); + if ( !v4 || (v5 = *v4) == 0 ) { LABEL_9: - GetWindowTextA(hWnd, &String, 255); - HIBYTE(v11) = 0; - v6 = strlen(&String); + GetWindowTextA(hWnd, String, 255); + String[254] = 0; + v6 = strlen(String); v7 = v6; - if ( v4 == 8 ) + if ( v3 == 8 ) { if ( v6 ) { - *(&v8 + v6) = 0; + String[v6-1] = 0; // *(&v8 + v6) = 0; goto LABEL_14; } } else if ( v6 < (signed int)GetPropA(hWnd, "LIMIT") ) { - *(&String + v7) = v4; - v10[v7] = 0; + String[v7] = v3; + String[v7 + 1] = 0; LABEL_14: - SetWindowTextA(hWnd, &String); - return (char *)DiabEdit_1000594E((LPARAM)hWnd); + SetWindowTextA(hWnd, String); + goto LABEL_15; } - return (char *)DiabEdit_1000594E((LPARAM)hWnd); +LABEL_15: + DiabEdit_GetCursorProp(hWnd); + return; } - while ( v4 != v5 ) + while ( v3 != v5 ) { - v5 = *++result; - if ( !*result ) + v5 = *++v4; + if ( !*v4 ) goto LABEL_9; } - return result; -} */ -// 10005A0A: using guessed type char var_103[252]; +} // ref: 0x10005AF4 -int __fastcall DiabEdit_10005AF4(LPARAM lParam, int a2, int a3) { return 0; } -/* { - HWND v3; // esi - int v4; // ebx - int result; // eax - char v6; // [esp+Bh] [ebp-101h] - CHAR String; // [esp+Ch] [ebp-100h] - char v8; // [esp+Dh] [ebp-FFh] - short v9; // [esp+109h] [ebp-3h] - char v10; // [esp+10Bh] [ebp-1h] +void __fastcall DiabEdit_SetTextAndProp(HWND hWnd, WPARAM wParam, LPARAM lParam) +{ + WPARAM v4; // ebx + size_t v5; // eax + //char v6; // [esp+Bh] [ebp-101h] + char String[256]; // [esp+Ch] [ebp-100h] - v3 = (HWND)lParam; - String = byte_10029448; - memset(&v8, 0, 0xFCu); - v9 = 0; - v10 = 0; - v4 = a2; - GetWindowTextA((HWND)lParam, &String, 255); - HIBYTE(v9) = 0; - result = strlen(&String); + String[0] = nullcharacter; + memset(&String[1], 0, 0xFCu); + *(_WORD *)&String[253] = 0; + String[255] = 0; + v4 = wParam; + GetWindowTextA(hWnd, String, 255); + String[254] = 0; + v5 = strlen(String); if ( v4 == 37 ) { - if ( result ) + if ( v5 ) { - *(&v6 + result) = 0; - SetWindowTextA(v3, &String); + String[v5-1] = 0; // *(&v6 + v5) = 0; + SetWindowTextA(hWnd, String); } - result = DiabEdit_1000594E((LPARAM)v3); + DiabEdit_GetCursorProp(hWnd); } - return result; -} */ +} // ref: 0x10005B70 -char *__fastcall DiabEdit_10005B70(HWND hWnd, char *a2) { return 0; } -/* { - char *v2; // edi - char *result; // eax - char *v4; // esi +void __fastcall DiabEdit_SetRestrictString(HWND hWnd, LPARAM lParam) +{ + const char *v2; // edi + char *v3; // eax MAPDST - v2 = a2; - result = (char *)GetPropA(hWnd, "RESTRICTED"); - v4 = result; - if ( result ) + v2 = (const char *)lParam; + v3 = (char *)GetPropA(hWnd, "RESTRICTED"); + if ( v3 ) { - result = strncpy(result, v2, 0xFFu); - v4[255] = 0; + strncpy(v3, v2, 0xFFu); + v3[255] = 0; } - return result; -} */ +} // ref: 0x10005B9F -BOOL UNKCALL DiabEdit_10005B9F(HWND hWnd) { return 0; } -/* { - HWND v1; // esi - _BYTE *v2; // eax +void __fastcall DiabEdit_SetRestrictTimer(HWND hWnd) +{ + unsigned char *v2; // eax - v1 = hWnd; - SDlgSetTimer(hWnd, 1, 500, 0); - SetPropA(v1, "CURSOR", 0); - v2 = (_BYTE *)SMemAlloc(256, "C:\\Src\\Diablo\\DiabloUI\\DiabEdit.cpp", 185, 0); + SDlgSetTimer((int)hWnd, 1, 500, 0); + SetPropA(hWnd, "CURSOR", 0); + v2 = (unsigned char *)SMemAlloc(0x100u, "C:\\Src\\Diablo\\DiabloUI\\DiabEdit.cpp", 185, 0); *v2 = 0; - return SetPropA(v1, "RESTRICTED", v2); -} */ -// 10010364: using guessed type int __stdcall SMemAlloc(_DWORD, _DWORD, _DWORD, _DWORD); -// 10010412: using guessed type int __stdcall SDlgSetTimer(_DWORD, _DWORD, _DWORD, _DWORD); + SetPropA(hWnd, "RESTRICTED", v2); +} // ref: 0x10005BE7 -HANDLE UNKCALL DiabEdit_10005BE7(HWND hWnd) { return 0; } -/* { - HWND v1; // edi - HANDLE result; // eax +void __fastcall DiabEdit_RemoveAllProps(HWND hWnd) +{ + HANDLE v2; // eax - v1 = hWnd; - SDlgKillTimer(hWnd, 1); - RemovePropA(v1, "LIMIT"); - RemovePropA(v1, "CURSOR"); - result = RemovePropA(v1, "RESTRICTED"); - if ( result ) - result = (HANDLE)SMemFree(result, "C:\\Src\\Diablo\\DiabloUI\\DiabEdit.cpp", 200, 0); - return result; -} */ -// 10010340: using guessed type int __stdcall SMemFree(_DWORD, _DWORD, _DWORD, _DWORD); -// 10010418: using guessed type int __stdcall SDlgKillTimer(_DWORD, _DWORD); + SDlgKillTimer((int)hWnd, 1); + RemovePropA(hWnd, "LIMIT"); + RemovePropA(hWnd, "CURSOR"); + v2 = RemovePropA(hWnd, "RESTRICTED"); + if ( v2 ) + SMemFree(v2, "C:\\Src\\Diablo\\DiabloUI\\DiabEdit.cpp", 200, 0); +} diff --git a/DiabloUI/diabloui.cpp b/DiabloUI/diabloui.cpp index 184a0902d..7b8ebd6dc 100644 --- a/DiabloUI/diabloui.cpp +++ b/DiabloUI/diabloui.cpp @@ -66,11 +66,11 @@ // ref: 0x10005C2A -int DiabloUI_10005C2A() { return 0; } -/* { - return dword_1002972C; -} */ -// 1002972C: using guessed type int dword_1002972C; +int __cdecl DiabloUI_GetSpawned() +{ + return sgbIsSpawn; +} +// 1002972C: using guessed type int sgbIsSpawn; // ref: 0x10005C30 void __stdcall UiOnPaint(int a1) @@ -79,67 +79,52 @@ void __stdcall UiOnPaint(int a1) } // ref: 0x10005C33 -int __stdcall UiSetBackgroundBitmap(int a1, int a2, int a3, int a4, int a5) { return 0; } -/* { - dword_1002971C = a3; - dword_10029720 = a4; - dword_10029724 = a5; - return SDrawUpdatePalette(10, 236, a2 + 40, 0); -} */ -// 100103FA: using guessed type int __stdcall SDrawUpdatePalette(_DWORD, _DWORD, _DWORD, _DWORD); -// 1002971C: using guessed type int dword_1002971C; -// 10029720: using guessed type int dword_10029720; -// 10029724: using guessed type int dword_10029724; +void __stdcall UiSetBackgroundBitmap(int a1, PALETTEENTRY *a2, int a3, int a4, int a5) +{ + backbmp_flag1 = a3; + backbmp_flag2 = a4; + backbmp_flag3 = a5; + SDrawUpdatePalette(0xAu, 0xECu, a2 + 10, 0); +} +// 1002971C: using guessed type int backbmp_flag1; +// 10029720: using guessed type int backbmp_flag2; +// 10029724: using guessed type int backbmp_flag3; // ref: 0x10005C67 -int __stdcall UiSetSpawned(int a1) { return 0; } -/* { - int result; // eax - - result = a1; - dword_1002972C = a1; - return result; -} */ -// 1002972C: using guessed type int dword_1002972C; +void __stdcall UiSetSpawned(BOOL bSpawned) +{ + sgbIsSpawn = bSpawned; +} +// 1002972C: using guessed type int sgbIsSpawn; // ref: 0x10005C73 -void __cdecl UiInitialize() { return; } -//int UiInitialize() { return 0; } -/* { +void __cdecl UiInitialize() +{ dword_10029714 = 1; - TitleSnd_1001030D(); - artfont_10001098(); + TitleSnd_InitSoundFunc(); + artfont_InitAllFonts(); Connect_10002EC4(); - local_10007FD0(); - return bn_prof_100021C4(); -} */ + local_LoadArtCursor(); + bn_prof_100021C4(); +} // 10029714: using guessed type int dword_10029714; // ref: 0x10005C96 -void __cdecl UiDestroy() { return; } -//int UiDestroy() { return 0; } -/* { - int result; // eax - +void __cdecl UiDestroy() +{ bn_prof_10002247(); - local_100080AD(); - result = Connect_10002E2B(); + local_FreeArtCursor(); + Connect_10002E2B(); dword_10029714 = 0; - return result; -} */ +} // 10029714: using guessed type int dword_10029714; // ref: 0x10005CAD -void __stdcall UiAppActivate(int a1) { return; } -//int __stdcall UiAppActivate(int a1) { return 0; } -/* { - int result; // eax - - result = a1; - dword_10029728 = a1; - return result; -} */ -// 10029728: using guessed type int dword_10029728; +void __stdcall UiAppActivate(BOOL bActive) +{ + app_is_active = bActive; +} +// 10029728: using guessed type int app_is_active; // ref: 0x10005CB9 BOOL __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) @@ -148,8 +133,8 @@ BOOL __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { if ( fdwReason == 1 ) { - // hInstance = hinstDLL; - DiabEdit_100057A6(); + ghUiInst = hinstDLL; + DiabEdit_SetupWindow(); local_InitUiPalette(); } } @@ -161,12 +146,9 @@ BOOL __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) } // ref: 0x10005CEA -signed int DiabloUI_10005CEA() { return 0; } -/* { - signed int result; // eax - - result = 2139095040; - dword_10029710 = 2139095040; - return result; -} */ -// 10029710: using guessed type int dword_10029710; +void __cdecl DiabloUI_cpp_init() +{ + DiabloUI_cpp_float = DiabloUI_cpp_float_value; +} +// 1001F410: using guessed type int DiabloUI_cpp_float_value; +// 10029710: using guessed type int DiabloUI_cpp_float; diff --git a/DiabloUI/diabloui.h b/DiabloUI/diabloui.h index 836c2a4ad..8566bd8ef 100644 --- a/DiabloUI/diabloui.h +++ b/DiabloUI/diabloui.h @@ -29,10 +29,10 @@ struct ProfFntStruct }; void __cdecl UiDestroy(); -void __stdcall UiTitleDialog(int a1); +BOOL __stdcall UiTitleDialog(int a1); void __cdecl UiInitialize(); void __stdcall UiCopyProtError(int a1); -void __stdcall UiAppActivate(int a1); +void __stdcall UiAppActivate(BOOL bActive); int __stdcall UiValidPlayerName(char *a1); int __stdcall UiSelHeroMultDialog(void *fninfo, void *fncreate, void *fnremove, void *fnstats, int *a5, int *a6, char *name); int __stdcall UiSelHeroSingDialog(void *fninfo, void *fncreate, void *fnremove, void *fnstats, int *a5, char *name, int *difficulty); diff --git a/DiabloUI/diabloui.res b/DiabloUI/diabloui.res new file mode 100644 index 0000000000000000000000000000000000000000..886557e2c41a5c73d8d6004c3fb14fb2ba0f1f53 GIT binary patch literal 110944 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 M>~ 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 5 ) { diff --git a/DiabloUI/focus.cpp b/DiabloUI/focus.cpp index 3d306af6d..51cf5fb88 100644 --- a/DiabloUI/focus.cpp +++ b/DiabloUI/focus.cpp @@ -230,7 +230,7 @@ void __fastcall Focus_SetFocusTimer(HWND hWnd, const char *pszFileName) } // ref: 0x10007804 -void __stdcall Focus_SetFocusAndBlit(int hWnd) +void __stdcall Focus_SetFocusAndBlit(int hWnd, int a2, int a3, int a4) { HWND v1; // eax diff --git a/DiabloUI/local.cpp b/DiabloUI/local.cpp index 654370b46..38f746e43 100644 --- a/DiabloUI/local.cpp +++ b/DiabloUI/local.cpp @@ -570,7 +570,7 @@ void __fastcall local_SetDiabloCursor(HWND hWnd) v3 = 0; local_SetCursorDefault(); - v2 = LoadCursorA(hInstance, "DIABLOCURSOR"); + v2 = LoadCursorA(ghUiInst, "DIABLOCURSOR"); SDlgSetCursor(hWnd, v2, 32512, &v3); } // 10010454: using guessed type int __stdcall SDlgSetCursor(_DWORD, _DWORD, _DWORD, _DWORD); diff --git a/DiabloUI/title.cpp b/DiabloUI/title.cpp index 08687c72e..5bb577151 100644 --- a/DiabloUI/title.cpp +++ b/DiabloUI/title.cpp @@ -1,352 +1,296 @@ // ref: 0x1000FDEE -_DWORD *UNKCALL Title_1000FDEE(HWND hWnd) { return 0; } -/* { - HWND v1; // esi +void __fastcall Title_BlitTitleBuffer(HWND hWnd) +{ _DWORD *v2; // edi - _DWORD *result; // eax - int v4; // eax - _DWORD *v5; // esi + int v3; // eax + HANDLE v4; // esi struct tagRECT Rect; // [esp+Ch] [ebp-18h] - HWND v7; // [esp+1Ch] [ebp-8h] HWND hWnda; // [esp+20h] [ebp-4h] - v1 = hWnd; - v7 = hWnd; v2 = (_DWORD *)GetWindowLongA(hWnd, -21); - hWnda = GetDlgItem(v1, 1043); - result = (_DWORD *)IsWindowVisible(v1); - if ( result && hWnda && v2 && *v2 && dword_1002A510[0] ) + hWnda = GetDlgItem(hWnd, 1043); + if ( IsWindowVisible(hWnd) && hWnda && v2 && *v2 && titlePHTrans[0] ) { - v4 = dword_1002A58C + 1; - dword_1002A58C = v4; - if ( !dword_1002A510[v4] || v4 >= 30 ) - dword_1002A58C = 0; + v3 = titleTransIdx + 1; + titleTransIdx = v3; + if ( !titlePHTrans[v3] || v3 >= 30 ) + titleTransIdx = 0; GetWindowRect(hWnda, &Rect); - ScreenToClient(v1, (LPPOINT)&Rect); - ScreenToClient(v7, (LPPOINT)&Rect.right); - result = GetPropA(v7, "TITLE_BUFFER"); - v5 = result; - if ( result ) + ScreenToClient(hWnd, (LPPOINT)&Rect); + ScreenToClient(hWnd, (LPPOINT)&Rect.right); + v4 = GetPropA(hWnd, "TITLE_BUFFER"); + if ( v4 ) { - SBltROP3(*result, Rect.left + *v2 + Rect.top * v2[1], result[1], result[2], result[1], v2[1], 0, 13369376); - STransBlt(*v5, 0, 0, v5[1], dword_1002A510[dword_1002A58C]); - result = (_DWORD *)InvalidateRect(hWnda, 0, 0); + 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); } } - return result; -} */ -// 1001036A: using guessed type int __stdcall STransBlt(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD); -// 100103F4: using guessed type int __stdcall SBltROP3(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); -// 1002A58C: using guessed type int dword_1002A58C; +} +// 1002A58C: using guessed type int titleTransIdx; // ref: 0x1000FEED -int Title_1000FEED() { return 0; } -/* { +void __cdecl Title_DeletePhTrans() +{ int *v0; // esi - int result; // eax - v0 = dword_1002A510; + v0 = (int *)titlePHTrans; do { - result = *v0; if ( *v0 ) { - result = STransDelete(*v0); + STransDelete((HANDLE)*v0); *v0 = 0; } ++v0; } - while ( (signed int)v0 < (signed int)&dword_1002A588 ); - return result; -} */ -// 1001033A: using guessed type int __stdcall STransDelete(_DWORD); -// 1002A588: using guessed type int dword_1002A588; + while ( (signed int)v0 < (signed int)&titlePHTrans[30] ); +} // ref: 0x1000FF0F -void **UNKCALL Title_1000FF0F(HWND hWnd) { return 0; } -/* { - HWND v1; // esi - _DWORD *result; // eax - _DWORD *v3; // esi - int v4; // eax +void __fastcall Title_FreeTransMem(HWND hWnd) +{ + void **v2; // eax MAPDST + void *v4; // eax - v1 = hWnd; - Title_1000FEED(); - result = RemovePropA(v1, "TITLE_BUFFER"); - v3 = result; - if ( result ) + Title_DeletePhTrans(); + v2 = (void **)RemovePropA(hWnd, "TITLE_BUFFER"); + if ( v2 ) { - v4 = *result; + v4 = *v2; if ( v4 ) { SMemFree(v4, "C:\\Src\\Diablo\\DiabloUI\\Title.cpp", 114, 0); - *v3 = 0; + *v2 = 0; } - result = (_DWORD *)SMemFree(v3, "C:\\Src\\Diablo\\DiabloUI\\Title.cpp", 117, 0); + SMemFree(v2, "C:\\Src\\Diablo\\DiabloUI\\Title.cpp", 117, 0); } - return result; -} */ -// 10010340: using guessed type int __stdcall SMemFree(_DWORD, _DWORD, _DWORD, _DWORD); +} // ref: 0x1000FF51 -HWND UNKCALL Title_1000FF51(HWND arg) { return 0; } -/* { - HWND result; // eax - int *v2; // esi - int v3; // eax +void __fastcall Title_SetTitleBMP(HWND hWnd) +{ + HWND v1; // eax MAPDST + _DWORD *v2; // esi + void *v3; // eax struct tagRECT Rect; // [esp+0h] [ebp-18h] - HWND v5; // [esp+10h] [ebp-8h] - HWND hDlg; // [esp+14h] [ebp-4h] - hDlg = arg; - Title_1000FF0F(arg); - result = GetDlgItem(hDlg, 1043); - v5 = result; - if ( result ) + Title_FreeTransMem(hWnd); + v1 = GetDlgItem(hWnd, 1043); + if ( v1 ) { - GetClientRect(result, &Rect); - v2 = (int *)SMemAlloc(12, "C:\\Src\\Diablo\\DiabloUI\\Title.cpp", 134, 0); + 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 = v3; + *v2 = (unsigned int)v3; v2[1] = Rect.right; v2[2] = Rect.bottom; - SDlgSetBitmapI(v5, 0, 0, -1, 1, v3, 0, Rect.right, Rect.bottom, -1); - result = (HWND)SetPropA(hDlg, "TITLE_BUFFER", v2); + SDlgSetBitmapI(v1, 0, 0, -1, 1, v3, 0, Rect.right, Rect.bottom, -1); + SetPropA(hWnd, "TITLE_BUFFER", v2); } - return result; -} */ -// 10010364: using guessed type int __stdcall SMemAlloc(_DWORD, _DWORD, _DWORD, _DWORD); -// 10010400: using guessed type int __stdcall SDlgSetBitmapI(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); +} // ref: 0x1000FFE8 -_DWORD *__fastcall Title_1000FFE8(HWND hWnd, int a2) { return 0; } -/* { - HWND v2; // esi +void __fastcall Title_LoadTitleImage(HWND hWnd, const char *pszFileName) +{ int v3; // edi - _DWORD *result; // eax - int v5; // esi + _DWORD *v4; // eax + _DWORD *v5; // esi int v6; // ebx - int v7; // [esp+8h] [ebp-20h] - int v8; // [esp+Ch] [ebp-1Ch] - int v9; // [esp+10h] [ebp-18h] - int v10; // [esp+14h] [ebp-14h] - char v11; // [esp+18h] [ebp-10h] - int v12; // [esp+1Ch] [ebp-Ch] - int *v13; // [esp+20h] [ebp-8h] - int v14; // [esp+24h] [ebp-4h] + 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] - v2 = hWnd; v3 = 0; - v14 = 0; - local_100078BE(a2, &v14, &v11); - result = GetPropA(v2, "TITLE_BUFFER"); - v5 = (int)result; - if ( v14 ) + pBuffer = 0; + local_LoadArtImage(pszFileName, &pBuffer, (DWORD *)data); + v4 = (unsigned int *)GetPropA(hWnd, "TITLE_BUFFER"); + v5 = v4; + if ( pBuffer ) { - if ( result ) + if ( v4 ) { - v6 = v12 / result[2]; + v6 = data[1] / v4[2]; if ( v6 > 30 ) v6 = 30; if ( v6 > 0 ) { - v13 = dword_1002A510; + phTransOut = (HANDLE *)titlePHTrans; do { - v7 = 0; - v9 = *(_DWORD *)(v5 + 4) - 1; - v8 = v3 * *(_DWORD *)(v5 + 8); - v10 = *(_DWORD *)(v5 + 8) + v8 - 1; - STransCreateI(v14, *(_DWORD *)(v5 + 4), *(_DWORD *)(v5 + 8), 8, &v7, 16777466, v13); - ++v13; + 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 ); } } - result = (_DWORD *)SMemFree(v14, "C:\\Src\\Diablo\\DiabloUI\\Title.cpp", 197, 0); + SMemFree(pBuffer, "C:\\Src\\Diablo\\DiabloUI\\Title.cpp", 197, 0); } - dword_1002A58C = 0; - return result; -} */ -// 10010340: using guessed type int __stdcall SMemFree(_DWORD, _DWORD, _DWORD, _DWORD); -// 10010346: using guessed type int __stdcall STransCreateI(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); -// 1002A58C: using guessed type int dword_1002A58C; + titleTransIdx = 0; +} +// 1002A58C: using guessed type int titleTransIdx; // ref: 0x1001009E -int __fastcall Title_1001009E(HWND hWnd, int a2, HWND hWnda) { return 0; } -/* { - int v3; // edi - HWND v4; // esi - - v3 = a2; - v4 = hWnd; - Title_1000FF51(hWnd); - Title_1000FFE8(v4, v3); - Title_1000FDEE(v4); - return SDlgSetTimer(v4, 2, 55, Title_100100CB); -} */ -// 10010412: using guessed type int __stdcall SDlgSetTimer(_DWORD, _DWORD, _DWORD, _DWORD); +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 -_DWORD *__stdcall Title_100100CB(HWND hWnd, int a2, int a3, int a4) { return 0; } -/* { - return Title_1000FDEE(hWnd); -} */ +void __stdcall Title_BlitTitleBufFnc(int hWnd, int a2, int a3, int a4) +{ + Title_BlitTitleBuffer((HWND)hWnd); +} // ref: 0x100100DC -signed int Title_100100DC() { return 0; } -/* { - signed int result; // eax - - result = 2139095040; - dword_1002A588 = 2139095040; - return result; -} */ -// 1002A588: using guessed type int dword_1002A588; +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 **UNKCALL Title_100100E7(HWND hWnd) { return 0; } -/* { +void __fastcall Title_KillTitleTimer(HWND hWnd) +{ HWND v1; // esi v1 = hWnd; - SDlgKillTimer(hWnd, 2); - return Title_1000FF0F(v1); -} */ -// 10010418: using guessed type int __stdcall SDlgKillTimer(_DWORD, _DWORD); + SDlgKillTimer((int)hWnd, 2); + Title_FreeTransMem(v1); +} // ref: 0x100100FA -void __stdcall UiTitleDialog(int a1) { return; } -/* { +BOOL __stdcall UiTitleDialog(int a1) +{ int v1; // eax - artfont_10001159(); - v1 = SDrawGetFrameWindow(); - SDlgDialogBoxParam(hInstance, "TITLESCREEN_DIALOG", v1, Title_10010126, a1); + artfont_LoadAllFonts(); + v1 = (int)SDrawGetFrameWindow(); + SDlgDialogBoxParam(ghUiInst, "TITLESCREEN_DIALOG", v1, Title_MainProc, a1); return 1; -} */ -// 10010370: using guessed type int __stdcall SDlgDialogBoxParam(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD); +} // 10010382: using guessed type _DWORD __stdcall SDrawGetFrameWindow(); // ref: 0x10010126 -int __stdcall Title_10010126(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { return 0; } -/* { +LRESULT __stdcall Title_MainProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ HWND v5; // eax - int v6; // [esp+0h] [ebp-8h] - if ( Msg <= 0x111 ) + if ( uMsg <= 0x111 ) { - if ( Msg != 273 ) + if ( uMsg != 273 ) { - if ( Msg != 2 ) + if ( uMsg != 2 ) { - if ( Msg == 135 ) + if ( uMsg == 135 ) return 4; - if ( Msg != 256 ) + if ( uMsg != 256 ) { - if ( Msg > 0x103 ) + if ( uMsg > 0x103 ) { - if ( Msg <= 0x105 ) + if ( uMsg <= 0x105 ) { v5 = (HWND)SDrawGetFrameWindow(); - SendMessageA(v5, Msg, wParam, lParam); + SendMessageA(v5, uMsg, wParam, lParam); } - else if ( Msg == 272 ) + else if ( uMsg == 272 ) { - Title_1001025A(hWnd, lParam); + Title_LoadAllTitleImgs(hWnd, lParam); PostMessageA(hWnd, 0x7E8u, 0, 0); return 1; } } - return SDlgDefDialogProc(hWnd, Msg, wParam, lParam); + return (LRESULT)SDlgDefDialogProc(hWnd, uMsg, (HDC)wParam, (HWND)lParam); } goto LABEL_25; } - Title_10010235(hWnd); - return SDlgDefDialogProc(hWnd, Msg, wParam, lParam); + Title_KillTimerAndFree(hWnd); + return (LRESULT)SDlgDefDialogProc(hWnd, uMsg, (HDC)wParam, (HWND)lParam); } goto LABEL_25; } - if ( Msg != 275 ) + if ( uMsg != 275 ) { - if ( Msg != 513 && Msg != 516 ) + if ( uMsg != 513 && uMsg != 516 ) { - if ( Msg == 528 ) + if ( uMsg == 528 ) { if ( (_WORD)wParam == 513 || (_WORD)wParam == 516 ) - Title_100102D7(hWnd); + Title_KillAndFadeDlg(hWnd); } - else if ( Msg == 2024 ) + else if ( uMsg == 2024 ) { - if ( !Fade_1000739F() ) - Fade_100073FD(hWnd, v6); + if ( !Fade_CheckRange5() ) + Fade_SetFadeTimer((int)hWnd); return 0; } - return SDlgDefDialogProc(hWnd, Msg, wParam, lParam); + return (LRESULT)SDlgDefDialogProc(hWnd, uMsg, (HDC)wParam, (HWND)lParam); } LABEL_25: - Title_100102D7(hWnd); + 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 UNKCALL Title_10010235(HWND hDlg) { return; } -/* { - HWND v1; // esi - _DWORD *v2; // eax +void __fastcall Title_KillTimerAndFree(HWND hWnd) +{ + void **v2; // eax - v1 = hDlg; - Title_100100E7(hDlg); - Doom_10006C53(v1, (int *)&unk_10023340); - v2 = (_DWORD *)GetWindowLongA(v1, -21); - local_10007F72(v2); -} */ + Title_KillTitleTimer(hWnd); + Doom_DeleteFreeProcs(hWnd, titlemsgtbl); + v2 = (void **)GetWindowLongA(hWnd, -21); + local_FreeMemPtr(v2); +} // ref: 0x1001025A -int __fastcall Title_1001025A(HWND hWnd, int a2) { return 0; } -/* { - int v2; // ebx - HWND v3; // esi - int *v4; // edi - int result; // eax - HWND v6; // [esp+0h] [ebp-Ch] +void __fastcall Title_LoadAllTitleImgs(HWND hWnd, int time) +{ + DWORD *v4; // edi - v2 = a2; - v3 = hWnd; - v4 = (int *)local_10007F46(); - SetWindowLongA(v3, -21, (LONG)v4); + v4 = local_AllocWndLongData(); + SetWindowLongA(hWnd, -21, (LONG)v4); if ( v4 ) { - local_10007944((int)v3, 0, &byte_10029448, -1, 1, (int)"ui_art\\title.pcx", v4, v4 + 1, 0); - Fade_100073C5(v3, 0); + local_LoadArtWithPal(hWnd, 0, &nullcharacter, -1, 1, "ui_art\\title.pcx", (BYTE **)v4, v4 + 1, 0); + Fade_NoInputAndArt(hWnd, 0); } - Doom_100068AB(v3, (int *)&unk_10023340, 3); - Title_1001009E(v3, (int)"ui_art\\logo.pcx", v6); - if ( v2 ) - result = SDlgSetTimer(v3, 1, 1000 * v2, 0); + Doom_ParseWndProc3(hWnd, titlemsgtbl, 3); + Title_LoadImgSetTimer(hWnd, "ui_art\\logo.pcx"); + if ( time ) + SDlgSetTimer((int)hWnd, 1, 1000 * time, 0); else - result = SDlgSetTimer(v3, 1, 5000, 0); - return result; -} */ -// 10010412: using guessed type int __stdcall SDlgSetTimer(_DWORD, _DWORD, _DWORD, _DWORD); + SDlgSetTimer((int)hWnd, 1, 5000, 0); +} // ref: 0x100102D7 -int UNKCALL Title_100102D7(void *arg) { return 0; } -/* { - void *v1; // esi - - v1 = arg; - Fade_100073B4(); - SDlgKillTimer(v1, 1); - Fade_100072BE(10); - return SDlgEndDialog(v1, 1); -} */ -// 10010376: using guessed type int __stdcall SDlgEndDialog(_DWORD, _DWORD); -// 10010418: using guessed type int __stdcall SDlgKillTimer(_DWORD, _DWORD); +void __fastcall Title_KillAndFadeDlg(HWND hWnd) +{ + Fade_Range5SetZero(); + SDlgKillTimer((int)hWnd, 1); + Fade_UpdatePaletteRange(10); + SDlgEndDialog(hWnd, (void *)HANDLE_FLAG_INHERIT); +} diff --git a/MakefileVC b/MakefileVC index 5203750cb..82fcf5c2b 100644 --- a/MakefileVC +++ b/MakefileVC @@ -67,7 +67,7 @@ Diablo.exe: main_files $(PKWARE_OBJS) diablo.res DiabloUI/diabloui.lib 3rdParty/ $(VC_LINK) /OUT:$@ $(LINKFLAGS) $(OBJS) $(PKWARE_OBJS) diablo.res advapi32.lib gdi32.lib shell32.lib user32.lib version.lib DiabloUI/diabloui.lib 3rdParty/Storm/Source/storm.lib DiabloUI/diabloui.lib: $(DIABLOUI_OBJS) 3rdParty/Storm/Source/storm.lib - $(CL) $^ /link /LINK50COMPAT /nologo /dll /subsystem:windows /machine:I386 /LIBPATH:$(VC6_LIB_DIR) advapi32.lib gdi32.lib shell32.lib user32.lib version.lib 3rdParty/Storm/Source/storm.lib /def:"DiabloUI/diabloui.def" /out:DiabloUI/diabloui.dll + $(CL) $^ /link /LINK50COMPAT /nologo /dll /subsystem:windows /machine:I386 /LIBPATH:$(VC6_LIB_DIR) DiabloUI/diabloui.res advapi32.lib gdi32.lib shell32.lib user32.lib version.lib 3rdParty/Storm/Source/storm.lib /def:"DiabloUI/diabloui.def" /out:DiabloUI/diabloui.dll 3rdParty/Storm/Source/storm.lib: $(STORM_OBJS) $(CL) $^ /link /LINK50COMPAT /nologo /dll /subsystem:windows /machine:I386 /LIBPATH:$(VC6_LIB_DIR) /def:"3rdParty/Storm/Source/storm.def" /out:3rdParty/Storm/Source/storm.dll