Skip to content

Instantly share code, notes, and snippets.

@DarkLotus
Last active September 25, 2018 14:45
Show Gist options
  • Select an option

  • Save DarkLotus/76af9d040a6919105d2ca74b79cafde2 to your computer and use it in GitHub Desktop.

Select an option

Save DarkLotus/76af9d040a6919105d2ca74b79cafde2 to your computer and use it in GitHub Desktop.
void __cdecl HandleChangeChar0x81(int a1)
{
unsigned int v1; // ebp@1
signed int v2; // eax@1
int v3; // eax@3
char v4; // cl@4
char *v5; // edi@5
char v6; // al@6
unsigned int v7; // eax@7
char *v8; // edi@7
char v9; // cl@8
char *v10; // eax@10
char v11; // cl@11
unsigned int v12; // eax@12
char *v13; // edi@12
char v14; // cl@13
char *v15; // edi@14
char v16; // al@15
void *v17; // eax@19
int v18; // eax@20
unsigned int v19; // ebx@29
signed int v20; // edi@31
signed int v21; // esi@31
char *v22; // eax@34
char v23; // cl@35
char *v24; // eax@37
char v25; // cl@38
char *v26; // eax@39
char v27; // cl@40
int v28; // edi@43
char v29; // al@45
int v30; // eax@50
signed int v31; // esi@56
char *v32; // eax@59
int v33; // ecx@59
int v34; // ebp@61
char v35; // al@61
signed int v36; // esi@64
char *v37; // eax@67
char v38; // cl@68
int v39; // eax@70
int v40; // eax@74
char v41; // cl@75
void *v42; // ebx@79
char v43; // cl@79
bool v44; // sf@79
int v45; // ebp@79
int v46; // eax@79
int v47; // esi@81
int v48; // edi@82
int *v49; // ebp@82
int v50; // eax@83
int v51; // edi@87
int v52; // ebp@87
bool v53; // zf@87
signed int v54; // esi@88
_BYTE *v55; // eax@91
char *v56; // ecx@91
_BYTE *v57; // edx@91
char v58; // al@92
signed int v59; // esi@95
int v60; // esi@107
int v61; // esi@110
char v62; // [sp+14h] [bp-3C0h]@0
char v63; // [sp+15h] [bp-3BFh]@43
char v64; // [sp+16h] [bp-3BEh]@66
unsigned __int8 charCount; // [sp+17h] [bp-3BDh]@23
int v66; // [sp+18h] [bp-3BCh]@3
unsigned __int8 v67; // [sp+1Fh] [bp-3B5h]@26
char *v68; // [sp+20h] [bp-3B4h]@32
int v69; // [sp+24h] [bp-3B0h]@1
void *v70; // [sp+28h] [bp-3ACh]@19
char v71; // [sp+2Fh] [bp-3A5h]@57
int v72; // [sp+30h] [bp-3A4h]@3
int v73; // [sp+34h] [bp-3A0h]@65
void *v74; // [sp+38h] [bp-39Ch]@106
int v75; // [sp+3Ch] [bp-398h]@64
int v76[19]; // [sp+40h] [bp-394h]@89
char v77[4]; // [sp+8Ch] [bp-348h]@82
int v78[20]; // [sp+90h] [bp-344h]@80
int v79[20]; // [sp+E0h] [bp-2F4h]@83
char v80[30]; // [sp+130h] [bp-2A4h]@66
char v81; // [sp+14Eh] [bp-286h]@66
char v82; // [sp+150h] [bp-284h]@31
_BYTE v83[3]; // [sp+151h] [bp-283h]@36
char v84; // [sp+16Dh] [bp-267h]@32
char v85; // [sp+170h] [bp-264h]@66
char v86; // [sp+18Eh] [bp-246h]@66
char v87; // [sp+190h] [bp-244h]@31
char v88; // [sp+1ADh] [bp-227h]@32
char v89[32]; // [sp+1B0h] [bp-224h]@5
char v90[500]; // [sp+1D0h] [bp-204h]@4
int v91; // [sp+3D0h] [bp-4h]@19
dword_A750E4[0] = -1;
dword_A750E8 = -1;
dword_A750EC = -1;
dword_A750F0 = -1;
dword_A750F4 = -1;
dword_A750F8 = -1;
dword_A750FC = -1;
v1 = 0;
v69 = a1;
v2 = 0;
do
{
byte_A752A8[v2] = 0;
byte_A75100[v2] = 0;
v2 += 60;
}
while ( v2 < 420 );
CHARCOUNT = 0;
v66 = 0;
v72 = 0;
v3 = 0;
do
{
v4 = byte_A75084[v3];
v90[v3++] = v4;
}
while ( v4 );
v5 = &v89[31];
do
v6 = (v5++)[1];
while ( v6 );
*(_WORD *)v5 = *(_WORD *)" ";
v7 = strlen(&byte_A750A4) + 1;
v8 = &v89[31];
do
v9 = (v8++)[1];
while ( v9 );
qmemcpy(v8, &byte_A750A4, v7);
if ( dword_94BFA8 )
{
v10 = &v89[31];
do
v11 = (v10++)[1];
while ( v11 );
*(_WORD *)v10 = 10272;
v10[2] = 0;
v12 = strlen(&byte_951E08) + 1;
v13 = &v89[31];
do
v14 = (v13++)[1];
while ( v14 );
qmemcpy(v13, &byte_951E08, v12);
v15 = &v89[31];
do
v16 = (v15++)[1];
while ( v16 );
*(_WORD *)v15 = 41;
}
sub_5E2BC0(v90);
if ( dword_A78338 || dword_94BFA8 )
{
v17 = j__malloc(0x108u);
v70 = v17;
v91 = 0;
if ( v17 )
v18 = sub_4FCEC0(v17);
else
v18 = 0;
v91 = -1;
v72 = v18;
}
ReadByte(a1, (int)&v66, &charCount);
if ( dword_A78338 || dword_94BFA8 )
CHARCOUNT = charCount;
ReadByte(a1, (int)&v66, &v67);
if ( !dword_94BFA8 )
{
sprintf(v90, "%d", v67);
unkA8Byte = v67;
sub_54D6F0(39, v90, 0);
}
if ( charCount > 5u )
{
v19 = charCount;
if ( !charCount )
goto LABEL_43;
}
else
{
v19 = 5;
}
v20 = byte_A75100 - &v87;
v21 = byte_A752A8 - &v82;
do
{
ReadStringLimitedLen(v69, &v66, &v68, 30);
strncpy(&v82, v68, 0x1Eu);
ReadStringLimitedLen(v69, &v66, &v68, 30);
strncpy(&v87, v68, 0x1Eu);
v84 = 0;
v88 = 0;
if ( dword_A78338 || dword_94BFA8 )
{
v22 = &v82;
do
v23 = *v22++;
while ( v23 );
if ( v22 != v83 )
{
v24 = &v82;
do
{
v25 = *v24;
v24[v21] = *v24;
++v24;
}
while ( v25 );
v26 = &v87;
do
{
v27 = *v26;
v26[v20] = *v26;
++v26;
}
while ( v27 );
dword_A750E4[v1] = v1;
sub_4FD920(&v82, v1);
}
}
++v1;
v21 += 60;
v20 += 60;
}
while ( v1 < v19 );
LABEL_43:
v28 = v69;
ReadByte(v69, (int)&v66, &v63);
if ( !dword_A78338 && !dword_94BFA8 )
{
v29 = v63;
if ( !v63 )
{
if ( dword_9525A4 )
{
(**(void (__stdcall ***)(_DWORD))dword_9525A4)(1);
dword_9525A4 = 0;
}
if ( dword_9529EC )
{
*(_DWORD *)(dword_9529EC + 132) = 0;
v70 = j__malloc(0x4D8u);
v91 = 1;
if ( v70 )
v30 = sub_4E89B0(
-1,
-1,
"The Ultima Online servers are currently down. Please try again in a few moments.",
dword_9529EC,
0,
1,
0,
0,
0);
else
v30 = 0;
v91 = -1;
dword_9525A4 = v30;
sub_4DCA10(0, 1);
dword_A78398 = 0;
sub_45EDA0();
}
goto LABEL_116;
}
LABEL_55:
dword_A7547C = v29;
dword_A75478 = (int)j__malloc_0(4 * ((char)dword_A7547C + 1) | -((unsigned __int64)(unsigned int)((char)dword_A7547C + 1) >> 30 != 0));
memset((void *)dword_A75478, 0, 4 * v63 + 4);
UNKCHANGECHARPOINTER = (int)j__malloc_0(2 * (v63 + 1) | -((unsigned __int64)(unsigned int)(v63 + 1) >> 31 != 0));
v29 = v63;
LABEL_56:
v31 = 0;
if ( v29 > 0 )
{
do
{
ReadByte(v28, (int)&v66, &v71);
ReadStringLimitedLen(v28, &v66, &v68, 16);
if ( !dword_94BFA8 && strlen(v68) )
{
*(_WORD *)(UNKCHANGECHARPOINTER + 2 * v31) = v71;
*(_DWORD *)(dword_A75478 + 4 * v31) = j__malloc_0(0x10u);
v32 = v68;
v33 = *(_DWORD *)(dword_A75478 + 4 * v31);
*(_DWORD *)v33 = *(_DWORD *)v68;
*(_DWORD *)(v33 + 4) = *((_DWORD *)v32 + 1);
*(_DWORD *)(v33 + 8) = *((_DWORD *)v32 + 2);
*(_DWORD *)(v33 + 12) = *((_DWORD *)v32 + 3);
*(_BYTE *)(*(_DWORD *)(dword_A75478 + 4 * v31) + 15) = 0;
}
++v31;
}
while ( v31 < v63 );
}
goto LABEL_61;
}
v29 = v63;
if ( v63 )
{
if ( dword_94BFA8 )
goto LABEL_56;
goto LABEL_55;
}
LABEL_61:
v34 = 0;
ReadByte(v28, (int)&v66, &v63);
v35 = v63;
if ( v63 )
{
if ( !dword_94BFA8 )
{
dword_A7545C = v63;
dword_A75450 = (int)j__malloc_0(92 * v63 | -(92 * (unsigned __int64)(unsigned int)v63 >> 32 != 0));
memset((void *)dword_A75450, 0, 92 * v63);
dword_A75458 = (int)j__malloc_0(4 * (v63 + 1) | -((unsigned __int64)(unsigned int)(v63 + 1) >> 30 != 0));
memset((void *)dword_A75458, 0, 4 * v63 + 4);
dword_A75454 = (int)j__malloc_0(4 * (v63 + 1) | -((unsigned __int64)(unsigned int)(v63 + 1) >> 30 != 0));
v35 = v63;
}
v36 = 0;
v34 = 0;
v75 = 0;
v70 = 0;
if ( v35 > 0 )
{
v73 = 0;
do
{
ReadByte(v28, (int)&v66, &v64);
ReadStringLimitedLen(v28, &v66, &v68, 31);
strncpy(v80, v68, 0x1Fu);
v81 = 0;
ReadStringLimitedLen(v28, &v66, &v68, 31);
strncpy(&v85, v68, 0x1Fu);
v86 = 0;
if ( !dword_94BFA8 )
{
v37 = v80;
do
v38 = *v37++;
while ( v38 );
if ( v37 != &v80[1] )
{
v39 = v73 + dword_A75450;
v73 += 92;
qmemcpy((void *)(v39 + 4), v80, 0x20u);
qmemcpy((void *)(v39 + 36), &v85, 0x20u);
*(_DWORD *)v39 = v64;
*(_DWORD *)(dword_A75458 + 4 * v64) = j__malloc_0(strlen(&v85) + strlen(v80) + 3);
sprintf(*(char **)(dword_A75458 + 4 * v64), "%s: %s", v80, &v85);
v28 = v69;
v36 = (signed int)v70;
*(_DWORD *)(dword_A75454 + 4 * v64) = v64;
}
}
if ( v36 > 0 && strcmp(v80, v89) )
*(&v75 + ++v34) = v36;
v40 = 0;
do
{
v41 = v80[v40];
v89[v40++] = v41;
}
while ( v41 );
v35 = v63;
v70 = (void *)++v36;
}
while ( v36 < v63 );
}
}
if ( !dword_94BFA8 && v35 )
{
v42 = j__malloc_0(4 * (v35 + 1) | -((unsigned __int64)(unsigned int)(v35 + 1) >> 30 != 0));
memset(v42, 0, 4 * v63 + 4);
v43 = v63;
v44 = v34 + 1 < 0;
v45 = v34 + 1;
v69 = v45;
*(&v75 + v45) = v63;
v46 = 0;
if ( !v44 )
{
do
{
v78[v46] = v46;
++v46;
}
while ( v46 <= v45 );
}
v47 = 0;
if ( v45 > 0 )
{
v48 = v69;
v49 = (int *)&v77[4 * v69];
do
{
v50 = sub_590450(v48);
v79[v47] = v78[v50];
if ( v50 < v48 - 1 )
v78[v50] = *v49;
++v47;
--v49;
--v48;
}
while ( v47 < v69 );
v43 = v63;
}
v51 = 0;
v52 = 0;
v53 = v69 == 0;
v44 = v69 < 0;
v79[v69] = v69;
if ( !v44 && !v53 )
{
do
{
v54 = *(&v75 + v79[v52]);
if ( v54 < v43 )
{
v70 = (void *)v76[v79[v52]];
do
{
if ( v54 >= (signed int)v70 )
break;
v55 = j__malloc_0(strlen(*(const char **)(dword_A75458 + 4 * v54)) + 1);
*((_DWORD *)v42 + v51) = v55;
v56 = *(char **)(dword_A75458 + 4 * v54);
v57 = v55;
do
{
v58 = *v56;
*v57++ = *v56++;
}
while ( v58 );
*(_DWORD *)(dword_A75454 + 4 * v51) = v54;
v43 = v63;
++v54;
++v51;
}
while ( v54 < v63 );
}
++v52;
}
while ( v52 < v69 );
}
v59 = 0;
if ( v43 > 0 )
{
do
sub_42ED8C(*(_DWORD *)(dword_A75458 + 4 * v59++));
while ( v59 < v63 );
}
sub_42ED8C(dword_A75458);
dword_A75458 = (int)v42;
}
if ( dword_9525A4 )
{
(**(void (__stdcall ***)(_DWORD))dword_9525A4)(1);
dword_9525A4 = 0;
}
if ( dword_9529F0 )
{
(**(void (__stdcall ***)(_DWORD))dword_9529F0)(1);
dword_9529F0 = 0;
}
if ( dword_9529EC )
*(_DWORD *)(dword_9529EC + 132) = 0;
if ( dword_A78338 || dword_94BFA8 )
{
v61 = v72;
if ( sub_4FDB60(v72) <= 0 )
{
sub_540B60(v61);
}
else
{
dword_9529F0 = v61;
sub_4DCA10(0, 1);
sub_4DAF10(v61);
}
}
else
{
v74 = j__malloc(0xA034u);
v91 = 2;
if ( v74 )
v60 = sub_4AD3C0(dword_9529E8, 3500, 100, 100, 100, 100, 0, 0, 0);
else
v60 = 0;
v91 = -1;
sub_545B30(v60);
sub_4AA9F0(v60);
sub_4DCA10(0, 1);
dword_952A04 = v60;
}
if ( dword_A1BC6C && dword_9529F0 )
(*(void (**)(void))(*(_DWORD *)dword_9529F0 + 104))();
LABEL_116:
sub_600F53(v62);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment