Beispiel #1
0
        protected void ExtractSvo(string SvoPath)
        {
            //try
            //{
            using (var _SvoStream = File.OpenRead(SvoPath))
            {
                Stream SvoStream  = _SvoStream;
                int    Compressed = TalesCompression.DetectVersion(SvoStream.Slice().ReadBytes(16), SvoStream.Length);
                if (Compressed >= 0)
                {
                    SvoStream = TalesCompression.DecompressStream(SvoStream);
                }

                if (SvoStream.SliceWithLength().ReadString(7) == "TO8SCEL")
                {
                    var TO8SCEL = new TO8SCEL(SvoStream);

                    foreach (var Entry in TO8SCEL)
                    {
                        Console.WriteLine("{0} ... Start: {1}, End: {2}, Length: {3}", Entry.Index, Entry.EntryStruct.Offset, Entry.EntryStruct.Offset + Entry.EntryStruct.LengthCompressed, Entry.EntryStruct.LengthCompressed);
                    }
                }
                else
                {
                    var FPS4 = new FPS4(SvoStream);

                    Console.WriteLine("{0}", FPS4);

                    foreach (var Entry in FPS4)
                    {
                        Console.WriteLine("{0} ... Start: {1}, End: {2}, Length: {3}", Entry.Name, Entry.EntryStruct.Offset, Entry.EntryStruct.Offset + Entry.EntryStruct.LengthReal, Entry.EntryStruct.LengthReal);
                    }
                }
            }
        }
Beispiel #2
0
        protected void CompressFile(int Version, string UncompressedFile, string CompressedFile = null)
        {
            if (CompressedFile == null)
            {
                CompressedFile = String.Format("{0}.c", UncompressedFile);
            }
            var Compression = TalesCompression.CreateFromVersion(Version);

            if (CompressedFile == UncompressedFile)
            {
                throw (new Exception("Compressed and uncompressed files can't be the same"));
            }

            Console.Write("{0} -> {1}...", UncompressedFile, CompressedFile);

            //var Uncompressed = File.ReadAllBytes(UncompressedFile);
            //TalesCompression.CreateFromVersion(1).EncodeFile();
            //var Compressed = complib.Encode(3, Uncompressed);
            //File.WriteAllBytes(CompressedFile, Compressed);

            var Start = DateTime.UtcNow;

            using (var In = File.OpenRead(UncompressedFile))
                using (var Out = File.Open(CompressedFile, FileMode.Create, FileAccess.Write, FileShare.None))
                {
                    Compression.EncodeFile(In, Out);
                }
            var End = DateTime.UtcNow;

            Console.WriteLine("Ok({0})", (End - Start).TotalSeconds);
            //Console.WriteLine(Version);
        }
Beispiel #3
0
 protected void Init(Stream StreamChatSvoOriginal, Stream StreamChatSvoTranslate, Stream StreamAcmeSkits)
 {
     //TalesCompression = new TalesCompression1_3(3);
     TalesCompression = new TalesCompression15_Lzx();
     PAK       = new FPS4(StreamChatSvoOriginal);
     PAKOutput = StreamChatSvoTranslate;
     ACME1     = new ACME1(StreamAcmeSkits, Encoding.GetEncoding("ISO-8859-1"));
 }
Beispiel #4
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="DatPath"></param>
        /// <param name="DavPath"></param>
        /// <param name="OutputDirectory"></param>
        protected void ExtractSvo2(string DatPath, string DavPath, string OutputDirectory = null)
        {
            if (DavPath == null)
            {
                DavPath = DatPath;
            }

            if (OutputDirectory == null)
            {
                OutputDirectory = DatPath + ".d";
            }

            Console.WriteLine("Loading {0}...", DatPath);
            //try
            //{
            using (var _Stream1 = File.OpenRead(DatPath))
                using (var Stream2 = File.OpenRead(DavPath))
                {
                    var Stream1 = (Stream)_Stream1;
                    try { Directory.CreateDirectory(OutputDirectory); }
                    catch { }

                    int Compressed = TalesCompression.DetectVersion(Stream1.Slice().ReadBytes(16), Stream1.Length);
                    if (Compressed >= 0)
                    {
                        Stream1 = TalesCompression.DecompressStream(Stream1);
                    }

                    if (Stream1.SliceWithLength().ReadString(7) == "TO8SCEL")
                    {
                        var TO8SCEL = new TO8SCEL(Stream1);

                        foreach (var Entry in TO8SCEL)
                        {
                            _ExtractFile(OutputDirectory + "/" + Entry.Index, () => Entry.UncompressedStream, (int)(uint)Entry.EntryStruct.Offset, (int)(uint)Entry.EntryStruct.LengthCompressed);
                        }
                    }
                    else
                    {
                        var FPS4 = new FPS4(Stream1, Stream2);

                        Console.WriteLine("{0}", FPS4);

                        foreach (var Entry in FPS4)
                        {
                            _ExtractFile(OutputDirectory + "/" + Entry.Name, () => Entry.Open(), (int)(uint)Entry.EntryStruct.Offset, (int)(uint)Entry.EntryStruct.LengthReal);
                        }
                    }
                }
            //}
            //catch (Exception Exception)
            //{
            //	Console.Error.WriteLine("{0}", Exception);
            //}
        }
Beispiel #5
0
 public void DecompressStream()
 {
     using (var CompressedStream = File.OpenRead(Utils.TestInputPath + @"\textfile.txt.c1"))
         using (var UncompressedStream = TalesCompression.DecompressStream(CompressedStream))
             using (var OriginalStream = File.OpenRead(Utils.TestInputPath + @"\textfile.txt"))
             {
                 CollectionAssert.AreEqual(
                     OriginalStream.ReadAll(),
                     UncompressedStream.ReadAll()
                     );
             }
 }
Beispiel #6
0
 public void DecompressRecompressStreamIfRequired(Stream CompressedStream, Action <Stream> Action, int RecompressVersion = -1, bool RecompressJustWhenModified = true)
 {
     if (TalesCompression.DetectVersion(CompressedStream.Slice()) == -1)
     {
         Action(CompressedStream);
     }
     else
     {
         using (var UncompressedStream = new DecompressRecompressStream(CompressedStream, RecompressVersion, RecompressJustWhenModified))
         {
             Action(UncompressedStream);
         }
     }
 }
Beispiel #7
0
        private void CompressRooms()
        {
            if (Patcher.TempFS.Exists("scenario_es.dat"))
            {
                return;
            }

            this.Patcher.ProgressHandler.AddProgressLevel("Comprimiendo habitaciones", RoomCount, () =>
            {
                var NewTO8SCEL = new TO8SCEL();

                Patcher.ParallelForeach("Compressing Room", Iterators.IntRange(0, RoomCount - 1), (RoomId) => RoomId.ToString(), (RoomId) =>
                {
                    this.Patcher.ProgressHandler.IncrementLevelProgress();

                    var ScenarioTempFileName           = ScenarioTempFileNamePrep + RoomId;
                    var ScenarioTempFileCompressedName = ScenarioTempFileName + ".c";

                    if (Patcher.TempFS.Exists(ScenarioTempFileName))
                    {
                        if (!Patcher.TempFS.Exists(ScenarioTempFileCompressedName))
                        {
                            var UncompressedBytes = Patcher.TempFS.ReadAllBytes(ScenarioTempFileName);
                            var CompressedBytes   = TalesCompression.CreateFromVersion(Patcher.CompressionVersion, Patcher.CompressionVersion).EncodeBytes(UncompressedBytes);
                            Patcher.TempFS.WriteAllBytes(ScenarioTempFileCompressedName, CompressedBytes);
                        }

                        NewTO8SCEL.CreateEntry(
                            RoomId,
                            Patcher.TempFS.OpenFileRead(ScenarioTempFileCompressedName),
                            Patcher.TempFS.OpenFileRead(ScenarioTempFileName)
                            );
                    }
                    else
                    {
                        NewTO8SCEL.CreateEntry(
                            RoomId,
                            new MemoryStream(),
                            new MemoryStream()
                            );
                    }
                });

                Patcher.TempFS.OpenFileCreateScope("scenario_es.dat", (Stream) =>
                {
                    NewTO8SCEL.SaveTo(Stream);
                    Stream.Position = 0;
                });
            });
        }
Beispiel #8
0
 public void DecompressAndRecompressIfRequired(Stream Stream, Action <Stream> Action, int RecompressVersion = -1)
 {
     if (TalesCompression.IsValid(Stream))
     {
         using (var UncompressedStream = new DecompressRecompressStream(Stream, RecompressVersion))
         {
             Action(UncompressedStream);
         }
     }
     else
     {
         Action(Stream);
     }
 }
Beispiel #9
0
        private Stream DecompressIfCompressedStream(Stream FileStream)
        {
            var MagicData = FileStream.Slice().ReadBytesUpTo(0x100);

            // Decompress if compressed
            try
            {
                if (TalesCompression.DetectVersion(MagicData, FileStream.Length) != -1)
                {
                    return(TalesCompression.DecompressStream(FileStream));
                }
            }
            catch
            {
            }

            return(FileStream);
        }
Beispiel #10
0
        protected void CompressFile(int Version, string UncompressedFile)
        {
            try
            {
                var Start         = DateTime.UtcNow;
                var Compression   = TalesCompression.CreateFromVersion(Version);
                var Uncompressed  = File.ReadAllBytes(UncompressedFile);
                var Compressed    = Compression.EncodeBytes(Uncompressed);
                var Uncompressed2 = Compression.DecodeBytes(Compressed);
                if (Uncompressed.Length != Uncompressed2.Length)
                {
                    Console.Error.WriteLine("Length mismatch {0} != {1}", Uncompressed.Length, Uncompressed2.Length);
                }

                var Offsets = new List <int>();
                for (int n = 0; n < Uncompressed.Length; n++)
                {
                    if (Uncompressed[n] != Uncompressed2[n])
                    {
                        Offsets.Add(n);
                    }
                }

                if (Offsets.Count > 0)
                {
                    foreach (var Offset in Offsets.Take(100))
                    {
                        Console.Error.WriteLine(" {0:X8}: {1:X2} != {2:X2}", Offset, Uncompressed[Offset], Uncompressed2[Offset]);
                    }
                    if (Offsets.Count > 100)
                    {
                        Console.WriteLine(" ...");
                    }
                    throw (new Exception(String.Format("Mismatches: [{0}], {1}", String.Join(",", Offsets.Take(100)), Offsets.Count)));
                }

                var End = DateTime.UtcNow;
                Console.WriteLine("Ok({0})", (End - Start).TotalSeconds);
            }
            catch (Exception Exception)
            {
                Console.WriteLine("Error({0})", Exception);
            }
        }
Beispiel #11
0
        public void HandleBattlePackDialogs(Stream OldStream, Stream NewStream)
        {
            FPS4 OldFps4;
            FPS4 NewFps4;

            OldFps4 = new FPS4(OldStream.Slice());
            NewFps4 = new FPS4(OldStream.Slice()); // Intended OldStream

            var TranslatedFiles = new ConcurrentDictionary <string, MemoryStream>();

            var Names = new[]
            {
                "BTL_EP_0070_010", "BTL_EP_030_040", "BTL_EP_030_080", "BTL_EP_0950_010",
                "BTL_EP_0960_020", "BTL_EP_1040_020", "BTL_EP_150_170", "BTL_EP_170_050",
                "BTL_EP_210_090", "BTL_EP_270_110", "BTL_EP_270_110_1", "BTL_EP_340_070",
                "BTL_EP_370_050", "BTL_EP_420_080", "BTL_EP_440_040", "BTL_EP_470_030",
                "BTL_EP_490_060_0", "BTL_EP_490_060_1", "BTL_EP_510_050", "BTL_EP_510_080",
                "BTL_EP_640_050", "BTL_EP_650_030", "BTL_EP_650_050", "BTL_LL_MONSTER",
                "MA_VAL_A_05",
            };

            Patcher.Action("Translating Battle Scripts", () =>
            {
                Patcher.ProgressHandler.AddProgressLevel("Traduciendo scripts de batalla...", Names.Length, () =>
                {
                    Patcher.ParallelForeach("Translating", Names, (Name) => Name, (Name) =>
                    {
                        using (var CompressedTssStream = OldFps4[Name].Open())
                        {
                            using (var TssStream = TalesCompression.DecompressStream(CompressedTssStream))
                            {
                                var TssName = Name;
                                var Tss     = new TSS().Load(TssStream);
                                Tss.TranslateTexts((Entry) =>
                                {
                                    //if (Entry == null) return;
                                    var TranslationEntry = Patcher.EntriesByRoom["battle/" + TssName][String.Format("{0:X8}", Entry.Id2)];

                                    int TextCount = Entry.Original.Length;

                                    Entry.TranslateWithTranslationEntry(TranslationEntry);

                                    //Console.WriteLine("{0} : {1}", Entry.Translated[1], TranslationEntry.texts.es[1]);
                                }, (String) =>
                                {
                                    return(null);
                                });

                                var TranslatedCompressedStream = TalesCompression.CreateFromVersion(Patcher.CompressionVersion, Patcher.CompressionFallback).EncodeFile(Tss.Save());

                                TranslatedFiles[Name] = TranslatedCompressedStream;
                            }
                        }
                        Patcher.ProgressHandler.IncrementLevelProgress();
                    });
                });
            });

            Patcher.Action("Reconstructing Battle Scripts Package", () =>
            {
                NewFps4.ClearAllEntries();
                foreach (var Entry in OldFps4.Entries.Values)
                {
                    var EntryName = Entry.Name;
                    if (TranslatedFiles.ContainsKey(EntryName))
                    {
                        NewFps4.CreateEntry(EntryName, TranslatedFiles[EntryName]);
                    }
                    else
                    {
                        NewFps4.CreateEntry(EntryName, Entry.Open());
                    }
                }

                NewFps4.SaveTo(NewStream, DoAlign: false);
            });
        }
Beispiel #12
0
        protected void DecompressFile(string CompressedFile, string UncompressedFile = null)
        {
            if (CompressedFile.Contains('*'))
            {
                var BaseDirectory = Path.GetDirectoryName(CompressedFile);
                if (BaseDirectory == "")
                {
                    BaseDirectory = ".";
                }

                if (UncompressedFile != null)
                {
                    if (!Directory.Exists(UncompressedFile))
                    {
                        Directory.CreateDirectory(UncompressedFile);
                    }
                }

                foreach (var CompressedFile2 in Directory.EnumerateFiles(BaseDirectory, Path.GetFileName(CompressedFile)))
                {
                    var BaseName = Path.GetFileName(CompressedFile2);

                    if (UncompressedFile == null)
                    {
                        DecompressFile(CompressedFile2, null);
                    }
                    else
                    {
                        var Out = UncompressedFile + Path.DirectorySeparatorChar + BaseName + ".u";
                        DecompressFile(CompressedFile2, Out);
                    }
                }

                return;
            }

            if (UncompressedFile == null)
            {
                UncompressedFile = CompressedFile + ".u";
            }
            if (CompressedFile == UncompressedFile)
            {
                throw(new Exception("Compressed and uncompressed files can't be the same"));
            }

            Console.Write("{0} -> {1}...", CompressedFile, UncompressedFile);

            try
            {
                var Start = DateTime.UtcNow;
                using (var CompressedStream = File.OpenRead(CompressedFile))
                    using (var UncompressedStream = File.Open(UncompressedFile, FileMode.Create, FileAccess.Write, FileShare.None))
                    {
                        var Compression = TalesCompression.CreateFromStart(CompressedStream.Slice().ReadBytes(0x10), CompressedStream.Length);
                        Compression.DecodeFile(CompressedStream, UncompressedStream);
                    }
                var End = DateTime.UtcNow;
                Console.WriteLine("Ok({0})", (End - Start).TotalSeconds);
            }
            catch (Exception Exception)
            {
                Console.WriteLine("Error({0})", Exception.Message);
            }
        }
Beispiel #13
0
        private void Handle1()
        {
            Patcher.TempFS.CreateDirectory("CHAT_ES", 0777, false);

            Patcher.Action("Translating Skits...", () =>
            {
                Patcher.ProgressHandler.AddProgressLevel("Traduciendo skits", OriginalChatSvo.Count(), () =>
                {
                    Patcher.ParallelForeach("Translating", OriginalChatSvo, (ChatSvoEntry) => ChatSvoEntry.Name, (ChatSvoEntry) =>
                    {
                        var Match = ChatSvoEntry.Name.RegexMatch(@"^(VC\d+B?)(UK)\.DAT$");
                        if (Match != null)
                        {
                            var CompleteFile = Match[0].Value;
                            var ChatId       = Match[1].Value;
                            var EsFile       = PreppendTempFile + ChatId + "ES.DAT";

                            Console.WriteLine("{0}...", ChatId);

                            if (!Patcher.TempFS.Exists(EsFile))
                            {
                                var Fps4 = new FPS4(TalesCompression.DecompressStream(OriginalChatSvo[CompleteFile].Open()));
                                {
                                    var Chtx = new TO8CHTX();
                                    Chtx.Load(Fps4["3"].Open());
                                    // Translate
                                    {
                                        foreach (var Entry in Patcher.EntriesByRoom["skits/" + ChatId].Values)
                                        {
                                            int TextId = int.Parse(Entry.text_id) - 1;
                                            if (TextId >= 0)
                                            {
                                                //Chtx[TextId].Title = "";
                                                //Chtx[TextId].Title = TextProcessor.Instance.ProcessAndDetectPitfalls(Chtx[TextId].Title, Entry.texts.es[0].TrimEnd(' ', '\t', '\n', '\r', '.'));
                                                //Chtx[TextId].Title = TextProcessor.Instance.ProcessAndDetectPitfalls(Chtx[TextId].Title, Entry.texts.es[0]);
                                                Chtx[TextId].Title          = "";
                                                Chtx[TextId].TextOriginal   = "";
                                                Chtx[TextId].TextTranslated = TextProcessor.Instance.ProcessAndDetectPitfalls(Chtx[TextId].TextTranslated, Entry.texts.es[1]);
                                            }
                                        }
                                    }
                                    //ChtxStream.SetLength(0);
                                    var ChtxStream = new MemoryStream();
                                    Chtx.SaveTo(ChtxStream);
                                    ChtxStream.Position = 0;
                                    Fps4["3"].SetStream(ChtxStream);
                                }
                                Patcher.TempFS.WriteAllBytes(EsFile, TalesCompression.CreateFromVersion(Patcher.CompressionVersion, Patcher.CompressionFallback).EncodeBytes(Fps4.Save(false).ToArray()));
                                Console.WriteLine("{0}...Ok", ChatId);
                            }
                            else
                            {
                                Console.WriteLine("{0}...Exists", ChatId);
                            }
                        }

                        Patcher.ProgressHandler.IncrementLevelProgress();
                    });
                });
            });
        }