/// <summary>
        /// Looks for an ability from the given <paramref name="abilityTalentId"/>, returning a value that indicates whether such value exists.
        /// </summary>
        /// <param name="abilityTalentId">The <see cref="AbilityTalentId"/> to look for.</param>
        /// <param name="ability">The <see cref="Ability"/> that is found.</param>
        /// <returns><see langword="true"/> if the value was found; otherwise <see langword="false"/>.</returns>
        /// <exception cref="ArgumentNullException"><paramref name="abilityTalentId"/> is <see langword="null"/>.</exception>
        public bool TryGetAbility(AbilityTalentId abilityTalentId, [NotNullWhen(true)] out Ability?ability)
        {
            if (abilityTalentId == null)
            {
                throw new ArgumentNullException(nameof(abilityTalentId));
            }

            return(_abilitiesByAbilityTalentId.TryGetValue(abilityTalentId, out ability));
        }
        /// <summary>
        /// Gets the ability from the <paramref name="abilityTalentId"/>.
        /// </summary>
        /// <param name="abilityTalentId">An <see cref="AbilityTalentId"/>.</param>
        /// <returns>An <see cref="Ability"/>.</returns>
        /// <exception cref="ArgumentNullException"><paramref name="abilityTalentId"/> is <see langword="null"/>.</exception>
        /// <exception cref="KeyNotFoundException"><paramref name="abilityTalentId"/> was not found.</exception>
        public Ability GetAbility(AbilityTalentId abilityTalentId)
        {
            if (abilityTalentId == null)
            {
                throw new ArgumentNullException(nameof(abilityTalentId));
            }

            return(_abilitiesByAbilityTalentId[abilityTalentId]);
        }
        /// <summary>
        /// Determines whether the value exists.
        /// </summary>
        /// <param name="abilityTalentId">An <see cref="AbilityTalentId"/>.</param>
        /// <returns><see langword="true"/> if the value was found; otherwise <see langword="false"/>.</returns>
        /// <exception cref="ArgumentNullException"><paramref name="abilityTalentId"/> is <see langword="null"/>.</exception>
        public bool ContainsAbility(AbilityTalentId abilityTalentId)
        {
            if (abilityTalentId == null)
            {
                throw new ArgumentNullException(nameof(abilityTalentId));
            }

            return(_abilitiesByAbilityTalentId.ContainsKey(abilityTalentId));
        }
Exemple #4
0
        public void EqualsTest(string referenceId, string buttonId, AbilityTypes abilityTypes, bool isPassive)
        {
            AbilityTalentId abilityTalentId = new AbilityTalentId(referenceId, buttonId)
            {
                AbilityType = abilityTypes,
                IsPassive   = isPassive,
            };

            Assert.AreEqual(abilityTalentId, abilityTalentId);
        }
    public void UpdateGameStringsThrowArgumentNullException()
    {
        Ability ability = new()
        {
            AbilityTalentId = new AbilityTalentId("AlarakDiscordStrike", "AlarakDiscordStrike")
            {
                AbilityType = AbilityTypes.Q,
            },
        };

        Assert.ThrowsException <ArgumentNullException>(() => ability.UpdateGameStrings(null !));
    }
Exemple #6
0
        public void NotSameObjectTest()
        {
            AbilityTalentId abilityTalentId = new AbilityTalentId("abil1", "abil77")
            {
                AbilityType = AbilityTypes.Q,
                IsPassive   = false,
            };

            Assert.AreNotEqual(new List <string>()
            {
                "asdf"
            }, abilityTalentId);
        }
Exemple #7
0
        public void EqualsMethodTests()
        {
            AbilityTalentId abilityTalentId = new AbilityTalentId("abil1", "abilbutton")
            {
                AbilityType = AbilityTypes.W,
                IsPassive   = true,
            };

            Assert.IsFalse(abilityTalentId.Equals((int?)null));
            Assert.IsFalse(abilityTalentId.Equals(5));

            Assert.IsTrue(abilityTalentId.Equals(obj: abilityTalentId));
        }
    public void UpdateGameStringsThrowArgumentNullException()
    {
        Talent talent = new()
        {
            AbilityTalentId = new AbilityTalentId("ZuljinWrongPlaceWrongTime", "ZuljinWrongPlaceWrongTime")
            {
                AbilityType = AbilityTypes.W,
            },
            Tier = TalentTiers.Level1,
        };

        Assert.ThrowsException <ArgumentNullException>(() => talent.UpdateGameStrings(null !));
    }
Exemple #9
0
        public void NotEqualsTest(string referenceId, string buttonId, AbilityTypes abilityTypes, bool isPassive)
        {
            AbilityTalentId abilityTalentId = new AbilityTalentId("abil1", "abil77")
            {
                AbilityType = AbilityTypes.Q,
                IsPassive   = false,
            };

            Assert.AreNotEqual(abilityTalentId, new AbilityTalentId(referenceId, buttonId)
            {
                AbilityType = abilityTypes,
                IsPassive   = isPassive,
            });
        }
    public void UpdateGameStringsTest()
    {
        using GameStringDocument gameStringDocument = GameStringDocument.Parse(LoadEnusLocalizedStringData());

        Talent talent = new()
        {
            AbilityTalentId = new AbilityTalentId("ZuljinWrongPlaceWrongTime", "ZuljinWrongPlaceWrongTime")
            {
                AbilityType = AbilityTypes.W,
            },
            Tier = TalentTiers.Level1,
        };

        talent.UpdateGameStrings(gameStringDocument);

        Assert.AreEqual("Bonus Twin Cleave damage at apex", talent.Tooltip.ShortTooltip !.RawDescription);
    }
    public void UpdateGameStringsTest()
    {
        using GameStringDocument gameStringDocument = GameStringDocument.Parse(LoadEnusLocalizedStringData());

        Ability ability = new()
        {
            AbilityTalentId = new AbilityTalentId("AlarakDiscordStrike", "AlarakDiscordStrike")
            {
                AbilityType = AbilityTypes.Q,
            },
        };

        ability.UpdateGameStrings(gameStringDocument);

        Assert.AreEqual("Discord Strike", ability.Name);
        Assert.AreEqual("Cooldown: 8 seconds", ability.Tooltip.Cooldown.CooldownTooltip !.RawDescription);
        Assert.AreEqual("<s val=\"bfd4fd\" name=\"StandardTooltipDetails\">Mana: 55</s>", ability.Tooltip.Energy.EnergyTooltip !.RawDescription);
        Assert.AreEqual("After a <c val=\"bfd4fd\">0.5</c> second delay, enemies in front of Alarak take <c val=\"bfd4fd\">175~~0.04~~</c> damage and are silenced for <c val=\"bfd4fd\">1.5</c> seconds. ", ability.Tooltip.FullTooltip !.RawDescription);
        Assert.AreEqual("Damage and silence enemies in an area", ability.Tooltip.ShortTooltip !.RawDescription);
        Assert.AreEqual("No life", ability.Tooltip.Life.LifeCostTooltip !.RawDescription);
    }
        /// <summary>
        /// Creates an ability from a <see cref="AbilityTalentId"/>.
        /// </summary>
        /// <param name="unitId"></param>
        /// <param name="abilityTalentId"></param>
        /// <returns></returns>
        public Ability?CreateAbility(string unitId, AbilityTalentId abilityTalentId)
        {
            if (string.IsNullOrEmpty(unitId))
            {
                throw new ArgumentException("Argument cannot be null or empty", nameof(unitId));
            }
            if (abilityTalentId == null)
            {
                throw new ArgumentNullException(nameof(abilityTalentId));
            }

            Ability ability = new Ability
            {
                AbilityTalentId = abilityTalentId,
                Tier            = AbilityTiers.Activable,
            };

            ability.AbilityTalentId.AbilityType = AbilityTypes.Active;

            // find all abilities and loop through them
            foreach (XElement element in GetAbilityElements(ability.AbilityTalentId.ReferenceId))
            {
                SetAbilityTalentData(element, ability, string.Empty);
            }

            XElement?buttonElement = GameData.MergeXmlElements(GameData.Elements("CButton").Where(x => x.Attribute("id")?.Value == abilityTalentId.ButtonId));

            if (buttonElement != null)
            {
                SetButtonData(buttonElement, ability);
            }

            // if no name was set, then use the ability name
            if (string.IsNullOrEmpty(ability.Name) && DefaultData.AbilData != null && GameData.TryGetGameString(DefaultData.AbilData.AbilName.Replace(DefaultData.IdPlaceHolder, ability.AbilityTalentId.ReferenceId, StringComparison.OrdinalIgnoreCase), out string?value))
            {
                ability.Name = value;
            }

            return(ability);
        }
Exemple #13
0
        public void OperatorEqualTest(string referenceId, string buttonId, AbilityTypes abilityTypes, bool isPassive, string referenceId2, string buttonId2, AbilityTypes abilityTypes2, bool isPassive2)
        {
            AbilityTalentId abilityTalentId2 = new AbilityTalentId(referenceId2, buttonId2)
            {
                AbilityType = abilityTypes2,
                IsPassive   = isPassive2,
            };

            AbilityTalentId abilityTalentId = new AbilityTalentId(referenceId, buttonId)
            {
                AbilityType = abilityTypes,
                IsPassive   = isPassive,
            };

#pragma warning disable SA1131 // Use readable conditions
            Assert.IsFalse(null ! == abilityTalentId2);
#pragma warning restore SA1131 // Use readable conditions
            Assert.IsFalse(abilityTalentId2 == null !);

            Assert.IsTrue(null ! == (AbilityTalentId)null !);
            Assert.IsTrue(abilityTalentId == abilityTalentId2);

            Assert.AreEqual(abilityTalentId.GetHashCode(), abilityTalentId2 !.GetHashCode());
        }
        protected override void SetOverride(XElement element)
        {
            if (element is null)
            {
                throw new ArgumentNullException(nameof(element));
            }

            HeroDataOverride heroDataOverride = new HeroDataOverride();

            AbilityPropertyOverride  abilityOverride  = new AbilityPropertyOverride();
            TalentPropertyOverride   talentOverride   = new TalentPropertyOverride();
            WeaponPropertyOverride   weaponOverride   = new WeaponPropertyOverride();
            PortraitPropertyOverride portraitOverride = new PortraitPropertyOverride();

            string heroId = element.Attribute("id")?.Value ?? string.Empty;

            foreach (XElement dataElement in element.Elements())
            {
                string elementName    = dataElement.Name.LocalName;
                string valueAttribute = dataElement.Attribute("value")?.Value ?? string.Empty;

                XElement?overrideElement;

                switch (elementName)
                {
                case "Name":
                    heroDataOverride.NameOverride = (true, valueAttribute);
                    break;

                case "HyperlinkId":
                    heroDataOverride.HyperlinkIdOverride = (true, valueAttribute);
                    break;

                case "CUnit":
                    heroDataOverride.CUnitOverride = (true, valueAttribute);
                    break;

                case "EnergyType":
                    heroDataOverride.EnergyTypeOverride = (true, valueAttribute);
                    break;

                case "Energy":
                    string energyValue = valueAttribute;

                    if (int.TryParse(energyValue, out int value))
                    {
                        if (value < 0)
                        {
                            value = 0;
                        }

                        heroDataOverride.EnergyOverride = (true, value);
                    }
                    else
                    {
                        heroDataOverride.EnergyOverride = (true, 0);
                    }

                    break;

                case "ParentLink":
                    heroDataOverride.ParentLinkOverride = (true, valueAttribute ?? string.Empty);
                    break;

                case "Ability":
                case "Talent":
                    string id             = dataElement.Attribute("id")?.Value ?? string.Empty;
                    string?abilityType    = dataElement.Attribute("abilityType")?.Value;
                    string?passiveAbility = dataElement.Attribute("passive")?.Value;
                    string?addedAbility   = dataElement.Attribute("add")?.Value;

                    AbilityTalentId abilityTalentId = new AbilityTalentId(string.Empty, string.Empty);

                    string[] idSplit = id.Split(',', StringSplitOptions.RemoveEmptyEntries);
                    if (idSplit.Length >= 2)
                    {
                        abilityTalentId.ReferenceId = idSplit[0];
                        abilityTalentId.ButtonId    = idSplit[1];
                    }
                    else if (idSplit.Length == 1)
                    {
                        abilityTalentId.ReferenceId = idSplit[0];
                        abilityTalentId.ButtonId    = idSplit[0];
                    }

                    if (Enum.TryParse(abilityType, true, out AbilityTypes abilityTypeResult))
                    {
                        abilityTalentId.AbilityType = abilityTypeResult;
                    }

                    if (bool.TryParse(passiveAbility, out bool abilityPassiveResult))
                    {
                        abilityTalentId.IsPassive = abilityPassiveResult;
                    }

                    if (elementName == "Ability")
                    {
                        if (bool.TryParse(addedAbility, out bool abilityAddedResult))
                        {
                            heroDataOverride.AddAddedAbility(abilityTalentId, abilityAddedResult);

                            if (!abilityAddedResult)
                            {
                                continue;
                            }
                        }
                    }

                    if (!string.IsNullOrEmpty(id))
                    {
                        overrideElement = dataElement.Element("Override");

                        if (overrideElement != null)
                        {
                            if (elementName == "Ability")
                            {
                                abilityOverride.SetOverride(abilityTalentId.ToString(), overrideElement, heroDataOverride.PropertyAbilityOverrideMethodByAbilityId);
                            }
                            else
                            {
                                talentOverride.SetOverride(abilityTalentId.ToString(), overrideElement, heroDataOverride.PropertyTalentOverrideMethodByTalentId);
                            }
                        }
                    }

                    break;

                case "Portrait":
                    overrideElement = dataElement.Element("Override");
                    if (overrideElement != null)
                    {
                        portraitOverride.SetOverride(heroId, overrideElement, heroDataOverride.PropertyPortraitOverrideMethodByHeroId);
                    }
                    break;

                case "HeroUnit":
                    string?heroUnitId     = dataElement.Attribute("id")?.Value;
                    string?removeHeroUnit = dataElement.Attribute("remove")?.Value;

                    if (string.IsNullOrEmpty(heroUnitId))
                    {
                        continue;
                    }

                    if (bool.TryParse(removeHeroUnit, out bool heroUnitRemoveResult))
                    {
                        if (heroUnitRemoveResult)
                        {
                            heroDataOverride.AddRemovedHeroUnit(heroUnitId);
                            continue;
                        }
                    }

                    heroDataOverride.AddHeroUnit(heroUnitId);
                    SetOverride(dataElement);

                    break;

                case "Weapon":
                    string?weaponId    = dataElement.Attribute("id")?.Value;
                    string?addedWeapon = dataElement.Attribute("add")?.Value;

                    if (string.IsNullOrEmpty(weaponId))
                    {
                        continue;
                    }

                    if (bool.TryParse(addedWeapon, out bool weaponValidResult))
                    {
                        heroDataOverride.AddAddedWeapon(weaponId, weaponValidResult);

                        if (!weaponValidResult)
                        {
                            continue;
                        }
                    }

                    overrideElement = dataElement.Element("Override");
                    if (overrideElement != null)
                    {
                        weaponOverride.SetOverride(weaponId, overrideElement, heroDataOverride.PropertyWeaponOverrideMethodByWeaponId);
                    }
                    break;
                }
            }

            DataOverridesById[heroId] = heroDataOverride;
        }