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); }
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(""); }
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()); }
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()); }
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); } }
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); }
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); }
private static void FindInnEvents(Options options) { BdatStringCollection tables = GetBdatStringCollection(options); HeartToHeart.PrintH2Hs(tables); //HeartToHeart.FindInnEvents(tables); }
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); }
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); }
private static BdatStringCollection GetBdatStringCollection(Options options) { BdatTables bdats = ReadBdatTables(options, true); BdatStringCollection tables = DeserializeStrings.DeserializeTables(bdats); Metadata.ApplyMetadata(tables); return(tables); }
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(); } }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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()); }
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); }
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); }
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()); } }
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}"); } } }
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)); } }
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); }
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); }
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); }