public void Deserialize(Stream input) { this.Version = input.ReadValueU32(); if (this.Version < 3 || this.Version > 22) { throw new FormatException(); } List <ResourceKey> keyTable = null; if (this.Version >= 11) { keyTable = new List <ResourceKey>(); long keyTableOffset = input.ReadValueU32(); long originalPosition = input.Position; input.Seek(keyTableOffset, SeekOrigin.Current); var count = input.ReadValueU8(); for (var i = 0; i < count; i++) { keyTable.Add(input.ReadResourceKeyIGT()); } input.Seek(originalPosition, SeekOrigin.Begin); } this.Presets.Clear(); if (this.Version >= 16) { var count = input.ReadValueU32(); for (uint i = 0; i < count; i++) { var text = input.ReadString(input.ReadValueU32() * 2, true, Encoding.Unicode); var index = input.ReadValueU32(); this.Presets.Add(index, text); } } if (this.Version >= 12) { this.Name = input.ReadString(input.ReadValueS32Packed(), true, Encoding.BigEndianUnicode); } if (this.Version >= 18) { this.DisplayIndex = input.ReadValueF32(); } else if (this.Version >= 13) { input.Seek(4, SeekOrigin.Current); // skip } this.Unknown04 = input.ReadValueB8(); this.Unknown05 = input.ReadValueU32(); if (this.Version >= 15) { this.Unknown06 = input.ReadValueU32(); } else { var remap = new uint[] { 0, 1, 2, 4, 8, 8, 8, 8 }; this.Unknown06 = this.Unknown05 < remap.Length ? remap[this.Unknown05] : 16; } if (this.Version >= 9) { this.Unknown06 = input.ReadValueU32(); } else { var a = input.ReadValueU32(); var b = input.ReadValueU32(); this.Unknown06 = a | b; } if (this.Version >= 8) { this.Unknown07 = input.ReadValueU32(); } if (this.Version >= 16) { this.Unknown09 = keyTable[input.ReadValueU8()]; this.Unknown10 = keyTable[input.ReadValueU8()]; } else if (this.Version >= 15) { this.Unknown09 = input.ReadResourceKeyIGT(); this.Unknown10 = input.ReadResourceKeyIGT(); } this.BlendKeys.Deserialize(input, this.Version, keyTable); this.Unknown17 = input.ReadValueU32(); this.VisualProxies.Clear(); if (this.Version >= 6) { var count = input.ReadValueU8(); for (int i = 0; i < count; i++) { if (this.Version >= 11) { this.VisualProxies.Add(keyTable[input.ReadValueU8()]); } else { this.VisualProxies.Add(input.ReadResourceKeyTGI()); } } } this.LODs.Clear(); { var count = input.ReadValueU8(); for (int i = 0; i < count; i++) { var lodInfo = new LODInfo(); lodInfo.Deserialize(input, this.Version); this.LODs.Add(lodInfo); } } this.TextureKeys.Deserialize(input, this.Version, keyTable); this.Unknown24.Clear(); if (this.Version >= 4) { var count = this.Version >= 6 ? input.ReadValueU8() : 7; for (int i = 0; i < count; i++) { if (this.Version >= 11) { this.Unknown24.Add(keyTable[input.ReadValueU8()]); } else { this.Unknown24.Add(input.ReadResourceKeyIGT()); } } } if (this.Version >= 7 && this.Version <= 15) { var count = input.ReadValueU32(); for (uint i = 0; i < count; i++) { var text = input.ReadString(input.ReadValueS32Packed(), true, Encoding.BigEndianUnicode); var index = input.ReadValueU32(); this.Presets.Add(index, text); } } if (this.Version >= 10) { this.ShoeMaterial = input.ReadString(input.ReadValueS32Packed(), true, Encoding.BigEndianUnicode); } if (this.Version >= 22) { this.OutfitMaterial = input.ReadString(input.ReadValueS32Packed(), true, Encoding.BigEndianUnicode); } if (this.Version >= 20) { this.ProfessionTypes = input.ReadValueU64(); } else if (this.Version >= 19) { this.ProfessionTypes = 0; var count = input.ReadValueU32(); for (uint i = 0; i < count; i++) { this.ProfessionTypes |= input.ReadValueU64(); } } }