public Archive(string filename) { ArchivePath = filename; using var stream = File.OpenRead(ArchivePath); using var reader = new EndianAwareBinaryReader(stream); reader.AssertTag(BlockType.HEL, BlockType.HEB); reader.IsBigEndian = reader.PeekChar() == 0; // contains file offsets and a string block containing // archive details. probably includes page size and offset // to MAST block Data = reader.ReadBytes(0x800 - 4); reader.AssertTag(BlockType.MAST); MAST = new MAST(reader); // this is reversed to signify this is the section header // for multi-sectioned files (which don't exist) reader.AssertTag(BlockType.TCES, BlockType.SECT); TCES = new TCES(reader); // can't find references to this? StringTable = reader.ReadString(MAST.StringTableSize); reader.Seek(TCES.PageOffset << 11, SeekOrigin.Begin); Section = new Section(reader); }
public Section(EndianAwareBinaryReader reader) { Offset = reader.BaseStream.Position; AssetLayers = new List <AssetLayer>(); DirectoryLayers = new List <DirectoryLayer>(); reader.AssertTag(BlockType.SECT); LayerCount = reader.ReadInt32(); Unknown1 = reader.ReadInt32(); SizeOfLayerData = reader.ReadInt32(); SizeOfName = reader.ReadInt32(); SizeOfChunk = reader.ReadInt32(); SizeOfSubLayerData = reader.ReadInt32(); Unknown2 = reader.ReadInt32(); Layers = Utils.CreateArray <Layer>(LayerCount, reader); SectionName = reader.ReadCString(); // skip padding reader.Seek(Offset + SizeOfChunk, SeekOrigin.Begin); // read sub layers for (var i = 0; i < LayerCount; i++) { ReadLayer(reader, Layers[i]); } // append internal names to asset entries UpdateAssetEntries(); }