Skip to content

Instantly share code, notes, and snippets.

@ezdiy
Last active October 21, 2017 02:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ezdiy/07d45b8a0682a4128a74c9c2047a3a22 to your computer and use it in GitHub Desktop.
Save ezdiy/07d45b8a0682a4128a74c9c2047a3a22 to your computer and use it in GitHub Desktop.
void hairloader() {
// ....
xx1 = (XXFile *)openxx((int)&a1a, *(_DWORD *)(a1 + 12) + 28, (int)&a3, v35);
if ( haircase )
*(_DWORD *)(v39 + 4 * v34 + 0x50) = xx1;
else
*(_DWORD *)(v39 + 4 * v34 + 0xEB8) = xx1;
if ( xx1 )
{
v136 = 1634426704;
*(_DWORD *)a4a = 1314869324;
v137 = 26989;
v138 = 0;
memset(&v139, 0, 0xF9u);
v140 = 808473409;
v141 = 1801408095;
v142 = (char *)&loc_696D5E + 3;
memset(&v143, 0, 0xF8u);
strcpy(fname1, "LPS_N_kao");
memset(&v145, 0, 0xFAu);
v146 = *(_DWORD *)"LPA_N_kao";
v147 = *(_DWORD *)"N_kao";
v148 = *(_WORD *)"o";
memset(&v149, 0, 0xFAu);
v150 = *(_DWORD *)"a01_J_Neck_03";
v151 = *(_DWORD *)"J_Neck_03";
v152 = *(_DWORD *)"ck_03";
v153 = *(_WORD *)"3";
memset(&v154, 0, 0xF6u);
v155 = *(_DWORD *)"a01_J_Neck_03";
v156 = *(_DWORD *)"J_Neck_03";
v157 = *(_DWORD *)"ck_03";
v158 = *(_WORD *)"3";
memset(&v159, 0, 0xF6u);
xx3 = xx2;
connect_frames(&fname1[260 * (BYTE3(v79) + 2 * v88)], (XXFile *)attachto, xx2, &a4a[260 * v88]);
if ( haircase == 1 )
{
v41 = v80;
v42 = *(_BYTE *)(v80 + 3);
BYTE1(v79) = *(_BYTE *)(v80 + 4);
BYTE2(v79) = v42;
*(_BYTE *)(v80 + 3) = 50;
*(_BYTE *)(v41 + 4) = 50;
neck_stuff(a1, 0);
v43 = v87;
v44 = BYTE1(v79);
*(_BYTE *)(v41 + 3) = BYTE2(v79);
lpWideCharStr = (LPCWSTR)16;
v91 = (void *)64;
v92 = (const WCHAR *)32;
v93 = (const WCHAR *)128;
v45 = (unsigned int)(&lpWideCharStr)[2 * v43] | 3;
*(_BYTE *)(v41 + 4) = v44;
do_attach(*(_DWORD *)(a1 + 36), v45);
}
else
{
attach(unused, xx3, xx3->m_attachmentFramePrev, &xx3->m_attachmentFrame->m_matrix2);
}
v88 = (*(int (__thiscall **)(int *))(dword_76F638 + 12))(&dword_76F638) + 16;
LOBYTE(v162) = 7;
v127 = 0;
v128 = 0;
v125 = 7929963;
v126 = 115;
v129 = 7340130;
v130 = 115;
v131 = 0;
v132 = 0;
v46 = (wchar_t **)sub_414BE0(&v104, (int)&attachto);
LOBYTE(v162) = 8;
v47 = *(_BYTE *)(v87 + v80 + 604);
sub_4026B0(*v46, v86[0]);
LOBYTE(v162) = 7;
v48 = attachto - 16;
if ( _InterlockedDecrement((volatile signed __int32 *)(attachto - 16 + 12)) <= 0 )
(*(void (__stdcall **)(int))(**(_DWORD **)v48 + 4))(v48);
sub_57E960(260, (const char *)&off_6FD674, v83, v88);
if ( haircase )
{
v91 = 0;
v92 = 0;
v93 = 0;
LOBYTE(v162) = 14;
LOBYTE(v49) = 5;
BYTE1(v79) = 5 * (*(_DWORD *)(*(_DWORD *)(a1 + 36) + 56) == 0);
sub_42A0C0(v49, (int)&lpWideCharStr, (char *)&v79 + 1);
LOBYTE(v51) = 5;
BYTE1(v79) = 5 * (*(_DWORD *)(*(_DWORD *)(a1 + 36) + 56) == 0) + 1;
sub_42A0C0(v51, (int)&lpWideCharStr, (char *)&v79 + 1);
LOBYTE(v52) = 5;
BYTE1(v79) = 5 * (*(_DWORD *)(*(_DWORD *)(a1 + 36) + 56) == 0) + 2;
sub_42A0C0(v52, (int)&lpWideCharStr, (char *)&v79 + 1);
LOBYTE(v53) = 5;
BYTE1(v79) = 5 * (*(_DWORD *)(*(_DWORD *)(a1 + 36) + 56) == 0) + 3;
sub_42A0C0(v53, (int)&lpWideCharStr, (char *)&v79 + 1);
if ( !BYTE3(v79) )
{
BYTE1(v79) = 14;
sub_42A0C0(v54, (int)&lpWideCharStr, (char *)&v79 + 1);
}
sub_402580(&Src, (int)&unused);
LOBYTE(v162) = 15;
sub_402580(&FileName, (int)&attachto);
v55 = xx2;
LOBYTE(v162) = 16;
v56 = *(_DWORD *)(a1 + 12);
v57 = *(_DWORD *)(v56 + 64);
sub_60AF70(
&attachto,
v56 + 28,
&unused,
xx2,
(unsigned __int8)(5 * *(_DWORD *)(*(_DWORD *)(a1 + 36) + 56)),
&lpWideCharStr);
sub_403610(&attachto);
LOBYTE(v162) = 14;
sub_403610(&unused);
v58 = v87;
v59 = *(_DWORD *)(*(_DWORD *)(a1 + 36) + 4 * v87 + 116);
if ( (unsigned __int8)sub_41B650(&v106) )
{
sub_57E960(260, v106, v83, *(_BYTE *)(v58 + v80 + 604));
sub_4DE180(v59, (int)v55, &FileName, *(_DWORD *)(a1 + 12) + 28, &Src);
}
else
{
sub_4DE800();
}
if ( BYTE3(v79) == 1 )
{
v60 = *(_DWORD *)&v55[1].m_name[16];
if ( v60 )
{
v61 = 0;
v83 = (*(_DWORD *)(v60 + 40) - *(_DWORD *)(v60 + 36)) >> 2;
if ( v83 > 0 )
{
do
{
v62 = sub_46F5B0(v60, v61);
v63 = v62;
v64 = *(_DWORD *)(v62 + 216) | 8;
*(_DWORD *)v86 = v63;
*(_DWORD *)(v63 + 216) = v64;
if ( operator new(0x28u) )
v65 = sub_46F240();
else
v65 = 0;
*(_DWORD *)(v65 + 4) = 0;
v66 = (*(_DWORD *)(v60 + 40) - *(_DWORD *)(v60 + 36)) >> 2;
if ( v66 )
{
if ( v61 >= 0 && v66 - 1 >= v61 )
v66 = *(_DWORD *)(*(_DWORD *)(v60 + 36) + 4 * v61);
else
v66 = 0;
}
*(_DWORD *)(v65 + 32) = *(_DWORD *)(v66 + 40);
v67 = sub_505CB0(v60, v61);
v68 = *(_DWORD *)v86;
v70 = __OFSUB__(++v61, v83);
v69 = v61 - v83 < 0;
*(_DWORD *)(v65 + 28) = v67;
*(_DWORD *)(v68 + 248) = v65;
}
while ( v69 ^ v70 );
}
}
}
if ( v91 )
operator delete(v91);
}
else
{
sub_402580(&Src, (int)v86);
LOBYTE(v162) = 9;
sub_40E400((LPCWSTR)&Src, (int)&v80);
LOBYTE(v162) = 10;
sub_431DF0(&v82);
LOBYTE(v162) = 11;
sub_51D2C0();
if ( (unsigned __int8)sub_5F8A90(&FileName, v82) )
{
v50 = operator new(0x34u) ? sub_59AD80(unused) : 0;
v89 = (void (__thiscall ***)(_DWORD, _DWORD))v50;
if ( v50 )
{
sub_402580(&Src, (int)&unused);
LOBYTE(v162) = 12;
sub_402580(&FileName, (int)&attachto);
LOBYTE(v162) = 13;
sub_59C280(v50, &attachto, *(_DWORD *)(a1 + 12) + 28, xx2);
sub_403610(&attachto);
sub_403610(&unused);
}
}
sub_51A910();
sub_403610(&v80);
sub_403610(v86);
}
LOBYTE(v162) = 3;
v71 = v88 - 16;
if ( _InterlockedDecrement((volatile signed __int32 *)(v88 - 16 + 12)) <= 0 )
(*(void (__stdcall **)(int))(**(_DWORD **)v71 + 4))(v71);
}
if ( haircase )
{
lpWideCharStr = 0;
v91 = (void *)1;
v92 = (const WCHAR *)2;
v93 = (const WCHAR *)3;
v72 = sub_5F0C30("A00_M_kami");
v73 = sub_414BE0(&v105, (int)v86);
LOBYTE(v162) = 17;
sub_535BC0(*(void **)(a1 + 320), (&lpWideCharStr)[2 * v87], v72, v73, *(_DWORD *)(*(_DWORD *)(a1 + 36) + 60));
LOBYTE(v162) = 3;
v74 = *(_DWORD *)v86 - 16;
if ( _InterlockedDecrement((volatile signed __int32 *)(*(_DWORD *)v86 - 16 + 12)) <= 0 )
(*(void (__stdcall **)(int))(**(_DWORD **)v74 + 4))(v74);
if ( haircase == 1 && a4 )
sub_51ABF0(a1);
sub_51A930(a1);
sub_51AA00();
}
else
{
*(_DWORD *)(*(_DWORD *)(a1 + 36) + 4 * v87 + 3788) = v89;
sub_51A970(a1);
}
LOBYTE(v162) = 1;
v75 = v98 - 16;
if ( _InterlockedDecrement((volatile signed __int32 *)(v98 - 16 + 12)) <= 0 )
(*(void (__stdcall **)(int))(**(_DWORD **)v75 + 4))(v75);
LOBYTE(v162) = 0;
v76 = *(_DWORD *)v99 - 16;
if ( _InterlockedDecrement((volatile signed __int32 *)(*(_DWORD *)v99 - 16 + 12)) <= 0 )
(*(void (__stdcall **)(int))(**(_DWORD **)v76 + 4))(v76);
v162 = -1;
v77 = (int)(v106 - 16);
if ( _InterlockedDecrement((volatile signed __int32 *)v106 - 1) <= 0 )
(*(void (__stdcall **)(int))(**(_DWORD **)v77 + 4))(v77);
goto LABEL_110;
}
goto LABEL_39;
}
LABEL_110:
sub_66BC69(v78);
}
char __stdcall neck_stuff(int a1, char a2)
{
XXFile *v2; // ebp@1
char result; // al@2
int v4; // ecx@3
Frame *v5; // esi@3
int v6; // edi@5
float v7; // ST20_4@5
int v8; // ecx@5
float v9; // ST24_4@5
int v10; // ecx@5
double v11; // st7@5
float v12; // [sp+40h] [bp-44h]@5
float v13; // [sp+44h] [bp-40h]@5
float v14; // [sp+48h] [bp-3Ch]@5
float v15; // [sp+4Ch] [bp-38h]@5
float v16; // [sp+50h] [bp-34h]@5
float v17; // [sp+54h] [bp-30h]@5
float v18; // [sp+58h] [bp-2Ch]@5
float v19; // [sp+5Ch] [bp-28h]@5
float v20; // [sp+60h] [bp-24h]@5
float v21; // [sp+64h] [bp-20h]@5
float v22; // [sp+68h] [bp-1Ch]@5
float v23; // [sp+6Ch] [bp-18h]@5
float v24; // [sp+70h] [bp-14h]@5
float v25; // [sp+74h] [bp-10h]@5
float v26; // [sp+78h] [bp-Ch]@5
float v27; // [sp+7Ch] [bp-8h]@5
v2 = *(XXFile **)(*(_DWORD *)(a1 + 36) + 100);
if ( v2
&& ((v5 = (Frame *)sub_41B6D0(*(_DWORD *)(a1 + 36), 17)) != 0 || (v5 = find_by_name((int)v2, "a01_J_Neck_03")) != 0) )
{
v6 = *(_DWORD *)(a1 + 40);
v7 = *(float *)sub_5281A0(v4, *(_DWORD *)(a1 + 40));
v9 = *(float *)(sub_5281A0(v8, v6) + 4);
v11 = *(float *)(sub_5281A0(v10, v6) + 8);
v12 = v7;
v13 = 0.0;
v14 = 0.0;
v15 = 0.0;
v16 = 0.0;
v17 = v9;
v18 = 0.0;
v19 = 0.0;
v20 = 0.0;
v21 = 0.0;
v23 = 0.0;
v24 = 0.0;
v25 = 0.0;
v26 = 0.0;
v22 = v11;
v27 = 1.0;
v5->m_matrix1._11 = v5->m_matrix5._11;
v5->m_matrix1._12 = v5->m_matrix5._12;
v5->m_matrix1._13 = v5->m_matrix5._13;
v5->m_matrix1._14 = v5->m_matrix5._14;
v5->m_matrix1._21 = v5->m_matrix5._21;
v5->m_matrix1._22 = v5->m_matrix5._22;
v5->m_matrix1._23 = v5->m_matrix5._23;
v5->m_matrix1._24 = v5->m_matrix5._24;
v5->m_matrix1._31 = v5->m_matrix5._31;
v5->m_matrix1._32 = v5->m_matrix5._32;
v5->m_matrix1._33 = v5->m_matrix5._33;
v5->m_matrix1._34 = v5->m_matrix5._34;
v5->m_matrix1._41 = v5->m_matrix5._41;
v5->m_matrix1._42 = v5->m_matrix5._42;
v5->m_matrix1._43 = v5->m_matrix5._43;
v5->m_matrix1._44 = v5->m_matrix5._44;
D3DXMatrixMultiply(&v5->m_matrix1, &v12, &v5->m_matrix1);
attach(*(_DWORD *)(a1 + 16), v2, v5, &v5->m_parent->m_matrix2);
if ( a2 )
do_attach(*(_DWORD *)(a1 + 36), -2);
result = 1;
}
else
{
result = 0;
}
return result;
}
char __userpurge do_attach@<al>(int a1@<esi>, char a2)
{
XXFile *v2; // eax@5
int v3; // eax@10
XXFile *v4; // eax@15
int v5; // eax@20
XXFile *v6; // eax@25
int v7; // eax@30
XXFile *v8; // eax@35
if ( a2 & 1 && *(_DWORD *)(a1 + 100) )
attach(
*(_DWORD *)(a1 + 20),
*(XXFile **)(a1 + 100),
*(Frame **)(*(_DWORD *)(a1 + 100) + 536),
(D3DMATRIX *)(*(_DWORD *)(a1 + 100) + 115640));
if ( a2 & 2 )
{
v2 = *(XXFile **)(a1 + 72);
if ( v2 )
{
if ( v2->m_attachmentFramePrev && v2->m_attachmentFrame != (Frame *)-84 )
attach(*(_DWORD *)(a1 + 20), v2, v2->m_attachmentFramePrev, &v2->m_attachmentFrame->m_matrix2);
}
}
if ( a2 & 0x10 )
{
v3 = *(_DWORD *)(a1 + 80);
if ( v3 )
{
if ( *(_DWORD *)(v3 + 520) && *(_DWORD *)(v3 + 524) != -84 )
attach(
*(_DWORD *)(a1 + 20),
*(XXFile **)(a1 + 80),
*(Frame **)(*(_DWORD *)(a1 + 80) + 520),
(D3DMATRIX *)(*(_DWORD *)(*(_DWORD *)(a1 + 80) + 524) + 84));
}
}
if ( a2 & 0x20 )
{
v4 = *(XXFile **)(a1 + 88);
if ( v4 )
{
if ( v4->m_attachmentFramePrev && v4->m_attachmentFrame != (Frame *)-84 )
attach(*(_DWORD *)(a1 + 20), v4, v4->m_attachmentFramePrev, &v4->m_attachmentFrame->m_matrix2);
}
}
if ( a2 & 0x40 )
{
v5 = *(_DWORD *)(a1 + 84);
if ( v5 )
{
if ( *(_DWORD *)(v5 + 520) && *(_DWORD *)(v5 + 524) != -84 )
attach(
*(_DWORD *)(a1 + 20),
*(XXFile **)(a1 + 84),
*(Frame **)(*(_DWORD *)(a1 + 84) + 520),
(D3DMATRIX *)(*(_DWORD *)(*(_DWORD *)(a1 + 84) + 524) + 84));
}
}
if ( a2 < 0 )
{
v6 = *(XXFile **)(a1 + 92);
if ( v6 )
{
if ( v6->m_attachmentFramePrev && v6->m_attachmentFrame != (Frame *)-84 )
attach(*(_DWORD *)(a1 + 20), v6, v6->m_attachmentFramePrev, &v6->m_attachmentFrame->m_matrix2);
}
}
if ( a2 & 4 )
{
v7 = *(_DWORD *)(a1 + 96);
if ( v7 )
{
if ( *(_DWORD *)(v7 + 520) && *(_DWORD *)(v7 + 524) != -84 )
attach(
*(_DWORD *)(a1 + 20),
*(XXFile **)(a1 + 96),
*(Frame **)(*(_DWORD *)(a1 + 96) + 520),
(D3DMATRIX *)(*(_DWORD *)(*(_DWORD *)(a1 + 96) + 524) + 84));
}
}
if ( a2 & 8 )
{
v8 = *(XXFile **)(a1 + 76);
if ( v8 )
{
if ( v8->m_attachmentFramePrev && v8->m_attachmentFrame != (Frame *)-84 )
attach(*(_DWORD *)(a1 + 20), v8, v8->m_attachmentFramePrev, &v8->m_attachmentFrame->m_matrix2);
}
}
return 1;
}
void __cdecl attach(int unused, XXFile *xxfile, Frame *frame, D3DMATRIX *matrix)
{
DWORD v4; // eax@2
D3DMATRIX *v5; // esi@2
double v6; // ST20_8@3
float v7; // ST1C_4@3
Frame *v8; // edi@14
signed __int32 v9; // ebx@14
D3DMATRIX mat; // [sp+24h] [bp-80h]@3
char v11; // [sp+64h] [bp-40h]@7
if ( !frame->m_unknown4[8] )
{
v4 = frame->m_unknown1;
v5 = &frame->m_matrix2;
if ( v4 == 1 )
{
D3DXMatrixMultiply(&mat, &frame->m_matrix1, matrix);
*(float *)&v6 = mat._41;
*((float *)&v6 + 1) = mat._42;
v7 = mat._43;
mat._41 = 0.0;
mat._42 = 0.0;
mat._43 = 0.0;
D3DXMatrixMultiply(&frame->m_matrix2, &mat, &frame->m_matrix3);
*(double *)frame->m_matrix2.m[3] = v6;
frame->m_matrix2._43 = v7;
}
else if ( v4 == 2 )
{
D3DXMatrixMultiply(&mat, &frame->m_matrix1, matrix);
D3DXMatrixMultiply(&frame->m_matrix2, &frame->m_matrix3, &mat);
}
else
{
D3DXMatrixMultiply(&frame->m_matrix2, &frame->m_matrix1, matrix);
}
D3DXMatrixInverse(&v11, 0, &unk_7851B8);
switch ( frame->m_frameFlags[0] )
{
case 1u:
sub_5F1A20((int)v5);
break;
case 2u:
sub_5F18A0((int)v5);
break;
case 3u:
sub_5F16C0((int)v5);
break;
case 4u:
sub_5F1510((int)&v11, (int)v5);
break;
case 5u:
sub_5F1360((int)&v11, (int)v5);
break;
case 6u:
sub_5F10B0((int)&v11, (int)v5);
break;
default:
break;
}
v8 = frame->m_children;
v9 = frame->m_nChildren;
if ( v9 > 0 )
{
do
{
attach(unused, xxfile, v8, v5);
++v8;
--v9;
}
while ( v9 );
}
}
}
char __usercall connect_frames@<al>(char *fname1@<eax>, XXFile *xx1@<ecx>, XXFile *xx2, char *fname2)
{
XXFile *v4; // esi@1
Frame *v5; // edi@1
Frame *v6; // eax@1
char result; // al@3
v4 = xx1;
v5 = find_by_name((int)xx1, fname1);
v6 = find_by_name((int)xx2, fname2);
if ( v6 && v5 )
result = create_attachment(xx2, v5, v6, v4);
else
result = 0;
return result;
}
char __usercall create_attachment@<al>(XXFile *a1@<eax>, Frame *a2@<edx>, Frame *a3@<esi>, XXFile *a4)
{
char result; // al@3
if ( a2 && a3 )
{
a1->m_attachmentFrame = a2;
a1->m_attachmentFramePrev = a3;
*(_DWORD *)&a1->m_unknown3[0] = a4;
a1->m_unknown2[3] = a4->m_unknown2[3] + 1;
*(_DWORD *)&a1->m_ambientLightBlue = *(_DWORD *)&a4->m_ambientLightBlue;
inner_attach(a1, a4->m_root->m_meshFlags[1]);
result = 1;
}
else
{
result = 0;
}
return result;
}
int __usercall inner_attach@<eax>(Frame *result@<eax>, char a2@<dl>)
{
bool v2; // zf@2
bool v3; // sf@2
Frame *v4; // esi@2
int v5; // ecx@3
if ( result )
{
result = *(Frame **)&result->m_unknown5[14];// // note: Input 'result' is actually xxfile and this is ->m_root
v2 = result->m_nChildren == 0;
v3 = (result->m_nChildren & 0x80000000) != 0;
v4 = result->m_children;
result->m_meshFlags[1] = a2;
if ( !v3 && !v2 )
{
do
{
result = (Frame *)do_something_with_frame(v4, a2);
++v4;
}
while ( v5 + 1 < (signed __int32)result->m_nChildren );
}
}
return (int)result;
}
int __cdecl do_something_with_frame(Frame *a1, int a2)
{
signed __int32 v2; // esi@1
bool v3; // zf@1
bool v4; // sf@1
Frame *v5; // edi@1
int result; // eax@2
v2 = 0;
v3 = a1->m_nChildren == 0;
v4 = (a1->m_nChildren & 0x80000000) != 0;
v5 = a1->m_children;
a1->m_meshFlags[1] = a2;
if ( !v4 && !v3 )
{
do
{
result = do_something_with_frame(v5, a2);
++v2;
++v5;
}
while ( v2 < (signed __int32)a1->m_nChildren );
}
return result;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment