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.
526 lines
13 KiB
526 lines
13 KiB
// ref: 0x10007825 |
|
void __cdecl local_InitUiPalette() |
|
{ |
|
LOGPALETTE *v0; // eax MAPDST |
|
PALETTEENTRY *v2; // eax |
|
int v3; // ecx |
|
|
|
v0 = (LOGPALETTE *)SMemAlloc(0x404u, "C:\\Src\\Diablo\\DiabloUI\\local.cpp", 27, 0); |
|
if (v0) { |
|
v0->palVersion = 768; |
|
v0->palNumEntries = 256; |
|
v2 = v0->palPalEntry; |
|
v3 = 0; |
|
do { |
|
v2[v3].peFlags = 2; |
|
++v3; |
|
} while (v3 < 256); |
|
objPalette = CreatePalette(v0); |
|
SMemFree(v0, "C:\\Src\\Diablo\\DiabloUI\\local.cpp", 41, 0); |
|
} |
|
} |
|
|
|
// ref: 0x1000787D |
|
void __cdecl local_DelUiPalette() |
|
{ |
|
if (objPalette) { |
|
DeleteObject(objPalette); |
|
objPalette = 0; |
|
} |
|
} |
|
|
|
// ref: 0x10007895 |
|
tagPALETTEENTRY *__fastcall local_GetArtPalEntry(int entry) |
|
{ |
|
return &artpal[entry]; |
|
} |
|
|
|
// ref: 0x1000789D |
|
void __fastcall local_ClearPalette(PALETTEENTRY *pPal) |
|
{ |
|
BYTE *v1; // eax |
|
signed int v2; // ecx |
|
|
|
v1 = &pPal->peBlue; |
|
v2 = 256; |
|
do { |
|
*(v1 - 2) = 0; |
|
*(v1 - 1) = 0; |
|
*v1 = 0; |
|
v1 += 4; |
|
--v2; |
|
} while (v2); |
|
} |
|
|
|
// ref: 0x100078B6 |
|
void __cdecl local_ClearSurface() |
|
{ |
|
SDrawClearSurface(0); |
|
} |
|
// 1001043C: using guessed type int __stdcall SDrawClearSurface(DWORD); |
|
|
|
// ref: 0x100078BE |
|
BOOL __fastcall local_LoadArtImage(const char *pszFileName, BYTE **pBuffer, DWORD *pdwSize) |
|
{ |
|
BYTE *v4; // eax |
|
DWORD v5; // ecx |
|
DWORD dwHeight; // [esp+10h] [ebp-8h] |
|
DWORD dwWidth; // [esp+14h] [ebp-4h] |
|
|
|
*pBuffer = 0; |
|
if (!SBmpLoadImage(pszFileName, 0, 0, 0, &dwWidth, &dwHeight, 0)) |
|
return 0; |
|
v4 = (BYTE *)SMemAlloc(dwHeight * dwWidth, "C:\\Src\\Diablo\\DiabloUI\\local.cpp", 93, 0); |
|
v5 = dwWidth; |
|
*pBuffer = v4; |
|
if (!SBmpLoadImage(pszFileName, 0, v4, dwHeight * v5, 0, 0, 0)) { |
|
SMemFree(*pBuffer, "C:\\Src\\Diablo\\DiabloUI\\local.cpp", 95, 0); |
|
*pBuffer = 0; |
|
return 0; |
|
} |
|
if (pdwSize) { |
|
*pdwSize = dwWidth; |
|
pdwSize[1] = dwHeight; |
|
} |
|
return 1; |
|
} |
|
|
|
// ref: 0x10007944 |
|
BOOL __fastcall local_LoadArtWithPal(HWND hWnd, int a2, char *src, int mask, int flags, const char *pszFileName, BYTE **pBuffer, DWORD *pdwSize, BOOL a9) |
|
{ |
|
BYTE *v10; // eax |
|
DWORD v11; // ST18_4 |
|
HPALETTE v13; // edi |
|
tagPALETTEENTRY pPalEntries[256]; // [esp+Ch] [ebp-40Ch] |
|
DWORD pdwWidth; // [esp+410h] [ebp-8h] |
|
DWORD dwHeight; // [esp+414h] [ebp-4h] |
|
|
|
if (!SBmpLoadImage(pszFileName, 0, 0, 0, &pdwWidth, &dwHeight, 0)) |
|
return 0; |
|
v10 = (BYTE *)SMemAlloc(dwHeight * pdwWidth, "C:\\Src\\Diablo\\DiabloUI\\local.cpp", 129, 0); |
|
v11 = dwHeight * pdwWidth; |
|
*pBuffer = v10; |
|
if (!SBmpLoadImage(pszFileName, pPalEntries, v10, v11, 0, 0, 0) |
|
|| !SDlgSetBitmapI(hWnd, a2, src, mask, flags, *pBuffer, 0, pdwWidth, dwHeight, -1)) { |
|
return 0; |
|
} |
|
if (!src || !*src) { |
|
v13 = (HPALETTE)GetStockObject(15); |
|
GetPaletteEntries(v13, 0, 0xAu, pPalEntries); |
|
GetPaletteEntries(v13, 0xAu, 0xAu, &pPalEntries[246]); |
|
memcpy(artpal, pPalEntries, 0x400u); |
|
if (a9) { |
|
SDrawUpdatePalette(0, 255, artpal, 1); |
|
} else { |
|
local_ClearPalette(pPalEntries); |
|
SDrawUpdatePalette(0, 256, pPalEntries, 1); |
|
} |
|
} |
|
if (pdwSize) { |
|
*pdwSize = pdwWidth; |
|
pdwSize[1] = dwHeight; |
|
} |
|
return 1; |
|
} |
|
// 100103FA: using guessed type int __stdcall SDrawUpdatePalette(DWORD, DWORD, DWORD, DWORD); |
|
|
|
// ref: 0x10007A68 |
|
void __fastcall local_AdjustRectSize(tagRECT *pRect, int a2, int a3) |
|
{ |
|
int v3; // eax |
|
int v4; // edx |
|
|
|
v3 = a2 - pRect->left; |
|
pRect->left = a2; |
|
pRect->right += v3 - 1; |
|
v4 = a3 - pRect->top; |
|
pRect->top = a3; |
|
pRect->bottom += v4 - 1; |
|
} |
|
|
|
// ref: 0x10007A85 |
|
BOOL __fastcall local_SetStaticBmp(HWND hWnd, int nIDDlgItem, BYTE *pBuffer, DWORD *pdwSize) |
|
{ |
|
HWND v4; // edi |
|
HWND v5; // ebx |
|
struct tagRECT Rect; // [esp+Ch] [ebp-10h] |
|
|
|
v4 = hWnd; |
|
v5 = GetDlgItem(hWnd, nIDDlgItem); |
|
GetWindowRect(v5, &Rect); |
|
ScreenToClient(v4, (LPPOINT)&Rect); |
|
ScreenToClient(v4, (LPPOINT)&Rect.right); |
|
SDlgSetBitmapI(v5, 0, "Static", -1, 1, pBuffer, (int)&Rect, *pdwSize, pdwSize[1], -1); |
|
return 1; |
|
} |
|
|
|
// ref: 0x10007AEA |
|
void __cdecl local_cpp_init() |
|
{ |
|
local_cpp_float = 0x7F800000; |
|
} |
|
// 10029CB8: using guessed type int local_cpp_float; |
|
|
|
// ref: 0x10007AF5 |
|
BOOL __fastcall local_SetButtonBmp(HWND hWnd, int flags, int a7, void *pBuffer, DWORD *pdwSize) |
|
{ |
|
return SDlgSetBitmapI(hWnd, 0, "Button", -1, flags, pBuffer, a7, *pdwSize, pdwSize[1], -1); |
|
} |
|
|
|
// ref: 0x10007B1B |
|
void __fastcall local_FitButtonDlg(HWND hWnd, int *a2, void *pBuffer, DWORD *pdwSize) |
|
{ |
|
int v4; // eax |
|
HWND v5; // esi |
|
struct tagRECT Rect; // [esp+0h] [ebp-1Ch] |
|
int a3; // [esp+14h] [ebp-8h] |
|
int *v9; // [esp+18h] [ebp-4h] |
|
|
|
v4 = *a2; |
|
a3 = 0; |
|
v9 = a2; |
|
if (v4) { |
|
do { |
|
v5 = GetDlgItem(hWnd, v4); |
|
if (v5) { |
|
GetClientRect(v5, &Rect); |
|
local_AdjustRectSize(&Rect, 0, a3); |
|
local_SetButtonBmp(v5, 16, (int)&Rect, pBuffer, pdwSize); |
|
++Rect.bottom; |
|
++Rect.right; |
|
local_AdjustRectSize(&Rect, 0, Rect.bottom); |
|
local_SetButtonBmp(v5, 64, (int)&Rect, pBuffer, pdwSize); |
|
++Rect.bottom; |
|
++Rect.right; |
|
local_AdjustRectSize(&Rect, 0, Rect.bottom); |
|
local_SetButtonBmp(v5, 32, (int)&Rect, pBuffer, pdwSize); |
|
++Rect.bottom; |
|
++Rect.right; |
|
local_AdjustRectSize(&Rect, 0, Rect.bottom); |
|
local_SetButtonBmp(v5, 128, (int)&Rect, pBuffer, pdwSize); |
|
++Rect.bottom; |
|
++Rect.right; |
|
local_AdjustRectSize(&Rect, 0, Rect.bottom); |
|
local_SetButtonBmp(v5, 1280, (int)&Rect, pBuffer, pdwSize); |
|
++Rect.bottom; |
|
++Rect.right; |
|
a3 = Rect.bottom; |
|
} |
|
++v9; |
|
v4 = *v9; |
|
} while (*v9); |
|
} |
|
} |
|
|
|
// ref: 0x10007C2E |
|
void __fastcall local_SetWhiteText(HDC hdc) |
|
{ |
|
SetTextColor(hdc, 0xFFFFu); |
|
} |
|
|
|
// ref: 0x10007C3B |
|
BOOL __fastcall local_GetBottomRect(HWND hWnd1, HWND hWnd2, int width, int height) |
|
{ |
|
BOOL result; // eax |
|
struct tagRECT Rect; // [esp+4h] [ebp-10h] |
|
|
|
if (hWnd1 |
|
&& hWnd2 |
|
&& (GetWindowRect(hWnd2, &Rect), |
|
ScreenToClient(hWnd1, (LPPOINT)&Rect), |
|
ScreenToClient(hWnd1, (LPPOINT)&Rect.right), |
|
width >= Rect.left) |
|
&& width < Rect.right |
|
&& height >= Rect.top) { |
|
result = height < Rect.bottom; |
|
} else { |
|
result = 0; |
|
} |
|
return result; |
|
} |
|
|
|
// ref: 0x10007C95 |
|
void __fastcall local_DlgDoPaint(HWND hWnd) |
|
{ |
|
char v2[64]; // [esp+4h] [ebp-40h] |
|
|
|
SDlgBeginPaint(hWnd, v2); |
|
SDlgEndPaint(hWnd, v2); |
|
} |
|
// 10010442: using guessed type int __stdcall SDlgEndPaint(DWORD, DWORD); |
|
// 10010448: using guessed type int __stdcall SDlgBeginPaint(DWORD, DWORD); |
|
|
|
// ref: 0x10007CB5 |
|
void __fastcall local_DoUiWndProc(HWND hWnd, DWORD *pdwMsgTbl) |
|
{ |
|
DWORD *v2; // edi |
|
int i; // eax |
|
HWND v5; // eax |
|
HWND v6; // esi |
|
void *v7; // eax |
|
|
|
v2 = pdwMsgTbl; |
|
for (i = *pdwMsgTbl; *v2; i = *v2) { |
|
v5 = GetDlgItem(hWnd, i); |
|
v6 = v5; |
|
if (v5) { |
|
v7 = (void *)GetWindowLongA(v5, -4); |
|
SetPropA(v6, "UIWNDPROC", v7); |
|
SetWindowLongA(v6, -4, (LONG)local_PostUiWndProc); |
|
} |
|
++v2; |
|
} |
|
} |
|
|
|
// ref: 0x10007D01 |
|
LRESULT __stdcall local_PostUiWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) |
|
{ |
|
WNDPROC v4; |
|
HWND v5; // eax |
|
HWND v6; // eax |
|
HWND v7; // eax |
|
WPARAM v9; // [esp-8h] [ebp-14h] |
|
BOOL v10; // [esp-4h] [ebp-10h] |
|
|
|
v4 = (WNDPROC)GetPropA(hWnd, "UIWNDPROC"); |
|
switch (uMsg) { |
|
case 2u: |
|
RemovePropA(hWnd, "UIWNDPROC"); |
|
if (!v4) |
|
return DefWindowProcA(hWnd, uMsg, wParam, lParam); |
|
SetWindowLongA(hWnd, -4, (LONG)v4); |
|
goto LABEL_21; |
|
case 0xFu: |
|
local_DlgDoPaint(hWnd); |
|
return 0; |
|
case 0x87u: |
|
return 4; |
|
} |
|
if (uMsg != 256) |
|
goto LABEL_21; |
|
switch (wParam) { |
|
case 0xDu: |
|
goto LABEL_26; |
|
case 0x1Bu: |
|
v9 = 2; |
|
LABEL_15: |
|
v7 = GetParent(hWnd); |
|
SendMessageA(v7, 0x111u, v9, 0); |
|
goto LABEL_21; |
|
case 0x20u: |
|
LABEL_26: |
|
v9 = 1; |
|
goto LABEL_15; |
|
} |
|
if (wParam <= 0x24) |
|
goto LABEL_21; |
|
if (wParam <= 0x26) { |
|
v10 = 1; |
|
} else { |
|
if (wParam > 0x28) |
|
goto LABEL_21; |
|
v10 = 0; |
|
} |
|
v5 = GetParent(hWnd); |
|
v6 = GetNextDlgGroupItem(v5, hWnd, v10); |
|
SetFocus(v6); |
|
LABEL_21: |
|
if (v4) |
|
return CallWindowProcA(v4, hWnd, uMsg, wParam, lParam); |
|
return DefWindowProcA(hWnd, uMsg, wParam, lParam); |
|
} |
|
|
|
// ref: 0x10007DE9 |
|
void __fastcall local_DoUiWndProc2(HWND hWnd, DWORD *pdwMsgTbl) |
|
{ |
|
DWORD *v2; // edi |
|
int i; // eax |
|
HWND v5; // eax |
|
HWND v6; // esi |
|
void *v7; // eax |
|
|
|
v2 = pdwMsgTbl; |
|
for (i = *pdwMsgTbl; *v2; i = *v2) { |
|
v5 = GetDlgItem(hWnd, i); |
|
v6 = v5; |
|
if (v5) { |
|
v7 = (void *)GetWindowLongA(v5, -4); |
|
SetPropA(v6, "UIWNDPROC", v7); |
|
SetWindowLongA(v6, -4, (LONG)local_PostUiWndProc2); |
|
} |
|
++v2; |
|
} |
|
} |
|
|
|
// ref: 0x10007E35 |
|
LRESULT __stdcall local_PostUiWndProc2(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) |
|
{ |
|
LRESULT(__stdcall * v4) |
|
(HWND, UINT, WPARAM, LPARAM); // ebx |
|
WPARAM v5; // ST0C_4 |
|
HWND v6; // eax |
|
HWND v8; // [esp+18h] [ebp+Ch] |
|
|
|
v4 = (LRESULT(__stdcall *)(HWND, UINT, WPARAM, LPARAM))GetPropA(hWnd, "UIWNDPROC"); |
|
switch (uMsg) { |
|
case 2u: |
|
RemovePropA(hWnd, "UIWNDPROC"); |
|
if (!v4) |
|
return DefWindowProcA(hWnd, uMsg, wParam, lParam); |
|
SetWindowLongA(hWnd, -4, (LONG)v4); |
|
break; |
|
case 0xFu: |
|
local_DlgDoPaint(hWnd); |
|
return 0; |
|
case 0x201u: |
|
v8 = GetFocus(); |
|
SetFocus(hWnd); |
|
InvalidateRect(v8, 0, 0); |
|
InvalidateRect(hWnd, 0, 0); |
|
UpdateWindow(v8); |
|
UpdateWindow(hWnd); |
|
v5 = (unsigned short)GetWindowLongA(hWnd, -12); |
|
v6 = GetParent(hWnd); |
|
PostMessageA(v6, 0x111u, v5, (LPARAM)hWnd); |
|
return 0; |
|
} |
|
if (v4) |
|
return CallWindowProcA(v4, hWnd, uMsg, wParam, lParam); |
|
return DefWindowProcA(hWnd, uMsg, wParam, lParam); |
|
} |
|
|
|
// ref: 0x10007F04 |
|
BOOL __fastcall local_DisableKeyWaitMouse(HWND hWnd) |
|
{ |
|
BOOL result; // eax |
|
struct tagMSG Msg; // [esp+8h] [ebp-1Ch] |
|
|
|
do { |
|
while (PeekMessageA(&Msg, hWnd, 0x100u, 0x108u, 1u)) |
|
; |
|
result = PeekMessageA(&Msg, hWnd, 0x200u, 0x209u, 1u); |
|
} while (result); |
|
return result; |
|
} |
|
|
|
// ref: 0x10007F46 |
|
DWORD *__cdecl local_AllocWndLongData() |
|
{ |
|
DWORD *result; // eax |
|
|
|
result = (DWORD *)SMemAlloc(0x110u, "C:\\Src\\Diablo\\DiabloUI\\local.cpp", 480, 0); |
|
if (result) { |
|
*result = 0; |
|
result[1] = 0; |
|
result[2] = 0; |
|
result[3] = 0; |
|
*((BYTE *)result + 16) = 0; |
|
} |
|
return result; |
|
} |
|
|
|
// ref: 0x10007F72 |
|
void __fastcall local_FreeMemPtr(void **p) |
|
{ |
|
if (p) { |
|
if (*p) |
|
SMemFree(*p, "C:\\Src\\Diablo\\DiabloUI\\local.cpp", 498, 0); |
|
SMemFree(p, "C:\\Src\\Diablo\\DiabloUI\\local.cpp", 499, 0); |
|
} |
|
} |
|
|
|
// ref: 0x10007FA4 |
|
void __fastcall local_SetWndLongStr(int WndLongData, const char *pszStr) |
|
{ |
|
if (WndLongData) { |
|
if (pszStr) { |
|
strncpy((char *)(WndLongData + 16), pszStr, 0xFFu); |
|
*(BYTE *)(WndLongData + 271) = 0; |
|
} else { |
|
*(BYTE *)(WndLongData + 16) = 0; |
|
} |
|
} |
|
} |
|
|
|
// ref: 0x10007FD0 |
|
void __cdecl local_LoadArtCursor() |
|
{ |
|
DWORD dwHeight; // [esp+8h] [ebp-8h] |
|
DWORD dwWidth; // [esp+Ch] [ebp-4h] |
|
|
|
if (SBmpLoadImage("ui_art\\cursor.pcx", 0, 0, 0, &dwWidth, &dwHeight, 0)) { |
|
gpCursorArt = (BYTE *)SMemAlloc(dwHeight * dwWidth, "C:\\Src\\Diablo\\DiabloUI\\local.cpp", 553, 0); |
|
gpCursorArt2 = (BYTE *)SMemAlloc(dwHeight * dwWidth, "C:\\Src\\Diablo\\DiabloUI\\local.cpp", 554, 0); |
|
if (SBmpLoadImage("ui_art\\cursor.pcx", 0, gpCursorArt, dwHeight * dwWidth, 0, 0, 0)) { |
|
gdwCursData[0] = dwWidth; |
|
gdwCursData[1] = dwHeight; |
|
local_InitArtCursor(); |
|
} |
|
} |
|
} |
|
|
|
// ref: 0x10008062 |
|
void __cdecl local_InitArtCursor() |
|
{ |
|
BYTE *v0; // eax |
|
BYTE *v1; // ecx |
|
int i; // esi |
|
char v3; // dl |
|
|
|
v0 = gpCursorArt2; |
|
v1 = gpCursorArt; |
|
if (gpCursorArt2) { |
|
if (gpCursorArt) { |
|
for (i = 0; i < gdwCursData[0] * gdwCursData[1]; ++i) { |
|
v3 = *v1++; |
|
if (v3) |
|
*v0 = 0; |
|
else |
|
*v0 = -1; |
|
++v0; |
|
} |
|
} |
|
} |
|
} |
|
|
|
// ref: 0x100080AD |
|
void __cdecl local_FreeArtCursor() |
|
{ |
|
if (gpCursorArt) { |
|
SMemFree(gpCursorArt, "C:\\Src\\Diablo\\DiabloUI\\local.cpp", 571, 0); |
|
gpCursorArt = 0; |
|
} |
|
if (gpCursorArt2) { |
|
SMemFree(gpCursorArt2, "C:\\Src\\Diablo\\DiabloUI\\local.cpp", 575, 0); |
|
gpCursorArt2 = 0; |
|
} |
|
} |
|
|
|
// ref: 0x100080F1 |
|
void __cdecl local_SetCursorArt() |
|
{ |
|
if (!gpCursorArt) |
|
local_LoadArtCursor(); |
|
SDlgSetSystemCursor(gpCursorArt2, gpCursorArt, (int *)gdwCursData, 32512); |
|
} |
|
// 1001044E: using guessed type int __stdcall SDlgSetSystemCursor(DWORD, DWORD, DWORD, DWORD); |
|
|
|
// ref: 0x1000811B |
|
void __cdecl local_SetCursorDefault() |
|
{ |
|
SDlgSetSystemCursor(0, 0, 0, 32512); |
|
} |
|
// 1001044E: using guessed type int __stdcall SDlgSetSystemCursor(DWORD, DWORD, DWORD, DWORD); |
|
|
|
// ref: 0x1000812B |
|
void __fastcall local_SetDiabloCursor(HWND hWnd) |
|
{ |
|
HCURSOR v2; // eax |
|
int v3; // [esp+4h] [ebp-4h] |
|
|
|
v3 = 0; |
|
local_SetCursorDefault(); |
|
v2 = LoadCursorA(ghUiInst, "DIABLOCURSOR"); |
|
SDlgSetCursor(hWnd, v2, 32512, &v3); |
|
} |
|
// 10010454: using guessed type int __stdcall SDlgSetCursor(DWORD, DWORD, DWORD, DWORD);
|
|
|