Beispiel #1
0
        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)},");
        }
Beispiel #2
0
        public static BdatCollection GetBdatCollection(Options options)
        {
            BdatTables     bdats  = ReadBdatTables(options, false);
            BdatCollection tables = Deserialize.DeserializeTables(bdats);

            return(tables);
        }
Beispiel #3
0
        public static BdatCollection GetBdatCollection(IFileSystem fs, bool readMetadata)
        {
            var            bdats  = new BdatTables(fs, readMetadata);
            BdatCollection tables = Deserialize.DeserializeTables(bdats);

            return(tables);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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());
        }
Beispiel #6
0
        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);
            }
        }
Beispiel #7
0
        public static void PrintEnemies(BdatCollection tables, StreamWriter writer)
        {
            var enemies = ReadEnemies(tables);
            var csv     = new CsvWriter(writer);

            csv.WriteRecords(enemies);
        }
Beispiel #8
0
        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);
            }
        }
Beispiel #9
0
        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);
            }
        }
Beispiel #10
0
        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();
        }
Beispiel #11
0
        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());
        }
Beispiel #12
0
        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);
            }
        }
Beispiel #13
0
 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();
 }
Beispiel #14
0
        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);
        }
Beispiel #15
0
        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);
        }
Beispiel #16
0
        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);
        }
Beispiel #17
0
        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);
        }
Beispiel #18
0
        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);
        }
Beispiel #19
0
        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);
        }
Beispiel #20
0
        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);
        }
Beispiel #21
0
        public static BdatCollection DeserializeTables(BdatTables files)
        {
            var tables = new BdatCollection();

            foreach (BdatTable table in files.Tables)
            {
                ReadTable(table, tables);
            }

            ReadFunctions.SetReferences(tables);

            return(tables);
        }
Beispiel #22
0
        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);
        }
Beispiel #23
0
        public static BdatCollection ReadBdats(byte[][] files)
        {
            var tables = new BdatCollection();

            foreach (byte[] file in files)
            {
                ReadBdat(file, tables);
            }

            ReadFunctions.SetReferences(tables);

            return(tables);
        }
Beispiel #24
0
        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);
        }
Beispiel #25
0
        public void LoadBdats()
        {
            var dirName = OpenDirViaFileBrowser();
            var options = new Options
            {
                BdatDir = dirName,
                Game    = Game.XB2,
                Filter  = "*.bdat"
            };

            BdatCollection tables = Tasks.GetBdatCollection(options);

            Tables = tables;
        }
Beispiel #26
0
        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("");
        }
Beispiel #27
0
        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("");
        }
Beispiel #28
0
        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();
        }
Beispiel #29
0
        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();
        }
Beispiel #30
0
 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);
 }