Example #1
0
        public void CreateWithStream()
        {
            using (var db = StringDatabase.Create(new MemoryStream()))
            {
                Insert(db);

                db.Should()
                .BeOfType <TransformDatabase <byte[], byte[], string, string> >();
            }
        }
Example #2
0
        public void CreateWithStreamAndVersion(StringDBVersion version)
        {
            using (var db = StringDatabase.Create(new MemoryStream(), version, false))
            {
                Insert(db);

                db.Should()
                .BeOfType <TransformDatabase <byte[], byte[], string, string> >();
            }
        }
Example #3
0
        public void Create()
        {
            using (var db = StringDatabase.Create())
            {
                Insert(db);

                db.Should()
                .BeOfType <MemoryDatabase <string, string> >();
            }
        }
Example #4
0
        public static long GetSizeAfter(int kvps, Action <IDatabase <string, string>, int> action)
        {
            using (var ms = new MemoryStream())
                using (var db = StringDatabase.Create(ms))
                {
                    action(db, kvps);

                    return(ms.Length);
                }
        }
        public void CreateWithStreamAndVersion(StringDBVersions version)
        {
            using (var db = StringDatabase.Create(new MemoryStream(), version, false))
            {
                db.Insert("init", "Hello, World!");
                db.Get("init").Should().Be("Hello, World!");

                db.Should()
                .BeOfType <TransformDatabase <byte[], byte[], string, string> >();
            }
        }
        public void Create()
        {
            using (var db = StringDatabase.Create())
            {
                db.Insert("init", "Hello, World!");
                db.Get("init").Should().Be("Hello, World!");

                db.Should()
                .BeOfType <MemoryDatabase <string, string> >();
            }
        }
        /// <summary>
        /// Initializes the <see cref="PresentationStrings"/> type.
        /// </summary>
        static PresentationStrings()
        {
            var asm = Assembly.GetExecutingAssembly();

            using (var stream = asm.GetManifestResourceStream("Ultraviolet.Presentation.Resources.Strings.xml"))
            {
                StringDatabase.LoadFromStream(stream);
            }
            using (var stream = asm.GetManifestResourceStream("Ultraviolet.Presentation.Resources.Commands.xml"))
            {
                StringDatabase.LoadFromStream(stream);
            }
        }
Example #8
0
        public static long GetSizeAfter(int times, Action <IDatabase <string, string> > action)
        {
            using (var ms = new MemoryStream())
                using (var db = StringDatabase.Create(ms))
                {
                    for (var i = 0; i < times; i++)
                    {
                        action(db);
                    }

                    return(ms.Length);
                }
        }
Example #9
0
        private static void Main()
        {
            // this is the most simplest way to use StringDB
            // this creates a database in RAM
            using (var db = StringDatabase.Create())
            {
                // we can insert stuff
                db.Insert("key", "Hello, World!");

                // get that value
                var value = db.Get("key");

                // write it to the console
                Console.WriteLine(value);
            }
        }
Example #10
0
            public void IntegrationTest()
            {
                if (File.Exists("stringdb.db"))
                {
                    File.Delete("stringdb.db");
                }

                using (var db = StringDatabase.Create(File.Open("stringdb.db", FileMode.OpenOrCreate)))
                {
                    db.Insert("test", "value");
                    db.Insert("test", "value2");
                    db.Insert("test", "value3");

                    db.EnumerateAggressively(3)
                    .Should().BeEquivalentTo(new[]
                    {
                        new KeyValuePair <string, string>("test", "value"),
                        new KeyValuePair <string, string>("test", "value2"),
                        new KeyValuePair <string, string>("test", "value3"),
                    });
                }

                using (var db = StringDatabase.Create(File.Open("stringdb.db", FileMode.OpenOrCreate)))
                {
                    db.Insert("test", "value4");

                    db.EnumerateAggressively(3)
                    .Should().BeEquivalentTo(new[]
                    {
                        new KeyValuePair <string, string>("test", "value"),
                        new KeyValuePair <string, string>("test", "value2"),
                        new KeyValuePair <string, string>("test", "value3"),
                        new KeyValuePair <string, string>("test", "value4")
                    });
                }
            }
Example #11
0
 public CodeParser(Databases dtbs, IndentationManager oldIndentation)
 {
     fdtb = dtbs.fdtb;
     cdtb = dtbs.cdtb;
     sdtb = dtbs.sdtb;
     indent = oldIndentation;
     block = new CodeBlock();
 }
Example #12
0
        // Insert CAT file to csv
        static void InsertCatFile(string catFile, string csvFile)
        {
            Console.WriteLine($"Processing {catFile}...");
            CleanTrados(catFile);
            string[] catStrings = File.ReadAllLines(catFile, Encoding.UTF8);

            var stringDb = new List <StringDatabase>();

            using (var reader = new StreamReader(csvFile, Encoding.GetEncoding("shift-jis")))
            {
                using (var csv = new CsvReader(reader))
                {
                    csv.Configuration.Delimiter         = "\t";
                    csv.Configuration.IgnoreQuotes      = true;
                    csv.Configuration.MissingFieldFound = null;
                    csv.Read();
                    csv.ReadHeader();
                    while (csv.Read())
                    {
                        var record = new StringDatabase
                        {
                            Offset  = csv.GetField <UInt32>("Offset"),
                            Hash    = csv.GetField <UInt32>("Hash"),
                            eString = csv.GetField("eString"),
                            jString = csv.GetField("jString")
                        };
                        stringDb.Add(record);
                    }
                }
            }

            // Copy catStrings to new db
            for (int i = 0; i < stringDb.Count; i++)
            {
                Console.Write($"\rUpdating entry {i + 1}/{stringDb.Count}");
                if (stringDb[i].jString != catStrings[i])
                {
                    stringDb[i].eString = catStrings[i];
                }
                // Allow for deletions
                else if (stringDb[i].jString == catStrings[i] && stringDb[i].eString != "")
                {
                    stringDb[i].eString = "";
                }
            }
            Console.WriteLine();

            // Using this approach because csvHelper would always escape some strings which might mess up in-game when copy-pasting where required
            string fileName = "csv\\" + Path.GetFileName(csvFile);

            //string fileName = "test.csv";
            if (File.Exists(fileName))
            {
                File.Delete(fileName);
            }
            StreamWriter txtOutput = new StreamWriter(fileName, true, Encoding.GetEncoding("shift-jis"));

            txtOutput.WriteLine("Offset\tHash\tjString\teString");
            foreach (var obj in stringDb)
            {
                txtOutput.WriteLine($"{obj.Offset}\t{obj.Hash}\t{obj.jString}\t{obj.eString}");
            }
            txtOutput.Close();

            if (!Directory.Exists("backup"))
            {
                Directory.CreateDirectory("backup");
            }
            File.Move(catFile, $"backup\\{Path.GetFileNameWithoutExtension(catFile)}_{DateTime.Now.ToString("yyyyMMdd_HHmm")}.txt");
        }
Example #13
0
        // Merge old and updated csvs
        static void Merge(string oldCsv, string newCsv)
        {
            // Read csv
            var stringDbOld = new List <StringDatabase>();

            using (var reader = new StreamReader(oldCsv, Encoding.GetEncoding("shift-jis")))
            {
                using (var csv = new CsvReader(reader))
                {
                    csv.Configuration.Delimiter         = "\t";
                    csv.Configuration.IgnoreQuotes      = true;
                    csv.Configuration.MissingFieldFound = null;
                    csv.Read();
                    csv.ReadHeader();
                    while (csv.Read())
                    {
                        var record = new StringDatabase
                        {
                            Hash    = csv.GetField <UInt32>("Hash"),
                            eString = csv.GetField("eString")
                        };
                        stringDbOld.Add(record);
                    }
                }
            }

            var stringDbNew = new List <StringDatabase>();

            using (var reader = new StreamReader(newCsv, Encoding.GetEncoding("shift-jis")))
            {
                using (var csv = new CsvReader(reader))
                {
                    csv.Configuration.Delimiter         = "\t";
                    csv.Configuration.IgnoreQuotes      = true;
                    csv.Configuration.MissingFieldFound = null;
                    csv.Read();
                    csv.ReadHeader();
                    while (csv.Read())
                    {
                        var record = new StringDatabase
                        {
                            Offset  = csv.GetField <UInt32>("Offset"),
                            Hash    = csv.GetField <UInt32>("Hash"),
                            eString = csv.GetField("eString"),
                            jString = csv.GetField("jString")
                        };
                        stringDbNew.Add(record);
                    }
                }
            }

            // Copy eStrings to new db
            for (int i = 0; i < stringDbOld.Count; i++)
            {
                Console.Write($"\rUpdating entry {i+1}/{stringDbOld.Count}");
                if (stringDbOld[i].eString != "")
                {
                    var matchedNewObjs = stringDbNew.Where(x => x.Hash.Equals(stringDbOld[i].Hash));
                    if (matchedNewObjs.Count() > 0)
                    {
                        foreach (var obj in matchedNewObjs)
                        {
                            obj.eString = stringDbOld[i].eString;
                        }
                    }
                }
            }
            Console.WriteLine();

            // Using this approach because csvHelper would always escape some strings which might mess up in-game when copy-pasting where required
            string fileName = "csv\\" + Path.GetFileName(oldCsv);

            if (File.Exists(fileName))
            {
                File.Delete(fileName);
            }
            StreamWriter txtOutput = new StreamWriter(fileName, true, Encoding.GetEncoding("shift-jis"));

            txtOutput.WriteLine("Offset\tHash\tjString\teString");
            foreach (var obj in stringDbNew)
            {
                txtOutput.WriteLine($"{obj.Offset}\t{obj.Hash}\t{obj.jString}\t{obj.eString}");
            }
            txtOutput.Close();
            File.Delete(newCsv);
        }
Example #14
0
        // Append translations and update pointers
        static void InsertStrings(string inputFile, string inputCsv)
        {
            Console.WriteLine($"Processing {inputFile}...");
            byte[] inputArray = File.ReadAllBytes(inputFile);

            // Read csv
            var stringDatabase = new List <StringDatabase>();

            using (var reader = new StreamReader(inputCsv, Encoding.GetEncoding("shift-jis")))
            {
                using (var csv = new CsvReader(reader))
                {
                    csv.Configuration.Delimiter         = "\t";
                    csv.Configuration.IgnoreQuotes      = true;
                    csv.Configuration.MissingFieldFound = null;
                    csv.Read();
                    csv.ReadHeader();
                    while (csv.Read())
                    {
                        var record = new StringDatabase
                        {
                            Offset  = csv.GetField <UInt32>("Offset"),
                            Hash    = csv.GetField <UInt32>("Hash"),
                            eString = csv.GetField("eString").
                                      Replace("<TAB>", "\t").     // Replace tab
                                      Replace("<CLINE>", "\r\n"). // Replace carriage return
                                      Replace("<NLINE>", "\n")    // Replace new line
                        };
                        stringDatabase.Add(record);
                    }
                }
            }

            // Get info for translation array and get all offsets that need to be remapped
            List <UInt32> eStringsOffsets = new List <uint>();
            List <Int32>  eStringLengths  = new List <int>();

            foreach (var obj in stringDatabase)
            {
                if (obj.eString != "")
                {
                    eStringsOffsets.Add(obj.Offset);
                    eStringLengths.Add(GetNullterminatedStringLength(obj.eString));
                }
            }
            int eStringsLength = eStringLengths.Sum();
            int eStringsCount  = eStringLengths.Count;

            // Create dictionary with offset replacements
            Dictionary <int, int> offsetDict = new Dictionary <int, int>();

            for (int i = 0; i < eStringsCount; i++)
            {
                offsetDict.Add((int)eStringsOffsets[i], inputArray.Length + eStringLengths.Take(i).Sum());
            }

            if (verbose)
            {
                Console.WriteLine($"Filling array of size {eStringsLength.ToString("X8")}...");
            }
            byte[] eStringsArray = new byte[eStringsLength];
            for (int i = 0, j = 0; i < stringDatabase.Count; i++)
            {
                if (stringDatabase[i].eString != "")
                {
                    // Write string to string array
                    int test = eStringLengths.Take(j).Sum();
                    if (verbose)
                    {
                        Console.WriteLine($"String: '{stringDatabase[i].eString}', Length: {eStringLengths[j] - 1}");
                    }
                    byte[] eStringArray = Encoding.GetEncoding("shift-jis").GetBytes(stringDatabase[i].eString);
                    Array.Copy(eStringArray, 0, eStringsArray, eStringLengths.Take(j).Sum(), eStringLengths[j] - 1);
                    j++;
                }
            }

            // Replace offsets in binary file
            for (int p = 0; p < inputArray.Length; p += 4)
            {
                if (p + 4 > inputArray.Length)
                {
                    continue;
                }
                int cur = BitConverter.ToInt32(inputArray, p);
                if (offsetDict.ContainsKey(cur) && p > 10000)
                {
                    int    replacement = 0; offsetDict.TryGetValue(cur, out replacement);
                    byte[] newPointer  = BitConverter.GetBytes(replacement);
                    for (int w = 0; w < 4; w++)
                    {
                        inputArray[p + w] = newPointer[w];
                    }
                }
            }

            // Combine arrays
            byte[] outputArray = new byte[inputArray.Length + eStringsLength];
            Array.Copy(inputArray, outputArray, inputArray.Length);
            Array.Copy(eStringsArray, 0, outputArray, inputArray.Length, eStringsArray.Length);

            // Output file
            Directory.CreateDirectory("output");
            string outputFile = $"output\\{Path.GetFileName(inputFile)}";

            File.WriteAllBytes(outputFile, outputArray);

            // Pack with jpk type 0 and encrypt file with ecd
            Pack.JPKEncode(0, outputFile, outputFile, 15);
            byte[] buffer     = File.ReadAllBytes(outputFile);
            byte[] bufferMeta = File.ReadAllBytes($"{outputFile}.meta");
            buffer = Crypto.encEcd(buffer, bufferMeta);
            File.WriteAllBytes(outputFile, buffer);

            // Update list
            string updEntry = Helpers.GetUpdateEntry(outputFile);

            UpdateList(updEntry);

            // Upload to ftp
            FileUploadSFTP(buffer, $"/var/www/html/mhfo/dat/{Path.GetFileName(inputFile)}");
        }
Example #15
0
 public Writer(Databases dtbs)
 {
     cdtb = dtbs.cdtb;
     fdtb = cdtb.functionDatabase;
     sdtb = dtbs.sdtb;
     this.dtbs = dtbs;
 }
Example #16
0
 private CodeParser(ClassDatabase cdtb, FunctionDatabase fdtb, StringDatabase sdtb, IndentationManager indentation, Dictionary<string, LocalVariable> loc)
 {
     this.cdtb = cdtb;
     this.sdtb = sdtb;
     this.fdtb = fdtb;
     indent = indentation;
     locals = loc;
     block = new CodeBlock();
 }
Example #17
0
        public CodeParser(Databases databases, Function f, IndentationManager lastIndentation)
        {
            fdtb = databases.fdtb;
            cdtb = databases.cdtb;
            sdtb = databases.sdtb;
            indent = lastIndentation;

            int offset = f is LocalFunction ? 1 : 0;

            foreach (Argument a in f.arguments)
            {
                if (!a.isSelfArgument())
                {
                    locals[a.name] = new LocalVariable(locals.Count+offset, a.type);
                }
            }

            if (f is LocalFunction) {
                Argument selfArgument = f.arguments.First((x => x.isSelfArgument()));
                locals[selfArgument.name]=new LocalVariable(0, selfArgument.type);
            }
            #if DEBUG
            Console.WriteLine("Locals are: " + locals.toAdvancedString());
            #endif
            block = new CodeBlock();
        }