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); }
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); }