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