public HeroSettingCollection AddUlt(string name, bool hasDuration = false, bool hasKnockback = false)
        {
            // Get the names of the settings to be added.
            string isEnabled  = "Ultimate Ability";
            string generation = "Ultimate Generation";
            string passive    = "Ultimate Generation - Passive";
            string combat     = "Ultimate Generation - Combat";
            string knockback  = "Knockback Scalar";

            if (name != null)
            {
                // Add the (name) suffix if 'name' is not null.
                isEnabled  += " (" + name + ")";
                generation += " (" + name + ")";
                passive    += " (" + name + ")";
                combat     += " (" + name + ")";
                knockback   = name + " " + knockback;
            }

            // i18n name resolvers.
            AbilityNameResolver enabledResolver           = new AbilityNameResolver(AbilityNameType.UltimateSwitchSetting, isEnabled, name ?? isEnabled); // Toggle
            AbilityNameResolver generationResolver        = new AbilityNameResolver(AbilityNameType.UltimateGeneration, generation, name ?? generation);  // Generation
            AbilityNameResolver passiveGenerationResolver = new AbilityNameResolver(AbilityNameType.UltimateGenerationPassive, passive, name ?? passive); // Passive Generation
            AbilityNameResolver combatGenerationResolver  = new AbilityNameResolver(AbilityNameType.UltimateGenerationCombat, combat, name ?? combat);    // Combat Generation

            // Add the settings.
            Add(new SwitchValue(isEnabled, true)
            {
                TitleResolver = enabledResolver
            });
            Add(RangeValue.NewPercentage(generation, generationResolver, min: 10, max: 500));
            Add(RangeValue.NewPercentage(passive, passiveGenerationResolver, min: 0, max: 500));
            Add(RangeValue.NewPercentage(combat, combatGenerationResolver, min: 0, max: 500));

            if (hasDuration)
            {
                // Add duration info if it can be changed.
                Add(UltimateDuration);
                Add(InfiniteDuration);
            }

            if (hasKnockback)
            {
                Add(RangeValue.NewPercentage(knockback, min: 0, max: 500));
            }

            return(this);
        }
        public HeroSettingCollection AddAbility(string name, bool hasCooldown = true, bool hasKnockback = false, bool rechargeable = false, bool noMaximumTime = false, bool selfKnockback = false)
        {
            Add(new SwitchValue(name, true));

            // If the ability has a cooldown, add the cooldown options.
            if (hasCooldown)
            {
                string cooldownTimeTitle = name + " Cooldown Time";
                Add(RangeValue.NewPercentage(cooldownTimeTitle, new AbilityNameResolver(AbilityNameType.CooldownTime, cooldownTimeTitle, name), min: 0, max: 500));
            }

            // If the ability has a knockback scalar, add the knockback option.
            if (hasKnockback)
            {
                if (!selfKnockback)
                {
                    Add(RangeValue.NewPercentage(name + " Knockback Scalar", min: 0, max: 500));
                }
                else
                {
                    Add(RangeValue.NewPercentage(name + " Knockback Scalar (Enemy)", min: 0, max: 300));
                    Add(RangeValue.NewPercentage(name + " Knockback Scalar (Self)", min: 0, max: 300));
                }
            }

            // If the ability is rechargeable, add the max time and recharge rate.
            if (rechargeable)
            {
                string rechargeRateTitle = name + " Recharge Rate";
                Add(RangeValue.NewPercentage(rechargeRateTitle, new AbilityNameResolver(AbilityNameType.CooldownTime, rechargeRateTitle, name), min: 0, max: 500));

                if (!noMaximumTime)
                {
                    string maximumTimeTitle = name + " Maximum Time";
                    Add(RangeValue.NewPercentage(maximumTimeTitle, new AbilityNameResolver(AbilityNameType.CooldownTime, maximumTimeTitle, name), min: 20, max: 500));
                }
            }
            return(this);
        }