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());
                }
        }
示例#2
0
        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);
                                }
                            }
                        }
        }
示例#5
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))
                    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);
                        }
        }