Skip to content

Instantly share code, notes, and snippets.

@goaaats
Last active July 10, 2019 21:57
Show Gist options
  • Save goaaats/863716ad59731b648465b40b4a3101fd to your computer and use it in GitHub Desktop.
Save goaaats/863716ad59731b648465b40b4a3101fd to your computer and use it in GitHub Desktop.
__int64 __fastcall Xiv::Gui::ChatGui::PrintMessage(__int64 handler, unsigned __int16 chatType, __int64 senderName, __int64 message, int senderActorId, __int64 parameters)
{
char v6; // r10
__int64 v7; // r11
__int64 v8; // r14
signed __int64 v9; // r9
unsigned __int16 v10; // r15
__int64 v11; // r8
_QWORD *v12; // rdi
int v13; // ecx
signed __int64 v15; // rsi
signed __int64 v16; // rcx
__int64 v17; // rbx
signed __int64 v18; // rdx
unsigned __int16 v19; // dx
signed __int64 v20; // rax
signed int v21; // ecx
signed __int64 v22; // rdi
__int64 v23; // rax
int v24; // eax
int v25; // eax
__int64 **v26; // r14
unsigned int v27; // er13
unsigned __int64 v28; // rcx
signed __int64 v29; // rbx
__int64 v30; // rcx
__int64 v31; // rax
__int64 v32; // rbx
__int64 v33; // rax
__int64 v34; // rax
int v35; // eax
bool v36; // zf
unsigned __int64 v37; // rax
signed int v38; // er8
__int64 v39; // r9
signed __int64 v40; // rdx
signed __int64 v41; // rax
unsigned __int16 v42; // r9
signed __int64 v43; // rdi
__int64 v44; // rsi
int v45; // er12
__int16 v46; // ax
unsigned int v47; // er8
int v48; // eax
int v49; // er11
__int64 v50; // rax
int v51; // er8
bool v52; // sf
int v53; // eax
int v54; // eax
__int64 *v55; // r10
__int64 *v56; // r9
__int64 ***v57; // rax
__int64 **v58; // rcx
__int64 v59; // rax
__int16 v60; // dx
int v61; // eax
__int64 ***v62; // rax
__int64 **v63; // rcx
__int64 v64; // rax
__int64 v65; // rax
int v66; // er8
int v67; // eax
int v68; // eax
__int64 *v69; // r10
__int64 *v70; // r9
__int64 ***v71; // rax
__int64 **v72; // rcx
__int64 v73; // rax
__int16 v74; // dx
int v75; // eax
__int64 ***v76; // rax
__int64 **v77; // rcx
__int64 v78; // rax
int v79; // eax
unsigned __int64 v80; // rdx
_QWORD *v81; // rcx
bool v82; // r8
_QWORD *v83; // r9
__int64 *v84; // rax
_QWORD *v85; // rax
__int64 j; // rcx
__int64 i; // rcx
__int64 v88; // rsi
int v89; // eax
int v90; // er8
int v91; // er10
__int64 *v92; // r11
__int64 *v93; // r9
__int64 ***v94; // rax
__int64 **v95; // rcx
__int64 v96; // rax
__int16 v97; // dx
int v98; // eax
__int64 ***v99; // rax
__int64 ****v100; // rcx
__int64 **v101; // rcx
__int64 v102; // rax
int v103; // eax
__int16 v104; // ax
unsigned __int16 v105; // [rsp+40h] [rbp-C0h]
int v106; // [rsp+44h] [rbp-BCh]
__int64 v107; // [rsp+48h] [rbp-B8h]
__int64 v108; // [rsp+50h] [rbp-B0h]
__int64 v109; // [rsp+58h] [rbp-A8h]
int v110; // [rsp+60h] [rbp-A0h]
unsigned __int16 v111; // [rsp+64h] [rbp-9Ch]
__int16 v112; // [rsp+66h] [rbp-9Ah]
__int64 v113; // [rsp+68h] [rbp-98h]
__int64 v114; // [rsp+78h] [rbp-88h]
int v115; // [rsp+90h] [rbp-70h]
int v116; // [rsp+94h] [rbp-6Ch]
int v117; // [rsp+98h] [rbp-68h]
int v118; // [rsp+9Ch] [rbp-64h]
int v119[16]; // [rsp+A0h] [rbp-60h]
int v120; // [rsp+E0h] [rbp-20h]
int v121; // [rsp+E4h] [rbp-1Ch]
int v122; // [rsp+100h] [rbp+0h]
int v123; // [rsp+108h] [rbp+8h]
char v124; // [rsp+110h] [rbp+10h]
char v125; // [rsp+180h] [rbp+80h]
v6 = 0;
v107 = handler;
v7 = message;
v8 = senderName;
v9 = 0i64;
v10 = chatType;
v11 = handler + 3088;
v12 = (_QWORD *)handler;
while ( 1 )
{
if ( *(_WORD *)(v11 + 12) )
{
v6 = 1;
v13 = *(_DWORD *)(*(_QWORD *)v11 + 4 * ((unsigned __int64)chatType >> 5));
if ( !_bittest(&v13, chatType & 0x1F) )
break;
}
++v9;
v11 += 1944i64;
if ( v9 >= 4 )
{
if ( v6 != 0 ? 2 : 0 )
return 0i64;
break;
}
}
v15 = (signed __int64)(v12 + 110);
sub_14005F880(v12 + 110, v7);
if ( (unsigned __int16)(v10 - 10) <= 0x14u || (unsigned __int16)(v10 - 36) <= 1u )
{
sub_1405C6070(v12[17], v12 + 110);
v17 = qword_141A8C1F8 + 16;
if ( v10 == 13 )
{
if ( !*(_DWORD *)(sub_14006E100(qword_141A8C1F8 + 16, 553i64) + 32) )
goto LABEL_35;
v18 = 537i64;
}
else
{
v19 = v10 - 14;
if ( (unsigned __int16)(v10 - 14) <= 0xAu )
{
if ( !parameters )
{
v115 = 554;
v20 = 0i64;
v116 = 555;
v117 = 556;
v21 = 562;
v118 = 557;
do
v119[v20++] = v21++;
while ( v20 < 16 );
v120 = 558;
v121 = 559;
v22 = 8i64 * v19;
if ( *(_DWORD *)(sub_14006E100(v17, (unsigned int)*(&v115 + 2 * v19)) + 32) )
{
v23 = sub_14006E100(v17, *(unsigned int *)((char *)&v116 + v22));
sub_1400AD590((unsigned int)(*(_DWORD *)(v23 + 32) + 37), 0i64, 0i64, 0i64);
}
v12 = (_QWORD *)v107;
}
goto LABEL_35;
}
if ( v10 == 27 )
{
if ( parameters || !*(_DWORD *)(sub_14006E100(qword_141A8C1F8 + 16, 578i64) + 32) )
goto LABEL_35;
v18 = 579i64;
}
else if ( v10 == 36 )
{
if ( parameters || !*(_DWORD *)(sub_14006E100(qword_141A8C1F8 + 16, 560i64) + 32) )
goto LABEL_35;
v18 = 561i64;
}
else
{
if ( v10 != 37 || parameters || !*(_DWORD *)(sub_14006E100(qword_141A8C1F8 + 16, 580i64) + 32) )
goto LABEL_35;
v18 = 581i64;
}
}
v16 = (unsigned int)(*(_DWORD *)(sub_14006E100(v17, v18) + 32) + 37);
}
else
{
if ( v10 != 80 )
goto LABEL_35;
v16 = 36i64;
}
sub_1400AD590(v16, 0i64, 0i64, 0i64);
LABEL_35:
sub_14005F200(&v125, v8);
if ( v10 != 61 && v10 != 68 )
{
v24 = sub_140060520(v8);
sub_1405D0150((_DWORD)v12, v24, (unsigned __int64)&v125, 0, 0, 0, 0);
}
v25 = senderActorId;
if ( !senderActorId )
{
if ( sub_1400960D0(qword_141A8C1F8) )
v25 = sub_1400AD460();
else
v25 = time64_0(0i64);
}
v112 = 0;
v110 = v25;
v111 = v10;
sub_140062380(v12 + 19);
sub_1400611C0(v12 + 19, &v110, 8i64);
sub_14005FA40(v12 + 19, &unk_141AC2090);
sub_14005FA40(v12 + 19, &v125);
sub_14005FA40(v12 + 19, &unk_141AC2090);
sub_14005FA40(v12 + 19, v15);
v26 = (__int64 **)(v12 + 1367);
v106 = -1;
v27 = sub_140F9E530(v12, v12 + 19);
v28 = v12[1371] + 1i64;
LOWORD(v114) = v10;
HIDWORD(v114) = v27;
v105 = -1;
if ( v12[1369] <= v28 )
sub_14061C310(v12 + 1367, 1i64);
v12[1370] &= v12[1369] - 1i64;
v29 = 8 * ((v12[1369] - 1i64) & (v12[1371] + v12[1370]));
if ( !*(_QWORD *)(v29 + v12[1368]) )
*(_QWORD *)(v29 + v12[1368]) = sub_14006AA60(12i64, 0i64, 402i64);
v30 = *(_QWORD *)(v29 + v12[1368]);
if ( v30 )
{
*(_QWORD *)v30 = v114;
*(_DWORD *)(v30 + 8) = 0;
}
++v12[1371];
while ( 1 )
{
v31 = *v26 ? **v26 : 0i64;
v32 = *(_QWORD *)(*(_QWORD *)(v31 + 8) + 8 * (v12[1370] & (*(_QWORD *)(v31 + 16) - 1i64)));
if ( *(_DWORD *)(v32 + 4) >= (signed int)sub_140F9E320(v12) )
break;
if ( *v26 )
v33 = **v26;
else
v33 = 0i64;
v105 = **(_WORD **)(*(_QWORD *)(v33 + 8) + 8 * (v12[1370] & (*(_QWORD *)(v33 + 16) - 1i64)));
if ( *v26 )
v34 = **v26;
else
v34 = 0i64;
v35 = *(_DWORD *)(*(_QWORD *)(*(_QWORD *)(v34 + 8) + 8 * (v12[1370] & (*(_QWORD *)(v34 + 16) - 1i64))) + 4i64);
v36 = v12[1371]-- == 1i64;
v106 = v35;
if ( v36 )
v12[1370] = 0i64;
else
++v12[1370];
}
v113 = 0i64;
v37 = (unsigned __int64)v10 >> 5;
v38 = 1 << (v10 & 0x1F);
v39 = 0i64;
v109 = (unsigned int)(1 << (v10 & 0x1F));
v40 = 4 * v37;
v108 = 4 * v37;
do
{
v41 = 243 * v39;
v42 = v105;
v43 = (signed __int64)&v12[v41 + 152];
v44 = *(_QWORD *)(v43 + 1872);
v45 = v38 & *(_DWORD *)(v44 + v40);
if ( !(v38 & *(_DWORD *)(v44 + v40)) || v105 != -1 )
{
v46 = *(_WORD *)(v43 + 1940);
if ( !v46 || !*(_BYTE *)(v43 + 1942) )
goto LABEL_161;
if ( *(_DWORD *)(v43 + 1928) < 0 )
{
*(_DWORD *)(v43 + 1928) = v27;
*(_DWORD *)(v43 + 1920) = v27;
}
v47 = *(unsigned __int16 *)(v43 + 1832);
if ( v47 >= v46 )
{
if ( v45 )
{
if ( v105 == -1 || (v79 = *(_DWORD *)(v44 + 4 * ((unsigned __int64)v105 >> 5)), _bittest(&v79, v105 & 0x1F)) )
{
LABEL_139:
if ( !v45 )
{
LABEL_140:
*(_DWORD *)(v43 + 1932) = v27;
*(_DWORD *)(v43 + 1924) = v27;
v115 = 0;
SomethingStringHandling((__int64)&v117, &unk_14146894F, 0xFFFFFFFFui64);
v123 = v115;
v122 = v27;
sub_14005F200(&v124, &v117);
v81 = *(_QWORD **)(v43 + 1904);
v82 = 1;
v83 = v81;
v84 = (__int64 *)v81[1];
while ( !*((_BYTE *)v84 + 25) )
{
v83 = v84;
v82 = v122 < *((_DWORD *)v84 + 8);
if ( v122 >= *((_DWORD *)v84 + 8) )
v84 = (__int64 *)v84[2];
else
v84 = (__int64 *)*v84;
}
v85 = v83;
if ( v82 )
{
if ( v83 == (_QWORD *)*v81 )
goto LABEL_159;
if ( *((_BYTE *)v83 + 25) )
{
v85 = (_QWORD *)v83[2];
}
else if ( *(_BYTE *)(*v83 + 25i64) )
{
for ( i = v83[1]; !*(_BYTE *)(i + 25); i = *(_QWORD *)(i + 8) )
{
if ( v85 != *(_QWORD **)i )
break;
v85 = (_QWORD *)i;
}
if ( !*((_BYTE *)v85 + 25) )
v85 = (_QWORD *)i;
}
else
{
v85 = (_QWORD *)*v83;
for ( j = *(_QWORD *)(*v83 + 16i64); !*(_BYTE *)(j + 25); j = *(_QWORD *)(j + 16) )
v85 = (_QWORD *)j;
}
}
if ( *((_DWORD *)v85 + 8) >= v122 )
{
LABEL_160:
SomethingStrings((__int64)&v124);
SomethingStrings((__int64)&v117);
sub_140062380(v43 + 104);
*(_WORD *)(v43 + 1838) |= 1u;
v42 = v105;
goto LABEL_161;
}
LABEL_159:
sub_140615AE0(v43 + 1904);
goto LABEL_160;
}
LABEL_161:
if ( v42 == -1
|| (v88 = *(_QWORD *)(v43 + 1872),
v89 = *(_DWORD *)(v88 + 4 * ((unsigned __int64)v42 >> 5)),
_bittest(&v89, v42 & 0x1F)) )
{
if ( v45 )
{
LABEL_203:
v38 = v109;
v40 = v108;
goto LABEL_204;
}
++*(_WORD *)(v43 + 1820);
}
else if ( *(_WORD *)(v43 + 1832) )
{
v90 = 0;
v91 = *(_DWORD *)(v107 + 10968);
if ( v91 > 0 )
{
v92 = v26[3];
v93 = *v26;
while ( 1 )
{
v94 = 0i64;
if ( v93 && *v93 )
v94 = *(__int64 ****)*v93;
if ( v94 && (v95 = *v94) != 0i64 && *v95 )
v96 = **v95;
else
v96 = 0i64;
v97 = **(_WORD **)(*(_QWORD *)(v96 + 8)
+ 8 * (((unsigned __int64)v92 + v90) & (*(_QWORD *)(v96 + 16) - 1i64)));
v98 = *(_DWORD *)(v88
+ 4
* ((unsigned __int64)**(unsigned __int16 **)(*(_QWORD *)(v96 + 8)
+ 8
* (((unsigned __int64)v92 + v90) & (*(_QWORD *)(v96 + 16) - 1i64))) >> 5));
if ( !_bittest(&v98, v97 & 0x1F) )
break;
if ( ++v90 >= v91 )
goto LABEL_190;
}
v99 = 0i64;
if ( *v26 )
{
v100 = (__int64 ****)**v26;
if ( v100 )
v99 = *v100;
}
if ( v99 && (v101 = *v99) != 0i64 && *v101 )
v102 = **v101;
else
v102 = 0i64;
v103 = *(_DWORD *)(*(_QWORD *)(*(_QWORD *)(v102 + 8)
+ 8 * (((unsigned __int64)v92 + v90) & (*(_QWORD *)(v102 + 16) - 1i64)))
+ 4i64);
*(_DWORD *)(v43 + 1808) = v103;
if ( *(_DWORD *)(v43 + 1920) < v103 )
*(_DWORD *)(v43 + 1920) = v103;
if ( *(_DWORD *)(v43 + 1928) < v103 )
*(_DWORD *)(v43 + 1928) = v103;
}
LABEL_190:
v104 = *(_WORD *)(v43 + 1822);
if ( v104 )
*(_WORD *)(v43 + 1822) = v104 - 1;
}
else
{
*(_DWORD *)(v43 + 1928) = v27;
*(_DWORD *)(v43 + 1920) = v27;
*(_DWORD *)(v43 + 1808) = v27;
}
if ( !v45 )
{
*(_DWORD *)(v43 + 1812) = v27;
if ( !parameters
&& ((unsigned __int16)(v10 - 10) <= 0xEu && v10 != 12
|| v10 == 30
|| v10 == 27
|| (unsigned __int16)(v10 - 80) <= 0xEu
|| (unsigned __int16)(v10 - 36) <= 1u) )
{
*(_BYTE *)(v43 + 1943) |= 0x80u;
}
}
goto LABEL_203;
}
sub_14061ED80(v43 + 1904, &v106);
v80 = *(unsigned __int16 *)(v43 + 1912);
if ( v80 < *(signed __int16 *)(v43 + 1940) )
*(_WORD *)(v43 + 1832) = v80;
}
else
{
v49 = *(_DWORD *)(v107 + 10968);
if ( *v26 )
v50 = **v26;
else
v50 = 0i64;
v51 = 0;
v53 = *(_DWORD *)(v43 + 1920)
- *(_DWORD *)(*(_QWORD *)(*(_QWORD *)(v50 + 8)
+ 8 * ((unsigned __int64)v26[3] & (*(_QWORD *)(v50 + 16) - 1i64)))
+ 4i64);
v52 = v53 < 0;
v54 = v53 + 1;
if ( !v52 )
v51 = v54;
if ( v51 < v49 )
{
v55 = v26[3];
v56 = *v26;
while ( 1 )
{
v57 = 0i64;
if ( v56 && *v56 )
v57 = *(__int64 ****)*v56;
if ( v57 && (v58 = *v57) != 0i64 && *v58 )
v59 = **v58;
else
v59 = 0i64;
v60 = **(_WORD **)(*(_QWORD *)(v59 + 8)
+ 8 * (((unsigned __int64)v55 + v51) & (*(_QWORD *)(v59 + 16) - 1i64)));
v61 = *(_DWORD *)(v44
+ 4
* ((unsigned __int64)**(unsigned __int16 **)(*(_QWORD *)(v59 + 8)
+ 8
* (((unsigned __int64)v55 + v51) & (*(_QWORD *)(v59 + 16) - 1i64))) >> 5));
if ( !_bittest(&v61, v60 & 0x1F) )
break;
if ( ++v51 >= v49 )
goto LABEL_106;
}
v62 = 0i64;
if ( v56 && *v56 )
v62 = *(__int64 ****)*v56;
if ( v62 && (v63 = *v62) != 0i64 && *v63 )
v64 = **v63;
else
v64 = 0i64;
*(_DWORD *)(v43 + 1920) = *(_DWORD *)(*(_QWORD *)(*(_QWORD *)(v64 + 8)
+ 8
* (((unsigned __int64)v26[3] + v51) & (*(_QWORD *)(v64 + 16)
- 1i64)))
+ 4i64);
}
LABEL_106:
if ( *v26 )
v65 = **v26;
else
v65 = 0i64;
v66 = 0;
v67 = *(_DWORD *)(v43 + 1928)
- *(_DWORD *)(*(_QWORD *)(*(_QWORD *)(v65 + 8)
+ 8 * ((unsigned __int64)v26[3] & (*(_QWORD *)(v65 + 16) - 1i64)))
+ 4i64);
v52 = v67 < 0;
v68 = v67 + 1;
if ( !v52 )
v66 = v68;
if ( v66 < v49 )
{
v69 = v26[3];
v70 = *v26;
while ( 1 )
{
v71 = 0i64;
if ( v70 && *v70 )
v71 = *(__int64 ****)*v70;
if ( v71 && (v72 = *v71) != 0i64 && *v72 )
v73 = **v72;
else
v73 = 0i64;
v74 = **(_WORD **)(*(_QWORD *)(v73 + 8)
+ 8 * (((unsigned __int64)v69 + v66) & (*(_QWORD *)(v73 + 16) - 1i64)));
v75 = *(_DWORD *)(v44
+ 4
* ((unsigned __int64)**(unsigned __int16 **)(*(_QWORD *)(v73 + 8)
+ 8
* (((unsigned __int64)v69 + v66) & (*(_QWORD *)(v73 + 16) - 1i64))) >> 5));
if ( !_bittest(&v75, v74 & 0x1F) )
break;
if ( ++v66 >= v49 )
{
++*(_WORD *)(v43 + 1822);
goto LABEL_138;
}
}
v76 = 0i64;
if ( v70 && *v70 )
v76 = *(__int64 ****)*v70;
if ( v76 && (v77 = *v76) != 0i64 && *v77 )
v78 = **v77;
else
v78 = 0i64;
*(_DWORD *)(v43 + 1928) = *(_DWORD *)(*(_QWORD *)(*(_QWORD *)(v78 + 8)
+ 8
* (((unsigned __int64)v26[3] + v66) & (*(_QWORD *)(v78 + 16)
- 1i64)))
+ 4i64);
}
++*(_WORD *)(v43 + 1822);
}
}
else
{
if ( v105 == -1 || (v48 = *(_DWORD *)(v44 + 4 * ((unsigned __int64)v105 >> 5)), _bittest(&v48, v105 & 0x1F)) )
{
if ( v45 )
goto LABEL_161;
if ( !(_WORD)v47 )
{
*(_DWORD *)(v43 + 1928) = v27;
*(_DWORD *)(v43 + 1920) = v27;
}
*(_WORD *)(v43 + 1832) = v47 + 1;
goto LABEL_139;
}
if ( !v45 )
goto LABEL_140;
*(_WORD *)(v43 + 1832) = v47 - 1;
sub_140062380(v43 + 104);
}
LABEL_138:
v42 = v105;
goto LABEL_139;
}
LABEL_204:
v12 = (_QWORD *)v107;
v39 = v113 + 1;
v113 = v39;
}
while ( v39 < 4 );
SomethingStrings((__int64)&v125);
return v27;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment