public void AddElementTest()
        {
            XmlArrayElement xmlArrayElement = new XmlArrayElement();

            xmlArrayElement.AddElement(new XElement("Test"));
            xmlArrayElement.AddElement(new XElement("Test"));
            xmlArrayElement.AddElement(new XElement("Test"));

            Assert.AreEqual(2, xmlArrayElement.MaxIndex);
            Assert.AreEqual(3, xmlArrayElement.Elements.Count());
        }
        private XmlArrayElement GetTalentPrerequisites(XElement talentElement)
        {
            XmlArrayElement prerequisiteTalentArray = new XmlArrayElement();

            foreach (XElement prerequisiteElement in talentElement.Elements("PrerequisiteTalentArray"))
            {
                prerequisiteTalentArray.AddElement(prerequisiteElement);
            }

            return(prerequisiteTalentArray);
        }
        public void AddRemovedElementsTest()
        {
            XmlArrayElement xmlArrayElement = new XmlArrayElement();

            xmlArrayElement.AddElement(new XElement("Test0")); // 0
            xmlArrayElement.AddElement(new XElement("Test1")); // 1
            xmlArrayElement.AddElement(new XElement("Test2")); // 2
            xmlArrayElement.AddElement(new XElement("Test3")); // 3
            xmlArrayElement.AddElement(new XElement("Test4")); // 4
            xmlArrayElement.AddElement(new XElement("Test5")); // 5

            xmlArrayElement.AddElement(new XElement("Test55", new XAttribute("index", 5), new XAttribute("removed", 1)));

            Assert.AreEqual(5, xmlArrayElement.MaxIndex);
            Assert.AreEqual(5, xmlArrayElement.Elements.Count());
        }
Beispiel #4
0
        private void SetTalents(Hero hero)
        {
            if (_talentsArray == null)
            {
                throw new NullReferenceException("Call SetData() first to set up the talents");
            }

            foreach (XElement element in _talentsArray.Elements)
            {
                Talent?talent = _talentData.CreateTalent(hero, element);
                if (talent != null)
                {
                    XmlArrayElement prerequisiteTalentArray = GetTalentPrerequisites(element);

                    foreach (XElement prerequisiteTalentElement in prerequisiteTalentArray.Elements)
                    {
                        string?talentPrerequisite = prerequisiteTalentElement.Attribute("value")?.Value;

                        if (!string.IsNullOrEmpty(talentPrerequisite))
                        {
                            talent.PrerequisiteTalentIds.Add(talentPrerequisite);
                        }
                    }

                    hero.AddTalent(talent);

                    // makes the abilities that are granted from talents subabilities to that talent
                    if (talent.AbilityTalentId.AbilityType != AbilityTypes.Heroic || talent.Tier == TalentTiers.Level20)
                    {
                        IEnumerable <Ability> abilities = hero.GetAbilitiesFromReferenceId(talent.AbilityTalentId.ReferenceId, StringComparison.OrdinalIgnoreCase);

                        foreach (Ability ability in abilities)
                        {
                            ability.ParentLink = new AbilityTalentId(talent.AbilityTalentId.ReferenceId, talent.AbilityTalentId.ButtonId)
                            {
                                AbilityType = talent.AbilityTalentId.AbilityType,
                                IsPassive   = talent.AbilityTalentId.IsPassive,
                            };
                        }
                    }
                }
            }
        }
        public void AddIndexedElementsTest()
        {
            XmlArrayElement xmlArrayElement = new XmlArrayElement();

            xmlArrayElement.AddElement(new XElement("Test0"));                               // 0
            xmlArrayElement.AddElement(new XElement("Test1"));                               // 1
            xmlArrayElement.AddElement(new XElement("Test2", new XAttribute("value", 100))); // 2
            xmlArrayElement.AddElement(new XElement("Test3"));                               // 3
            xmlArrayElement.AddElement(new XElement("Test4", new XAttribute("value", 500))); // 4
            xmlArrayElement.AddElement(new XElement("Test5"));                               // 5

            xmlArrayElement.AddElement(new XElement("Test22", new XAttribute("index", 2)));
            xmlArrayElement.AddElement(new XElement("Test33", new XAttribute("index", 3)));
            xmlArrayElement.AddElement(new XElement("Test44", new XAttribute("index", 4), new XAttribute("value", 1000)));
            xmlArrayElement.AddElement(new XElement("Test55", new XAttribute("index", 5)));

            Assert.AreEqual(5, xmlArrayElement.MaxIndex);
            Assert.AreEqual(6, xmlArrayElement.Elements.Count());
            Assert.AreEqual("Test33", xmlArrayElement.Elements.ToList()[3].Name.LocalName);
            Assert.AreEqual("100", xmlArrayElement.Elements.ToList()[2].Attribute("value")?.Value);
            Assert.AreEqual("1000", xmlArrayElement.Elements.ToList()[4].Attribute("value")?.Value);
        }
        private void SetTalents(Hero hero)
        {
            if (TalentsArray == null)
            {
                throw new ArgumentNullException("Call SetData() first to set up the talents");
            }

            foreach (XElement element in TalentsArray.Elements)
            {
                Talent talent = TalentData.CreateTalent(hero, element);
                if (talent != null)
                {
                    XmlArrayElement prerequisiteTalentArray = GetTalentPrerequisites(element);

                    foreach (XElement prerequisiteTalentElement in prerequisiteTalentArray.Elements)
                    {
                        string talentPrerequisite = prerequisiteTalentElement.Attribute("value")?.Value;

                        if (!string.IsNullOrEmpty(talentPrerequisite))
                        {
                            talent.AddPrerequisiteTalentId(talentPrerequisite);
                        }
                    }

                    hero.AddTalent(talent);

                    // makes the abilities that are granted from talents subabilities to that talent
                    if ((talent.AbilityType != AbilityType.Heroic || talent.Tier == TalentTier.Level20) && hero.TryGetAbilities(talent.AbilityTalentId.ReferenceId, out IEnumerable <Ability> abilities))
                    {
                        foreach (Ability ability in abilities)
                        {
                            ability.ParentLink = talent.AbilityTalentId;
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Returns the parsed game data from the given ids. Multiple ids may be used to identity one item.
        /// </summary>
        /// <param name="id">The ids of the item to parse.</param>
        /// <returns></returns>
        public Hero Parse(params string[] ids)
        {
            string heroId = ids.FirstOrDefault();

            if (string.IsNullOrEmpty(heroId))
            {
                return(null);
            }

            TalentsArray = new XmlArrayElement();

            UnitData unitData = XmlDataService.UnitData;

            unitData.IsAbilityTierFilterEnabled = true;
            unitData.IsAbilityTypeFilterEnabled = true;
            unitData.IsHeroParsing = true;
            unitData.Localization  = Localization;

            Hero hero = new Hero
            {
                Name        = GameData.GetGameString(DefaultData.HeroData.HeroName.Replace(DefaultData.IdPlaceHolder, heroId)),
                Description = new TooltipDescription(GameData.GetGameString(DefaultData.HeroData.HeroDescription.Replace(DefaultData.IdPlaceHolder, heroId)), Localization),
                CHeroId     = heroId,
                Id          = heroId,
            };

            HeroDataOverride = HeroOverrideLoader.GetOverride(heroId) ?? new HeroDataOverride();

            XElement heroElement = GameData.MergeXmlElements(GameData.Elements(ElementType).Where(x => x.Attribute("id")?.Value == heroId));

            if (heroElement == null)
            {
                return(null);
            }

            SetDefaultValues(hero);

            // must be done first to any find any units.
            FindUnits(heroElement, hero);

            // adds from overrides, parses for abilities
            AddHeroUnits(hero, unitData);

            // parses the hero's unit data; abilities
            // this must come after AddHeroUnits to correctly set the abilityTalentLinks for the talents
            unitData.SetUnitData(hero, HeroDataOverride, true);

            // parses the hero's hero data; talents
            SetData(heroElement, hero);
            SetTalents(hero);

            ClearHeroUnitsFromUnitIds(hero);

            // execute all overrides
            ApplyOverrides(hero, HeroDataOverride);
            foreach (Hero heroUnit in hero.HeroUnits)
            {
                ApplyOverrides(heroUnit, HeroOverrideLoader.GetOverride(heroUnit.CHeroId) ?? new HeroDataOverride());
            }

            ValidateAbilityTalentLinkIds(hero);

            return(hero);
        }