예제 #1
0
        private static Map.CompressedData MakeCompressedData(MemoryStream input)
        {
            var cd = new Map.CompressedData();

            using (var data = new MemoryStream())
            {
                input.Position = 0;
                uint virtualOffset = 0;
                uint realOffset    = 4;
                while (input.Position < input.Length)
                {
                    var length = (uint)Math.Min(0x40000, input.Length - input.Position);

                    using (var block = new MemoryStream())
                    {
                        var zlib = new DeflaterOutputStream(block, new Deflater(9, false));
                        zlib.WriteFromStream(input, length);
                        zlib.Finish();

                        cd.Blocks.Add(new Map.CompressedData.Block()
                        {
                            VirtualOffset = virtualOffset,
                            FileOffset    = realOffset,
                            IsCompressed  = true,
                        });

                        block.Position = 0;
                        data.WriteFromStream(block, block.Length);

                        realOffset += (uint)block.Length;
                    }

                    virtualOffset += length;
                }

                data.Position = 0;
                cd.Data       = new byte[data.Length];
                data.Read(cd.Data, 0, cd.Data.Length);

                cd.Blocks.Add(new Map.CompressedData.Block()
                {
                    VirtualOffset = virtualOffset,
                    FileOffset    = realOffset,
                    IsCompressed  = true,
                });
            }

            return(cd);
        }
예제 #2
0
        public void Deserialize(Stream input, Endian endian)
        {
            var baseOffset = input.Position;

            var magic = input.ReadValueU32(endian);

            if (magic != 0x4D324346) // FC2M
            {
                throw new FormatException();
            }

            this.Version = input.ReadValueU32(endian);
            if (this.Version != 1)
            {
                throw new FormatException();
            }

            uint offsetA = input.ReadValueU32(endian);
            uint offsetB = input.ReadValueU32(endian);
            uint offsetC = input.ReadValueU32(endian);

            if (offsetA != 20)
            {
                throw new FormatException();
            }

            this.DAT = new CompressedData();
            this.DAT.Deserialize(input, endian);

            if (baseOffset + offsetB != input.Position)
            {
                throw new FormatException();
            }

            this.FAT = new CompressedData();
            this.FAT.Deserialize(input, endian);

            if (baseOffset + offsetC != input.Position)
            {
                throw new FormatException();
            }

            this.XML = new CompressedData();
            this.XML.Deserialize(input, endian);
        }