public void Serialize(Stream output)
        {
            var endian = this._Endian;

            var strings = new Interface.StringTable();

            output.WriteValueU32(Signature, endian);
            output.WriteValueS32(strings.WriteIndex(this._Name), endian);
            output.WriteValueU16(this._Version, endian);
            output.WriteValueF32(this._AnimationTime, endian);

            output.WriteValueS32(this._Metadata.Count, endian);
            output.WriteValueS32(this._CriticalResources.Count, endian);

            var stringTableOffsetOffset = output.Position;

            output.WriteValueU32(0xFFFFFFFF, endian); // string table stub

            output.WriteValueU16((ushort)this._Elements.Count);
            output.WriteValueU16((ushort)this._Animations.Count);

            foreach (var criticalResource in this._CriticalResources)
            {
                output.WriteValueEnum <Interface.CriticalResource>(criticalResource.Type);
                strings.WriteIndex(output, endian, criticalResource.Name);

                if (this._Version >= 2)
                {
                    output.WriteValueB8(criticalResource.Autoload);
                }
                else
                {
                    if (criticalResource.Autoload == true)
                    {
                        throw new InvalidOperationException();
                    }
                }
            }

            foreach (var metadata in this._Metadata)
            {
                strings.WriteIndex(output, endian, metadata.Name);
                strings.WriteIndex(output, endian, metadata.Value);
            }

            foreach (var element in this._Elements)
            {
                element.Serialize(output, endian, strings);
            }

            foreach (var animation in this._Animations)
            {
                animation.Serialize(output, endian, strings);
            }

            var stringTableOffset = output.Position;

            strings.Serialize(output, endian);

            output.Seek(stringTableOffsetOffset, SeekOrigin.Begin);
            output.WriteValueU32((uint)stringTableOffset, endian);
        }
 public void Deserialize(Stream input, Endian endian, StringTable strings)
 {
     this.Value = strings.ReadString(input, endian);
 }
        public void Deserialize(Stream input)
        {
            var magic = input.ReadValueU32(Endian.Little);

            if (magic != Signature && magic.Swap() != Signature)
            {
                throw new FormatException();
            }
            var endian = magic == Signature ? Endian.Little : Endian.Big;

            var nameIndex             = input.ReadValueS32(endian);
            var version               = input.ReadValueU16(endian);
            var animationTime         = input.ReadValueF32(endian);
            var metadataCount         = input.ReadValueU32(endian);
            var criticalResourceCount = input.ReadValueU32(endian);
            var stringTableOffset     = input.ReadValueU32(endian);
            var elementCount          = input.ReadValueU16(endian);
            var animationCount        = input.ReadValueU16(endian);

            if (version != 1 && version != 2)
            {
                throw new FormatException();
            }

            if (stringTableOffset >= input.Length)
            {
                throw new FormatException();
            }

            var position = input.Position;

            input.Seek(stringTableOffset, SeekOrigin.Begin);
            var strings = new Interface.StringTable();

            strings.Deserialize(input, endian);
            input.Seek(position, SeekOrigin.Begin);

            if (nameIndex != 0)
            {
                throw new FormatException();
            }

            var fileName = strings.ReadString(nameIndex);

            var criticalResources = new Interface.CriticalResource[criticalResourceCount];

            for (uint i = 0; i < criticalResourceCount; i++)
            {
                var type = input.ReadValueEnum <Interface.CriticalResourceType>();
                if (type != Interface.CriticalResourceType.Peg &&
                    type != Interface.CriticalResourceType.Document)
                {
                    throw new FormatException();
                }

                var name     = strings.ReadString(input, endian);
                var autoload = this._Version >= 2 && input.ReadValueB8() == true;

                if (autoload == true &&
                    type != Interface.CriticalResourceType.Peg)
                {
                    throw new FormatException();
                }

                criticalResources[i] = new Interface.CriticalResource()
                {
                    Type     = type,
                    Name     = name,
                    Autoload = autoload,
                };
            }

            var metadatas = new Interface.Metadata[metadataCount];

            for (uint i = 0; i < metadataCount; i++)
            {
                var name  = strings.ReadString(input, endian);
                var value = strings.ReadString(input, endian);
                metadatas[i] = new Interface.Metadata(name, value);
            }

            var elements = new Interface.Object[elementCount];

            for (ushort i = 0; i < elementCount; i++)
            {
                var element = new Interface.Object();
                element.Deserialize(input, endian, strings);
                elements[i] = element;
            }

            var animations = new Interface.Object[animationCount];

            for (ushort i = 0; i < animationCount; i++)
            {
                var animation = new Interface.Object();
                animation.Deserialize(input, endian, strings);
                animations[i] = animation;
            }

            if (input.Position != stringTableOffset)
            {
                throw new FormatException();
            }

            this._Endian        = endian;
            this._Name          = fileName;
            this._Version       = version;
            this._AnimationTime = animationTime;
            this._CriticalResources.Clear();
            this._CriticalResources.AddRange(criticalResources);
            this._Metadata.Clear();
            this._Metadata.AddRange(metadatas);
            this._Elements.Clear();
            this._Elements.AddRange(elements);
            this._Animations.Clear();
            this._Animations.AddRange(animations);
        }
 public void Serialize(Stream output, Endian endian, StringTable strings)
 {
     strings.WriteIndex(output, endian, this.Value);
 }
Exemple #5
0
 public void Deserialize(Stream input, Endian endian, StringTable strings)
 {
     this.Value = input.ReadValueB8();
 }
Exemple #6
0
 public void Serialize(Stream output, Endian endian, StringTable strings)
 {
     output.WriteValueB8(this.Value);
 }
 public void Deserialize(Stream input, Endian endian, StringTable strings)
 {
     this.R = input.ReadValueF32(endian);
     this.G = input.ReadValueF32(endian);
     this.B = input.ReadValueF32(endian);
 }
 public void Serialize(Stream output, Endian endian, StringTable strings)
 {
     output.WriteValueF32(this.R, endian);
     output.WriteValueF32(this.G, endian);
     output.WriteValueF32(this.B, endian);
 }