private static byte[] InsertDdsHeader(byte[] data, int width, int height, int mipmaps, int format) { using (var ms = new MemoryStream()) using (var output = new ExtendedBinaryWriter(ms)) { output.WriteString("DDS ", false); output.Write(0x0000007C); output.Write(mipmaps > 1 ? 0x000A1007 : 0x00081007); output.Write(height); output.Write(width); output.Write(height * width); // pitch output.Write(0x00000000); output.Write(mipmaps); output.Skip(44); // PixelFormat output.Write(0x00000020); output.Write(0x00000004); output.WriteString(format == 0 ? "DXT1" : "DXT5", false); output.Write(0x00000000); output.Write(0x00000000); output.Write(0x00000000); output.Write(0x00000000); output.Write(0x00000000); output.Write(mipmaps > 1 ? 0x00401008 : 0x00001000); output.Write(0x00000000); output.Write(0x00000000); output.Write(0x00000000); output.Write(0x00000000); output.Write(data); return(ms.ToArray()); } }
private static byte[] AddHeaders(string filename) { var data = System.IO.File.ReadAllBytes(filename); using (var ms = new MemoryStream()) { using (var output = new ExtendedBinaryWriter(ms)) { output.Write(0x58455448); output.Write(data.Length + 0x60); output.Write(0x00000020); output.Write(0x10000004); output.Skip(0x10); output.Write(0x46535448); output.Write(data.Length + 0x20); output.Write(0x00000020); output.Write(0x10000000); output.Write(0x00000001); output.Write(data.Length + 0x20); output.Skip(0x28); output.Write(data); output.Write(0x43464F45); output.Write(0x00000000); output.Write(0x00000020); output.Write(0x10000000); output.Write(0x00000001); output.Skip(0x0C); output.Write(0x43464F45); output.Write(0x00000000); output.Write(0x00000020); output.Write(0x10000000); output.Write(0x00000000); output.Write(0x00000000); output.Write(0x00000000); output.Write(0x00000000); } return(ms.ToArray()); } }
public static void Repack(string inputFolder, string outputPath, bool useCompression) { var logFile = Path.Combine(inputFolder, "Extract_Data.tf"); var dir = Path.GetDirectoryName(outputPath); Directory.CreateDirectory(dir); using (var output = new ExtendedBinaryWriter(new FileStream(outputPath, FileMode.Create), Encoding.UTF8, Endianness.BigEndian)) using (var log = new ExtendedBinaryReader(new FileStream(logFile, FileMode.Open), Encoding.UTF8, Endianness.BigEndian)) { var numFiles = log.ReadInt32(); output.Write((short)numFiles); output.Write(log.ReadBytes(6)); var outputOffset = 0x10 + 0x10 * numFiles; for (var i = 0; i < numFiles; i++) { output.Seek(8 + i * 16, SeekOrigin.Begin); var unknown = log.ReadInt32(); output.Write(unknown); var hasMsg = log.ReadInt32() != 0; var hasRemainder = log.ReadInt32() != 0; if (hasMsg) { var msgFile = Path.Combine(inputFolder, $"{i:0000}.msg"); var msg = File.ReadAllBytes(msgFile); output.Write(outputOffset); var returnPos = output.Position; output.Seek(outputOffset, SeekOrigin.Begin); output.Write(msg); output.WritePadding(0x04); outputOffset = (int)output.Position; output.Seek(returnPos + 4, SeekOrigin.Begin); output.Write((short)msg.Length); output.Seek(-6, SeekOrigin.Current); } else { output.Write(0); output.Skip(4); output.Write((short)0); output.Seek(-6, SeekOrigin.Current); } if (hasRemainder) { var sizeRemainder = log.ReadInt32(); var remainder = log.ReadBytes(sizeRemainder); output.Write(outputOffset); var returnPos = output.Position; output.Seek(outputOffset, SeekOrigin.Begin); output.Write(remainder); output.WritePadding(0x04); outputOffset = (int)output.Position; output.Seek(returnPos + 2, SeekOrigin.Begin); output.Write((short)sizeRemainder); } else { output.Write(0); output.Skip(2); output.Write((short)0); } } } }
public override void Rebuild(string outputFolder) { var outputPath = System.IO.Path.Combine(outputFolder, RelativePath); Directory.CreateDirectory(System.IO.Path.GetDirectoryName(outputPath)); var subtitles = GetSubtitles(); using (var fsInput = new FileStream(Path, FileMode.Open)) using (var input = new ExtendedBinaryReader(fsInput, FileEncoding, Endianness.BigEndian)) using (var fsOutput = new FileStream(outputPath, FileMode.Create)) using (var output = new ExtendedBinaryWriter(fsOutput, FileEncoding, Endianness.BigEndian)) { input.Skip(0x38); var stringsOffset = input.ReadInt32(); input.Seek(0, SeekOrigin.Begin); output.Write(input.ReadBytes(stringsOffset)); Subtitle subtitle; var dict = new Dictionary <long, long>(subtitles.Count); while (input.Position < input.Length) { subtitle = ReadSubtitle(input); var newSubtitle = subtitles.FirstOrDefault(x => x.Offset == subtitle.Offset); if (newSubtitle != null) { dict.Add(subtitle.Offset, output.Position); output.WriteString(newSubtitle.Translation); } } input.Seek(0x10, SeekOrigin.Begin); var count1 = input.ReadInt32(); var offset1 = input.ReadInt32(); input.Skip(8); var count2 = input.ReadInt32(); var offset2 = input.ReadInt32(); input.Seek(offset1, SeekOrigin.Begin); output.Seek(offset1, SeekOrigin.Begin); for (var i = 0; i < count1; i++) { input.Skip(4); output.Skip(4); var stringOffset = input.ReadInt32(); output.Write((int)dict[stringOffset]); input.Skip(16); output.Skip(16); } input.Seek(offset2, SeekOrigin.Begin); output.Seek(offset2, SeekOrigin.Begin); for (var i = 0; i < count2; i++) { var stringOffset = input.ReadInt32(); if (dict.ContainsKey(stringOffset)) { output.Write((int)dict[stringOffset]); } else { output.Skip(4); } } } }
public override void Rebuild(string outputFolder) { var outputPath = System.IO.Path.Combine(outputFolder, RelativePath); Directory.CreateDirectory(System.IO.Path.GetDirectoryName(outputPath)); var subtitles = GetSubtitles(); using (var fsInput = new FileStream(Path, FileMode.Open)) using (var input = new ExtendedBinaryReader(fsInput, FileEncoding)) using (var fsOutput = new FileStream(outputPath, FileMode.Create)) using (var output = new ExtendedBinaryWriter(fsOutput, FileEncoding)) { output.Write(input.ReadBytes(0x20)); // Escribo la cabecera, aunque al final tendré que editarla output.Write(input.ReadInt32()); var stringCount1 = input.ReadInt32(); output.Write(stringCount1); var aux = input.ReadInt32(); output.Write(aux); var stringCount2 = input.ReadInt32(); output.Write(stringCount2); output.Write(input.ReadInt32()); if (aux == 3) { output.Write(input.ReadInt32()); } var language = input.ReadInt32(); output.Write(language); var base1 = input.Position; var base2 = base1 + 4 * stringCount1; var stringsBase = base2 + aux * 4 * stringCount1; var outputOffset = 0; for (var i = 0; i < stringCount1; i++) { input.Seek(base1 + 4 * i, SeekOrigin.Begin); output.Seek(base1 + 4 * i, SeekOrigin.Begin); var index1 = input.ReadInt32(); output.Write(index1); input.Seek(base2 + 4 * index1, SeekOrigin.Begin); output.Seek(base2 + 4 * index1, SeekOrigin.Begin); output.Write(input.ReadInt32()); if (aux == 3) { output.Write(input.ReadInt32()); } var strOffset = input.ReadInt32(); output.Write(outputOffset); input.Seek(stringsBase + strOffset, SeekOrigin.Begin); output.Seek(stringsBase + outputOffset, SeekOrigin.Begin); var originalSize = input.ReadInt32(); var subtitle = ReadSubtitle(input); var outputSubtitle = subtitles.FirstOrDefault(x => x.Offset == subtitle.Offset); if (outputSubtitle != null) { var translationSize = FileEncoding.GetByteCount(outputSubtitle.Translation); output.Write((int)translationSize); WriteSubtitle(output, outputSubtitle, output.Position, false); } else { output.Write(originalSize); WriteSubtitle(output, subtitle, output.Position, false); } output.WritePadding(0x04); outputOffset = (int)(output.Position - stringsBase); } output.WritePadding(0x10); var size = output.Position - 0x20; input.Seek(-0x80, SeekOrigin.End); output.Write(input.ReadBytes(0x80)); output.Seek(0x04, SeekOrigin.Begin); output.Write((int)(size + 0x60)); output.Skip(12); output.Write((int)size); } }