// 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; }