mirror of
https://github.com/galaxyhaxz/devilution
synced 2024-11-14 16:29:02 +00:00
417 lines
10 KiB
C++
417 lines
10 KiB
C++
|
// ref: 0x10004339
|
||
|
void __cdecl cr8game_cpp_init()
|
||
|
{
|
||
|
cr8game_cpp_float = cr8game_cpp_float_value;
|
||
|
}
|
||
|
// 1001F3FC: using guessed type int cr8game_cpp_float_value;
|
||
|
// 1002962C: using guessed type int cr8game_cpp_float;
|
||
|
|
||
|
// ref: 0x10004344
|
||
|
BOOL __fastcall cr8game_GetSnetCreaGame(HWND hWnd)
|
||
|
{
|
||
|
BOOL result; // eax
|
||
|
DWORD *v2; // eax
|
||
|
int *v3; // ST24_4
|
||
|
int v4; // ST18_4
|
||
|
int v5; // ST14_4
|
||
|
char *v6; // ST10_4
|
||
|
int v7; // eax
|
||
|
char Buffer[128]; // [esp+Ch] [ebp-308h]
|
||
|
char Text[256]; // [esp+8Ch] [ebp-288h]
|
||
|
char a4[128]; // [esp+18Ch] [ebp-188h]
|
||
|
char a2[128]; // [esp+20Ch] [ebp-108h]
|
||
|
char str[128]; // [esp+28Ch] [ebp-88h]
|
||
|
BOOL v13; // [esp+30Ch] [ebp-8h]
|
||
|
|
||
|
Connect_CopyPlrDescStrings(a2, 128, str, 128);
|
||
|
Connect_SetDiffString(&cr8_gamedata, a2, str, a4, 128);
|
||
|
if ( UiAuthCallback(2, a2, str, 0, a4, Text, 256) )
|
||
|
{
|
||
|
v2 = cr8_somegamestruct;
|
||
|
if ( cr8_somegamestruct[8] >= 8 )
|
||
|
{
|
||
|
*(_BYTE *)(cr8_somegamestruct[7] + 4) = cr8_gamedata.bDiff;
|
||
|
v2 = cr8_somegamestruct;
|
||
|
}
|
||
|
v3 = cr8game_playerID;
|
||
|
v4 = *(_DWORD *)(cr8_playercount + 8);
|
||
|
v5 = v2[8];
|
||
|
v6 = (char *)v2[7];
|
||
|
v7 = Connect_GetRankFromLevel(str);
|
||
|
v13 = SNetCreateGame(cr8_gamename, cr8_gamepassword, a4, v7, v6, v5, v4, a2, 0, (DWORD *)v3);
|
||
|
if ( !v13 )
|
||
|
{
|
||
|
if ( SErrGetLastError() == 183 )
|
||
|
{
|
||
|
LoadStringA(ghUiInst, 0x40Fu, Buffer, 128);
|
||
|
sprintf(Text, Buffer, cr8_gamename);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LoadStringA(ghUiInst, 0x410u, Text, 256);
|
||
|
}
|
||
|
UiMessageBoxCallback(hWnd, Text, 0, 0x30u);
|
||
|
}
|
||
|
result = v13;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
UiMessageBoxCallback(hWnd, Text, 0, 0x30u);
|
||
|
result = 0;
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
// 10010406: using guessed type _DWORD __stdcall SErrGetLastError();
|
||
|
// 10029630: using guessed type int cr8_playercount;
|
||
|
|
||
|
// ref: 0x100044AA
|
||
|
BOOL __stdcall UiCreateGameCallback(int a1, int a2, int a3, int a4, int a5, int a6)
|
||
|
{
|
||
|
BOOL v6; // eax
|
||
|
|
||
|
cr8_playercount = a1;
|
||
|
cr8_somegamestruct = (DWORD *)a2;
|
||
|
cr8_dword_10029638 = a3;
|
||
|
cr8_dword_10029640 = a5;
|
||
|
cr8_dword_1002963C = a4;
|
||
|
cr8game_playerID = (int *)a6;
|
||
|
v6 = SDlgDialogBoxParam(ghUiInst, "DIALOG_CREATE_GAME", *(_DWORD *)(a4 + 8), cr8game_WndProc, 0);
|
||
|
return v6 != -1 ? v6 : 0;
|
||
|
}
|
||
|
// 10029630: using guessed type int cr8_playercount;
|
||
|
// 10029638: using guessed type int cr8_dword_10029638;
|
||
|
// 1002963C: using guessed type int cr8_dword_1002963C;
|
||
|
// 10029640: using guessed type int cr8_dword_10029640;
|
||
|
|
||
|
// ref: 0x10004506
|
||
|
LRESULT __stdcall cr8game_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
signed int v4; // ebx
|
||
|
HWND v6; // eax
|
||
|
HWND v7; // eax
|
||
|
HWND v8; // eax
|
||
|
char Buffer[256]; // [esp+Ch] [ebp-104h]
|
||
|
int a2; // [esp+10Ch] [ebp-4h]
|
||
|
|
||
|
v4 = Msg;
|
||
|
if ( Msg == 2 )
|
||
|
{
|
||
|
cr8game_FreeCreaStuff();
|
||
|
cr8game_FreeMainMem(hWnd);
|
||
|
if ( cr8game_hobject )
|
||
|
DeleteObject(cr8game_hobject);
|
||
|
cr8_sendmsg1 = 0;
|
||
|
cr8_sendmsg2 = 0;
|
||
|
return (LRESULT)SDlgDefDialogProc(hWnd, v4, (HDC)wParam, (HWND)lParam);
|
||
|
}
|
||
|
if ( Msg > 0x103 )
|
||
|
{
|
||
|
if ( Msg > 0x105 )
|
||
|
{
|
||
|
if ( Msg == 272 )
|
||
|
{
|
||
|
cr8_sendmsg2 = GetDlgItem(hWnd, 1010);
|
||
|
cr8_sendmsg1 = GetDlgItem(hWnd, 1011);
|
||
|
cr8game_LoadCreaGFX(hWnd);
|
||
|
cr8game_AllocMainMem(hWnd);
|
||
|
cr8game_SendMessageF5(hWnd);
|
||
|
cr8game_hobject = cr8game_GetCr8Object(hWnd);
|
||
|
SendMessageA(cr8_sendmsg2, 0xC5u, 0x1Fu, 0);
|
||
|
SendMessageA(cr8_sendmsg1, 0xC5u, 0x1Fu, 0);
|
||
|
return 1;
|
||
|
}
|
||
|
if ( Msg != 273 )
|
||
|
{
|
||
|
if ( Msg == 312 && GetWindowLongA((HWND)lParam, -12) == 1030 )
|
||
|
{
|
||
|
local_SetWhiteText((HDC)wParam);
|
||
|
return (LRESULT)GetStockObject(5);
|
||
|
}
|
||
|
return (LRESULT)SDlgDefDialogProc(hWnd, v4, (HDC)wParam, (HWND)lParam);
|
||
|
}
|
||
|
if ( (unsigned short)wParam == 1 )
|
||
|
{
|
||
|
if ( SendMessageA(cr8_sendmsg2, 0xEu, 0, 0) )
|
||
|
{
|
||
|
SendMessageA(cr8_sendmsg2, 0xDu, 0x20u, (LPARAM)cr8_gamename);
|
||
|
if ( SelHero_IsNameReserved(cr8_gamename)
|
||
|
|| SelHero_NameHasChar(cr8_gamename, &nullcharacter)
|
||
|
|| !cr8game_CheckValidGameName(cr8_gamename) )
|
||
|
{
|
||
|
LoadStringA(ghUiInst, 0x404u, Buffer, 256);
|
||
|
OkCancel_DoOkDialog(hWnd, Buffer, 1);
|
||
|
cr8_gamename[0] = 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
cr8_gamepassword[0] = 0;
|
||
|
if ( SendMessageA(cr8_sendmsg1, 0xEu, 0, 0) )
|
||
|
SendMessageA(cr8_sendmsg1, 0xDu, 0x20u, (LPARAM)cr8_gamepassword);
|
||
|
cr8_gamedata.bDiff = cr8_dword_1002966C;
|
||
|
TitleSnd_PlaySelectSound();
|
||
|
if ( cr8game_GetSnetCreaGame(hWnd) )
|
||
|
SDlgEndDialog(hWnd, (void *)HANDLE_FLAG_INHERIT);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LoadStringA(ghUiInst, 0x3F0u, Buffer, 256);
|
||
|
OkCancel_DoOkDialog(hWnd, Buffer, 1);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if ( (unsigned short)wParam != 2 )
|
||
|
{
|
||
|
if ( (signed int)(unsigned short)wParam > 1031 && (signed int)(unsigned short)wParam <= 1034 )
|
||
|
{
|
||
|
a2 = (unsigned short)wParam - 1032;
|
||
|
if ( HIWORD(wParam) == 6 )
|
||
|
SetFocus(cr8_sendmsg2);
|
||
|
if ( cr8_dword_1002966C != (unsigned short)wParam - 1032 )
|
||
|
{
|
||
|
if ( cr8_dword_1002966C != -1 )
|
||
|
{
|
||
|
v6 = GetDlgItem(hWnd, cr8_dword_1002966C + 1032);
|
||
|
SendMessageA(v6, 0xF3u, 0, 0);
|
||
|
TitleSnd_PlayMoveSound();
|
||
|
}
|
||
|
cr8game_BlitCr8Dialog(hWnd, a2);
|
||
|
v7 = GetDlgItem(hWnd, 1040);
|
||
|
cr8game_SetWindowStr(v7, 1029, a2);
|
||
|
v4 = 273;
|
||
|
cr8_dword_1002966C = a2;
|
||
|
}
|
||
|
SendMessageA((HWND)lParam, 0xF3u, 1u, 0);
|
||
|
}
|
||
|
return (LRESULT)SDlgDefDialogProc(hWnd, v4, (HDC)wParam, (HWND)lParam);
|
||
|
}
|
||
|
TitleSnd_PlaySelectSound();
|
||
|
SDlgEndDialog(hWnd, 0);
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
v8 = (HWND)SDrawGetFrameWindow(NULL);
|
||
|
SendMessageA(v8, Msg, wParam, lParam);
|
||
|
}
|
||
|
return (LRESULT)SDlgDefDialogProc(hWnd, v4, (HDC)wParam, (HWND)lParam);
|
||
|
}
|
||
|
// 10010382: using guessed type _DWORD __stdcall SDrawGetFrameWindow();
|
||
|
|
||
|
// ref: 0x10004828
|
||
|
void __cdecl cr8game_FreeCreaStuff()
|
||
|
{
|
||
|
if ( cr8_creat_bg_ptr )
|
||
|
{
|
||
|
SMemFree(cr8_creat_bg_ptr, "C:\\Src\\Diablo\\DiabloUI\\cr8game.cpp", 55, 0);
|
||
|
cr8_creat_bg_ptr = 0;
|
||
|
}
|
||
|
if ( cr8_but_xsm_ptr )
|
||
|
{
|
||
|
SMemFree(cr8_but_xsm_ptr, "C:\\Src\\Diablo\\DiabloUI\\cr8game.cpp", 60, 0);
|
||
|
cr8_but_xsm_ptr = 0;
|
||
|
}
|
||
|
if ( cr8_diffbtns_ptr )
|
||
|
{
|
||
|
SMemFree(cr8_diffbtns_ptr, "C:\\Src\\Diablo\\DiabloUI\\cr8game.cpp", 65, 0);
|
||
|
cr8_diffbtns_ptr = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// ref: 0x1000487F
|
||
|
BOOL __fastcall cr8game_LoadCreaGFX(HWND hWnd)
|
||
|
{
|
||
|
int id[3]; // [esp+8h] [ebp-1Ch]
|
||
|
DWORD a8[2]; // [esp+14h] [ebp-10h]
|
||
|
DWORD a3[2]; // [esp+1Ch] [ebp-8h]
|
||
|
|
||
|
id[0] = 0;
|
||
|
id[0] = 1;
|
||
|
id[1] = 2;
|
||
|
local_LoadArtWithPal(hWnd, 0, "Dialog", -1, 1, "ui_art\\creat_bg.pcx", &cr8_creat_bg_ptr, a8, 1);
|
||
|
local_LoadArtImage("ui_art\\but_xsm.pcx", &cr8_but_xsm_ptr, a3);
|
||
|
SDlgSetControlBitmaps(hWnd, id, 0, (char *)cr8_but_xsm_ptr, (char *)a3, 1, -1);
|
||
|
local_LoadArtImage("ui_art\\diffbtns.pcx", &cr8_diffbtns_ptr, cr8diffbtns_size);
|
||
|
local_SetStaticBmp(hWnd, 1040, cr8_creat_bg_ptr, a8);
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
// ref: 0x10004914
|
||
|
void __fastcall cr8game_FreeMainMem(HWND hWnd)
|
||
|
{
|
||
|
signed int v2; // edi
|
||
|
HWND v3; // esi
|
||
|
void **v4; // eax MAPDST
|
||
|
void *v6; // eax
|
||
|
struct tagRECT Rect; // [esp+10h] [ebp-10h]
|
||
|
|
||
|
v2 = 0;
|
||
|
do
|
||
|
{
|
||
|
v3 = GetDlgItem(hWnd, v2 + 1032);
|
||
|
GetClientRect(v3, &Rect);
|
||
|
v4 = (void **)GetWindowLongA(v3, -21);
|
||
|
if ( v4 )
|
||
|
{
|
||
|
v6 = *v4;
|
||
|
if ( *v4 )
|
||
|
SMemFree(v6, "C:\\Src\\Diablo\\DiabloUI\\cr8game.cpp", 160, 0);
|
||
|
SMemFree(v4, "C:\\Src\\Diablo\\DiabloUI\\cr8game.cpp", 162, 0);
|
||
|
}
|
||
|
++v2;
|
||
|
}
|
||
|
while ( v2 < 3 );
|
||
|
}
|
||
|
|
||
|
// ref: 0x1000497F
|
||
|
void __fastcall cr8game_AllocMainMem(HWND hWnd)
|
||
|
{
|
||
|
int v1; // ebx
|
||
|
void **v2; // esi
|
||
|
HWND v3; // ST1C_4
|
||
|
LONG v4; // eax
|
||
|
struct tagRECT Rect; // [esp+Ch] [ebp-18h]
|
||
|
HWND hWnda; // [esp+20h] [ebp-4h]
|
||
|
|
||
|
v1 = 0;
|
||
|
do
|
||
|
{
|
||
|
hWnda = GetDlgItem(hWnd, v1 + 1032);
|
||
|
GetClientRect(hWnda, &Rect);
|
||
|
v2 = (void **)SMemAlloc(0x110u, "C:\\Src\\Diablo\\DiabloUI\\cr8game.cpp", 177, 0);
|
||
|
*v2 = SMemAlloc(Rect.right * Rect.bottom, "C:\\Src\\Diablo\\DiabloUI\\cr8game.cpp", 178, 0);
|
||
|
v3 = hWnda;
|
||
|
v2[1] = (void *)Rect.right;
|
||
|
v4 = Rect.bottom;
|
||
|
v2[3] = 0;
|
||
|
v2[2] = (void *)v4;
|
||
|
SetWindowLongA(v3, -21, (LONG)v2);
|
||
|
SDlgSetBitmapI(hWnda, 0, &nullcharacter, -1, 241, *v2, 0, (int)v2[1], (int)v2[2], -1);
|
||
|
cr8game_DoAROP3Blit(hWnda, v1++, 0);
|
||
|
}
|
||
|
while ( v1 < 3 );
|
||
|
}
|
||
|
|
||
|
// ref: 0x10004A34
|
||
|
void __fastcall cr8game_DoAROP3Blit(HWND hWnd, int frame, int size)
|
||
|
{
|
||
|
DWORD *v5; // eax
|
||
|
|
||
|
v5 = (DWORD *)GetWindowLongA(hWnd, -21);
|
||
|
if ( v5 )
|
||
|
{
|
||
|
if ( cr8_diffbtns_ptr )
|
||
|
{
|
||
|
SBltROP3(
|
||
|
(void *)*v5,
|
||
|
&cr8_diffbtns_ptr[cr8diffbtns_size[0] * v5[2] * (size + 2 * frame)],
|
||
|
v5[1],
|
||
|
v5[2],
|
||
|
v5[1],
|
||
|
cr8diffbtns_size[0],
|
||
|
0,
|
||
|
0xCC0020u);
|
||
|
InvalidateRect(hWnd, 0, 0);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// ref: 0x10004A93
|
||
|
void __fastcall cr8game_SendMessageF5(HWND hWnd)
|
||
|
{
|
||
|
cr8_dword_1002966C = -1;
|
||
|
cr8_dword_10029658 = 0;
|
||
|
cr8_dword_10029668 = 0;
|
||
|
SendDlgItemMessageA(hWnd, 1032, 0xF5u, 0, 0);
|
||
|
}
|
||
|
// 10029658: using guessed type int cr8_dword_10029658;
|
||
|
// 10029668: using guessed type int cr8_dword_10029668;
|
||
|
|
||
|
// ref: 0x10004ABA
|
||
|
void __fastcall cr8game_BlitCr8Dialog(HWND hWnd, int a2)
|
||
|
{
|
||
|
HWND v4; // eax
|
||
|
HWND v5; // eax
|
||
|
|
||
|
if ( cr8_dword_1002966C != -1 )
|
||
|
{
|
||
|
v4 = GetDlgItem(hWnd, cr8_dword_1002966C + 1032);
|
||
|
cr8game_DoAROP3Blit(v4, cr8_dword_1002966C, 0);
|
||
|
}
|
||
|
v5 = GetDlgItem(hWnd, a2 + 1032);
|
||
|
cr8game_DoAROP3Blit(v5, a2, 1);
|
||
|
}
|
||
|
|
||
|
// ref: 0x10004B02
|
||
|
void __fastcall cr8game_SetWindowStr(HWND hWnd, int dlgitem, int a3)
|
||
|
{
|
||
|
char Buffer[256]; // [esp+4h] [ebp-100h]
|
||
|
|
||
|
LoadStringA(ghUiInst, a3 + dlgitem, Buffer, 256);
|
||
|
SetWindowTextA(hWnd, Buffer);
|
||
|
}
|
||
|
|
||
|
// ref: 0x10004B3F
|
||
|
int __fastcall cr8game_CheckValidGameName(char *name)
|
||
|
{
|
||
|
signed int v1; // edi
|
||
|
char v2; // al
|
||
|
signed int v3; // esi
|
||
|
int result; // eax
|
||
|
char v5[32]; // [esp+8h] [ebp-24h]
|
||
|
|
||
|
strcpy(v5, name);
|
||
|
v1 = 0;
|
||
|
if ( v5[0] == 32 )
|
||
|
{
|
||
|
v2 = 32;
|
||
|
while ( v2 )
|
||
|
{
|
||
|
v2 = v5[v1++ + 1];
|
||
|
if ( v2 != 32 )
|
||
|
goto LABEL_5;
|
||
|
}
|
||
|
LABEL_9:
|
||
|
result = 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LABEL_5:
|
||
|
v3 = strlen(v5);
|
||
|
while ( v5[--v3] == 32 )
|
||
|
{
|
||
|
if ( v3 <= v1 )
|
||
|
goto LABEL_9;
|
||
|
}
|
||
|
v5[v3 + 1] = 0;
|
||
|
strcpy(name, &v5[v1]);
|
||
|
result = v3 + 1 - v1;
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
// ref: 0x10004BA8
|
||
|
HFONT __fastcall cr8game_GetCr8Object(HWND hWnd)
|
||
|
{
|
||
|
HFONT v2; // eax MAPDST
|
||
|
int pv[15]; // [esp+8h] [ebp-40h]
|
||
|
|
||
|
v2 = (HFONT)SendMessageA(hWnd, 0x31u, 0, 0);
|
||
|
if ( v2 )
|
||
|
{
|
||
|
if ( GetObjectA(v2, 60, pv) )
|
||
|
{
|
||
|
pv[0] = -MulDiv(12, 96, 72);
|
||
|
pv[1] = 0;
|
||
|
v2 = CreateFontIndirectA((const LOGFONTA *)pv);
|
||
|
if ( v2 )
|
||
|
{
|
||
|
SendDlgItemMessageA(hWnd, 1032, 0x30u, (WPARAM)v2, 0);
|
||
|
SendDlgItemMessageA(hWnd, 1033, 0x30u, (WPARAM)v2, 0);
|
||
|
SendDlgItemMessageA(hWnd, 1034, 0x30u, (WPARAM)v2, 0);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return v2;
|
||
|
}
|