Beispiel #1
0
        private static string SearchScriptForEvent(BdatStringCollection tables, int id, string filename)
        {
            string s     = "";
            var    lines = File.ReadAllLines(filename);

            int next = FindNextScriptEntry(lines, $"evt_status::change(32, {id}", -3);

            next = FindNextScriptEntry(lines, $"return {next}", -4);
            next = FindNextScriptEntry(lines, $"return {next}", -4);

            for (int i = 0; i < lines.Count(); i++)
            {
                if (lines[i].Contains($"return {next}"))
                {
                    for (int j = 3; j <= 9; j += 3)
                    {
                        if (lines[i - j].Contains("evt_status::judge"))
                        {
                            var args = Array.ConvertAll(lines[i - j].Substring(27).Split(')').FirstOrDefault().Split(','), str => int.Parse(str));
                            if (s.Length > 0)
                            {
                                s += ", ";
                            }
                            s += Conditions.EventJudge(tables, args);
                        }
                    }
                    break;
                }
            }

            return(s);
        }
Beispiel #2
0
        public static string EventJudge(BdatStringCollection tables, int[] args) // EVT_judge, int id, int val=0)
        {
            int EVT_judge = args[0];

            int id = 0;

            if (args.Count() > 1)
            {
                id = args[1];
            }

            int val = 0;

            if (args.Count() > 2)
            {
                val = args[2];
            }

            switch (EVT_judge)
            {
            case 1:
                return($"ScenarioId >= {id}");

            case 15:
                return($"1bit flag {id + 0xc327} == {val}");

            case 26:
                return(ParseGameCond(tables, id));

            default:
                break;
            }

            return("");
        }
Beispiel #3
0
        public static void PrintBdatIndex(BdatStringCollection bdats, string htmlDir)
        {
            var sb = new Indenter(2);

            sb.AppendLine("<!DOCTYPE html>");
            sb.AppendLineAndIncrease("<html>");
            sb.AppendLineAndIncrease("<head>");
            sb.AppendLine("<meta charset=\"utf-8\" />");
            string name = bdats.Game == Game.XB2 ? "2" : "X";

            sb.AppendLine($"<title>Xenoblade {name} Data Tables</title>");
            sb.DecreaseAndAppendLine("</head>");

            sb.AppendLineAndIncrease("<body>");

            IOrderedEnumerable <IGrouping <string, BdatStringTable> > grouped = bdats.Tables.Values.GroupBy(x => x.Filename).OrderBy(x => x.Key ?? "zzz");

            foreach (IGrouping <string, BdatStringTable> group in grouped)
            {
                sb.AppendLine($"<h2>{group.Key ?? "Other"}</h2>");
                string subDir = group.Key ?? string.Empty;
                foreach (BdatStringTable table in group.OrderBy(x => x.Name))
                {
                    string path = Path.Combine(subDir, table.Name) + ".html";
                    sb.AppendLine($"<a href=\"{path}\">{table.Name}</a><br/>");
                }
            }

            sb.DecreaseAndAppendLine("</body>");
            sb.DecreaseAndAppendLine("</html>");

            string filename = Path.Combine(htmlDir, "index.html");

            File.WriteAllText(filename, sb.ToString());
        }
Beispiel #4
0
        public static void PrintIndex(BdatStringCollection bdats, string htmlDir)
        {
            var sb = new Indenter(2);

            sb.AppendLine("<!DOCTYPE html>");
            sb.AppendLineAndIncrease("<html>");
            sb.AppendLineAndIncrease("<head>");
            sb.AppendLine("<meta charset=\"utf-8\" />");
            sb.AppendLine("<title>Xenoblade 2 BDAT Index</title>");
            sb.DecreaseAndAppendLine("</head>");

            sb.AppendLineAndIncrease("<body>");

            var grouped = bdats.Tables.Values.GroupBy(x => x.Filename).OrderBy(x => x.Key ?? "zzz");

            foreach (var group in grouped)
            {
                sb.AppendLine($"<h2>{group.Key ?? "Other"}</h2>");
                var subDir = Path.Combine("bdat", group.Key ?? string.Empty);
                foreach (var table in group.OrderBy(x => x.Name))
                {
                    var path = Path.Combine(subDir, table.Name) + ".html";
                    sb.AppendLine($"<a href=\"{path}\">{table.Name}</a><br/>");
                }
            }

            sb.DecreaseAndAppendLine("</body>");
            sb.DecreaseAndAppendLine("</html>");

            var filename = Path.Combine(htmlDir, "index.html");

            File.WriteAllText(filename, sb.ToString());
        }
Beispiel #5
0
        public static void PrintAllTables(BdatStringCollection bdats, string jsonDir, IProgressReport progress = null)
        {
            progress?.LogMessage("Writing BDAT tables as JSON");
            progress?.SetTotal(bdats.Tables.Count);
            string bdatHtmlDir = Path.Combine(jsonDir, "json");

            Directory.CreateDirectory(bdatHtmlDir);

            foreach (string tableName in bdats.Tables.Keys)
            {
                string outDir        = bdatHtmlDir;
                string tableFilename = bdats[tableName].Filename;

                string json = PrintTable(bdats[tableName]);

                if (tableFilename != null)
                {
                    outDir = Path.Combine(outDir, tableFilename);
                }

                string filename = Path.Combine(outDir, tableName + ".json");
                Directory.CreateDirectory(outDir);
                File.WriteAllText(filename, json);
                progress?.ReportAdd(1);
            }
        }
        private static void ReadBdat(byte[] file, BdatStringCollection tables, string filename)
        {
            if (file.Length <= 12)
            {
                throw new InvalidDataException("File is too short");
            }
            int fileLength = BitConverter.ToInt32(file, 4);

            if (file.Length != fileLength)
            {
                throw new InvalidDataException("Incorrect file length field");
            }

            BdatTools.DecryptBdat(file);

            int tableCount = BitConverter.ToInt32(file, 0);

            for (int i = 0; i < tableCount; i++)
            {
                int offset = BitConverter.ToInt32(file, 8 + 4 * i);
                var table  = ReadTable(file, offset);
                if (table == null)
                {
                    continue;
                }
                if (tableCount > 1)
                {
                    table.Filename = filename;
                }
                tables.Add(table);
            }
        }
Beispiel #7
0
        private static void GiveMaps(Options options)
        {
            if (options.Input == null)
            {
                throw new NullReferenceException("No input file was specified.");
            }
            if (options.BdatDir == null)
            {
                throw new NullReferenceException("No bdat dir was specified.");
            }
            if (options.Output == null)
            {
                throw new NullReferenceException("No output dir was specified.");
            }
            if (options.Game != Game.XB1DE)
            {
                throw new NotImplementedException("Xb Definitive Edition only.");
            }
            if (!Directory.Exists(options.Input))
            {
                throw new DirectoryNotFoundException($"{options.Input} is not a valid directory.");
            }

            BdatStringCollection tables = GetBdatStringCollection(options);

            Xbde.Maps.ReadMap(tables, options);
        }
Beispiel #8
0
        private static BdatStringCollection DeserializeBdatStringArchive(string arhFilename, string ardFilename)
        {
            var header  = File.ReadAllBytes(arhFilename);
            var archive = new FileArchive(header, ardFilename);

            var files     = new List <byte[]>();
            var fileNames = new List <string>();

            files.Add(archive.ReadFile("/bdat/common.bdat"));
            fileNames.Add(Path.GetFileNameWithoutExtension("common.bdat"));
            files.Add(archive.ReadFile("/bdat/common_gmk.bdat"));
            fileNames.Add(Path.GetFileNameWithoutExtension("common_gmk.bdat"));
            foreach (var file in archive.GetChildFileInfos("/bdat/gb/"))
            {
                byte[] bdat = archive.ReadFile(file);
                if (bdat == null)
                {
                    continue;
                }
                files.Add(bdat);
                fileNames.Add(Path.GetFileNameWithoutExtension(file.Filename));
            }

            BdatStringCollection tables = DeserializeStrings.ReadBdats(files.ToArray(), fileNames.ToArray());

            return(tables);
        }
Beispiel #9
0
        private static void FindInnEvents(Options options)
        {
            BdatStringCollection tables = GetBdatStringCollection(options);

            HeartToHeart.PrintH2Hs(tables);
            //HeartToHeart.FindInnEvents(tables);
        }
Beispiel #10
0
        public static string ParseGameCond(BdatStringCollection tables, int condId)
        {
            var    condition = tables.Tables["FLD_ConditionList"].Items.FirstOrDefault(x => x.Id == condId);
            string s         = "";

            for (int i = 0; i < 8; i++)
            {
                var conditionType  = int.Parse(condition[$"ConditionType{i + 1}"].ValueString);
                var conditionEntry = condition[$"Condition{i+1}"];
                if (conditionType == 0)
                {
                    continue;
                }
                if (i >= 1)
                {
                    s += ", ";
                }
                switch ((ConditionType)conditionType)
                {
                case ConditionType.Party:
                    s += ParsePartyCond(conditionEntry.Reference);
                    break;

                case ConditionType.Scenario:
                    s += ParseScenarioCond(conditionEntry.Reference);
                    break;

                case ConditionType.Achievement:
                    s += ParseAchievementCond(conditionEntry.Reference);
                    break;

                case ConditionType.Quest:
                    s += ParseQuestCond(conditionEntry.Reference);
                    break;

                case ConditionType.Item:
                    s += ParseItemCond(conditionEntry.Reference);
                    break;

                case ConditionType.Flag:
                    s += ParseFlagCond(conditionEntry.Reference);
                    break;

                case ConditionType.FieldSkill:
                    s += ParseFskillCond(conditionEntry.Reference);
                    break;

                case ConditionType.Environment:
                    s += ParseEnvCond(conditionEntry.Reference);
                    break;

                default:
                    Console.WriteLine($"unhandled condition type: {conditionType.ToString()}");
                    break;
                }
            }

            return(s);
        }
Beispiel #11
0
        private static void SearchScripts(BdatStringCollection tables)
        {
            var i         = 0;
            var filenames = Directory.GetFiles("../decompiled_scripts/main_game/").Concat(Directory.GetFiles("../decompiled_scripts/aoc/"));

            foreach (var filename in filenames.Where(x => File.ReadAllLines(x).Any(y => y.Contains("evt_status::change(2,"))))
            {
                var line  = File.ReadAllLines(filename).FirstOrDefault(x => x.Contains("evt_status::change(2,"));
                var quest = FindQuestById(tables, int.Parse(line.Split('(')[1].Split(')')[0].Split(',')[1]));
                if (int.Parse(quest["Visible"].ValueString) == 0 || int.Parse(quest["QuestIcon"].ValueString) == 0)
                {
                    continue; // Hidden Task or Unimplemented
                }
                Console.WriteLine(quest["QuestTitle"].DisplayString);
                var sc = new Scripts(filename);
                if (sc.FindPathsTo("evt_status::change(2,") == 0)
                {
                    Console.WriteLine("uh oh");
                }
                sc.PrintPaths();

                string script = Path.GetFileNameWithoutExtension(filename);
                var    evt    = tables.Tables.Where(x => x.Key.Contains("EVT_list")).SelectMany(x => x.Value.Items.Where(y => y.Values.ContainsKey("evtName") && y["evtName"].DisplayString == script)).FirstOrDefault();
                if (evt.ReferencedBy.FirstOrDefault(x => x.Values.ContainsKey("name")) == null)
                {
                    filenames.FirstOrDefault(x => File.ReadAllLines(x).Any(y => y.Contains($"evt_status::change(32, {evt.Id}")));
                    Console.WriteLine();
                }
                else
                {
                    Console.WriteLine(evt.ReferencedBy.FirstOrDefault()["name"].DisplayString);
                }

                //Console.WriteLine(line.FirstOrDefault());
            }
            foreach (var events in tables.Tables.Where(x => x.Key.Contains("EVT_chg")).Select(x => x.Value.Items.Where(y => int.Parse(y["chgType"].ValueString) == 2)))
            {
                foreach (var evt in events)
                {
                    var quest = FindQuestById(tables, int.Parse(evt["id"].ValueString));
                    if (quest == null)
                    {
                        continue;
                    }
                    if (int.Parse(quest["Visible"].ValueString) == 0 || int.Parse(quest["QuestIcon"].ValueString) == 0)
                    {
                        continue; // Hidden Task or Unimplemented
                    }
                    if (evt.ReferencedBy.Count() == 0 || int.Parse(quest["QuestCategory"].ValueString) == 1)
                    {
                        continue;
                    }
                    Console.WriteLine(quest["QuestTitle"].DisplayString);
                    i++;
                }
            }

            Console.WriteLine(i);
        }
Beispiel #12
0
        private static BdatStringCollection GetBdatStringCollection(Options options)
        {
            BdatTables           bdats  = ReadBdatTables(options, true);
            BdatStringCollection tables = DeserializeStrings.DeserializeTables(bdats);

            Metadata.ApplyMetadata(tables);
            return(tables);
        }
Beispiel #13
0
 public static void PrintH2Hs(BdatStringCollection tables)
 {
     foreach (var h2h in tables.Tables["FLD_KizunaTalk"].Items.Where(x => x["name"].DisplayString.Contains("kizuna")))
     {
         int.TryParse(h2h["name"].DisplayString.Substring(7), out int id);
         Console.Write($"{id}\t{h2h["Title"].DisplayString}\t");
         PrintTrust(tables, h2h["EventID"].Reference["evtName"].DisplayString);
         //Console.WriteLine();
     }
 }
Beispiel #14
0
        public static void PrintSeparateTables(BdatStringCollection bdats, string htmlDir, IProgressReport progress = null)
        {
            progress?.LogMessage("Writing BDAT tables as HTML");
            progress?.SetTotal(bdats.Tables.Count);
            string bdatHtmlDir = Path.Combine(htmlDir, "bdat");

            Directory.CreateDirectory(bdatHtmlDir);

            if (bdats.Game == Game.XB2)
            {
                PrintIndex(bdats, htmlDir);
            }
            PrintBdatIndex(bdats, bdatHtmlDir);
            foreach (string tableName in bdats.Tables.Keys)
            {
                string outDir        = bdatHtmlDir;
                string tableFilename = bdats[tableName].Filename;
                string indexPath     = tableFilename == null ? "index.html" : "../index.html";

                var sb = new Indenter(2);
                sb.AppendLine("<!DOCTYPE html>");
                sb.AppendLineAndIncrease("<html>");
                sb.AppendLineAndIncrease("<head>");
                sb.AppendLine("<meta charset=\"utf-8\" />");
                sb.AppendLine($"<title>{tableName}</title>");
                sb.AppendLineAndIncrease("<style>");
                sb.AppendLine(CssSticky);
                sb.AppendLine(CssSortable);
                sb.DecreaseAndAppendLine("</style>");
                sb.DecreaseAndAppendLine("</head>");

                sb.AppendLineAndIncrease("<body>");
                sb.AppendLine($"<a href=\"{indexPath}\">Return to BDAT index</a><br/>");
                sb.AppendLine("<input type=\"button\" value=\"Open all references\" onclick=\"openAll(true)\" />");
                sb.AppendLine("<input type=\"button\" value=\"Close all references\" onclick=\"openAll(false)\" />");
                PrintTable(bdats[tableName], sb);
                sb.AppendLineAndIncrease("<script>");
                sb.AppendLine(JsOpenAll);
                sb.AppendLine(JsSortable);
                sb.AppendLine(JsAnchor);
                sb.DecreaseAndAppendLine("</script>");
                sb.DecreaseAndAppendLine("</body>");
                sb.DecreaseAndAppendLine("</html>");

                if (tableFilename != null)
                {
                    outDir = Path.Combine(outDir, tableFilename);
                }

                string filename = Path.Combine(outDir, tableName + ".html");
                Directory.CreateDirectory(outDir);
                File.WriteAllText(filename, sb.ToString());
                progress?.ReportAdd(1);
            }
        }
        public static BdatStringCollection ReadBdats(byte[][] files, string[] filenames)
        {
            var tables = new BdatStringCollection();

            for (int i = 0; i < files.Length; i++)
            {
                ReadBdat(files[i], tables, filenames[i]);
            }

            return(tables);
        }
Beispiel #16
0
        private static void Bdat2Html(Options options)
        {
            if (options.Output == null)
            {
                throw new NullReferenceException("Output directory was not specified.");
            }

            BdatStringCollection tables = GetBdatStringCollection(options);

            HtmlGen.PrintSeparateTables(tables, options.Output, options.Progress);
        }
Beispiel #17
0
        private static void Bdat2Psql(Options options)
        {
            if (options.Output == null)
            {
                throw new NullReferenceException("Ouput directory (Schema) was not specified.");
            }

            BdatStringCollection tables = GetBdatStringCollection(options);

            DbGen.PrintAllTables(tables, options.Output, options.Progress);
        }
Beispiel #18
0
        public static void GenerateDropTables(BdatStringCollection bdats, string outputFile)
        {
            var enemies = ReadBdatTables(bdats);

            CalculateDropRates(enemies);

            PrintCsv(enemies, $"{outputFile}.csv");

            string html = PrintDropTables(enemies);

            File.WriteAllText(outputFile, html, Encoding.UTF8);
        }
Beispiel #19
0
        public static void ReadQuests(BdatStringCollection tables)
        {
            var story  = tables["FLD_QuestListNormal"].Items.Where(x => x["QuestIcon"].DisplayString != "0" && x["QuestCategory"].DisplayString == "1");
            var normal = tables["FLD_QuestListMini"].Items.Where(x => x["QuestIcon"].DisplayString != "0");

            normal = normal.Concat(tables["FLD_QuestListNormal"].Items.Where(x => x["QuestIcon"].DisplayString != "0" && x["QuestCategory"].DisplayString == "3"));
            var blade        = tables["FLD_QuestListBlade"].Items.Where(x => x["QuestIcon"].DisplayString != "0");
            var torna_story  = tables["FLD_QuestListNormalIra"].Items.Where(x => x["QuestIcon"].DisplayString != "0" && x["QuestCategory"].DisplayString == "1");
            var torna_normal = tables["FLD_QuestListNormalIra"].Items.Where(x => x["QuestIcon"].DisplayString != "0" && x["QuestCategory"].DisplayString == "3");

            //SearchScripts(tables);
            PrintQuests(tables, normal);
        }
Beispiel #20
0
        private static void GenerateDropTables(Options options)
        {
            if (options.BdatDir == null)
            {
                throw new NullReferenceException("No bdat path was specified.");
            }
            if (options.Output == null)
            {
                throw new NullReferenceException("No output path was specified.");
            }

            BdatStringCollection tables = GetBdatStringCollection(options);

            DropTableGen.GenerateDropTables(tables, options.Output);
        }
Beispiel #21
0
        public static BdatStringCollection DeserializeTables(BdatTables tables, IProgressReport progress = null)
        {
            var collection = new BdatStringCollection {
                Bdats = tables
            };

            progress?.LogMessage("Parsing BDAT tables");
            progress?.SetTotal(tables.Tables.Length);

            foreach (BdatTable table in tables.Tables)
            {
                var items = new BdatStringItem[table.ItemCount];

                var stringTable = new BdatStringTable
                {
                    Collection = collection,
                    Name       = table.Name,
                    BaseId     = table.BaseId,
                    Members    = table.Members,
                    Items      = items,
                    Filename   = table.Filename
                };

                if (tables.DisplayFields.TryGetValue(table.Name, out string displayMember))
                {
                    stringTable.DisplayMember = displayMember;
                }

                for (int i = 0; i < table.ItemCount; i++)
                {
                    BdatStringItem item = ReadItem(table, i);
                    item.Table = stringTable;
                    item.Id    = table.BaseId + i;

                    if (displayMember != null)
                    {
                        item.Display = item[displayMember];
                    }

                    items[i] = item;
                }

                collection.Add(stringTable);
                progress?.ReportAdd(1);
            }

            return(collection);
        }
Beispiel #22
0
        public static void PrintIndex(BdatStringCollection bdats, string htmlDir)
        {
            var sb = new Indenter(2);

            sb.AppendLine("<!DOCTYPE html>");
            sb.AppendLineAndIncrease("<html>");
            sb.AppendLineAndIncrease("<head>");
            sb.AppendLine("<meta charset=\"utf-8\" />");
            sb.AppendLine("<title>Xenoblade 2</title>");
            sb.DecreaseAndAppendLine("</head>");

            sb.AppendLineAndIncrease("<body>");
            sb.AppendLine("<h1>Xenoblade 2 data tables</h1>");
            sb.AppendLine($"<p>{IndexText}</p>");
            sb.AppendLine("<a href=\"chbtlrewards.html\">Challenge Battle Rewards</a><br/>");
            sb.AppendLine("<h2><a href=\"bdat\\index.html\">Complete table list</a></h2>");

            string prefix = bdats.Game.ToString().ToLower();

            if (!File.Exists($"{prefix}_tableDisplay.csv"))
            {
                return;
            }
            using (var stream = new FileStream($"{prefix}_tableDisplay.csv", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                using (var reader = new StreamReader(stream))
                {
                    IEnumerable <BdatFriendlyInfo> csv = new CsvReader(reader).GetRecords <BdatFriendlyInfo>();
                    IOrderedEnumerable <IGrouping <string, BdatFriendlyInfo> > grouped = csv.GroupBy(x => x.Group).OrderBy(x => x.Key);

                    foreach (IGrouping <string, BdatFriendlyInfo> group in grouped)
                    {
                        sb.AppendLine($"<h2>{group.Key ?? "Other"}</h2>");

                        foreach (BdatFriendlyInfo tableInfo in group.OrderBy(x => x.Display))
                        {
                            BdatStringTable table = bdats[tableInfo.TableName];
                            string          path  = Path.Combine("bdat", table.Filename ?? "", table.Name) + ".html";
                            sb.AppendLine($"<a href=\"{path}\">{tableInfo.Display}</a><br/>");
                        }
                    }
                }
            sb.DecreaseAndAppendLine("</body>");
            sb.DecreaseAndAppendLine("</html>");

            string filename = Path.Combine(htmlDir, "index.html");

            File.WriteAllText(filename, sb.ToString());
        }
Beispiel #23
0
        private static void BdatToHtmlArchive(string arhFilename, string ardFilename, string htmlDir)
        {
            var watch = Stopwatch.StartNew();
            BdatStringCollection tables = DeserializeBdatStringArchive(arhFilename, ardFilename);

            watch.Stop();
            Console.WriteLine(watch.Elapsed.TotalMilliseconds);

            BdatInfo info = BdatInfoImport.GetBdatInfo(tables);

            BdatStringTools.ProcessReferences(tables, info);

            watch.Restart();
            HtmlGen.OutputHtml(tables, info, htmlDir);
            watch.Stop();
            Console.WriteLine(watch.Elapsed.TotalMilliseconds);
        }
Beispiel #24
0
        private static List <Enemy> ReadBdatTables(BdatStringCollection bdats)
        {
            BdatStringTable enemyTable = bdats.Tables["BTL_enelist"];

            var enemies = new List <Enemy>();

            foreach (BdatStringItem item in enemyTable.Items)
            {
                Enemy enemy = TryGetEnemy(item);

                if (enemy != null)
                {
                    enemies.Add(enemy);
                }
            }

            return(enemies);
        }
Beispiel #25
0
        public static void PrintSeparateTables(BdatStringCollection bdats, BdatInfo info, string htmlDir)
        {
            string bdatHtmlDir = Path.Combine(htmlDir, "bdat");

            Directory.CreateDirectory(htmlDir);

            PrintIndex(bdats, htmlDir);
            foreach (string tableName in bdats.Tables.Keys)
            {
                string outDir        = bdatHtmlDir;
                string tableFilename = bdats[tableName].Filename;
                var    indexPath     = tableFilename == null ? "../index.html" : "../../index.html";

                var sb = new Indenter(2);
                sb.AppendLine("<!DOCTYPE html>");
                sb.AppendLineAndIncrease("<html>");
                sb.AppendLineAndIncrease("<head>");
                sb.AppendLine("<meta charset=\"utf-8\" />");
                sb.AppendLine($"<title>{tableName}</title>");
                sb.AppendLineAndIncrease("<script>");
                sb.AppendLine(JsOpenAll);
                sb.DecreaseAndAppendLine("</script>");
                sb.DecreaseAndAppendLine("</head>");

                sb.AppendLineAndIncrease("<body>");
                sb.AppendLine($"<a href=\"{indexPath}\">Return to BDAT index</a><br/>");
                sb.AppendLine("<input type=\"button\" value=\"Open all references\" onclick=\"openAll(true)\" />");
                sb.AppendLine("<input type=\"button\" value=\"Close all references\" onclick=\"openAll(false)\" />");
                PrintTable(bdats, info, tableName, sb);
                sb.DecreaseAndAppendLine("</body>");
                sb.DecreaseAndAppendLine("</html>");

                if (tableFilename != null)
                {
                    outDir = Path.Combine(outDir, tableFilename);
                }

                string filename = Path.Combine(outDir, tableName + ".html");
                Directory.CreateDirectory(outDir);
                File.WriteAllText(filename, sb.ToString());
            }
        }
Beispiel #26
0
        public static void FindInnEvents(BdatStringCollection tables)
        {
            var h2hs = tables.Tables["EVT_listFev01"].Items.Where(x => x["evtName"].DisplayString.Contains("kizuna"));

            foreach (var inn in h2hs.Where(x => x["evtName"].DisplayString.Contains("kizunainn")))
            {
                int.TryParse(inn["evtName"].DisplayString.Substring(9), out int id);
                var h2h = h2hs.FirstOrDefault(x => x["evtName"].DisplayString == $"kizunatalk{id:D3}").ReferencedBy.FirstOrDefault();
                if (h2h["ConditionID"].Reference["Condition1"].Reference["FlagMin"].DisplayString == "1")
                {
                    var name = h2h["Title"].DisplayString;
                    var fev  = inn.Id;

                    Console.WriteLine($"{name}:");
                    Console.WriteLine(FindInnScripts(tables, fev));
                    Console.WriteLine("");
                    // Console.WriteLine($"{name}\t{fev}");
                }
            }
        }
Beispiel #27
0
        private static void PrintQuests(BdatStringCollection tables, IEnumerable <BdatStringItem> quests)
        {
            var changeEvents = tables.Tables.Where(tbl => tbl.Key.Contains("EVT_chg")).SelectMany(tbl => tbl.Value.Items).Where(evt => int.Parse(evt["chgType"].ValueString) == 2);
            var scriptFiles  = Directory.GetFiles("../decompiled_scripts/main_game/").Concat(Directory.GetFiles("../decompiled_scripts/aoc/"));
            var listEvents   = tables.Tables.Where(tbl => tbl.Key.Contains("EVT_list") && !tbl.Key.Contains("listList")).SelectMany(tbl => tbl.Value.Items);

            foreach (var quest in quests)
            {
                string questName = quest["QuestTitle"].DisplayString;
                int    questId   = quest.Id;
                Console.WriteLine("--------");
                Console.WriteLine(questName);
                Console.WriteLine("--------");
                Console.WriteLine("Start Requirements: ");
                PrintStartEvent(changeEvents, listEvents, scriptFiles, questId);
                Console.WriteLine("--------");
                Console.WriteLine("=======================");

                //Console.WriteLine(FindStartCondition(tables, quest));
            }
        }
Beispiel #28
0
        private static string FindInnScripts(BdatStringCollection tables, int id)
        {
            string s = "";

            foreach (var inn in tables.Tables["MNU_ShopList"].Items.Where(x => x["ShopType"].DisplayString == "Inn").Select(x => x.ReferencedBy.FirstOrDefault(y => y["QuestFlag"].DisplayString == null && y["QuestID"].DisplayString == null)))
            {
                if (inn == null || inn.Id == 40293)
                {
                    continue;
                }
                var evt = inn["EventID"].Reference["evtName"].DisplayString;

                var filename = Directory.GetFiles("../decompiled_scripts/main_game/").FirstOrDefault(x => x.Contains(evt));

                if (!(File.ReadLines(filename).SkipWhile(x => !x.Contains($"evt_status::change(32, {id}")).Take(1).Count() == 0))
                {
                    s = SearchScriptForEvent(tables, id, filename) + $", Rest at {inn["ShopID"].DisplayString}";
                    break;
                }
            }
            return(s);
        }
Beispiel #29
0
        private static void PrintTrust(BdatStringCollection tables, string evt)
        {
            string s      = "";
            int    last   = -1;
            var    lines  = File.ReadAllLines($"../decompiled_scripts/main_game/{evt}.c");
            bool   choice = false;

            for (int i = 0; i < lines.Length; i++)
            {
                if (lines[i].Contains("evt_status::change(55, "))
                {
                    var args   = Array.ConvertAll(lines[i].Substring(27).Split(')').FirstOrDefault().Split(','), str => int.Parse(str));
                    var blade  = tables["CHR_Bl"].Items.FirstOrDefault(x => x.Id == args[0])["Name"].DisplayString;
                    var amount = args[1];


                    if (last != -1 && i - last > 1)
                    {
                        s      = "(" + s + ") or (";
                        choice = true;
                    }
                    else if (s.Length > 0)
                    {
                        s += ", ";
                    }

                    s += $"{blade} +{amount} trust";

                    last = i;
                }
            }
            if (choice)
            {
                s += ")";
            }

            Console.WriteLine(s);
        }
Beispiel #30
0
        public static void GenerateBdatHtml(IFileSystem fs, string outDir, IProgressReport progress)
        {
            var bdats = new BdatTables(fs, true, progress);
            BdatStringCollection tablesStr = DeserializeStrings.DeserializeTables(bdats, progress);

            Metadata.ApplyMetadata(tablesStr);
            HtmlGen.PrintSeparateTables(tablesStr, Path.Combine(outDir, BdatDir), progress);
            JsonGen.PrintAllTables(tablesStr, Path.Combine(outDir, JsonDir), progress);

            BdatCollection tables = Deserialize.DeserializeTables(bdats, progress);

            string dataDir = Path.Combine(outDir, DataDir);

            progress.SetTotal(0);
            progress.LogMessage("Creating salvaging tables");
            Directory.CreateDirectory(dataDir);
            string salvaging = SalvagingTable.Print(tables);

            File.WriteAllText(Path.Combine(dataDir, "salvaging.html"), salvaging);

            progress.LogMessage("Creating enemy tables");
            using (var writer = new StreamWriter(Path.Combine(dataDir, "enemies.csv")))
            {
                Enemies.PrintEnemies(tables, writer);
            }

            progress.LogMessage("Creating achievement tables");
            using (var writer = new StreamWriter(Path.Combine(dataDir, "achievements.csv")))
            {
                Achievements.PrintAchievements(tables, writer);
            }

            string gmkDir = Path.Combine(outDir, GmkDir);

            MapInfo[] gimmicks = ReadGmk.ReadAll(fs, tables, progress);
            progress.LogMessage("Writing map info and gimmick data");
            ExportMap.ExportCsv(gimmicks, gmkDir);
        }