Example #1
0
        public void TestValidLoStatIdentifier()
        {
            D2Stat stat = new D2Stat();

            stat.HiStatID = 140;
            stat.Value    = 4999;

            stat.LoStatID = 140;
            Assert.AreEqual(false, stat.HasValidLoStatIdentifier());

            stat.LoStatID = (ushort)StatIdentifier.PoisonDivisor;
            Assert.AreEqual(true, stat.HasValidLoStatIdentifier());

            stat.LoStatID = (ushort)StatIdentifier.CannotBeFrozen;
            Assert.AreEqual(true, stat.HasValidLoStatIdentifier());

            stat.LoStatID = 300;
            Assert.AreEqual(false, stat.HasValidLoStatIdentifier());
        }
Example #2
0
        public bool TryHandleStat(D2Stat stat, out string description)
        {
            description = null;

            if (!stat.HasValidLoStatIdentifier())
            {
                return(false);
            }

            switch ((StatIdentifier)stat.LoStatID)
            {
            // Handle one and two handed damage.
            case StatIdentifier.DamageMin:
            case StatIdentifier.DamageMax:
            case StatIdentifier.SecondaryDamageMin:
            case StatIdentifier.SecondaryDamageMax:
                // Only print once if it's a range.
                if (HasHandledDamageRange)
                {
                    return(true);
                }

                // Skip two-handed damage if there is a one-handed damage source or if no damage is defined.
                if (stat.IsOfType(StatIdentifier.SecondaryDamageMin) && !IsDamageMinSecondary)
                {
                    return(true);
                }
                if (stat.IsOfType(StatIdentifier.SecondaryDamageMax) && !IsDamageMaxSecondary)
                {
                    return(true);
                }

                // If not a range, print normally.
                if (!damage.HasRange())
                {
                    return(false);
                }

                // We also print twice if they are the same.
                if (damage.min == damage.max)
                {
                    return(false);
                }

                HasHandledDamageRange = true;
                description           = damage.ToString(stringReader);
                return(true);

            // Handle enhanced damage.
            case StatIdentifier.ItemDamageMinPercent:
                if (!damagePercent.HasRange())
                {
                    return(false);
                }
                description = string.Format(
                    "+{0}% {1}",
                    stat.Value,
                    stringReader.GetString(StringConstants.EnhancedDamage).TrimEnd()
                    );
                return(true);

            case StatIdentifier.ItemDamageMaxPercent:
                return(damagePercent.HasRange());

            // Handle fire damage ranges.
            case StatIdentifier.FireDamageMin:
                if (!fireDamage.HasRange())
                {
                    return(false);
                }
                description = fireDamage.ToString(stringReader);
                return(true);

            case StatIdentifier.FireDamageMax:
                return(fireDamage.HasRange());

            // Handle lightning damage ranges.
            case StatIdentifier.LightningDamageMin:
                if (!lightningDamage.HasRange())
                {
                    return(false);
                }
                description = lightningDamage.ToString(stringReader);
                return(true);

            case StatIdentifier.LightningDamageMax:
                return(lightningDamage.HasRange());

            // Handle magic damage ranges.
            case StatIdentifier.MagicDamageMin:
                if (!magicDamage.HasRange())
                {
                    return(false);
                }
                description = magicDamage.ToString(stringReader);
                return(true);

            case StatIdentifier.MagicDamageMax:
                return(magicDamage.HasRange());

            // Handle cold damage ranges.
            case StatIdentifier.ColdDamageMin:
                if (!coldDamage.HasRange())
                {
                    return(false);
                }
                description = coldDamage.ToString(stringReader);
                return(true);

            case StatIdentifier.ColdDamageMax:
                return(coldDamage.HasRange());

            // Handle poison damage ranges.
            case StatIdentifier.PoisonDamageMax:
            case StatIdentifier.PoisonDamageDuration:
                return(poisonDamage.HasRange());

            case StatIdentifier.PoisonDamageMin:
                if (!poisonDamage.HasRange())
                {
                    return(false);
                }
                description = poisonDamage.ToString(stringReader);
                return(true);

            // By default, the stat is not handled.
            default:
                return(false);
            }
        }