예제 #1
0
        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);
        }
예제 #2
0
        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();
        }