public static void PrintBladeCsv(SDataBlade blade, BdatCollection tables, StringBuilder sb) { sb.Append($"{blade.GetName(tables)},"); sb.Append($"{tables.CHR_Dr.GetItemOrNull(blade.Creator)?._Name.name},"); sb.Append($"{blade.Attribute},"); sb.Append($"{tables.ITM_PcWpnType.GetItemOrNull(blade.WeaponType)?._Name.name},"); var mod = blade.GetStatMod(); sb.Append($"{mod.type},"); sb.Append($"{mod.percent},"); sb.Append($"{tables.MNU_MsgTrustRank.GetItemOrNull(blade.TrustRank)?._name.name},"); sb.Append($"{blade.TrustPoints},"); sb.Append(","); sb.Append($"{blade.FieldSkills[0].MaxLevel},"); sb.Append($"{blade.GetFieldSkillLevel("Forestry", tables)},"); sb.Append($"{blade.GetFieldSkillLevel("Botany", tables)},"); sb.Append($"{blade.GetFieldSkillLevel("Agronomy", tables)},"); sb.Append($"{blade.GetFieldSkillLevel("Entomology", tables)},"); sb.Append($"{blade.GetFieldSkillLevel("Ichthyology", tables)},"); sb.Append($"{blade.GetFieldSkillLevel("Mineralogy", tables)},"); sb.Append($"{blade.GetFieldSkillLevel("Salvaging Mastery", tables)},"); sb.Append($"{blade.GetFieldSkillLevel("Info Collector", tables)},"); sb.Append($"{blade.GetFieldSkillLevel("Expeditionist", tables)},"); sb.Append($"{blade.GetFieldSkillLevel("Transport Mastery", tables)},"); sb.Append($"{blade.GetFieldSkillLevel("Industry Mastery", tables)},"); sb.Append($"{blade.GetFieldSkillLevel("Production Mastery", tables)},"); sb.Append($"{blade.GetBattleSkillLevel("Gold Rush", tables)},"); sb.Append($"{blade.GetBattleSkillLevel("Treasure Sensor", tables)},"); sb.Append($"{blade.GetBattleSkillLevel("Orb Master", tables)},"); sb.Append($"{blade.GetBattleSkillLevel("Slamdown", tables)},"); sb.Append($"{blade.GetBattleSkillLevel("Ultimate Combo", tables)},"); }
public static BdatCollection GetBdatCollection(Options options) { BdatTables bdats = ReadBdatTables(options, false); BdatCollection tables = Deserialize.DeserializeTables(bdats); return(tables); }
public static BdatCollection GetBdatCollection(IFileSystem fs, bool readMetadata) { var bdats = new BdatTables(fs, readMetadata); BdatCollection tables = Deserialize.DeserializeTables(bdats); return(tables); }
public static void ExportQuests(BdatCollection tables, string outDir) { Directory.CreateDirectory(outDir); var quests = ReadQuests(tables.FLD_QuestListNormal); var export = Export.ExportQuests(quests); File.WriteAllText(Path.Combine(outDir, "quests normal.txt"), export); quests = ReadQuests(tables.FLD_QuestListBlade); export = Export.ExportQuests(quests); File.WriteAllText(Path.Combine(outDir, "quests blade.txt"), export); quests = ReadQuests(tables.FLD_QuestListMini); export = Export.ExportQuests(quests); File.WriteAllText(Path.Combine(outDir, "quests mini.txt"), export); quests = ReadQuests(tables.FLD_QuestList); export = Export.ExportQuests(quests); File.WriteAllText(Path.Combine(outDir, "quests.txt"), export); quests = ReadQuests(tables.FLD_QuestListIra); export = Export.ExportQuests(quests); File.WriteAllText(Path.Combine(outDir, "quests ira.txt"), export); quests = ReadQuests(tables.FLD_QuestListNormalIra); export = Export.ExportQuests(quests); File.WriteAllText(Path.Combine(outDir, "quests normal ira.txt"), export); }
public static string Print(BdatCollection tables) { var sb = new Indenter(); BdatTable <FLD_SalvagePointList> pointList = tables.FLD_SalvagePointList; sb.AppendLine("<!DOCTYPE html>"); sb.AppendLineAndIncrease("<html>"); sb.AppendLineAndIncrease("<head>"); sb.AppendLine("<meta charset=\"utf-8\" />"); sb.AppendLine("<title>Xenoblade 2 Salvaging Points</title>"); sb.AppendLine("<style>.tbox td{vertical-align: top;} table.BtnChallenge td,th{border: 1px solid;}table{margin:0;padding:0;border-collapse: collapse;}</style>"); sb.DecreaseAndAppendLine("</head>"); sb.AppendLineAndIncrease("<body>"); foreach (FLD_SalvagePointList point in pointList.Where(x => x.SalvagePointName > 0)) { PrintPoint(point, sb); } sb.DecreaseAndAppendLine("</body>"); sb.DecreaseAndAppendLine("</html>"); return(sb.ToString()); }
public static void Create(BdatCollection tables) { var driver = new DriverInfo(); var createParams = new BladeCreateParams(); driver.Level = 99; createParams.Crystal = CrystalType.Legendary; driver.IdeaLevels[0] = 10; driver.IdeaLevels[1] = 10; driver.IdeaLevels[2] = 10; driver.IdeaLevels[3] = 10; createParams.BoosterCount = 0; if (createParams.BoosterCount > 0) { createParams.IdeaCategory = IdeaCategory.Compassion; } int times = 10; string delim = new string('=', 25); var create = new CreateCommon(tables, driver, createParams); for (int i = 0; i < times; i++) { Console.WriteLine(); Console.WriteLine($"Blade #{i + 1:D5}"); Console.WriteLine(delim); Console.Write(OutputBlade.GetString(create.Create())); Console.WriteLine(delim); } }
public static void PrintEnemies(BdatCollection tables, StreamWriter writer) { var enemies = ReadEnemies(tables); var csv = new CsvWriter(writer); csv.WriteRecords(enemies); }
private static void GenerateData(Options options) { if (options.Output == null) { throw new NullReferenceException("Output directory was not specified."); } BdatCollection tables = GetBdatCollection(options); Directory.CreateDirectory(options.Output); string chBtlRewards = ChBtlRewards.PrintHtml(tables); File.WriteAllText(Path.Combine(options.Output, "chbtlrewards.html"), chBtlRewards); string chBtlRewardsCsv = ChBtlRewards.PrintCsv(tables); File.WriteAllText(Path.Combine(options.Output, "chbtlrewards.csv"), chBtlRewardsCsv); string salvaging = SalvagingTable.Print(tables); File.WriteAllText(Path.Combine(options.Output, "salvaging.html"), salvaging); using (var writer = new StreamWriter(Path.Combine(options.Output, "enemies.csv"))) { Enemies.PrintEnemies(tables, writer); } using (var writer = new StreamWriter(Path.Combine(options.Output, "achievements.csv"))) { Achievements.PrintAchievements(tables, writer); } }
private static void ReadGimmick(Options options) { using (var xb2Fs = new Xb2Fs(options.Xb2Dir)) { if (options.Xb2Dir == null) { throw new NullReferenceException("Must specify XB2 Directory."); } if (options.Output == null) { throw new NullReferenceException("No output path was specified."); } if (!Directory.Exists(options.Xb2Dir)) { throw new DirectoryNotFoundException($"{options.Xb2Dir} is not a valid directory."); } BdatCollection tables = GetBdatCollection(xb2Fs, false); MapInfo[] gimmicks = ReadGmk.ReadAll(xb2Fs, tables); ExportMap.ExportCsv(gimmicks, options.Output); ExportMap.Export(xb2Fs, gimmicks, options.Output); } }
public static void PromptCreate(BdatCollection tables) { var driver = new DriverInfo(); var createParams = new BladeCreateParams(); driver.Level = ReadIntFromConsole(1, 99, "Enter Player Level (1-99)"); createParams.Crystal = ReadIntFromConsole(1, 3, "Core Crystal Type; 1 - Common, 2 - Rare, 3 - Legendary") + CrystalType.Common - 1; driver.IdeaLevels[0] = ReadIntFromConsole(1, 10, "Bravery Idea Level (1-10)"); driver.IdeaLevels[1] = ReadIntFromConsole(1, 10, "Truth Idea Level (1-10)"); driver.IdeaLevels[2] = ReadIntFromConsole(1, 10, "Compassion Idea Level (1-10)"); driver.IdeaLevels[3] = ReadIntFromConsole(1, 10, "Justice Idea Level (1-10)"); createParams.BoosterCount = ReadIntFromConsole(0, 5, "Use how many boosters? (0-5)"); if (createParams.BoosterCount > 0) { createParams.IdeaCategory = (IdeaCategory)(ReadIntFromConsole(1, 4, "Booster type; Bravery - 1, Truth - 2, Compassion - 3, Justice - 4") - 1); } int times = ReadIntFromConsole(1, 100, "Number of blades to generate (1-100)"); string delim = new string('=', 25); var create = new CreateCommon(tables, driver, createParams); for (int i = 0; i < times; i++) { Console.WriteLine(); Console.WriteLine(delim); Console.Write(OutputBlade.GetString(create.Create())); Console.WriteLine(delim); } Console.WriteLine("Press enter to exit"); Console.ReadLine(); }
public static MapInfo[] ReadAll(IFileReader fs, BdatCollection tables) { Dictionary <string, MapInfo> maps = MapInfo.ReadAll(fs); var mapList = tables.FLD_maplist; var areaList = tables.MNU_MapInfo; foreach (MapInfo mapInfo in maps.Values) { var map = mapList.FirstOrDefault(x => x.resource == mapInfo.Name && x._nameID != null); if (map == null) { continue; } if (map._nameID != null) { mapInfo.DisplayName = map._nameID.name; } foreach (var areaInfo in mapInfo.Areas) { MNU_MapInfo area = areaList.FirstOrDefault(x => x.level_name == areaInfo.Name || x.level_name2 == areaInfo.Name); Debug.Assert(area != null, "Area does not exist"); // Some areas use one of 2 maps depending on the game state. // These 2 maps are always the same except one has a small addition or removal. // We want the map with the most objects on it, so we use the second map for // Gormott (ma05a), and the first map for everywhere else. if (!string.IsNullOrWhiteSpace(area.level_name2) && area.level_name == areaInfo.Name && mapInfo.Name == "ma05a") { areaInfo.Priority = int.MaxValue; } else if (!string.IsNullOrWhiteSpace(area.level_name2) && area.level_name2 == areaInfo.Name && mapInfo.Name != "ma05a") { areaInfo.Priority = int.MaxValue; } else { areaInfo.Priority = area.level_priority; } if (area._disp_name?.name != null) { areaInfo.DisplayName = area._disp_name.name; } } var gimmickSet = ReadGimmickSet(fs, tables, map.Id); AssignGimmickAreas(gimmickSet, mapInfo); } return(maps.Values.ToArray()); }
public static void PrintData(BdatCollection tables, string dataDir) { Directory.CreateDirectory(dataDir); using (var writer = new StreamWriter(Path.Combine(dataDir, "achievements.csv"))) { Achievements.PrintAchievements(tables, writer); } }
public Raffle(RaffleInfo info, BdatCollection tables) { Cylinder = info.Cylinder; SkillLevel = info.SalvageMasteryLevel; ButtonLevel = info.ButtonChallengeLevel; SalvagePoint = tables.FLD_SalvagePointList[info.SalvagePoint]; SalvageTable = SalvagePoint._SalvageTable[(int)Cylinder]; Rand = new Random(); }
public static string GetName(this SDataBlade blade, BdatCollection tables) { if (blade.RareNameId != 0) { return(tables.chr_bl_ms.GetItemOrNull(blade.RareNameId)?.name ?? blade.Name); } return(tables.bld_bladename.GetItemOrNull(blade.CommonNameId)?.name ?? blade.Name); }
public static void PrintAchievements(BdatCollection tables, StreamWriter writer) { IEnumerable <Achievement> achievements = GetBladeAchievements(tables.CHR_Bl); var csv = new CsvWriter(writer, new Configuration { HasHeaderRecord = false }); writer.WriteLine("Blade ID,Blade Name,Skill,Type,Col,Row,Level,Idea Category,Idea Points,Condition,Count,Result"); csv.WriteRecords(achievements); }
private static void ExportQuests(Options options) { if (options.Output == null) { throw new NullReferenceException("No output path was specified."); } BdatCollection tables = GetBdatCollection(options); Xb2.Quest.Read.ExportQuests(tables, options.Output); }
private static List <RewardSet> ReadAllRewards(BdatCollection tables) { var rewards = new List <RewardSet>(); foreach (var chBtl in tables.BTL_ChBtl) { rewards.Add(ReadRewardSet(tables, chBtl.Id)); } return(rewards); }
public static string GetPlaceName(PlaceCategory category, int id, BdatCollection tables) { var tableName = GetPlaceTable(category, id); if (tableName == null) { return(string.Empty); } var name = tables[tableName].GetBdatItem(id).Read <string>("name"); return(name); }
public static Reward ReadReward(BdatCollection tables, int rewardSetId) { var set = tables.BTL_ChBtlRewardSet[rewardSetId]; var reward = new Reward { Id = rewardSetId, MinGold = (int)set.GoldMin, MaxGold = (int)set.GoldMax, MinItems = set.ItemNumMin, MaxItems = set.ItemNumMax, AppointCount = set.AppointItemNum, AppointItem = ItemData.GetName(set.AppointItem, tables) }; int minValue = set.ItemValueMin; int maxValue = set.ItemValueMax; reward.Items = tables.BTL_ChBtlRewardItem.Where(x => x.ItemValue >= minValue && x.ItemValue <= maxValue) .Select(x => new Item { Id = x.ItemID, Prob = x.Param1 }).ToList(); foreach (var item in reward.Items) { var cat = ItemData.GetItemCategory(item.Id); if (cat == set._UpCategory1 || cat == set._UpCategory2) { item.Prob *= 2; } if (cat == set._DownCategory1 || cat == set._DownCategory2) { item.Prob /= 2; } if (item.Id == set.UpItemID1 || item.Id == set.UpItemID2 || item.Id == set.UpItemID3 || item.Id == set.UpItemID4) { item.Prob *= 2; } } var totalProb = reward.Items.Sum(x => x.Prob); foreach (var item in reward.Items) { item.Name = ItemData.GetName(item.Id, tables); item.Percent = (float)item.Prob / totalProb; } return(reward); }
private static void ReadTable(BdatTable file, BdatCollection tables) { Type itemType = TypeMap.GetTableType(file.Name); Type tableType = typeof(BdatTable <>).MakeGenericType(itemType); var table = (IBdatTable)Activator.CreateInstance(tableType); table.Name = file.Name; table.BaseId = file.BaseId; table.Members = file.Members; table.Items = ReadItems(file, itemType); Fields[file.Name].SetValue(tables, table); }
public static BdatCollection DeserializeTables(BdatTables files) { var tables = new BdatCollection(); foreach (BdatTable table in files.Tables) { ReadTable(table, tables); } ReadFunctions.SetReferences(tables); return(tables); }
public static string GetName(int id, BdatCollection tables) { ItemTypeXb2 category = GetItemCategory(id); string tableName = GetCategoryTable(category); string name = tables[tableName].GetBdatItem(id).Read <Message>("_Name").name; if (category == ItemTypeXb2.PcEquip) { name += $" ({tables.ITM_PcEquip[id]._Rarity.name})"; } return(name); }
public static BdatCollection ReadBdats(byte[][] files) { var tables = new BdatCollection(); foreach (byte[] file in files) { ReadBdat(file, tables); } ReadFunctions.SetReferences(tables); return(tables); }
private static BdatCollection DeserializeBdat(string bdatDir, string pattern) { string[] filenames = Directory.GetFiles(bdatDir, pattern, SearchOption.AllDirectories); byte[][] files = new byte[filenames.Length][]; for (int i = 0; i < filenames.Length; i++) { files[i] = File.ReadAllBytes(filenames[i]); } BdatCollection tables = Deserialize.ReadBdats(files); return(tables); }
public void LoadBdats() { var dirName = OpenDirViaFileBrowser(); var options = new Options { BdatDir = dirName, Game = Game.XB2, Filter = "*.bdat" }; BdatCollection tables = Tasks.GetBdatCollection(options); Tables = tables; }
public static string GetFieldSkillLevel(this SDataBlade blade, string name, BdatCollection tables) { FLD_FieldSkillList a = tables.FLD_FieldSkillList.First(x => x?._Name?.name == name); foreach (var skill in blade.FieldSkills) { if (skill.Id == a.Id) { return(skill.MaxLevel.ToString()); } } return(""); }
public static string GetBattleSkillLevel(this SDataBlade blade, string name, BdatCollection tables) { BTL_Skill_Bl a = tables.BTL_Skill_Bl.First(x => x?._Name?.name == name); foreach (var skill in blade.BattleSkills) { if (skill.Id == a.Id) { return(skill.MaxLevel.ToString()); } } return(""); }
public static void Run(BdatCollection tables) { var info = new RaffleInfo { SalvagePoint = 11, Cylinder = CylinderType.Normal, SalvageMasteryLevel = 0, ButtonChallengeLevel = 0 }; var raffle = new Raffle(info, tables); raffle.Create(); }
public MainViewModel() { ReadSaveCommand = new RelayCommand(ReadSaveDialog); WriteSaveCommand = new RelayCommand(WriteSave); LoadBdatsCommand = new RelayCommand(LoadBdats); if (IsInDesignModeStatic) { using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("SaveEditor.bf2savefile.sav.gz")) { if (stream == null) { return; } using (var decompressionStream = new GZipStream(stream, CompressionMode.Decompress)) { var file = new byte[0x1176A0]; decompressionStream.Read(file, 0, file.Length); SaveFile = new SDataSave(new DataBuffer(file, Game.XB2, 0)); } } } using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("SaveEditor.bdats.gz")) { if (stream == null) { return; } using (var decompressionStream = new GZipStream(stream, CompressionMode.Decompress)) { var file = new byte[7394040]; decompressionStream.Read(file, 0, file.Length); var bdats = new BdatTables(file, Game.XB2, false); Tables = Deserialize.DeserializeTables(bdats); } } var s = new List <ItemDesc> { new ItemDesc { Id = 0, Name = "" } }; s.AddRange(Tables.ITM_PcEquip.Select(x => new ItemDesc { Id = x.Id, Name = x._Name?.name })); Acc = s.ToArray(); }
public static object GetCharacter(int id, BdatCollection tables) { if (id > 2000) { return(tables.RSC_NpcList[id]); } if (id > 1000) { return(tables.CHR_Bl[id]); } if (id > 0) { return(tables.CHR_Dr[id]); } return(null); }