Exemple #1
0
        public CELFile(byte[] fileData, bool isCL2 = false)
        {
            this.fileData = fileData;
            this.isCL2    = isCL2;
            //this.isTileCel = !isCL2;

            var r     = new BinaryReader(fileData);
            var first = r.ReadU32();

            if (first == 32)
            {
                if (isCL2)
                {
                    r.Seek(0);
                    ReadCL2ArchiveOffsets(r);
                }
                else
                {
                    r.Seek(32);
                    for (int i = 0; i < 8; ++i)
                    {
                        ReadNormalOffsets(r);
                    }
                }
            }
            else
            {
                r.Seek(0);
                ReadNormalOffsets(r);
            }

            Debug.WriteLine("NumFrames: " + NumFrames);
        }
Exemple #2
0
        private void ReadNormalOffsets(BinaryReader r, uint offsetOffset = 0)
        {
            uint numFrames = r.ReadU32();
            var  offsets   = new uint[numFrames + 1];

            for (var i = 0; i <= numFrames; ++i)
            {
                offsets[i] = r.ReadU32();
            }
            for (var i = 0; i < numFrames; ++i)
            {
                frames.Add(new FrameInfo {
                    Offset = (int)(offsets[i] + offsetOffset),
                    Size   = (int)(offsets[i + 1] - offsets[i])
                });
            }
        }
Exemple #3
0
 private void ReadCL2ArchiveOffsets(BinaryReader r)
 {
     var headerOffsets = new uint[8];
     for (int i = 0; i < 8; ++i)
         headerOffsets[i] = r.ReadU32();
     for (int i = 0; i < 8; ++i) {
         r.Seek((int)headerOffsets[i]);
         ReadNormalOffsets(r, headerOffsets[i]);
     }
 }
Exemple #4
0
        public MPQArchive(string path)
        {
            archivePath = path;

            var file      = new FileStream(path, FileMode.Open, FileAccess.Read);
            var headerBuf = new byte[32];
            var len       = file.Read(headerBuf, 0, 32);

            if (len != 32)
            {
                throw new Exception("file too small");
            }

            // read archive header
            var r  = new BinaryReader(headerBuf);
            var id = r.ReadU32();

            r.Skip(8); // HeaderSize and ArchiveSize
            var version = r.ReadU16();

            BlockSize = (uint)(0x200 << r.ReadU16());
            var hashTablePos  = r.ReadU32();
            var blockTablePos = r.ReadU32();

            hashTableSize  = r.ReadU32();
            blockTableSize = r.ReadU32();

            if (id != FourCC)
            {
                throw new Exception("bad file header");
            }
            if (version != 0)
            {
                throw new NotImplementedException();
            }

            file.Seek(hashTablePos, SeekOrigin.Begin);
            hashTable = ReadHashTable(file, hashTableSize);

            file.Seek(blockTablePos, SeekOrigin.Begin);
            blockTable = ReadBlockTable(file, blockTableSize);
        }
Exemple #5
0
 private void ReadNormalOffsets(BinaryReader r, uint offsetOffset = 0)
 {
     uint numFrames = r.ReadU32();
     var offsets = new uint[numFrames + 1];
     for (var i = 0; i <= numFrames; ++i)
         offsets[i] = r.ReadU32();
     for (var i = 0; i < numFrames; ++i) {
         frames.Add(new FrameInfo {
             Offset = (int)(offsets[i] + offsetOffset),
             Size = (int)(offsets[i + 1] - offsets[i])
         });
     }
 }
Exemple #6
0
        private void ReadCL2ArchiveOffsets(BinaryReader r)
        {
            var headerOffsets = new uint[8];

            for (int i = 0; i < 8; ++i)
            {
                headerOffsets[i] = r.ReadU32();
            }
            for (int i = 0; i < 8; ++i)
            {
                r.Seek((int)headerOffsets[i]);
                ReadNormalOffsets(r, headerOffsets[i]);
            }
        }
Exemple #7
0
        public CELFile(byte[] fileData, bool isCL2 = false)
        {
            this.fileData = fileData;
            this.isCL2 = isCL2;
            //this.isTileCel = !isCL2;

            var r = new BinaryReader(fileData);
            var first = r.ReadU32();
            if (first == 32) {
                if (isCL2) {
                    r.Seek(0);
                    ReadCL2ArchiveOffsets(r);
                } else {
                    r.Seek(32);
                    for (int i = 0; i < 8; ++i)
                        ReadNormalOffsets(r);
                }
            } else {
                r.Seek(0);
                ReadNormalOffsets(r);
            }

            Debug.WriteLine("NumFrames: " + NumFrames);
        }
Exemple #8
0
        public MPQArchive(string path)
        {
            archivePath = path;

            var file = new FileStream(path, FileMode.Open, FileAccess.Read);
            var headerBuf = new byte[32];
            var len = file.Read(headerBuf, 0, 32);
            if (len != 32)
                throw new Exception("file too small");
            
            // read archive header
            var r = new BinaryReader(headerBuf);
            var id = r.ReadU32();
            r.Skip(8); // HeaderSize and ArchiveSize
            var version = r.ReadU16();
            BlockSize = (uint)(0x200 << r.ReadU16());
            var hashTablePos = r.ReadU32();
            var blockTablePos = r.ReadU32();
            hashTableSize = r.ReadU32();
            blockTableSize = r.ReadU32();

            if (id != FourCC)
                throw new Exception("bad file header");
            if (version != 0)
                throw new NotImplementedException();

            file.Seek(hashTablePos, SeekOrigin.Begin);
            hashTable = ReadHashTable(file, hashTableSize);

            file.Seek(blockTablePos, SeekOrigin.Begin);
            blockTable = ReadBlockTable(file, blockTableSize);
        }