static int unk1(UnkClass a, int a2) { var v2 = a2; var v3 = a2 - a.unk4038; if (a2 - a.unk4038 <= 0) { uint v7 = (uint)(a.unk4040 & ((1 << a2) - 1)); a.unk4040 >>= v2; a.unk4038 -= v2; return((int)v7); } else { var v4 = a.unk24; while (true) { var v5 = a.unk28; if (v5 >= v4) { break; } var v6 = a.unk4038; v3 -= 8; a.unk4040 |= a.unk8[v5] << a.unk4038; a.unk28 = v5 + 1; a.unk4038 = v6 + 8; if (v3 <= 0) { uint v7 = (uint)(a.unk4040 & ((1 << a2) - 1)); a.unk4040 >>= v2; a.unk4038 -= v2; return((int)v7); } } return(-1); } }
static uint DecompressBlock(UnkClass unkClass) { var v17 = new byte[4096]; do { var result = unk1(unkClass, unkClass.dword4030); var v3 = result; if (result == -1) { break; } var v4 = unkClass.dword6848; if (v4 == -1) { if (result >= 256) { throw (new Exception("Unexpected compression code")); } //test.gap684C[test.dwordE84C++] = result; var temp = BitConverter.GetBytes(result); unkClass.OutputBuffer[unkClass.dwordE84C++] = temp[0]; unkClass.OutputBuffer[unkClass.dwordE84C + 1] = temp[1]; unkClass.OutputBuffer[unkClass.dwordE84C + 2] = temp[2]; unkClass.OutputBuffer[unkClass.dwordE84C + 3] = temp[3]; } else { var v5 = unkClass.signed402C; var i = 0; if (v3 < v5) { var v10 = v3; var v11 = 0; var v12 = 0; do { v12 = v11; v17[v11++] = unkClass.gap0[4 * v10 + 2]; v10 = BitConverter.ToInt16(unkClass.gap0, 4 * v10); //*(unsigned __int16 *)&a1->gap0[4 * v10 + 44]; }while ((ushort)v10 != 0xFFFF); for (i = v17[v12]; v12 >= 0; unkClass.OutputBuffer[unkClass.dwordE84C++] = v17[v12--]) { ; } } else { if (v3 != v5) { throw (new Exception("Unexpected next compression code")); } var v6 = 0; var v7 = 0; do { v7 = v6; var v8 = unkClass.gap0[4 * v4 + 2]; v4 = BitConverter.ToInt16(unkClass.gap0, 4 * v4);//*(unsigned __int16 *)&a1->gap0[4 * v4 + 44]; v17[v6++] = v8; }while ((ushort)v4 != 0xFFFF); i = v17[v7]; for (var m = i; v7 >= 0; unkClass.OutputBuffer[unkClass.dwordE84C++] = v17[v7--]) { i = m; } var temp2 = BitConverter.GetBytes(i); //test.gap684C[test.dwordE84C++] = i; unkClass.OutputBuffer[unkClass.dwordE84C++] = temp2[0]; unkClass.OutputBuffer[unkClass.dwordE84C + 1] = temp2[1]; unkClass.OutputBuffer[unkClass.dwordE84C + 2] = temp2[2]; unkClass.OutputBuffer[unkClass.dwordE84C + 3] = temp2[3]; } var v13 = unkClass.dword6848; //test.gap0[4 * test.signed402C + 2] = (byte)i; var temp3 = BitConverter.GetBytes(i); unkClass.gap0[4 * unkClass.signed402C + 2] = temp3[0]; unkClass.gap0[4 * unkClass.signed402C + 2 + 1] = temp3[1]; //unkClass.gap0[4 * unkClass.signed402C + 0] = (byte)v13; temp3 = BitConverter.GetBytes(v13); unkClass.gap0[4 * unkClass.signed402C] = temp3[0]; unkClass.gap0[4 * unkClass.signed402C + 1] = temp3[1]; var v14 = (i ^ v13) & 0x3FF; //test.gap4049[2 * test.signed402C + 0x7FF] = (byte)(test.char4048 + v14); var temp = BitConverter.GetBytes(unkClass.signed402C); unkClass.char4048[v14] = temp[0]; unkClass.char4048[v14] = temp[1]; var v15 = unkClass.dword4030; ++unkClass.signed402C; result = (1 << v15); if (unkClass.signed402C == result) { result = (v15 + 1); unkClass.dword4030 = result; if (result > 12) { unkClass.signed402C = 256; unkClass.dword4030 = 9; //result = (__int64)memset(&a1->char4048, 255, 0x800ui64); unkClass.char4048 = new byte[2048]; unkClass.dword6848 = -1; continue; } } } unkClass.dword6848 = v3; }while (unkClass.dwordE84C < 0x7000); return(0); }