/// <summary> /// Unpacks all the files inside the BG file into a folder. /// </summary> public void Unpack() { Files.Clear(); List <int> indices = Header.RealIndices; using (BinaryReader reader = new BinaryReader(new FileStream(FilePath, FileMode.Open))) { int fileCount = Header.FileCount; int lastOffset = 64; reader.BaseStream.Seek(64, SeekOrigin.Begin); for (int i = 0; i < fileCount; i++) { int endOffset = indices[i] + 64; int length = endOffset - lastOffset; byte[] buffer = reader.ReadBytes(length); string directory = Path.GetDirectoryName(FilePath) + "\\" + Path.GetFileNameWithoutExtension(FilePath); Directory.CreateDirectory(directory); string fileName = directory + "\\" + i + "." + HeaderList.GetExtensionFromBuffer(buffer); using (BinaryWriter writer = new BinaryWriter(new FileStream(fileName, FileMode.Create))) { writer.Write(buffer); } Files.Add(HeaderList.GetTypeFromFile(fileName)); lastOffset = indices[i] + 64; } } }
private void decompress_Mode(byte[] buffer, byte mode, ushort windowSize) { CircularBuffer circularBuffer = new CircularBuffer(windowSize); string outputPath = FilePath + ".OUT"; using (BinaryWriter writer = new BinaryWriter(new FileStream(outputPath, FileMode.Create))) { writer.Write(buffer, 0, 1); circularBuffer.AddData(new byte[] { buffer[0] }); for (int i = 1; i < buffer.Length; i++) { bool[] flags = GetFlags(buffer[i]); for (int j = 7; j >= 0; j--) { if (flags[j]) { byte[] wordBytes = new byte[2]; Array.Copy(buffer, ++i, wordBytes, 0, 2); CompressedWord word = new CompressedWord(wordBytes, mode); byte[] result = circularBuffer.GetData(word.Offset, word.Length); i++; writer.Write(result, 0, result.Length); } else { if (i < buffer.Length - 1) { writer.Write(buffer, ++i, 1); circularBuffer.AddData(new byte[] { buffer[i] }); } } if (writer.BaseStream.Length >= LZSSHeader.UncompressedSize) { break; } } if (writer.BaseStream.Length >= LZSSHeader.UncompressedSize) { break; } } } DecompressedFile = HeaderList.GetTypeFromFile(outputPath); string headerPath = Path.Combine(Path.GetDirectoryName(FilePath), Path.GetFileName(FilePath) + ".HEADER"); using (BinaryWriter writer = new BinaryWriter(new FileStream(headerPath, FileMode.Create))) { writer.Write(LZSSHeader.GetBytes()); } HeaderFile = new BaseFile(headerPath); }
public BaseFile GetFile(string filePath) { if (String.IsNullOrEmpty(filePath)) { return(null); } string extension = Path.GetExtension(filePath).ToUpper(); if (extension == ".BIN") { if (Path.GetFileName(filePath) == "FONT.BIN") { return(new FONTFile(filePath)); } return(new BaseFile(filePath)); } return(HeaderList.GetTypeFromFile(filePath)); }
private void decompress_Mode0(byte[] buffer) { string outputPath = FilePath + ".OUT"; using (BinaryWriter writer = new BinaryWriter(new FileStream(outputPath, FileMode.Create))) { writer.Write(buffer, 0, (int)LZSSHeader.UncompressedSize); } DecompressedFile = HeaderList.GetTypeFromFile(outputPath); string headerPath = Path.Combine(Path.GetDirectoryName(FilePath), Path.GetFileName(FilePath) + ".HEADER"); using (BinaryWriter writer = new BinaryWriter(new FileStream(headerPath, FileMode.Create))) { writer.Write(LZSSHeader.GetBytes()); } HeaderFile = new BaseFile(headerPath); }
/// <summary> /// Unpacks all the files inside the PB file into a folder. /// </summary> public void Unpack() { Files.Clear(); int index = 0; using (BinaryReader reader = new BinaryReader(new FileStream(FilePath, FileMode.Open))) { reader.BaseStream.Seek(8, SeekOrigin.Begin); while (reader.BaseStream.Length != reader.BaseStream.Position) { byte[] headerBytes = reader.ReadBytes(17); PBFileHeader header = new PBFileHeader(headerBytes); if (header.Length == 0x00F7FFFF) { return; } byte[] buffer = reader.ReadBytes(header.Length - 17); string directory = Path.GetDirectoryName(FilePath) + "\\" + Path.GetFileNameWithoutExtension(FilePath); Directory.CreateDirectory(directory); string fileName = directory + "\\" + index + "." + HeaderList.GetExtensionFromBuffer(buffer); using (BinaryWriter writer = new BinaryWriter(new FileStream(fileName, FileMode.Create))) { writer.Write(buffer); } Files.Add(new PBFileEntry(header, HeaderList.GetTypeFromFile(fileName))); index++; } } foreach (PBFileEntry file in Files) { if (file.File.GetType() == typeof(LZBFile)) { LZBFile lzb = (LZBFile)file.File; lzb.Decompress(); } } }