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()); }
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); } }