__int16 __userpurge CharacterData::Decode@<ax>(int a1@<ebp>, int a2, int a3)
{
int v3; // esi
int v4; // ecx
int v5; // edi
int v6; // eax
bool v7; // zf
int v8; // ebx
int *v9; // esi
int v10; // eax
unsigned __int32 *v11; // ecx
int v12; // eax
unsigned __int32 *v13; // ecx
int v14; // eax
int v15; // eax
int *v16; // esi
int v17; // eax
int v18; // edi
int i; // ebx
int v20; // eax
int v21; // eax
unsigned __int32 *v22; // ecx
int v23; // eax
int v24; // esi
const void **v25; // edi
_DWORD *v26; // eax
char *v27; // ecx
_DWORD *v28; // eax
int v29; // eax
int j; // ebx
_DWORD *v31; // esi
_DWORD *v32; // esi
int v33; // edi
int v34; // esi
unsigned __int32 *v35; // ecx
_DWORD *v36; // esi
int v37; // edi
unsigned __int8 v38; // al
int v39; // esi
unsigned __int32 *v40; // ecx
int v41; // eax
int v42; // eax
int v43; // edi
unsigned __int8 v44; // al
int v45; // esi
unsigned __int32 *v46; // ecx
int v47; // edi
int v48; // eax
int *v49; // ebx
int v50; // eax
unsigned __int8 v51; // al
int v52; // esi
unsigned __int32 *v53; // ecx
unsigned __int16 v54; // ax
_DWORD *v55; // esi
int v56; // ebx
unsigned __int16 v57; // ax
int v58; // ebx
int v59; // eax
int v60; // esi
int v61; // ebx
int v62; // eax
int v63; // esi
int v64; // eax
unsigned __int16 v65; // ax
int *v66; // esi
int v67; // esi
int v68; // esi
int v69; // esi
int v70; // esi
unsigned __int16 v71; // ax
int v72; // esi
int v73; // ebx
void *v74; // eax
int v75; // ebx
int *v76; // esi
int *v77; // esi
int v78; // ebx
int v79; // ebx
int v80; // edx
int v81; // eax
int v82; // ecx
int k; // esi
int v84; // ecx
int v85; // ecx
int v86; // edi
int v87; // ecx
int v88; // ecx
int v89; // edi
int v90; // ecx
int v91; // ecx
int v92; // esi
int v93; // ecx
int v94; // ecx
int v95; // esi
int v96; // ecx
int v97; // esi
int v98; // eax
_DWORD *v99; // edi
int v100; // eax
int v101; // edi
int v102; // esi
int v103; // eax
int v104; // esi
_DWORD *v105; // ebx
int v106; // eax
int v107; // ebx
int v108; // eax
int *v109; // edi
int v110; // eax
int v111; // ecx
_DWORD *v112; // esi
int v113; // eax
int v114; // ecx
int v115; // eax
_DWORD *v116; // ecx
int v117; // eax
int v118; // eax
int v119; // ebx
unsigned __int32 *v121; // [esp-6Ch] [ebp-6Ch] BYREF
unsigned __int32 *v122; // [esp-68h] [ebp-68h]
int v123; // [esp-64h] [ebp-64h]
SEHSetup();
v3 = *(a1 + 8);
v5 = v4;
*(a1 - 24) = v4;
LOWORD(v6) = CInPacket::Decode2(v3);
*(a1 - 28) = v6;
if ( (v6 & 1) != 0 )
{
sub_480364(v5, v3, *(a1 + 12));
*(v5 + 643) = CInPacket::Decode1(v3);
}
if ( (*(a1 - 28) & 2) != 0 )
sub_480550(v5, v3);
`eh vector constructor iterator'(a1 - 96, 4, 6, sub_482C80, sub_482C86);
*(a1 - 4) = 0;
`eh vector constructor iterator'(a1 - 72, 4, 6, sub_482C80, sub_482C86);
v7 = *(a1 + 12) == 0;
*(a1 - 4) = 1;
if ( !v7 )
{
if ( (*(a1 - 28) & 4) != 0 )
{
v8 = -1;
v9 = (v5 + 191);
do
{
v10 = *v9;
if ( *v9 )
{
v11 = (*(v10 + 28) | *(v10 + 24));
if ( *(v10 + 24) )
{
v123 = v8;
v122 = v11;
v121 = v11;
*(a1 - 44) = &v121;
sub_482C49(v9 - 1);
*(a1 - 4) = 1;
sub_48370B(-1);
sub_4828BE(v121, v122, v123);
}
}
v12 = v9[40];
if ( v12 )
{
v13 = (*(v12 + 28) | *(v12 + 24));
if ( *(v12 + 24) )
{
v123 = v8 - 100;
v122 = v13;
v121 = v13;
*(a1 - 44) = &v121;
sub_482C49(v9 + 39);
*(a1 - 4) = 1;
sub_48370B(-1);
sub_4828BE(v121, v122, v123);
}
}
--v8;
v9 += 2;
}
while ( v8 >= -19 );
}
v14 = *(a1 - 28);
*(a1 - 20) = 1;
*(a1 - 40) = v14;
while ( 1 )
{
switch ( *(a1 - 20) )
{
case 1:
v123 = 4;
goto LABEL_27;
case 2:
v123 = 8;
goto LABEL_27;
case 3:
v123 = 16;
goto LABEL_27;
}
if ( *(a1 - 20) == 4 )
break;
if ( *(a1 - 20) == 5 )
{
v123 = 64;
LABEL_27:
v15 = v123;
goto LABEL_28;
}
v15 = 0;
LABEL_28:
if ( (v15 & *(a1 - 40)) != 0 )
{
v16 = (*(a1 - 24) + 4 * *(a1 - 20) + 499);
v17 = *v16;
if ( *v16 )
v17 = *(v17 - 4);
v18 = v17 - 1;
for ( i = 1; i <= v18; ++i )
{
v20 = *(*v16 + 8 * i + 4);
if ( v20 && *(v20 + 24) )
{
v123 = i;
v21 = sub_4836C2(v16, i);
v122 = v22;
v121 = v22;
*(a1 - 44) = &v121;
sub_482C49(v21);
*(a1 - 4) = 1;
sub_48370B(-1);
sub_4828BE(v121, v122, v123);
}
}
}
if ( ++*(a1 - 20) > 5 )
goto LABEL_37;
}
v123 = 32;
goto LABEL_27;
}
LABEL_37:
*(a1 - 44) = *(a1 - 28) & 0x80;
v23 = *(a1 - 28);
*(a1 - 20) = 1;
*(a1 - 40) = v23;
do
{
v24 = *(a1 - 20);
v25 = (*(a1 - 24) + 4 * v24 + 499);
v26 = *v25;
if ( *v25 )
v26 = *(v26 - 1);
v7 = *(a1 - 44) == 0;
v27 = v26 - 1;
*(a1 - 32) = v26 - 1;
if ( !v7 )
{
v27 = CInPacket::Decode1(*(a1 + 8));
*(a1 - 32) = v27;
}
v28 = *v25;
if ( *v25 )
v28 = *(v28 - 1);
if ( v27 != v28 - 1 )
sub_447B44(v25, (v27 + 1), 0, a1 - 13);
switch ( v24 )
{
case 1:
v123 = 4;
goto LABEL_57;
case 2:
v123 = 8;
goto LABEL_57;
case 3:
v123 = 16;
goto LABEL_57;
case 4:
v123 = 32;
goto LABEL_57;
case 5:
v123 = 64;
LABEL_57:
v29 = v123;
goto LABEL_58;
}
v29 = 0;
LABEL_58:
if ( (v29 & *(a1 - 40)) != 0 )
{
for ( j = 0; j <= *(a1 - 32); ++j )
{
v31 = *v25 + 8 * j;
if ( v31[1] )
{
sub_436E8B(v31, 0);
v31[1] = 0;
}
}
}
++*(a1 - 20);
}
while ( *(a1 - 20) <= 5 );
if ( (*(a1 - 28) & 4) != 0 )
{
v32 = (*(a1 - 24) + 183);
v33 = 20;
do
{
if ( *v32 )
{
sub_436E8B(v32 - 1, 0);
*v32 = 0;
}
v32 += 2;
--v33;
}
while ( v33 );
while ( 1 )
{
v34 = CInPacket::Decode1(*(a1 + 8));
if ( !v34 )
break;
v123 = *(a1 + 8);
v122 = (a1 - 36);
sub_480993(a1, v33, v34);
*(a1 - 4) = 5;
if ( v34 <= 19 )
{
if ( *(a1 + 12) && (v35 = (*(*(a1 - 32) + 28) | *(*(a1 - 32) + 24)), *(*(a1 - 32) + 24)) )
{
v123 = -v34;
v122 = v35;
v121 = v35;
*(a1 - 44) = &v121;
sub_482C49(a1 - 36);
*(a1 - 4) = 5;
sub_48370B(-1);
sub_4828BE(v121, v122, v123);
}
else
{
sub_447A88((*(a1 - 24) + 8 * v34 + 179), a1 - 36);
}
}
v7 = *(a1 - 32) == 0;
*(a1 - 4) = 1;
if ( !v7 )
{
sub_436E8B((a1 - 36), 0);
*(a1 - 32) = 0;
}
}
v36 = (*(a1 - 24) + 343);
v37 = 20;
do
{
if ( *v36 )
{
sub_436E8B(v36 - 1, 0);
*v36 = 0;
}
v36 += 2;
--v37;
}
while ( v37 );
while ( 1 )
{
v38 = CInPacket::Decode1(*(a1 + 8));
v39 = v38;
if ( !v38 )
break;
v123 = *(a1 + 8);
v122 = (a1 - 36);
sub_480993(a1, v37, v38);
*(a1 - 4) = 7;
if ( v39 >= 1 && v39 <= 19 )
{
if ( *(a1 + 12) && (v40 = (*(*(a1 - 32) + 28) | *(*(a1 - 32) + 24)), *(*(a1 - 32) + 24)) )
{
v123 = -100 - v39;
v122 = v40;
v121 = v40;
*(a1 - 44) = &v121;
sub_482C49(a1 - 36);
*(a1 - 4) = 7;
sub_48370B(-1);
sub_4828BE(v121, v122, v123);
}
else
{
sub_447A88((*(a1 - 24) + 8 * v39 + 339), a1 - 36);
}
}
v7 = *(a1 - 32) == 0;
*(a1 - 4) = 1;
if ( !v7 )
{
sub_436E8B((a1 - 36), 0);
*(a1 - 32) = 0;
}
}
v41 = *(*(a1 - 24) + 503);
if ( v41 )
v42 = *(v41 - 4);
else
v42 = 0;
v43 = v42 - 1;
while ( 1 )
{
v44 = CInPacket::Decode1(*(a1 + 8));
v45 = v44;
if ( !v44 )
break;
v123 = *(a1 + 8);
v122 = (a1 - 36);
sub_480993(a1, v43, v44);
*(a1 - 4) = 9;
if ( v45 >= 1 && v45 <= v43 )
{
if ( *(a1 + 12) && (v46 = (*(*(a1 - 32) + 28) | *(*(a1 - 32) + 24)), *(*(a1 - 32) + 24)) )
{
v123 = v45;
v122 = v46;
v121 = v46;
*(a1 - 44) = &v121;
sub_482C49(a1 - 36);
*(a1 - 4) = 9;
sub_48370B(-1);
sub_4828BE(v121, v122, v123);
}
else
{
sub_447A88((*(*(a1 - 24) + 503) + 8 * v45), a1 - 36);
}
}
v7 = *(a1 - 32) == 0;
*(a1 - 4) = 1;
if ( !v7 )
{
sub_436E8B((a1 - 36), 0);
*(a1 - 32) = 0;
}
}
}
v47 = *(a1 + 8);
*(a1 - 20) = 2;
while ( 2 )
{
switch ( *(a1 - 20) )
{
case 1:
v123 = 4;
break;
case 2:
v123 = 8;
break;
case 3:
v123 = 16;
break;
case 4:
v123 = 32;
break;
case 5:
v123 = 64;
break;
default:
v48 = 0;
goto LABEL_117;
}
v48 = v123;
LABEL_117:
if ( (v48 & *(a1 - 40)) != 0 )
{
v49 = (*(a1 - 24) + 4 * *(a1 - 20) + 499);
v50 = *v49;
if ( *v49 )
v50 = *(v50 - 4);
*(a1 - 32) = v50 - 1;
while ( 1 )
{
v51 = CInPacket::Decode1(v47);
v52 = v51;
if ( !v51 )
break;
v123 = v47;
v122 = (a1 - 48);
sub_480993(a1, v47, v51);
*(a1 - 4) = 11;
if ( v52 < 1 || v52 > *(a1 - 32) )
{
v7 = *(a1 - 44) == 0;
*(a1 - 4) = 1;
if ( !v7 )
goto LABEL_129;
}
else
{
if ( *(a1 + 12) && (v53 = (*(*(a1 - 44) + 28) | *(*(a1 - 44) + 24)), *(*(a1 - 44) + 24)) )
{
v123 = v52;
v122 = v53;
v121 = v53;
*(a1 + 8) = &v121;
sub_482C49(a1 - 48);
*(a1 - 4) = 11;
sub_48370B(-1);
sub_4828BE(v121, v122, v123);
}
else
{
sub_447A88((*v49 + 8 * v52), a1 - 48);
}
v7 = *(a1 - 44) == 0;
*(a1 - 4) = 1;
if ( !v7 )
{
LABEL_129:
sub_436E8B((a1 - 48), 0);
*(a1 - 44) = 0;
continue;
}
}
}
}
if ( ++*(a1 - 20) <= 5 )
continue;
break;
}
if ( (*(a1 - 27) & 1) != 0 )
{
v54 = CInPacket::Decode2(v47);
if ( v54 )
{
v55 = (*(a1 - 24) + 523);
v56 = v54;
do
{
*(a1 - 44) = CInPacket::Decode4(v47);
*(a1 + 8) = CInPacket::Decode4(v47);
sub_44ACC6(v55, (a1 - 44), (a1 + 8));
--v56;
}
while ( v56 );
}
}
if ( *(a1 - 27) < 0 )
{
v57 = CInPacket::Decode2(v47);
if ( v57 )
{
v58 = v57;
do
{
*(a1 - 44) = CInPacket::Decode4(v47);
LOWORD(v59) = CInPacket::Decode2(v47);
*(a1 + 8) = v59;
sub_4830BA(a1 - 44, a1 + 8);
--v58;
}
while ( v58 );
}
}
if ( (*(a1 - 27) & 2) != 0 )
{
v60 = CInPacket::Decode2(v47);
v61 = *(a1 - 24) + 571;
sub_4832E0(v61);
if ( v60 )
{
do
{
LOWORD(v62) = CInPacket::Decode2(v47);
*(a1 - 44) = v62;
CInPacket::DecodeStr(a1, a1 + 8);
v123 = a1 + 8;
v122 = (a1 - 44);
*(a1 - 4) = 13;
sub_4831F1(v61, v122, v123);
*(a1 - 4) = 1;
ZXString_char_::_Release((a1 + 8));
--v60;
}
while ( v60 );
}
}
if ( (*(a1 - 27) & 0x40) != 0 )
{
v63 = CInPacket::Decode2(v47);
sub_483478(*(a1 - 24) + 595);
if ( v63 )
{
do
{
LOWORD(v64) = CInPacket::Decode2(v47);
v123 = 8;
*(a1 + 8) = v64;
CInPacket::DecodeBuffer(v47, (a1 - 48), v123);
sub_483399(a1 + 8, a1 - 48);
--v63;
}
while ( v63 );
}
}
if ( (*(a1 - 27) & 4) != 0 )
{
v65 = CInPacket::Decode2(v47);
if ( v65 )
{
*(a1 + 8) = v65;
do
{
*(a1 - 44) = 0;
*(a1 - 4) = 14;
sub_482C8B(a1 - 48);
v66 = *(a1 - 44);
*v66 = CInPacket::Decode4(v47);
v67 = *(a1 - 44);
*(v67 + 4) = CInPacket::Decode4(v47);
v68 = *(a1 - 44);
*(v68 + 8) = CInPacket::Decode4(v47);
v69 = *(a1 - 44);
*(v69 + 12) = CInPacket::Decode4(v47);
v70 = *(a1 - 44);
*(v70 + 16) = CInPacket::Decode4(v47);
sub_483533(*(a1 - 44), a1 - 48);
v7 = *(a1 - 44) == 0;
*(a1 - 4) = 1;
if ( !v7 )
{
sub_482CBE(0);
*(a1 - 44) = 0;
}
v7 = (*(a1 + 8))-- == 1;
}
while ( !v7 );
}
}
if ( (*(a1 - 27) & 8) != 0 )
{
*(a1 - 44) = 0;
*(a1 - 4) = 15;
v71 = CInPacket::Decode2(v47);
if ( v71 )
{
v72 = *(a1 - 24) + 647;
v73 = v71;
do
{
v74 = sub_483684(v72, a1);
sub_4817D1(v74, v47);
--v73;
}
while ( v73 );
}
*(a1 - 4) = 1;
ZXString_char_::_Release((a1 - 44));
}
if ( (*(a1 - 27) & 0x10) != 0 )
{
v75 = *(a1 - 24);
v76 = (v75 + 667);
*(a1 + 8) = 5;
do
{
*v76++ = CInPacket::Decode4(v47);
v7 = (*(a1 + 8))-- == 1;
}
while ( !v7 );
v77 = (v75 + 687);
v78 = 10;
do
{
*v77++ = CInPacket::Decode4(v47);
--v78;
}
while ( v78 );
}
if ( *(a1 + 12) )
{
*(a1 - 20) = 1;
do
{
v79 = 0;
*(a1 + 8) = 0;
*(a1 - 32) = 12;
while ( 1 )
{
v80 = *(a1 - 20);
v81 = *(a1 + 4 * v80 - 72);
v82 = v81 ? *(v81 - 4) : 0;
if ( *(a1 + 8) >= v82 )
break;
*(a1 + 12) = *(a1 + 8) + 1;
for ( k = v81 + *(a1 - 32) + 4; ; k += 12 )
{
v84 = v81 ? *(v81 - 4) : 0;
if ( *(a1 + 12) >= v84 )
break;
v85 = *(v81 + v79 + 4);
v86 = *(v85 + 24);
v87 = v85 + 24;
if ( v86 == *(*k + 24) && *(v87 + 4) == *(*k + 28) )
break;
++*(a1 + 12);
}
if ( v81 )
v88 = *(v81 - 4);
else
v88 = 0;
if ( *(a1 + 12) < v88 )
goto LABEL_194;
v89 = *(a1 + 4 * *(a1 - 20) - 96);
*(a1 + 12) = 0;
for ( *(a1 - 40) = v89 + 4; ; *(a1 - 40) += 12 )
{
v90 = v89 ? *(v89 - 4) : 0;
if ( *(a1 + 12) >= v90 )
break;
v91 = *(v81 + v79 + 4);
v92 = *(v91 + 24);
v93 = v91 + 24;
if ( v92 == *(**(a1 - 40) + 24) && *(v93 + 4) == *(**(a1 - 40) + 28) )
break;
++*(a1 + 12);
}
v94 = v89 ? *(v89 - 4) : 0;
v95 = *(a1 + 12);
if ( v95 < v94 )
{
v97 = 12 * v95;
(*(**(v89 + v97 + 4) + 40))(*(v89 + v97 + 4), *(v81 + v79 + 4));
v98 = *(a1 - 20);
v99 = (a1 + 4 * v98 - 96);
sub_447A88((v79 + *(a1 + 4 * v98 - 72)), *v99 + v97);
v123 = *v99 + v97;
}
else
{
LABEL_194:
--*(a1 + 8);
*(a1 - 32) -= 12;
v96 = v79;
v79 -= 12;
v123 = v96 + v81;
}
sub_483790(v123);
++*(a1 + 8);
*(a1 - 32) += 12;
v79 += 12;
}
v100 = *(a1 + 4 * v80 - 96);
if ( v100 && *(v100 - 4) )
{
v101 = 0;
*(a1 + 8) = 0;
while ( 1 )
{
v102 = *(a1 + 4 * *(a1 - 20) - 96);
v103 = v102 ? *(v102 - 4) : 0;
if ( *(a1 + 8) >= v103 )
break;
v104 = v101 + v102;
v105 = sub_48370B(-1);
sub_447A88(v105, v104);
v106 = *(v104 + 8);
++*(a1 + 8);
v105[2] = v106;
v101 += 12;
}
}
v107 = *(a1 - 20);
v108 = *(a1 - 24);
*(a1 + 8) = 0;
*(a1 + 12) = 0;
v109 = (v108 + 4 * v107 + 499);
while ( 1 )
{
v110 = *(a1 + 4 * v107 - 72);
v111 = v110 ? *(v110 - 4) : 0;
if ( *(a1 + 8) >= v111 )
break;
v112 = (v110 + *(a1 + 12));
v113 = *v109;
if ( *v109 )
v113 = *(v113 - 4);
v114 = v113 - 1;
if ( v107 == 1 && (v115 = v112[2], v115 <= -101) && v115 >= -119 )
{
v116 = (*(a1 - 24) - 8 * v115 - 461);
}
else
{
v117 = v112[2];
if ( v117 < 1 || v117 > v114 )
goto LABEL_222;
v116 = (*v109 + 8 * v117);
}
if ( v116 && !v116[1] )
{
v123 = v112;
goto LABEL_225;
}
LABEL_222:
v118 = sub_464D62(*(a1 - 24), v107);
v123 = v112;
if ( v118 <= 0 )
v116 = sub_482FC7(-1);
else
v116 = (*v109 + 8 * v118);
LABEL_225:
sub_447A88(v116, v123);
++*(a1 + 8);
*(a1 + 12) += 12;
}
v119 = v107 + 1;
*(a1 - 20) = v119;
}
while ( v119 <= 5 );
}
*(a1 - 4) = 0;
`eh vector destructor iterator'(a1 - 72, 4, 6, sub_482C86);
*(a1 - 4) = -1;
`eh vector destructor iterator'(a1 - 96, 4, 6, sub_482C86);
return *(a1 - 28);
}