Ejemplo n.º 1
0
        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();
                }
            }
        }