// ref: 0x10002E2B void __cdecl Connect_FreeConnectData() { HANDLE *v0; // edi if ( connect_data1 ) { SMemFree(connect_data1, "C:\\Src\\Diablo\\DiabloUI\\Connect.cpp", 124, 0); connect_data1 = 0; } if ( connect_data2 ) { SMemFree(connect_data2, "C:\\Src\\Diablo\\DiabloUI\\Connect.cpp", 129, 0); connect_data2 = 0; } v0 = connect_trans; do { if ( *v0 ) { STransDelete(*v0); *v0 = 0; } ++v0; } while ( (signed int)v0 < (signed int)&connect_trans[10] ); if ( connect_data3 ) { SMemFree(connect_data3, "C:\\Src\\Diablo\\DiabloUI\\Connect.cpp", 141, 0); connect_data3 = 0; } if ( connect_data4 ) { SMemFree(connect_data4, "C:\\Src\\Diablo\\DiabloUI\\Connect.cpp", 146, 0); connect_data4 = 0; } } // ref: 0x10002EC4 BOOL __cdecl Connect_LoadGFXAndStuff() { HANDLE *v0; // esi int v1; // ebx int a5[4]; // [esp+4h] [ebp-14h] BYTE *a2; // [esp+14h] [ebp-4h] a2 = 0; if ( !connect_data1 && !connect_trans[0] ) { local_LoadArtImage("ui_art\\heroport.pcx", &connect_data1, heroport_data); local_LoadArtImage("ui_art\\spwnport.pcx", &connect_data2, 0); local_LoadArtImage("ui_art\\heronum.pcx", &a2, heronum_data); local_LoadArtImage("ui_art\\special.pcx", &connect_data3, special_data); connect_draw_height = 14; heronum_frames = (signed int)heronum_data[1] / 10; special_frames = (signed int)special_data[1] / 8; heronum_frames2 = (signed int)heronum_data[1] / 10 * heronum_data[0]; heroport_frames = 14 * heroport_data[0]; v0 = connect_trans; connect_data4 = SMemAlloc(14 * heroport_data[0], "C:\\Src\\Diablo\\DiabloUI\\Connect.cpp", 194, 0); memset(connect_trans, 0, 0x28u); if ( a2 ) { v1 = 0; do { a5[0] = 0; a5[2] = heronum_data[0] - 1; a5[1] = v1 * heronum_frames; a5[3] = heronum_frames + v1 * heronum_frames - 1; STransCreateI(a2, heronum_data[0], heronum_frames, 8, (int)a5, 16777455, v0); ++v0; ++v1; } while ( (signed int)v0 < (signed int)&connect_trans[10] ); SMemFree(a2, "C:\\Src\\Diablo\\DiabloUI\\Connect.cpp", 218, 0); } } return 1; } // 100294A4: using guessed type int special_frames; // 100295B0: using guessed type int heronum_frames2; // 100295C0: using guessed type int heroport_frames; // ref: 0x10003009 BOOL __stdcall UiArtCallback(int game_type, unsigned int art_code, PALETTEENTRY *pPalette, void *pBuffer, DWORD dwBuffersize, DWORD *pdwWidth, DWORD *pdwHeight, DWORD *pdwBpp) { BOOL result; // eax char pszFileName[260]; // [esp+8h] [ebp-104h] pszFileName[0] = nullcharacter; memset(&pszFileName[1], 0, 0x100u); *(_WORD *)&pszFileName[257] = 0; pszFileName[259] = 0; SStrCopy(pszFileName, "ui_art\\", 260); if ( game_type == 'BNET' ) { if ( art_code > 0x80000004 ) { switch ( art_code ) { case 0x80000005: SStrPack(pszFileName, "bnconnbg.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x80000006: SStrPack(pszFileName, "bnselchn.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x80000007: SStrPack(pszFileName, "bnlogin.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x80000008: SStrPack(pszFileName, "newaccount.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x80000009: SStrPack(pszFileName, "changepassword.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x8000000A: SStrPack(pszFileName, "bnladder.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x8000000B: SStrPack(pszFileName, "badconn.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x8000000C: SStrPack(pszFileName, "welcome.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x8000000D: SStrPack(pszFileName, "lepopup.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x8000000E: SStrPack(pszFileName, "tos.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); default: break; } } else { if ( art_code == 0x80000004 ) { SStrPack(pszFileName, "redlag.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); } if ( art_code > 7 ) { switch ( art_code ) { case 8u: LABEL_48: SStrPack(pszFileName, "but_lrg.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x80000000: SStrPack(pszFileName, "bnbuttns.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x80000001: SStrPack(pszFileName, "chat_bkg.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x80000002: SStrPack(pszFileName, "greenlag.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x80000003: SStrPack(pszFileName, "yellolag.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); } } else { switch ( art_code ) { case 7u: LABEL_47: SStrPack(pszFileName, "but_med.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0u: SStrPack(pszFileName, "bn_bkg.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 2u: SStrPack(pszFileName, "bnjoinbg.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 3u: SStrPack(pszFileName, "hpopup.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 5u: LABEL_46: SStrPack(pszFileName, "but_xsm.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 6u: LABEL_11: SStrPack(pszFileName, "but_sml.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); } } } } else if ( game_type == 'IPXN' ) { if ( !art_code ) { SStrPack(pszFileName, "ipx_bkg.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); } } else if ( !game_type && !art_code ) { SStrPack(pszFileName, "connect.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); } switch ( art_code ) { case 0u: case 2u: SStrPack(pszFileName, "menu.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 1u: case 8u: goto LABEL_48; case 3u: case 4u: SStrPack(pszFileName, "lpopup.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 5u: goto LABEL_46; case 6u: goto LABEL_11; case 7u: goto LABEL_47; case 9u: SStrPack(pszFileName, "xsmlogo.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0xAu: SStrPack(pszFileName, "prog_bg.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0xBu: SStrPack(pszFileName, "prog_fil.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0xCu: SStrPack(pszFileName, "spopup.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0xDu: SStrPack(pszFileName, "scrlarrw.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0xEu: SStrPack(pszFileName, "scrlthmb.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0xFu: SStrPack(pszFileName, "scrlbar.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x10u: SStrPack(pszFileName, "cmel.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x11u: SStrPack(pszFileName, "cmml.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x12u: SStrPack(pszFileName, "cmbl.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x13u: SStrPack(pszFileName, "cmec.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x14u: SStrPack(pszFileName, "cmmc.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x15u: SStrPack(pszFileName, "cmbc.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x16u: SStrPack(pszFileName, "cmer.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x17u: SStrPack(pszFileName, "cmmr.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x18u: SStrPack(pszFileName, "cmbr.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x19u: SStrPack(pszFileName, "slgray.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x1Au: SStrPack(pszFileName, "slthumb.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x1Bu: SStrPack(pszFileName, "slfocus.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x1Cu: SStrPack(pszFileName, "slleft.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x1Du: SStrPack(pszFileName, "slmiddle.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x1Eu: SStrPack(pszFileName, "slright.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x20u: SStrPack(pszFileName, "but_checkoff.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); case 0x21u: SStrPack(pszFileName, "but_checkon.pcx", 0x104u); return SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp); default: result = 0; break; } return result; } // 100103E2: using guessed type unsigned int __stdcall SStrPack(char *, const char *, unsigned int); // ref: 0x100033D1 void __cdecl Connect_cpp_init() { Connect_cpp_float = Connect_cpp_float_value; } // 1001F3F4: using guessed type int Connect_cpp_float_value; // 100294A0: using guessed type int Connect_cpp_float; // ref: 0x100033DC BOOL __stdcall UiGetDataCallback(int game_type, int data_code, void *a3, int a4, int a5) { signed int v5; // edi _DWORD *v6; // esi HCURSOR v7; // eax v5 = 0; if ( game_type != 'BNET' || data_code != 0x80000000 ) { switch ( data_code ) { case 1: v5 = 16; if ( !a3 ) goto LABEL_24; if ( (unsigned int)a4 >= 0x10 ) { memcpy(a3, connect_subnet_ip, 0x10u); goto LABEL_24; } return 0; case 2: v6 = (unsigned int *)a3; v5 = 4; if ( !a3 ) goto LABEL_24; if ( (unsigned int)a4 < 4 ) return 0; v7 = LoadCursorA(ghUiInst, "DIABLO_LINKCURSOR"); break; case 3: v6 = (unsigned int *)a3; v5 = 4; if ( !a3 ) goto LABEL_24; if ( (unsigned int)a4 < 4 ) return 0; v7 = LoadCursorA(ghUiInst, "DIABLO_ARROWCURSOR"); break; case 4: v6 = (unsigned int *)a3; v5 = 4; if ( !a3 ) goto LABEL_24; if ( (unsigned int)a4 < 4 ) return 0; v7 = LoadCursorA(ghUiInst, "DIABLOIBEAM"); break; default: goto LABEL_24; } *v6 = (unsigned int)v7; if ( v7 ) goto LABEL_24; return 0; } v5 = 4; if ( a3 ) { if ( (unsigned int)a4 >= 4 ) { *(_DWORD *)a3 = 54; goto LABEL_24; } return 0; } LABEL_24: if ( a5 ) *(_DWORD *)a5 = v5; return v5 != 0; } // ref: 0x100034AB BOOL __stdcall UiSoundCallback(int a1, int type, int a3) { if ( type ) { if ( type == 1 ) TitleSnd_PlaySelectSound(); } else { TitleSnd_PlayMoveSound(); } return 0; } // ref: 0x100034C8 BOOL __stdcall UiAuthCallback(int a1, char *a2, char *a3, char a4, char *a5, LPSTR lpBuffer, int cchBufferMax) { size_t v7; // edi size_t v8; // ebx int v9; // ebx char *v10; // ebx size_t v11; // eax int v12; // eax int v14; // eax char v15[256]; // [esp+0h] [ebp-434h] char a1a[256]; // [esp+100h] [ebp-334h] char v17[256]; // [esp+200h] [ebp-234h] char Buffer[256]; // [esp+300h] [ebp-134h] _uiheroinfo heroinfo; // [esp+400h] [ebp-34h] _gamedata GameData; // [esp+42Ch] [ebp-8h] *(_DWORD *)&GameData.bDiff = 0; if ( cchBufferMax ) *lpBuffer = 0; v7 = strlen(a3) + 1; v8 = strlen(a5) + 1; if ( v7 > 0x100 || v8 > 0x100 ) { if ( lpBuffer ) LoadStringA(ghUiInst, 0x413u, lpBuffer, cchBufferMax); return 0; } memcpy(a1a, a3, v7); memcpy(v17, a5, v8); if ( Connect_GetHeroInfoConc(a1a, &heroinfo) ) { if ( a1 == 1 ) { if ( !(a4 & 9) ) { v9 = 0; while ( 1 ) { LoadStringA(ghUiInst, v9 + 4, Buffer, 256); if ( strstr(v17, Buffer) ) break; if ( ++v9 >= 3 ) goto LABEL_16; } if ( heroinfo.heroclass != v9 ) goto LABEL_20; *(_DWORD *)&GameData.bDiff = 1; LABEL_16: LoadStringA(ghUiInst, 0x408u, Buffer, 256); v10 = strstr(v17, Buffer); if ( v10 ) { v11 = strlen(Buffer); v12 = atoi(&v10[v11]); if ( heroinfo.level >= v12 ) return 1; } if ( *(_DWORD *)&GameData.bDiff ) return 1; LABEL_20: if ( lpBuffer ) { LoadStringA(ghUiInst, 0x415u, v15, 256); v14 = sprintf(Buffer, v15, v17) + 1; if ( cchBufferMax >= v14 ) { memcpy(lpBuffer, Buffer, v14); } else { memcpy(lpBuffer, Buffer, cchBufferMax); lpBuffer[cchBufferMax - 1] = 0; } } return 0; } } else if ( !(a4 & 8) ) { Connect_DiffFromString(v17, &GameData, 0, 0); if ( GameData.bDiff == 1 ) { if ( heroinfo.level < 20u ) { if ( lpBuffer ) LoadStringA(ghUiInst, 0x411u, lpBuffer, cchBufferMax); return 0; } } else if ( GameData.bDiff == 2 && heroinfo.level < 30u ) { if ( lpBuffer ) LoadStringA(ghUiInst, 0x412u, lpBuffer, cchBufferMax); return 0; } } return 1; } if ( lpBuffer ) LoadStringA(ghUiInst, 0x414u, lpBuffer, cchBufferMax); return 0; } // ref: 0x10003710 BOOL __stdcall UiDrawDescCallback(int arg0, COLORREF color, LPCSTR lpString, char *a4, int a5, UINT align, time_t a7, HDC *a8) { HDC *v8; // ebx HDC v9; // esi int v10; // esi size_t v11; // eax UINT v13; // eax BOOL v14; // esi int v15; // eax int v16; // eax HDC v17; // ST20_4 struct tm *v18; // eax struct tm *v19; // edi signed int v20; // eax int v21; // eax int v22; // eax UINT v23; // eax int v24; // esi int v25; // eax int v26; // eax signed int v27; // [esp-4h] [ebp-2E8h] char a1[256]; // [esp+Ch] [ebp-2D8h] char String[128]; // [esp+10Ch] [ebp-1D8h] char Buffer[128]; // [esp+18Ch] [ebp-158h] CHAR v31[32]; // [esp+20Ch] [ebp-D8h] HDC a8a[12]; // [esp+22Ch] [ebp-B8h] struct tagTEXTMETRICA tm; // [esp+25Ch] [ebp-88h] _uiheroinfo heroinfo; // [esp+294h] [ebp-50h] struct tagPOINT pt; // [esp+2C0h] [ebp-24h] _gamedata gamedata; // [esp+2C8h] [ebp-1Ch] struct tagRECT rc; // [esp+2D0h] [ebp-14h] COLORREF v38; // [esp+2E0h] [ebp-4h] LPCSTR lpStringa; // [esp+2F4h] [ebp+10h] Buffer[0] = nullcharacter; v8 = a8; memset(&Buffer[1], 0, 0x7Cu); v9 = a8[4]; *(_WORD *)&Buffer[125] = 0; Buffer[127] = 0; v10 = (unsigned char)v9 & 1; v11 = strlen(a4) + 1; if ( v11 > 0x100 ) return 0; memcpy(a1, a4, v11); if ( color == 1 ) { a8 = 0; a4 = 0; if ( !Connect_DiffFromString(a1, &gamedata, (int)&a8, (int)&a4) ) return 0; color = SetTextColor(v8[6], 0xFFFFFFu); v38 = SetBkColor(v8[6], v10 != 0 ? 0x808080 : 0); if ( align & 1 ) { v13 = strlen(lpString); ExtTextOutA(v8[6], (int)v8[7], (int)v8[8], 6u, (const RECT *)(v8 + 7), lpString, v13, 0); } else { v14 = a8 && a4; if ( gamedata.bDiff < 3u ) LoadStringA(ghUiInst, gamedata.bDiff + 1003, Buffer, 128); if ( align & 2 && v14 ) { GetTextMetricsA(v8[6], &tm); lpStringa = (LPCSTR)(tm.tmHeight + tm.tmExternalLeading); MoveToEx(v8[6], (int)v8[7], (int)v8[8], &pt); align = SetTextAlign(v8[6], 1u); v15 = strlen(Buffer); TextOutA(v8[6], 0, 0, Buffer, v15); LoadStringA(ghUiInst, 0x409u, String, 128); MoveToEx(v8[6], (int)v8[7], (int)v8[8] + (_DWORD)lpStringa, 0); v16 = strlen(String); TextOutA(v8[6], 0, 0, String, v16); v17 = v8[6]; qmemcpy(a8a, v8, sizeof(a8a)); GetCurrentPositionEx(v17, (LPPOINT)&a8a[7]); SetTextAlign(v8[6], 0); connect_color_text = 1; UiDrawDescCallback(arg0, 2u, (LPCSTR)a8, a4, 0, 1u, 0, a8a); connect_color_text = 0; if ( a7 ) { SetTextAlign(v8[6], 1u); LoadStringA(ghUiInst, 0x40Cu, &heroinfo.name[8], 32); LoadStringA(ghUiInst, 0x40Du, v31, 32); v18 = localtime(&a7); v19 = v18; if ( v18 ) { LoadStringA(ghUiInst, (v18->tm_hour > 12) + 1034, (LPSTR)&rc.top, 10); v20 = v19->tm_hour; if ( v20 > 12 ) v19->tm_hour = v20 - 12; if ( !v19->tm_hour ) v19->tm_hour = 12; sprintf(String, &heroinfo.name[8], v31, v19->tm_hour, v19->tm_min, &rc.top); MoveToEx(v8[6], (int)v8[7], (int)v8[8] + 2 * (_DWORD)lpStringa, 0); v21 = strlen(String); TextOutA(v8[6], 0, 0, String, v21); } } MoveToEx(v8[6], pt.x, pt.y, 0); SetTextAlign(v8[6], align); } else { v22 = strlen(Buffer); TextOutA(v8[6], (int)v8[7], (int)v8[8], Buffer, v22); } } goto LABEL_56; } GetTextMetricsA(v8[6], &tm); a4 = (char *)((tm.tmHeight - connect_draw_height) / 2 + 1); if ( !connect_color_text ) { color = SetTextColor(v8[6], 0xFFFFu); v38 = SetBkColor(v8[6], v10 != 0 ? 0x808080 : 0); } if ( align & 1 ) { v23 = strlen(lpString); ExtTextOutA(v8[6], (int)v8[7] + heroport_data[0] + 2, (int)v8[8], 6u, (const RECT *)(v8 + 7), lpString, v23, 0); } if ( a5 ) { if ( a5 & 0x20 ) { v27 = 5; LABEL_45: v24 = v27; goto LABEL_46; } if ( a5 & 1 ) { v24 = 0; LABEL_46: SetRect(&rc, 0, 0, special_data[0] - 1, special_frames - 1); OffsetRect(&rc, 0, special_frames * v24); SDlgBltToWindowI( (HWND)v8[5], 0, (char *)v8[7], (int)v8[8] + (_DWORD)a4, connect_data3, &rc, (SIZE *)special_data, -1, 0, 0xCC0020u); goto LABEL_55; } if ( a5 & 2 ) { v27 = 2; goto LABEL_45; } if ( a5 & 4 ) { v27 = 3; goto LABEL_45; } if ( a5 & 8 ) { v25 = (arg0 != 'BNET') - 1; _LOBYTE(v25) = v25 & 0xFD; v24 = v25 + 4; goto LABEL_46; } } if ( *(_DWORD *)a1 == 'CHAT' ) { v27 = 6; goto LABEL_45; } if ( *(_DWORD *)a1 == 'SEXP' || *(_DWORD *)a1 == 'SSHR' || *(_DWORD *)a1 == 'STAR' ) { v27 = 7; goto LABEL_45; } if ( Connect_GetHeroInfoConc(a1, &heroinfo) ) { if ( heroinfo.spawned ) { if ( connect_data2 ) SBltROP3( connect_data4, connect_data2, heroport_data[0], connect_draw_height, heroport_data[0], heroport_data[0], 0, 0xCC0020u); } else { SBltROP3( connect_data4, &connect_data1[heroport_frames * (heroinfo.heroclass + 3 * heroinfo.herorank)], heroport_data[0], connect_draw_height, heroport_data[0], heroport_data[0], 0, 0xCC0020u); } v26 = heroinfo.level / 10; if ( v26 ) STransBlt( (char *)connect_data4 + 4 * heroport_data[0] + heroport_data[0] + 14, 0, 0, heroport_data[0], connect_trans[v26]); STransBlt( (char *)connect_data4 + 4 * (heroport_data[0] + 4) + heroport_data[0] + 4, 0, 0, heroport_data[0], connect_trans[heroinfo.level % 10]); SetRect(&rc, 0, 0, heroport_data[0] - 1, connect_draw_height - 1); SDlgBltToWindowI( (HWND)v8[5], 0, (char *)v8[7], (int)v8[8] + (_DWORD)a4, connect_data4, &rc, (SIZE *)heroport_data, -1, 0, 0xCC0020u); } LABEL_55: if ( !connect_color_text ) { LABEL_56: SetTextColor(v8[6], color); SetBkColor(v8[6], v38); } return 1; } // 100294A4: using guessed type int special_frames; // 100295C0: using guessed type int heroport_frames; // 10029614: using guessed type int connect_color_text; // ref: 0x10003CE4 BOOL __stdcall UiCategoryCallback(int a1, int a2, int a3, int a4, int a5, _DWORD *a6, _DWORD *a7) { *a7 = 0xFFFF; *a6 = Connect_GetRankFromLevel(connect_categorystr); return 1; } // ref: 0x10003D04 int __fastcall Connect_GetRankFromLevel(char *str) { char a1[512]; // [esp+0h] [ebp-22Ch] _uiheroinfo a2; // [esp+200h] [ebp-2Ch] strcpy(a1, str); if ( !Connect_GetHeroInfoConc(a1, &a2) || a2.level == 1 ) return 0; if ( (signed int)a2.level < 4 ) return 1; if ( (signed int)a2.level < 6 ) return 2; if ( (signed int)a2.level < 8 ) return 3; if ( (signed int)a2.level < 10 ) return 4; if ( (signed int)a2.level < 13 ) return 5; if ( (signed int)a2.level < 17 ) return 6; if ( (signed int)a2.level < 20 ) return 7; if ( (signed int)a2.level < 25 ) return 8; if ( (signed int)a2.level < 30 ) return 9; if ( (signed int)a2.level < 35 ) return 10; if ( (signed int)a2.level < 40 ) return 11; return ((signed int)a2.level >= 48) + 12; } // ref: 0x10003DAF BOOL __fastcall Connect_DiffFromString(char *str, _gamedata *gamedata, int a3, int a4) { unsigned char v6; // al char *v8; // eax const char *v9; // eax char *v10; // eax if ( !*str ) return 0; v6 = atoi(str); gamedata->bDiff = v6; if ( v6 >= 3u ) return 0; v8 = strchr(str, 13); if ( v8 ) { *v8 = 0; v9 = v8 + 1; if ( a3 ) *(_DWORD *)a3 = (unsigned int)v9; v10 = (char *)strchr(v9, 13); if ( v10 ) { *v10 = 0; if ( a4 ) *(_DWORD *)a4 = (unsigned int)v10 + 1; } } return 1; } // ref: 0x10003E0C void __fastcall Connect_SetDiffString(_gamedata *gamedata, const char *str1, char *str2, char *str3, int size) { size_t v7; // ebx size_t v8; // eax unsigned char v9; // zf unsigned char v10; // sf unsigned char v11; // of int v12; // eax v7 = strlen(str1); v8 = v7 + strlen(str2) + 5; v11 = __OFSUB__(size, v8); v9 = size == v8; v10 = (signed int)(size - v8) < 0; v12 = gamedata->bDiff; if ( (unsigned char)(v10 ^ v11) | v9 ) _itoa(v12, str3, 10); else sprintf(str3, "%d\r%s\r%s", v12, str1, str2); } // ref: 0x10003E61 BOOL __fastcall Connect_GetHeroInfoConc(const char *a1, _uiheroinfo *pInfo) { int v4; // eax int v5; // edi int v6; // edx unsigned short v7; // di unsigned char v8; // cl int v10; // [esp+Ch] [ebp-24h] unsigned int v11; // [esp+10h] [ebp-20h] unsigned int v12; // [esp+14h] [ebp-1Ch] unsigned int v13; // [esp+18h] [ebp-18h] int v14; // [esp+1Ch] [ebp-14h] int v15; // [esp+20h] [ebp-10h] int v16; // [esp+24h] [ebp-Ch] int v17; // [esp+28h] [ebp-8h] int v18; // [esp+2Ch] [ebp-4h] memset(pInfo, 0, 0x2Cu); if ( !*a1 ) return 0; v4 = *(_DWORD *)a1; if ( *(_DWORD *)a1 != 'DRTL' && v4 != 'DSHR' && v4 != 'DTST' ) return 0; if ( sscanf(a1 + 4, "%d %d %d %d %d %d %d %d %d", &v13, &v12, &v11, &v18, &v17, &v16, &v15, &v10, &v14) != 9 ) return 0; v5 = *(_DWORD *)a1; v6 = v14; if ( v5 == 'DRTL' ) { if ( v14 ) return 0; } if ( v5 == 'DSHR' && !v14 ) return 0; v7 = v13; if ( !v13 ) return 0; if ( v13 > 0x63 ) return 0; v8 = v12; if ( v12 >= 3 || v11 > 3 || v18 < 0 || v17 < 0 || v16 < 0 || v15 < 0 ) return 0; pInfo->herorank = v11; pInfo->level = v7; pInfo->strength = (unsigned char)v18; pInfo->heroclass = v8; pInfo->magic = (unsigned char)v17; pInfo->spawned = v6; pInfo->dexterity = (unsigned char)v16; pInfo->vitality = (unsigned char)v15; pInfo->gold = v10; return 1; } // ref: 0x10003F6F void __fastcall Connect_MakeDescString(_uiheroinfo *a1, char *name, size_t size) { *(_DWORD *)name = (unsigned int)connect_charname; _snprintf( name + 4, size, " %d %d %d %d %d %d %d %d %d", a1->level, a1->heroclass, a1->herorank, a1->strength, a1->magic, a1->dexterity, a1->vitality, a1->gold, a1->spawned); } // ref: 0x10003FB7 void __stdcall UiCreateGameCriteria(_uiheroinfo *pInfo, char *str) { sprintf(str, "#%d?%d", 3, pInfo->level); } // ref: 0x10003FD6 BOOL __stdcall UiCreatePlayerDescription(_uiheroinfo *info, int mode, char *desc) { connect_charname = (char *)mode; Connect_MakeDescString(info, desc, 0x80u); return 1; } // ref: 0x10003FF7 void __stdcall UiSetupPlayerInfo(char *infostr, _uiheroinfo *pInfo, int type) { connect_charname = (char *)type; SStrCopy(connect_plrinfostr, infostr, 128); Connect_MakeDescString(pInfo, connect_categorystr, 0x80u); } // ref: 0x10004028 void __fastcall Connect_CopyPlrDescStrings(char *str1, int size1, char *str2, int size2) { if ( str1 ) SStrCopy(str1, connect_plrinfostr, size1); if ( str2 ) SStrCopy(str2, connect_categorystr, size2); }