Exemple #1
0
        static void Main(string[] args)
        {
            Utility.WriteExeDetails();
            Console.WriteLine("Loading strings...");
            Utility.LoadStrings(root);

            Console.WriteLine("Loading items...");
            Utility.LoadItems(root);

            Console.WriteLine("Loading NPCs...");
            Utility.LoadClientNpcs(root);

            Console.WriteLine("Loading client trade lists...");
            Utility.LoadNpcGoodLists(root);

            Console.WriteLine("Loading quests...");
            Utility.LoadQuestFile(root);

            Console.WriteLine("Loading NPC dialogs...");
            Utility.LoadHtmlDialogs(root);

            string outputPath = Path.Combine(root, @".\output");
            if (!Directory.Exists(outputPath))
                Directory.CreateDirectory(outputPath);

            //var outputFile = new TradeListFile();

            var settings = new XmlWriterSettings()
            {
                CheckCharacters = false,
                CloseOutput = false,
                Indent = true,
                IndentChars = "\t",
                NewLineChars = "\n",
                Encoding = new UTF8Encoding(false)
            };

            string[] armorMat = { "pl", "ch", "lt", "rb" };
            string[] weapons = {
                                 "orb", "dagger", "mace", "sword", "staff", "book", "2hsword", "polearm", "bow",
                                 "t_orb", "t_dagger", "t_mace", "t_sword", "t_staff", "t_book", "t_2hsword", "t_polearm", "bow"
                               };

            var disasmItems = Utility.ItemIndex.ItemList.Where(i => i.disassembly_item.HasValue &&
                                                               i.disassembly_item.Value &&
                                                               i.Category != ItemCategories.harvest);

            var metals = Utility.ItemIndex.ItemList.Where(i => i.Category == ItemCategories.harvest &&
                                                               i.Quality == ItemQualities.common &&
                                                               (i.name.StartsWith("metal") ||
                                                                i.name.StartsWith("noblemetal")));

            var jewels = Utility.ItemIndex.ItemList.Where(i => i.Category == ItemCategories.harvest &&
                                                               i.Quality == ItemQualities.rare &&
                                                               i.quest == 0 &&
                                                               i.name.StartsWith("jewelry"));

            var enchants = Utility.ItemIndex.ItemList.Where(i => i.package_permitted > 0 &&
                                                                 i.name.StartsWith("matter_enchant"));

            var aethers = Utility.ItemIndex.ItemList.Where(i => i.Category == ItemCategories.harvest &&
                                                                !i.disassembly_item.Value &&
                                                                i.name.StartsWith("od_"));

            var balaurs = Utility.ItemIndex.ItemList.Where(i => i.Quality == ItemQualities.rare &&
                                                                i.name.StartsWith("dr_material"));

            var petals = Utility.ItemIndex.ItemList.Where(i => i.Quality == ItemQualities.rare &&
                                                               i.name.StartsWith("harvest_dye"));

            var gatherables = Utility.ItemIndex.ItemList.Where(i => i.Category == ItemCategories.harvest &&
                                                                    i.quest == 0);
            // don't know actually
            var accessoir = Utility.ItemIndex.ItemList.Where(i => i.name.StartsWith("ac_head") /*&&
                                                                  i.name.Contains("_p_")*/);
            SkillMap skillMap = new SkillMap();
            skillMap.LoadFromFile(root);

            WrappedItemsFile wrappedItemFile = new WrappedItemsFile();
            List<WrapperItem> wrappers = new List<WrapperItem>();
            foreach (var item in disasmItems) {
                if (item.desc != null) {
                    var wrapper = new WrapperItem();
                    wrapper.id = item.id;
                    wrapper.description = item.Description;
                    string[] nameParts = item.name.Split('_');
                    string last = nameParts[nameParts.Length - 1];
                    if (Char.IsDigit(last[0]) && last.EndsWith("day")) {
                        string itemName = String.Join("_", nameParts, 1, nameParts.Length - 1);
                        Item wrappedItem = Utility.ItemIndex.GetItem(itemName);
                        if (wrappedItem == null) {
                            var matched = Utility.ItemIndex.GetItemsByDescription("str_" + itemName);
                            if (matched.Count() > 1 || matched.Count() == 0)
                                Debug.Print("Wrapped item not found for: {0}", item.name);
                            else
                                wrappedItem = matched.First();
                        }
                        if (wrappedItem != null) {
                            wrapper.item = new WrappedItem[1];
                            var wi = new WrappedItem();
                            wi.id = wrappedItem.id;
                            wi.min = wi.max = 1;
                            wi.description = wrappedItem.Description;
                            wrapper.item[0] = wi;
                        }
                    } else if (nameParts.Contains("copper")) {
                        wrapper.item = new WrappedItem[1];
                        var wi = new WrappedItem();
                        wi.id = nameParts.Contains("l") ? 186000002 : 186000007;
                        wi.min = wi.max = 1;
                        wrapper.item[0] = wi;
                    } else if (nameParts.Contains("silver")) {
                        wrapper.item = new WrappedItem[1];
                        var wi = new WrappedItem();
                        wi.id = nameParts.Contains("l") ? 186000003 : 186000008;
                        wi.min = wi.max = 1;
                        wrapper.item[0] = wi;
                    } else if (nameParts.Contains("gold")) {
                        wrapper.item = new WrappedItem[1];
                        var wi = new WrappedItem();
                        wi.id = nameParts.Contains("l") ? 186000004 : 186000009;
                        wi.min = wi.max = 1;
                        wrapper.item[0] = wi;
                    } else if (nameParts.Contains("platinum")) {
                        wrapper.item = new WrappedItem[1];
                        var wi = new WrappedItem();
                        wi.id = nameParts.Contains("l") ? 186000005 : 186000010;
                        wi.min = wi.max = 1;
                        wrapper.item[0] = wi;
                    } else if (nameParts.Contains("mithril") ||
                               nameParts.Contains("medal") && nameParts.Contains("Quest")) {
                        wrapper.item = new WrappedItem[1];
                        var wi = new WrappedItem();
                        wi.id = nameParts.Contains("l", StringComparer.InvariantCultureIgnoreCase) ?
                                186000018 : 186000019;
                        wi.min = wi.max = 1;
                        wrapper.item[0] = wi;
                    } else if (nameParts.Contains("torso") || nameParts.Contains("pants")) {
                        string itemName = String.Join("_", nameParts, 1, nameParts.Length - 1);
                        List<WrappedItem> armor = new List<WrappedItem>();
                        for (int i = 0; i < 4; i++) {
                            string name = armorMat[i] + "_" + itemName;
                            Item wrappedItem = Utility.ItemIndex.GetItem(name);
                            if (wrappedItem == null) {
                                name = "str_" + armorMat[i] + "_" + itemName;
                                var matched = Utility.ItemIndex.GetItemsByDescription(name);
                                if (matched.Count() > 1 || matched.Count() == 0)
                                    Debug.Print("Wrapped item not found for: {0}", name);
                                else
                                    wrappedItem = matched.First();
                            }
                            if (wrappedItem != null) {
                                var wi = new WrappedItem();
                                wi.id = wrappedItem.id;
                                wi.min = 0;
                                wi.max = 1;
                                wi.description = wrappedItem.Description;
                                armor.Add(wi);
                            }
                        }
                        wrapper.count = 1;
                        wrapper.item = armor.ToArray();
                    } else if (nameParts[0] != "material" && nameParts.Contains("weapon")) {
                        string itemName = String.Join("_", nameParts, 2, nameParts.Length - 2);
                        List<WrappedItem> weaps = new List<WrappedItem>();
                        for (int i = 0; i < 18; i++) {
                            string name = weapons[i] + "_" + itemName;
                            Item wrappedItem = Utility.ItemIndex.GetItem(name);
                            if (wrappedItem == null) {
                                name = "str_" + weapons[i] + "_" + itemName;
                                var matched = Utility.ItemIndex.GetItemsByDescription(name);
                                if (matched.Count() > 1 || matched.Count() == 0)
                                    Debug.Print("Wrapped item not found for: {0}", name);
                                else
                                    wrappedItem = matched.First();
                            }
                            if (wrappedItem != null) {
                                var wi = new WrappedItem();
                                wi.id = wrappedItem.id;
                                wi.min = 0;
                                wi.max = 1;
                                wi.description = wrappedItem.Description;
                                weaps.Add(wi);
                            }
                        }
                        wrapper.item = weaps.ToArray();
                        wrapper.count = 1;
                    } else if (nameParts.Contains("metal")) {
                        string itemName = String.Join("_", nameParts, 1, nameParts.Length - 1);
                        string levelSuffix = nameParts.Last();
                        levelSuffix = levelSuffix.Substring(0, levelSuffix.Length - 1);
                        int level = Int32.Parse(levelSuffix) * 10;
                        var rewards = metals.Where(m => m.level == level);
                        List<WrappedItem> items = new List<WrappedItem>();
                        foreach (var metal in rewards) {
                            var wi = new WrappedItem();
                            wi.id = metal.id;
                            wi.min = 1;
                            wi.max = 5;
                            wi.description = metal.Description;
                            items.Add(wi);
                        }
                        wrapper.count = 1;
                        wrapper.item = items.ToArray();
                    } else if (nameParts.Contains("jewelry")) {
                        string itemName = String.Join("_", nameParts, 1, nameParts.Length - 1);
                        string levelSuffix = nameParts.Last();
                        levelSuffix = levelSuffix.Substring(0, levelSuffix.Length - 1);
                        int level = Int32.Parse(levelSuffix) * 10;
                        var rewards = jewels.Where(m => m.level == level);
                        List<WrappedItem> items = new List<WrappedItem>();
                        foreach (var jewel in rewards) {
                            var wi = new WrappedItem();
                            wi.id = jewel.id;
                            wi.min = 1;
                            wi.max = 5;
                            wi.description = jewel.Description;
                            items.Add(wi);
                        }
                        wrapper.count = 1;
                        wrapper.item = items.ToArray();
                    } else if (nameParts.Contains("od") || nameParts.Contains("od02") ||
                               nameParts.Contains("od03") || nameParts.Contains("od04")) {
                        string itemName = String.Join("_", nameParts, 1, nameParts.Length - 1);
                        string levelSuffix = nameParts.Last();
                        levelSuffix = levelSuffix.Substring(0, levelSuffix.Length - 1);
                        int level = Int32.Parse(levelSuffix) * 10;
                        var rewards = aethers.Where(m => m.level == level);
                        List<WrappedItem> items = new List<WrappedItem>();
                        foreach (var aether in rewards) {
                            var wi = new WrappedItem();
                            wi.id = aether.id;
                            wi.min = 1;
                            wi.max = 5;
                            wi.description = aether.Description;
                            items.Add(wi);
                        }
                        wrapper.count = 1;
                        wrapper.item = items.ToArray();
                    } else if (nameParts.Contains("dr") && (nameParts.Contains("material") ||
                               nameParts.Contains("material02") || nameParts.Contains("material03") ||
                               nameParts.Contains("material04"))) {
                        string itemName = String.Join("_", nameParts, 1, nameParts.Length - 1);
                        string levelSuffix = nameParts.Last();
                        levelSuffix = levelSuffix.Substring(0, levelSuffix.Length - 1);
                        int level = Int32.Parse(levelSuffix) * 10 + 20;
                        var rewards = balaurs.Where(m => m.level == level);
                        List<WrappedItem> items = new List<WrappedItem>();
                        foreach (var material in rewards) {
                            var wi = new WrappedItem();
                            wi.id = material.id;
                            wi.min = 1;
                            wi.max = 5;
                            wi.description = material.Description;
                            items.Add(wi);
                        }
                        wrapper.count = 1;
                        wrapper.item = items.ToArray();
                    } else if (nameParts.Contains("enchant") || nameParts.Contains("enchant02") ||
                               nameParts.Contains("enchant03") || nameParts.Contains("enchant04") ||
                               nameParts.Contains("enchant05")) {
                        string itemName = String.Join("_", nameParts, 1, nameParts.Length - 1);
                        string levelSuffix = nameParts.Last();
                        if (Char.IsLetter(levelSuffix.ToCharArray().Last()))
                            levelSuffix = levelSuffix.Substring(0, levelSuffix.Length - 1);
                        int level = Int32.Parse(levelSuffix) - 1;
                        var rewards = enchants.Skip(level * 10).Take(10);
                        List<WrappedItem> items = new List<WrappedItem>();
                        foreach (var enchant in rewards) {
                            var wi = new WrappedItem();
                            wi.id = enchant.id;
                            wi.min = 1;
                            wi.max = 5;
                            wi.description = enchant.Description;
                            items.Add(wi);
                        }
                        wrapper.count = 1;
                        wrapper.item = items.ToArray();
                    } else if (nameParts.Contains("dye")) {
                        string itemName = String.Join("_", nameParts, 1, nameParts.Length - 1);
                        string levelSuffix = nameParts.Last();
                        if (Char.IsLetter(levelSuffix.ToCharArray().Last()))
                            levelSuffix = levelSuffix.Substring(0, levelSuffix.Length - 1);
                        int level = Int32.Parse(levelSuffix);
                        List<WrappedItem> items = new List<WrappedItem>();
                        foreach (var dye in petals) {
                            var wi = new WrappedItem();
                            wi.id = dye.id;
                            wi.min = level;
                            wi.max = 5;
                            wi.description = dye.Description;
                            items.Add(wi);
                        }
                        wrapper.count = 1;
                        wrapper.item = items.ToArray();
                    } else if (nameParts.Contains("head")) {
                        string itemName = String.Join("_", nameParts, 1, nameParts.Length - 1);
                        string levelSuffix = nameParts.Last();
                        if (Char.IsLetter(levelSuffix.ToCharArray().Last()))
                            levelSuffix = levelSuffix.Substring(0, levelSuffix.Length - 1);
                        int level = Int32.Parse(levelSuffix) * 10 + 10;
                        // don't know...
                    } else if (nameParts.Contains("medal")) {
                        int start = 1;
                        if (nameParts.Contains("d"))
                            start++;
                        string itemName = String.Join("_", nameParts, start, nameParts.Length - 1 - start);
                        Item wrappedItem = Utility.ItemIndex.GetItem(itemName);
                        if (wrappedItem == null) {
                            Debug.Print("Wrapped item not found for: {0}", item.name);
                        } else {
                            wrapper.item = new WrappedItem[1];
                            var wi = new WrappedItem();
                            wi.id = wrappedItem.id;
                            wi.min = 1;
                            wi.max = 5;
                            wi.description = wrappedItem.Description;
                            wrapper.item[0] = wi;
                        }
                    } else if (nameParts[0] == "material") {
                        ItemQualities q = ItemQualities.junk;
                        try {
                            q = (ItemQualities)Enum.Parse(typeof(ItemQualities), nameParts[1], true);
                        } catch {
                        }
                        if (q != ItemQualities.junk) {
                            ItemRace raceExlude = nameParts.Contains("d") ? ItemRace.ELYOS : ItemRace.ASMODIANS;
                            var g = gatherables.Where(i => i.Quality == q && i.quest == 0);
                            List<WrappedItem> items = new List<WrappedItem>();
                            foreach (var gatherable in g) {
                                if (gatherable.race == raceExlude || gatherable.name.StartsWith("od") ||
                                    gatherable.id >= 152002001 && gatherable.id <= 152002003)
                                    continue;
                                var wi = new WrappedItem();
                                wi.id = gatherable.id;
                                wi.min = 10;
                                wi.max = 10;
                                wi.description = gatherable.Description;
                                items.Add(wi);
                            }
                            wrapper.count = 10;
                            wrapper.item = items.ToArray();
                        } else if (nameParts[1] == "flower") {
                            List<WrappedItem> items = new List<WrappedItem>();
                            foreach (var dye in petals) {
                                var wi = new WrappedItem();
                                wi.id = dye.id;
                                wi.max = 1;
                                wi.description = dye.Description;
                                items.Add(wi);
                            }
                            wrapper.count = 1;
                            wrapper.item = items.ToArray();
                        } else if (nameParts[1] == "weapon") {
                            ItemRace raceExlude = nameParts.Contains("d") ? ItemRace.ELYOS : ItemRace.ASMODIANS;
                            var fabledW = Utility.ItemIndex.ItemList.Where(i =>
                                i.level >= 50 &&
                                i.WeaponType != WeaponTypes.None &&
                                i.WeaponType != WeaponTypes.NoWeapon &&
                                i.quest == 0);
                            var fabledWH = from w in fabledW
                                           let parts = w.name.Split('_')
                                           let suffix = parts[parts.Length - 2]
                                           where suffix == "h"
                                           select w;
                            List<WrappedItem> items = new List<WrappedItem>();
                            foreach (var weap in fabledWH) {
                                if (weap.race == raceExlude)
                                    continue;
                                var wi = new WrappedItem();
                                wi.id = weap.id;
                                wi.max = 1;
                                wi.description = weap.Description;
                                items.Add(wi);
                            }
                            wrapper.count = 1;
                            wrapper.item = items.ToArray();
                        }
                    }
                    wrappers.Add(wrapper);
                }
            }
            wrappedItemFile.wrapper_item = wrappers.ToArray();

            try {
                using (var fs = new FileStream(Path.Combine(outputPath, "wrapped_items.xml"),
                                               FileMode.Create, FileAccess.Write))
                using (var writer = XmlWriter.Create(fs, settings)) {
                    XmlSerializer ser = new XmlSerializer(typeof(WrappedItemsFile));
                    ser.Serialize(writer, wrappedItemFile);
                }
            } catch (Exception ex) {
                Debug.Print(ex.ToString());
            }

            // var eventQuests = Utility.QuestIndex.QuestList.Where(q => q.category1 == QuestCategory1.Event);
            var expUtil = Utility<Quest>.Instance;

            foreach (var q in Utility.QuestIndex.QuestList) {
                string eventName = String.Empty;
                if (q.dev_name.StartsWith("[이벤트]일본대만_1주년")) {
                    eventName = ItemTag.taiwan.ToString();
                } else if (q.dev_name.StartsWith("[이벤트]할로윈")) {
                    eventName = "halloween";
                } else if (q.dev_name.StartsWith("[이벤트]구정") || q.dev_name.StartsWith("[이벤트]신년")) {
                    eventName = "NewYear";
                } else if (q.dev_name.StartsWith("제로코크")) {
                    eventName = "china";
                }

                var rewards = new List<Rewards>();
                expUtil.Export(q, "reward_item", rewards);
                expUtil.Export(q, "selectable_reward_item", rewards);
                expUtil.Export(q, "reward_item_ext_", rewards);
                expUtil.Export(q, "selectable_reward_item_ext_", rewards);
                rewards = rewards.Where(r => r.BasicRewards != null || r.SelectableRewards != null).ToList();

                QuestOur qOur = new QuestOur();
                qOur.Rewards = rewards;
                qOur.AddClassRewards(q);
                List<QuestItemsOur> allRewards = qOur.AllRewards;
                q.OurQuest = qOur;

                if (!String.IsNullOrEmpty(eventName)) {
                    AddQuest(eventName, q);
                    continue;
                }

                string questName = q.Description.body;
                if (questName.StartsWith("[")) {
                    int pos = questName.IndexOf(']');
                    questName = questName.Substring(1, pos - 1);
                    if (questName.Contains("Daily")) {
                        AddQuest("daily", q);
                        continue;
                    }
                }

                if (allRewards.Count > 0) {
                    foreach (var br in allRewards) {
                        Item item = Utility.ItemIndex.ItemList.Where(i => i.id == br.item_id).First();
                        string[] nameParts = item.name.Split('_');
                        if (nameParts[0] == "world" && nameParts[1] == "wrap" && nameParts[2] == "event" ||
                            nameParts[0] == "world" && nameParts[1] == "event") {
                            eventName = nameParts[3];
                        }
                        break;
                    }
                } else {
                    if (q.category2 == "STR_FACTION_GuardianOfDivine" ||
                        q.category2 == "STR_FACTION_GuardianOfTower" ||
                        q.category2 == "STR_FACTION_Army_Li" ||
                        q.category2 == "STR_FACTION_BountyHunter_Li" ||
                        q.category2 == "STR_FACTION_Army_Da" ||
                        q.category2 == "STR_FACTION_BountyHunter_Da") {
                        eventName = "guild_order";
                    } else if (q.dev_name.StartsWith("7월 프로모션 퀘스트")) {
                        eventName = ItemTag.july_promotion.ToString();
                    } else if (q.dev_name.StartsWith("[이벤트]해외용 임시 등록")) {
                        eventName = "Temporary";
                    }
                }

                if (!String.IsNullOrEmpty(eventName)) {
                    AddQuest(eventName, q);
                    continue;
                } else {
                    Debug.Print("Unknown event category: {0}", q.category2);
                }
            }

            EventsFile outputFile = new EventsFile();
            outputFile.events = new List<EventData>();

            ILookup<string, Item> worldEventsByName;
            ILookup<string, Item> worldCashByName;
            ILookup<string, Item> worldGiftsByName;

            ILookup<string, Item> eventsByName;
            ILookup<string, Item> cashByName;
            ILookup<string, Item> giftsByName;

            var worldItems = Utility.ItemIndex.ItemList.Where(i => i.name.StartsWith("world_"));
            var worldEvents = worldItems.Where(i => i.name.StartsWith("world_event_"));
            worldEventsByName = (from it in worldEvents
                                 let names = it.name.Split(new char[] { '_' })
                                 let subset = names.Where(n => n.Length > 3)
                                 from name in subset
                                 select new { Name = name, Item = it })
                                .ToLookup(a => a.Name, a => a.Item, StringComparer.InvariantCultureIgnoreCase);
            var worldCash = worldItems.Where(i => i.name.StartsWith("world_cash_"));
            worldCashByName = (from it in worldCash
                               let names = it.name.Split(new char[] { '_' })
                               let subset = names.Where(n => n.Length > 3)
                               from name in subset
                               select new { Name = name, Item = it })
                               .ToLookup(a => a.Name, a => a.Item, StringComparer.InvariantCultureIgnoreCase);
            var worldGifts = worldItems.Where(i => i.name.StartsWith("world_wrap_"));
            worldGiftsByName = (from it in worldGifts
                                let names = it.name.Split(new char[] { '_' })
                                let subset = names.Where(n => n.Length > 3)
                                from name in subset
                                select new { Name = name, Item = it })
                                .ToLookup(a => a.Name, a => a.Item, StringComparer.InvariantCultureIgnoreCase);

            var westItems = Utility.ItemIndex.ItemList.Where(i => i.name.StartsWith("west_"));

            var chinaItems = Utility.ItemIndex.ItemList.Where(i => i.name.StartsWith("china_"));

            var eventItems = Utility.ItemIndex.ItemList.Where(i => i.name.StartsWith("event_"));
            eventsByName = (from it in eventItems
                            let names = it.name.Split(new char[] { '_' })
                            let subset = names.Where(n => n.Length > 3)
                            from name in subset
                            select new { Name = name, Item = it })
                            .ToLookup(a => a.Name, a => a.Item, StringComparer.InvariantCultureIgnoreCase);
            var eventCash = Utility.ItemIndex.ItemList.Where(i => i.name.StartsWith("cash_"));
            cashByName = (from it in eventCash
                          let names = it.name.Split(new char[] { '_' })
                          let subset = names.Where(n => n.Length > 3)
                          from name in subset
                          select new { Name = name, Item = it })
                          .ToLookup(a => a.Name, a => a.Item, StringComparer.InvariantCultureIgnoreCase);
            var eventGifts = Utility.ItemIndex.ItemList.Where(i => i.name.StartsWith("wrap_event_"));
            giftsByName = (from it in eventItems
                           let names = it.name.Split(new char[] { '_' })
                           let subset = names.Where(n => n.Length > 3)
                           from name in subset
                           select new { Name = name, Item = it })
                           .ToLookup(a => a.Name, a => a.Item, StringComparer.InvariantCultureIgnoreCase);

            var dailyGifts = Utility.ItemIndex.ItemList.Where(i => i.name.StartsWith("wrap_daily_") ||
                                                                   i.name.StartsWith("wrap_d_daily"));

            var combined = worldEvents.Union(worldCash).Union(worldGifts).Union(westItems).Union(chinaItems)
                                      .Union(eventItems).Union(eventCash).Union(eventGifts).Union(dailyGifts);
            var dailyItems = Utility.ItemIndex.ItemList.Where(i => i.tag == ItemTag.daily);
            var missing = dailyItems.Except(combined);

            questsByCategory.Add("deva", new List<Quest>());
            // questsByCategory.Add("devaday", new List<Quest>());
            questsByCategory.Add("foolsday", new List<Quest>());
            questsByCategory.Add("goods", new List<Quest>());
            questsByCategory.Add("july_pcbang", new List<Quest>());
            questsByCategory.Add("kaspa", new List<Quest>());
            questsByCategory.Add("petcard", new List<Quest>());
            questsByCategory.Add("santa", new List<Quest>());
            questsByCategory.Add("repeatquest", new List<Quest>());
            questsByCategory.Add("season1", new List<Quest>());
            questsByCategory.Add("v19promotion", new List<Quest>());
            questsByCategory.Add("worldcup", new List<Quest>());
            questsByCategory.Add("wondergirls", new List<Quest>());
            questsByCategory.Add("west", new List<Quest>());
            questsByCategory.Add("fanta", new List<Quest>());
            questsByCategory.Add("shapechange", new List<Quest>());
            questsByCategory.Add("social", new List<Quest>());
            questsByCategory.Add("changeskin", new List<Quest>());
            questsByCategory.Add("highdress", new List<Quest>());
            questsByCategory.Add("weddingdress", new List<Quest>());
            questsByCategory.Add("wing", new List<Quest>());

            foreach (string category in questsByCategory.Keys) {
                var quests = questsByCategory[category];
                var eventData = new EventData();
                eventData.name = category;
                eventData.quests = new List<EventQuest>();
                Dictionary<int, Item> categoryItems = null;
                if (category == "china") {
                    categoryItems = chinaItems.ToDictionary(i => i.id, i => i);
                } else if (category == "daily") {
                    categoryItems = dailyItems.ToDictionary(i => i.id, i => i);
                } else if (category == "fanta" || category == "shapechange" || category == "santa" ||
                           category == "social" || category == "changeskin" || category == "highdress" ||
                           category == "weddingdress" || category == "wing") {
                    categoryItems = new Dictionary<int, Item>();
                    if (eventsByName.Contains(category)) {
                        foreach (var item in eventsByName[category])
                            categoryItems.Add(item.id, item);
                    }
                    if (cashByName.Contains(category)) {
                        foreach (var item in cashByName[category]) {
                            if (!categoryItems.ContainsKey(item.id))
                                categoryItems.Add(item.id, item);
                        }
                    }
                    if (giftsByName.Contains(category)) {
                        foreach (var item in giftsByName[category]) {
                            if (!categoryItems.ContainsKey(item.id))
                                categoryItems.Add(item.id, item);
                        }
                    }
                    if (category == "fanta")
                        eventData.name = "fanta_japen";
                    else if (category == "santa")
                        eventData.name = "xmas";
                    else if (category == "social")
                        eventData.name = "performance";
                } else if (category == "west") {
                    categoryItems = westItems.ToDictionary(i => i.id, i => i);
                } else {
                    categoryItems = Utility.ItemIndex.ItemList.Where(i => i.tag.ToString() == category)
                                                              .ToDictionary(i => i.id, i => i);
                    if (worldEventsByName.Contains(category)) {
                        foreach (var item in worldEventsByName[category])
                            categoryItems.Add(item.id, item);
                    }
                    if (worldCashByName.Contains(category)) {
                        foreach (var item in worldCashByName[category])
                            categoryItems.Add(item.id, item);
                    }
                    if (worldGiftsByName.Contains(category)) {
                        foreach (var item in worldGiftsByName[category])
                            categoryItems.Add(item.id, item);
                    }
                }
                foreach (var q in quests) {
                    var eventQuest = new EventQuest();
                    eventQuest.id = q.id;
                    eventQuest.name = q.Description.body.Trim();
                    eventData.quests.Add(eventQuest);
                    var rewardIds = q.OurQuest.AllRewards.Select(r => r.item_id);
                    if (categoryItems != null) {
                        foreach (int rewardId in rewardIds)
                            categoryItems.Remove(rewardId);
                    }
                }
                if (categoryItems != null) {
                    eventData.wrapItems = new List<EventItem>();
                    eventData.rewardItems = new List<EventItem>();
                    eventData.cash = new List<EventItem>();
                    HashSet<int> cashIds = new HashSet<int>();

                    foreach (var pair in categoryItems) {
                        var eventItem = new EventItem();
                        Item origItem = Utility.ItemIndex.GetItem(pair.Key);
                        eventItem.name = Utility.StringIndex.GetString(origItem.desc).Trim();
                        eventItem.item_id = pair.Key;
                        eventItem.race = origItem.race;
                        if (origItem.extra_currency_item_count > 0) {
                            int cashId = Utility.ItemIndex.GetItem(origItem.extra_currency_item).id;
                            cashIds.Add(cashId);
                        }
                        if (origItem.cash_item == 1 || origItem.name.StartsWith("wrap_")) {
                            eventItem.comment = Utility.StringIndex.GetString(origItem.desc_long);
                            eventData.wrapItems.Add(eventItem);
                        } else {
                            eventData.rewardItems.Add(eventItem);
                        }
                    }
                    if (eventData.rewardItems.Count == 0)
                        eventData.rewardItems = null;
                    else if (cashIds.Count > 0) {
                        foreach (var ci in cashIds) {
                            var cashItem = eventData.rewardItems.Where(r => r.item_id == ci).FirstOrDefault();
                            if (cashItem != null) {
                                eventData.rewardItems.Remove(cashItem);
                            } else {
                                cashItem = new EventItem();
                                cashItem.item_id = ci;
                                var origItem = Utility.ItemIndex.ItemList.Where(i => i.id == ci).FirstOrDefault();
                                cashItem.name = Utility.StringIndex.GetString(origItem.desc).Trim();
                                cashItem.race = origItem.race;
                            }
                            eventData.cash.Add(cashItem);
                        }
                    }
                    if (eventData.wrapItems.Count == 0)
                        eventData.wrapItems = null;
                }
                outputFile.events.Add(eventData);
            }

            //var merchants = Utility.ClientNpcIndex.NpcList.Where(n => n.cursor_type == CursorType.trade ||
            //                                                          n.disk_type == DiskType.merchant ||
            //                                                          n.TradeInfo != null ||
            //                                                          n.AbyssTradeInfo != null ||
            //                                                          n.CouponTradeInfo != null ||
            //                                                          n.ExtraCurrencyTradeInfo != null);
            //foreach (var merchant in merchants) {
            //    var dialogs = Utility.DialogFiles.Where(p => p.Key.StartsWith(merchant.name.ToLower() + '|'));
            //    if (dialogs.Any()) {
            //        foreach (var dialog in dialogs) {
            //            var pg = dialog.Value.HtmlPages.Where(p => p.npcfuncs != null).FirstOrDefault();
            //            if (pg != null) {
            //                var sellbuy = pg.npcfuncs.Where(f => f.GetType().Equals(typeof(trade_buy)) ||
            //                                                     f.GetType().Equals(typeof(trade_sell)) ||
            //                                                     f.GetType().Equals(typeof(exchange_coin)) ||
            //                                                     f.GetType().Equals(typeof(Pet_adopt)));
            //                if (sellbuy.Any()) {
            //                    break;
            //                }
            //            }
            //        }
            //    }
            //}

            //Utility.OriginalTradeList.TradeLists =
            //    Utility.OriginalTradeList.TradeLists.OrderBy(t => t.npc_id).ToList();

            try {
                using (var fs = new FileStream(Path.Combine(outputPath, "events.xml"),
                                               FileMode.Create, FileAccess.Write))
                using (var writer = XmlWriter.Create(fs, settings)) {
                    XmlSerializer ser = new XmlSerializer(typeof(EventsFile));
                    ser.Serialize(writer, outputFile);
                }
            } catch (Exception ex) {
                Debug.Print(ex.ToString());
            }
        }
Exemple #2
0
        static void Main(string[] args)
        {
            Utility.WriteExeDetails();
            Utility.LoadStrings(root);
            Utility.LoadItems(root);
            Utility.LoadQuestFile(root);

            var newStuff = Utility.QuestIndex.QuestList.Where(n => n.nodes.Count > 0)
                                                       .SelectMany(n => n.nodes);
            var distinctNew = newStuff.Select(n => n.Name).Distinct();

            if (distinctNew.Any()) {
                Console.WriteLine("New elements found in XML which were not coded in. Continue?");
                Console.WriteLine("Elements are:");
                foreach (var nodeName in distinctNew)
                    Console.WriteLine("      {0}", nodeName);
                Console.Write("(Y/N): ");
                var input = Console.ReadKey(true);
                if (Char.ToLower(input.KeyChar) == 'n')
                    return;
            }

            Utility.LoadClientNpcs(root);

            Utility.LoadTitles(root);

            Utility.LoadNpcFactions(root);

            Console.Write("Parsing... ");
            int top = Console.CursorTop;
            int left = Console.CursorLeft;

            var utility = Utility<Quest>.Instance;
            List<QuestOur> ourList = new List<QuestOur>();
            foreach (Quest quest in Utility.QuestIndex.QuestList) {
                //testing
                //if (quest.Description == null) continue;

                // disable check, using new check for testing
                // not enabled 임시 in korean
                if (quest.Description != null) {
                    if (quest.Description.body == "Temporary" || quest.Description.body == "임시")
                        continue;
                }

                // Only Exclude Temporary and min level == 99 (Disabled Quests)
                //if (Utility.QuestStringIndex.GetString(quest.desc) == "Temporary" || quest.minlevel_permitted == 99) continue;

                /* disable check
                if (quest.minlevel_permitted != 99 && quest.minlevel_permitted > 60 &&
                    quest.minlevel_permitted != 65)
                    continue;
                */

                QuestOur q = new QuestOur();
                q.id = quest.id;

                Console.SetCursorPosition(left, top);
                Console.Write("Q" + q.id);

                q.max_repeat_count = quest.max_repeat_count;

                // Assign to category
                q.category = quest.category1.ToUpper();

                /* disabled, Get Id's from string index instead
                q.nameId = (quest.Description.id * 2 + 1);
                if (q.nameId > 0)
                    q.nameIdSpecified = true;
                */

                q.nameId = Utility.StringIndex[quest.desc];
                q.nameIdSpecified = true;

                // Get Mentor Faction from Client Data
                if (quest.npcfaction_name != null) q.npcfaction_id = Utility.NpcFactionIndex[quest.npcfaction_name];

                // set mentor type
                if (quest.category2 != null) if (quest.category2.Contains("Mentee")) q.mentor_type = "MENTE";
                if (quest.category2 != null) if (quest.category2.Contains("Mentor")) q.mentor_type = "MENTOR";

                if (quest.race_permitted == string.Empty)
                {
                    q.race_permitted = Race.PC_ALL;
                    q.race_permittedSpecified = true;
                }
                else if (quest.race_permitted.Split(' ').Count() > 1) {
                    q.race_permitted = Race.PC_ALL;
                    q.race_permittedSpecified = true;
                }
                else {
                    q.race_permitted = (Race)Enum.Parse(typeof(Race), quest.race_permitted.ToUpper());
                    q.race_permittedSpecified = true;
                }

                q.name = quest.Description.body.TrimEnd();
                q.minlevel_permitted = quest.minlevel_permitted;
                if (quest.minlevel_permitted < quest.maxlevel_permitted)
                    q.maxlevel_permitted = quest.maxlevel_permitted;

                q.playtime_hour = quest.playtime_hour;

                if(quest.quest_repeat_cycle!= null)
                    q.repeat_cycle = quest.quest_repeat_cycle.ToUpper();

                q.cannot_giveup = quest.cannot_giveup;
                q.cannot_share = quest.cannot_share;

                string[] classes = quest.class_permitted.ToUpper().Split(' ');
                string classesParse = String.Join(",", classes);
                Class classEnum = (Class)Enum.Parse(typeof(Class), classesParse);
                if ((classEnum & Class.ALL) != Class.ALL) {
                    q.class_permitted = ((ClassOur)classEnum).ToString().Replace(",", String.Empty);
                    q.class_permittedSpecified = true;
                }

                string race = quest.race_permitted.ToLower();
                if (race == "pc_light") {
                    q.race_permitted = Race.ELYOS;
                    q.race_permittedSpecified = true;
                } else if (race == "pc_dark") {
                    q.race_permitted = Race.ASMODIANS;
                    q.race_permittedSpecified = true;
                }

                string gender = quest.gender_permitted.ToLower();
                if (gender != "all") {
                    q.gender_permittedSpecified = true;
                    if (gender == "male")
                        q.gender_permitted = Gender.MALE;
                    else
                        q.gender_permitted = Gender.FEMALE;
                }

                var drops = new List<QuestDrop>();
                utility.Export(quest, "drop_item_", drops);
                drops = drops.Where(d => d.item_id != 0 && d.chance > 0).ToList();
                if (drops.Count > 0) {
                    // check if multiple NCS
                    q.QuestDrops = new List<QuestDrop>();
                    foreach (var drop in drops) {
                        if (drop.npc_id > 0) {
                            drop.collecting_step = quest.collect_progress;
                            q.QuestDrops.Add(drop);
                        }
                        else {
                            if (drop.npcIds == null /*&& drop.npc_faction != null*/) {
                                // NOT defined in 1.9 but in 2.0 - skip them
                                // q.QuestDrops.Add(drop);
                                continue;
                            }
                            foreach (var npcName in drop.npcIds) {
                                QuestDrop newDrop = (QuestDrop)drop.Clone();
                                int id = Utility.ClientNpcIndex[npcName];
                                if (id != -1) {
                                    newDrop.npc_id = id;
                                    newDrop.collecting_step = quest.collect_progress;
                                    q.QuestDrops.Add(newDrop);
                                }
                            }
                        }
                    }
                }

                q.QuestWorkItems = new List<QuestItemsOur>();
                utility.Export(quest, "quest_work_item", q.QuestWorkItems);
                q.QuestWorkItems = q.QuestWorkItems.Where(d => d.count > 0).ToList();
                if (q.QuestWorkItems.Count == 0)
                    q.QuestWorkItems = null;
                else
                    q.QuestWorkItemsSpecified = true;

                if (quest.assassin_selectable_reward != null) {
                    q.AssassinSelectableRewards = new List<QuestItemsOur>();
                    foreach (var r in quest.assassin_selectable_reward) {
                        QuestItemsOur our = GetRewardItem(r.assassin_selectable_item);
                        if (our != null)
                            q.AssassinSelectableRewards.Add(our);
                    }
                }

                if (quest.chanter_selectable_reward != null) {
                    q.ChanterSelectableRewards = new List<QuestItemsOur>();
                    foreach (var r in quest.chanter_selectable_reward) {
                        QuestItemsOur our = GetRewardItem(r.chanter_selectable_item);
                        if (our != null)
                            q.ChanterSelectableRewards.Add(our);
                    }
                }

                if (quest.elementalist_selectable_reward != null) {
                    q.ElementalistSelectableRewards = new List<QuestItemsOur>();
                    foreach (var r in quest.elementalist_selectable_reward) {
                        QuestItemsOur our = GetRewardItem(r.elementalist_selectable_item);
                        if (our != null)
                            q.ElementalistSelectableRewards.Add(our);
                    }
                }

                if (quest.fighter_selectable_reward != null) {
                    q.FighterSelectableRewards = new List<QuestItemsOur>();
                    foreach (var r in quest.fighter_selectable_reward) {
                        QuestItemsOur our = GetRewardItem(r.fighter_selectable_item);
                        if (our != null)
                            q.FighterSelectableRewards.Add(our);
                    }
                }

                if (quest.knight_selectable_reward != null) {
                    q.KnightSelectableRewards = new List<QuestItemsOur>();
                    foreach (var r in quest.knight_selectable_reward) {
                        QuestItemsOur our = GetRewardItem(r.knight_selectable_item);
                        if (our != null)
                            q.KnightSelectableRewards.Add(our);
                    }
                }

                if (quest.priest_selectable_reward != null) {
                    q.PriestSelectableRewards = new List<QuestItemsOur>();
                    foreach (var r in quest.priest_selectable_reward) {
                        QuestItemsOur our = GetRewardItem(r.priest_selectable_item);
                        if (our != null)
                            q.PriestSelectableRewards.Add(our);
                    }
                }

                if (quest.ranger_selectable_reward != null) {
                    q.RangerSelectableRewards = new List<QuestItemsOur>();
                    foreach (var r in quest.ranger_selectable_reward) {
                        QuestItemsOur our = GetRewardItem(r.ranger_selectable_item);
                        if (our != null)
                            q.RangerSelectableRewards.Add(our);
                    }
                }

                if (quest.wizard_selectable_reward != null) {
                    q.WizardSelectableRewards = new List<QuestItemsOur>();
                    foreach (var r in quest.wizard_selectable_reward) {
                        QuestItemsOur our = GetRewardItem(r.wizard_selectable_item);
                        if (our != null)
                            q.WizardSelectableRewards.Add(our);
                    }
                }

                if (quest.bard_selectable_reward != null)
                {
                    q.Bard_selectablRewards = new List<QuestItemsOur>();
                    foreach (var r in quest.bard_selectable_reward)
                    {
                        QuestItemsOur our = GetRewardItem(r.bard_selectable_item);
                        if (our != null)
                            q.Bard_selectablRewards.Add(our);
                    }
                }

                if (quest.gunner_selectable_reward != null)
                {
                    q.Gunner_selectableRewards = new List<QuestItemsOur>();
                    foreach (var r in quest.gunner_selectable_reward)
                    {
                        QuestItemsOur our = GetRewardItem(r.gunner_selectable_item);
                        if (our != null)
                            q.Gunner_selectableRewards.Add(our);
                    }
                }

                q.CollectItems = new List<CollectItem>();
                utility.Export(quest, "collect_item", q.CollectItems);
                q.CollectItems = q.CollectItems.Where(d => d.count > 0).ToList();
                if (q.CollectItems.Count == 0)
                    q.CollectItems = null;
                else
                    q.CollectItemsSpecified = true;

                q.combine_skillpoint = quest.combine_skillpoint;
                if (q.combine_skillpoint > 0)
                    q.combine_skillpointSpecified = true;

                if (quest.combineskill != CombineSkillType.any) {
                    q.combineskill = (int)quest.combineskill;
                    q.combineskillSpecified = true;
                }

                var questConds = GetConditions(quest, "finished_quest_cond");
                if (questConds.Count > 0) {
                    if (q.start_conditions == null) q.start_conditions = new QuestStartCondition();
                    q.start_conditions.finishedQuestSteps = new List<QuestStep>();
                    for (int i = 0; i < questConds.Count; i++) {
                        q.start_conditions.finishedQuestSteps.Add(questConds[i].questSteps[0]);
                    }
                }
                questConds = GetConditions(quest, "unfinished_quest_cond");
                if (questConds.Count > 0) {
                    if (q.start_conditions == null) q.start_conditions = new QuestStartCondition();
                    q.start_conditions.unfinishedQuestSteps = new List<QuestStep>();
                    for (int i = 0; i < questConds.Count; i++) {
                        q.start_conditions.unfinishedQuestSteps.Add(questConds[i].questSteps[0]);
                    }
                }
                questConds = GetConditions(quest, "acquired_quest_cond");
                if (questConds.Count > 0) {
                    if (q.start_conditions == null) q.start_conditions = new QuestStartCondition();
                    q.start_conditions.acquiredQuestSteps = new List<QuestStep>();
                    for (int i = 0; i < questConds.Count; i++) {
                        q.start_conditions.acquiredQuestSteps.Add(questConds[i].questSteps[0]);
                    }
                }
                questConds = GetConditions(quest, "noacquired_quest_cond");
                if (questConds.Count > 0) {
                    if (q.start_conditions == null) q.start_conditions = new QuestStartCondition();
                    q.start_conditions.notAcquiredQuestSteps = new List<QuestStep>();
                    for (int i = 0; i < questConds.Count; i++) {
                        q.start_conditions.notAcquiredQuestSteps.Add(questConds[i].questSteps[0]);
                    }
                }
                questConds = GetConditions(quest, "equiped_item_name");
                if (questConds.Count > 0) {
                    if (q.start_conditions == null) q.start_conditions = new QuestStartCondition();
                    q.start_conditions.equippedQuestSteps = new List<QuestStep>();
                    for (int i = 0; i < questConds.Count; i++) {
                        q.start_conditions.equippedQuestSteps.Add(questConds[i].questSteps[0]);
                    }
                }

                q.use_class_reward = quest.use_class_reward == 1 ? true : false;

                var rewards = new List<Rewards>();

                utility.Export(quest, "reward_exp", rewards);
                utility.Export(quest, "reward_gold", rewards);
                utility.Export(quest, "reward_score", rewards);
                utility.Export(quest, "reward_abyss_point", rewards);
                utility.Export(quest, "reward_title", rewards);
                utility.Export(quest, "reward_extend_inventory", rewards);
                utility.Export(quest, "reward_extend_stigma", rewards);
                utility.Export(quest, "reward_item", rewards);
                utility.Export(quest, "selectable_reward_item", rewards);

                rewards = rewards.Where(r => r.BasicRewards != null || r.SelectableRewards != null ||
                                             r.exp > 0 || r.gold > 0 || r.reward_abyss_point > 0 ||
                                             r.title > 0).ToList();
                if (rewards.Count > 0)
                    q.Rewards = rewards;

                Rewards extRewards = null;

                if (quest.reward_gold_ext != 0) {
                    extRewards = new Rewards();
                    extRewards.gold = quest.reward_gold_ext;
                    extRewards.goldSpecified = true;
                }

                if (quest.reward_score_ext != 0)
                {
                    extRewards = new Rewards();
                    extRewards.score = quest.reward_score_ext;
                }

                if (quest.reward_title_ext != null) {
                    int titleId = Utility.TitleIndex[quest.reward_title_ext];
                    if (titleId > 0) {
                        if (extRewards == null)
                            extRewards = new Rewards();
                        extRewards.title = titleId;
                    }
                }

                rewards = new List<Rewards>();
                utility.Export(quest, "reward_item_ext_", rewards);
                rewards = rewards.Where(r => r.BasicRewards != null).ToList();
                if (rewards.Count > 0) {
                    var items = rewards.SelectMany(r => r.BasicRewards);
                    if (extRewards == null)
                        extRewards = new Rewards();
                    extRewards.BasicRewards = new List<QuestItemsOur>();
                    extRewards.BasicRewards.AddRange(items);
                }

                rewards = new List<Rewards>();
                utility.Export(quest, "selectable_reward_item_ext_", rewards);
                rewards = rewards.Where(r => r.SelectableRewards != null).ToList();
                if (rewards.Count > 0) {
                    var items = rewards.SelectMany(r => r.SelectableRewards);
                    if (extRewards == null)
                        extRewards = new Rewards();
                    extRewards.SelectableRewards = new List<QuestItemsOur>();
                    extRewards.SelectableRewards.AddRange(items);
                }

                if (extRewards != null)
                    q.ExtRewards = new List<Rewards>() { extRewards };

                // Lets Add Item Bonuses
                var bonuses = new List<Rewards>();
                utility.Export(quest, "reward_item", bonuses);
                bonuses = rewards.Where(r => r.BonusRewards != null).ToList();
                if (bonuses.Count > 0) {
                    foreach (var bonus in bonuses[0].BonusRewards) {
                        if (bonus.name.Contains("Quest_L_matter_option") || bonus.name.Contains("Quest_D_matter_option")) {
                            string[] split = bonus.name.Split('_');
                            q.bonus = new Bonus();
                            q.bonus.level = Int32.Parse(split[4].Substring(0, 2)); // Get Level Part of Random Bonus
                            q.bonus.type = "MANASTONE"; // bonus type

                            string quantity = split[split.Count() - 1];
                            int number;
                            bool result = Int32.TryParse(quantity, out number);
                            if (result) q.bonus.quantity = number;
                        }
                        if (bonus.name.Contains("Quest_L_medicine") || bonus.name.Contains("Quest_D_medicine")) {
                            string[] split = bonus.name.Split('_');
                            q.bonus = new Bonus();
                            q.bonus.level = Int32.Parse(split[3].Substring(0, 2)); // Get Level Part of Random Bonus
                            q.bonus.type = "MEDICINE"; // bonus type

                            string quantity = split[split.Count() - 1];
                            int number;
                            bool result = Int32.TryParse(quantity, out number);
                            if (result) q.bonus.quantity = number;
                        }
                        if (bonus.name.Contains("Quest_D_food") || bonus.name.Contains("Quest_D_food")) {
                            string[] split = bonus.name.Split('_');
                            q.bonus = new Bonus();
                            q.bonus.level = Int32.Parse(split[3].Substring(0, 2)); // Get Level Part of Random Bonus
                            q.bonus.type = "FOOD"; // bonus type

                            string quantity = split[split.Count() - 1];
                            int number;
                            bool result = Int32.TryParse(quantity, out number);
                            if (result) q.bonus.quantity = number;
                        }
                        if (bonus.name.Contains("Quest_D_fortress") || bonus.name.Contains("Quest_D_fortress")) {
                            string[] split = bonus.name.Split('_');
                            q.bonus = new Bonus();
                            q.bonus.level = Int32.Parse(split[3].Substring(0, 2)); // Get Level Part of Random Bonus
                            q.bonus.type = "FORTRESS"; // bonus type

                            string quantity = split[split.Count() - 1];
                            int number;
                            bool result = Int32.TryParse(quantity, out number);
                            if (result) q.bonus.quantity = number;
                        }
                        if (bonus.name.Contains("Quest_L_Goods") || bonus.name.Contains("Quest_D_Goods")) {
                            string[] split = bonus.name.Split('_');
                            q.bonus = new Bonus();
                            q.bonus.level = Int32.Parse(split[3].Substring(0, 2)); // Get Level Part of Random Bonus
                            q.bonus.type = "GOODS"; // bonus type

                            string quantity = split[split.Count() - 1];
                            int number;
                            bool result = Int32.TryParse(quantity, out number);
                            if (result) q.bonus.quantity = number;
                        }
                        if (bonus.name.Contains("Quest_A_BranchLunarEvent")) {
                            string[] split = bonus.name.Split('_');
                            q.bonus = new Bonus();
                            q.bonus.level = Int32.Parse(split[3].Substring(0, 2)); // Get Level Part of Random Bonus
                            q.bonus.type = "LUNAR"; // bonus type

                            string quantity = split[split.Count() - 1];
                            int number;
                            bool result = Int32.TryParse(quantity, out number);
                            if (result) q.bonus.quantity = number;
                        }
                        if (bonus.name.Contains("Quest_L_magical") || bonus.name.Contains("Quest_D_magical")) {
                            string[] split = bonus.name.Split('_');
                            q.bonus = new Bonus();
                            q.bonus.level = Int32.Parse(split[3].Substring(0, 2)); // Get Level Part of Random Bonus
                            q.bonus.type = "MAGICAL"; // bonus type

                            string quantity = split[split.Count() - 1];
                            int number;
                            bool result = Int32.TryParse(quantity, out number);
                            if (result) q.bonus.quantity = number;
                        }
                        if (bonus.name.Contains("Quest_D_material")) {
                            string[] split = bonus.name.Split('_');
                            q.bonus = new Bonus();
                            q.bonus.level = Int32.Parse(split[3].Substring(0, 2)); // Get Level Part of Random Bonus
                            q.bonus.type = "MATERIAL"; // bonus type

                            string quantity = split[split.Count() - 1];
                            int number;
                            bool result = Int32.TryParse(quantity, out number);
                            if (result) q.bonus.quantity = number;
                        }
                        if (bonus.name.Contains("Quest_L_medal") || bonus.name.Contains("Quest_D_medal")) {
                            string[] split = bonus.name.Split('_');
                            q.bonus = new Bonus();
                            q.bonus.level = Int32.Parse(split[3].Substring(0, 2)); // Get Level Part of Random Bonus
                            q.bonus.type = "MEDAL"; // bonus type

                            string quantity = split[split.Count() - 1];
                            int number;
                            bool result = Int32.TryParse(quantity, out number);
                            if (result) q.bonus.quantity = number;
                        }
                        if (bonus.name.Contains("Quest_L_Christmas") || bonus.name.Contains("Quest_D_Christmas")) {
                            q.bonus = new Bonus();
                            q.bonus.type = "MOVIE"; // bonus type
                        }
                        if (bonus.name.Contains("Quest_L_Recipe")) {
                            string[] split = bonus.name.Split('_');
                            q.bonus = new Bonus();
                            q.bonus.level = Int32.Parse(split[3].Substring(0, 2)); // Get Level Part of Random Bonus
                            q.bonus.type = "RECIPE"; // bonus type
                        }
                        if (bonus.name.Contains("Quest_L_redeem") || bonus.name.Contains("Quest_D_redeem")) {
                            string[] split = bonus.name.Split('_');
                            q.bonus = new Bonus();
                            q.bonus.level = Int32.Parse(split[3].Substring(0, 2)); // Get Level Part of Random Bonus
                            q.bonus.type = "REDEEM"; // bonus type
                        }
                        if (bonus.name.Contains("Quest_L_BranchRiftEvent") || bonus.name.Contains("Quest_D_BranchRiftEvent")) {
                            string[] split = bonus.name.Split('_');
                            q.bonus = new Bonus();
                            q.bonus.level = Int32.Parse(split[3].Substring(0, 2)); // Get Level Part of Random Bonus
                            q.bonus.type = "RIFT"; // bonus type
                        }
                        if (bonus.name.Contains("Quest_L_task") || bonus.name.Contains("Quest_D_task")) {
                            q.bonus.skill = q.combineskill;
                            q.bonus.type = "TASK"; // bonus type
                        }
                        if (bonus.name.Contains("Quest_A_BranchWinterEvent")) {
                            string[] split = bonus.name.Split('_');
                            q.bonus = new Bonus();
                            q.bonus.level = Int32.Parse(split[3].Substring(0, 2)); // Get Level Part of Random Bonus
                            q.bonus.type = "WINTER"; // bonus type
                        }
                        if (bonus.name.Contains("Quest_L_boss") || bonus.name.Contains("Quest_D_boss")) {
                            string[] split = bonus.name.Split('_');
                            q.bonus = new Bonus();
                            q.bonus.level = Int32.Parse(split[3].Substring(0, 2)); // Get Level Part of Random Bonus
                            q.bonus.type = "BOSS"; // bonus type
                        }
                    }
                }

                ourList.Add(q);
                Thread.Sleep(1);
            }

            quest_data fileData = new quest_data();
            fileData.Quests = ourList;

            var settings = new XmlWriterSettings() {
                CheckCharacters = false,
                CloseOutput = false,
                Encoding = new UTF8Encoding(false),
                Indent = true,
                IndentChars = "\t",
            };

            string outputPath = Path.Combine(root, @".\output\");
            if (!Directory.Exists(outputPath))
                Directory.CreateDirectory(outputPath);

            try {
                using (var fs = new FileStream(Path.Combine(outputPath, "quest_data.xml"),
                                               FileMode.Create, FileAccess.Write))
                using (var writer = XmlWriter.Create(fs, settings)) {
                    XmlSerializer ser = new XmlSerializer(typeof(quest_data));
                    ser.Serialize(writer, fileData);
                }
            }
            catch (Exception ex) {
                Debug.Print(ex.ToString());
            }

            Console.Clear();
            Console.WriteLine("Done.");
            Console.ReadKey();
            Environment.Exit(0);
        }
Exemple #3
0
        static void Main(string[] args)
        {
            Utility.WriteExeDetails();
            Console.WriteLine("Loading quests...");
            Utility.LoadQuestFile(root);

            var newStuff = Utility.QuestIndex.QuestList.Where(n => n.nodes.Count > 0)
                                                       .SelectMany(n => n.nodes);
            var distinctNew = newStuff.Select(n => n.Name).Distinct();

            if (distinctNew.Any()) {
                Console.WriteLine("New elements found in XML which were not coded in. Continue?");
                Console.WriteLine("Elements are:");
                foreach (var nodeName in distinctNew)
                    Console.WriteLine("      {0}", nodeName);
                Console.Write("(Y/N): ");
                var input = Console.ReadKey(true);
                if (Char.ToLower(input.KeyChar) == 'n')
                    return;
            }

            Console.WriteLine("Loading strings...");
            Utility.LoadStrings(root);
            Console.WriteLine("Loading NPCs...");
            Utility.LoadClientNpcs(root);
            Console.WriteLine("Loading items...");
            Utility.LoadItems(root);
            Console.WriteLine("Loading titles...");
            Utility.LoadTitles(root);

            Console.Write("Parsing... ");
            int top = Console.CursorTop;
            int left = Console.CursorLeft;

            var utility = Utility<Quest>.Instance;
            List<QuestOur> ourList = new List<QuestOur>();
            foreach (Quest quest in Utility.QuestIndex.QuestList) {
                // not enabled 임시 in korean
                if (quest.Description.body == "Temporary" || quest.Description.body == "임시")
                    continue;

                if (quest.minlevel_permitted != 99 && quest.minlevel_permitted > 55 &&
                    quest.minlevel_permitted != 65)
                    continue;

                QuestOur q = new QuestOur();
                q.id = quest.id;

                Console.SetCursorPosition(left, top);
                Console.Write("Q" + q.id);

                q.max_repeat_count = quest.max_repeat_count;
                q.nameId = (quest.Description.id * 2 + 1);
                if (q.nameId > 0)
                    q.nameIdSpecified = true;

                q.name = quest.Description.body.TrimEnd();
                q.minlevel_permitted = quest.minlevel_permitted;
                if (quest.minlevel_permitted < quest.maxlevel_permitted)
                    q.maxlevel_permitted = quest.maxlevel_permitted;
                q.repeat_day = (int)quest.quest_repeat_cycle;
                q.cannot_giveup = quest.cannot_giveup;
                q.cannot_share = quest.cannot_share;

                string[] classes = quest.class_permitted.ToUpper().Split(' ');
                string classesParse = String.Join(",", classes);
                Class classEnum = (Class)Enum.Parse(typeof(Class), classesParse);
                if ((classEnum & Class.ALL) != Class.ALL) {
                    q.class_permitted = ((ClassOur)classEnum).ToString().Replace(",", String.Empty);
                    q.class_permittedSpecified = true;
                }

                string race = quest.race_permitted.ToLower();
                if (race == "pc_light") {
                    q.race_permitted = Race.ELYOS;
                    q.race_permittedSpecified = true;
                } else if (race == "pc_dark") {
                    q.race_permitted = Race.ASMODIANS;
                    q.race_permittedSpecified = true;
                }

                string gender = quest.gender_permitted.ToLower();
                if (gender != "all") {
                    q.gender_permittedSpecified = true;
                    if (gender == "male")
                        q.gender_permitted = Gender.MALE;
                    else
                        q.gender_permitted = Gender.FEMALE;
                }

                var drops = new List<QuestDrop>();
                utility.Export(quest, "drop_item_", drops);
                drops = drops.Where(d => d.item_id != 0 && d.chance > 0).ToList();
                if (drops.Count > 0) {
                    // check if multiple NCS
                    q.QuestDrops = new List<QuestDrop>();
                    foreach (var drop in drops) {
                        if (drop.npc_id > 0)
                            q.QuestDrops.Add(drop);
                        else {
                            if (drop.npcIds == null /*&& drop.npc_faction != null*/) {
                                // NOT defined in 1.9 but in 2.0 - skip them
                                // q.QuestDrops.Add(drop);
                                continue;
                            }
                            foreach (var npcName in drop.npcIds) {
                                QuestDrop newDrop = (QuestDrop)drop.Clone();
                                int id = Utility.ClientNpcIndex[npcName];
                                if (id != -1) {
                                    newDrop.npc_id = id;
                                    q.QuestDrops.Add(newDrop);
                                }
                            }
                        }
                    }
                }

                q.QuestWorkItems = new List<QuestItemsOur>();
                utility.Export(quest, "quest_work_item", q.QuestWorkItems);
                q.QuestWorkItems = q.QuestWorkItems.Where(d => d.count > 0).ToList();
                if (q.QuestWorkItems.Count == 0)
                    q.QuestWorkItems = null;
                else
                    q.QuestWorkItemsSpecified = true;

                if (quest.assassin_selectable_reward != null) {
                    q.AssassinSelectableRewards = new List<QuestItemsOur>();
                    foreach (var r in quest.assassin_selectable_reward) {
                        QuestItemsOur our = GetRewardItem(r.assassin_selectable_item);
                        if (our != null)
                            q.AssassinSelectableRewards.Add(our);
                    }
                }

                if (quest.chanter_selectable_reward != null) {
                    q.ChanterSelectableRewards = new List<QuestItemsOur>();
                    foreach (var r in quest.chanter_selectable_reward) {
                        QuestItemsOur our = GetRewardItem(r.chanter_selectable_item);
                        if (our != null)
                            q.ChanterSelectableRewards.Add(our);
                    }
                }

                if (quest.elementalist_selectable_reward != null) {
                    q.ElementalistSelectableRewards = new List<QuestItemsOur>();
                    foreach (var r in quest.elementalist_selectable_reward) {
                        QuestItemsOur our = GetRewardItem(r.elementalist_selectable_item);
                        if (our != null)
                            q.ElementalistSelectableRewards.Add(our);
                    }
                }

                if (quest.fighter_selectable_reward != null) {
                    q.FighterSelectableRewards = new List<QuestItemsOur>();
                    foreach (var r in quest.fighter_selectable_reward) {
                        QuestItemsOur our = GetRewardItem(r.fighter_selectable_item);
                        if (our != null)
                            q.FighterSelectableRewards.Add(our);
                    }
                }

                if (quest.knight_selectable_reward != null) {
                    q.KnightSelectableRewards = new List<QuestItemsOur>();
                    foreach (var r in quest.knight_selectable_reward) {
                        QuestItemsOur our = GetRewardItem(r.knight_selectable_item);
                        if (our != null)
                            q.KnightSelectableRewards.Add(our);
                    }
                }

                if (quest.priest_selectable_reward != null) {
                    q.PriestSelectableRewards = new List<QuestItemsOur>();
                    foreach (var r in quest.priest_selectable_reward) {
                        QuestItemsOur our = GetRewardItem(r.priest_selectable_item);
                        if (our != null)
                            q.PriestSelectableRewards.Add(our);
                    }
                }

                if (quest.ranger_selectable_reward != null) {
                    q.RangerSelectableRewards = new List<QuestItemsOur>();
                    foreach (var r in quest.ranger_selectable_reward) {
                        QuestItemsOur our = GetRewardItem(r.ranger_selectable_item);
                        if (our != null)
                            q.RangerSelectableRewards.Add(our);
                    }
                }

                if (quest.wizard_selectable_reward != null) {
                    q.WizardSelectableRewards = new List<QuestItemsOur>();
                    foreach (var r in quest.wizard_selectable_reward) {
                        QuestItemsOur our = GetRewardItem(r.wizard_selectable_item);
                        if (our != null)
                            q.WizardSelectableRewards.Add(our);
                    }
                }

                q.CollectItems = new List<CollectItem>();
                utility.Export(quest, "collect_item", q.CollectItems);
                q.CollectItems = q.CollectItems.Where(d => d.count > 0).ToList();
                if (q.CollectItems.Count == 0)
                    q.CollectItems = null;
                else
                    q.CollectItemsSpecified = true;

                q.combine_skillpoint = quest.combine_skillpoint;
                if (q.combine_skillpoint > 0)
                    q.combine_skillpointSpecified = true;

                if (quest.combineskill != CombineSkillType.any) {
                    q.combineskill = (int)quest.combineskill;
                    q.combineskillSpecified = true;
                }

                var questConds = GetConditions(quest, "finished_quest_cond");
                if (questConds.Count > 0)
                    q.finished_quest_conds = questConds;

                questConds = GetConditions(quest, "unfinished_quest_cond");
                if (questConds.Count > 0)
                    q.unfinished_quest_conds = questConds;

                questConds = GetConditions(quest, "acquired_quest_cond");
                if (questConds.Count > 0)
                    q.acquired_quest_conds = questConds;

                questConds = GetConditions(quest, "noacquired_quest_cond");
                if (questConds.Count > 0)
                    q.noacquired_quest_conds = questConds;

                q.use_class_reward = quest.use_class_reward;

                var rewards = new List<Rewards>();

                utility.Export(quest, "reward_exp", rewards);
                utility.Export(quest, "reward_gold", rewards);
                utility.Export(quest, "reward_abyss_point", rewards);
                utility.Export(quest, "reward_title", rewards);
                utility.Export(quest, "reward_extend_inventory", rewards);
                utility.Export(quest, "reward_extend_stigma", rewards);
                utility.Export(quest, "reward_item", rewards);
                utility.Export(quest, "selectable_reward_item", rewards);

                rewards = rewards.Where(r => r.BasicRewards != null || r.SelectableRewards != null ||
                                             r.exp > 0 || r.gold > 0 || r.reward_abyss_point > 0 ||
                                             r.title > 0).ToList();

                if (rewards.Count > 0)
                    q.Rewards = rewards;

                Rewards extRewards = null;

                if (quest.reward_gold_ext != 0) {
                    extRewards = new Rewards();
                    extRewards.gold = quest.reward_gold_ext;
                    extRewards.goldSpecified = true;
                }

                if (quest.reward_title_ext != null) {
                    int titleId = Utility.TitleIndex[quest.reward_title_ext];
                    if (titleId > 0) {
                        if (extRewards == null)
                            extRewards = new Rewards();
                        extRewards.title = titleId;
                    }
                }

                rewards = new List<Rewards>();
                utility.Export(quest, "reward_item_ext_", rewards);
                rewards = rewards.Where(r => r.BasicRewards != null).ToList();
                if (rewards.Count > 0) {
                    var items = rewards.SelectMany(r => r.BasicRewards);
                    if (extRewards == null)
                        extRewards = new Rewards();
                    extRewards.BasicRewards = new List<QuestItemsOur>();
                    extRewards.BasicRewards.AddRange(items);
                }

                rewards = new List<Rewards>();
                utility.Export(quest, "selectable_reward_item_ext_", rewards);
                rewards = rewards.Where(r => r.SelectableRewards != null).ToList();
                if (rewards.Count > 0) {
                    var items = rewards.SelectMany(r => r.SelectableRewards);
                    if (extRewards == null)
                        extRewards = new Rewards();
                    extRewards.SelectableRewards = new List<QuestItemsOur>();
                    extRewards.SelectableRewards.AddRange(items);
                }

                if (extRewards != null)
                    q.ExtRewards = new List<Rewards>() { extRewards };

                ourList.Add(q);
                Thread.Sleep(1);
            }

            quest_data fileData = new quest_data();
            fileData.Quests = ourList;

            var settings = new XmlWriterSettings()
            {
                CheckCharacters = false,
                CloseOutput = false,
                Encoding = new UTF8Encoding(false),
                Indent = true,
                IndentChars = "\t",
            };

            string outputPath = Path.Combine(root, @".\output\");
            if (!Directory.Exists(outputPath))
                Directory.CreateDirectory(outputPath);

            try {
                using (var fs = new FileStream(Path.Combine(outputPath, "quest_data.xml"),
                                               FileMode.Create, FileAccess.Write))
                using (var writer = XmlWriter.Create(fs, settings)) {
                    XmlSerializer ser = new XmlSerializer(typeof(quest_data));
                    ser.Serialize(writer, fileData);
                }
            } catch (Exception ex) {
                Debug.Print(ex.ToString());
            }

            Console.Clear();
            Console.WriteLine("Done.");
            Console.ReadKey();
            Environment.Exit(0);
        }