public static PBEResult IsAffectedByAttack(PBEBattlePokemon user, PBEBattlePokemon target, PBEType moveType, out double damageMultiplier, bool useKnownInfo = false) { if (user == null) { throw new ArgumentNullException(nameof(user)); } if (target == null) { throw new ArgumentNullException(nameof(target)); } if (moveType >= PBEType.MAX) { throw new ArgumentOutOfRangeException(nameof(moveType)); } PBEResult result; if (moveType == PBEType.Ground) { result = target.IsGrounded(user, useKnownInfo: useKnownInfo); if (result != PBEResult.Success) { damageMultiplier = 0; return(result); } } bool ignoreGhost = user.Ability == PBEAbility.Scrappy || target.Status2.HasFlag(PBEStatus2.Identified), ignoreDark = target.Status2.HasFlag(PBEStatus2.MiracleEye); damageMultiplier = GetEffectiveness(moveType, target, useKnownInfo, ignoreGhost: ignoreGhost, ignoreDark: ignoreDark); if (damageMultiplier <= 0) // (-infinity, 0] { damageMultiplier = 0; return(PBEResult.Ineffective_Type); } else if (damageMultiplier < 1) // (0, 1) { result = PBEResult.NotVeryEffective_Type; } else if (damageMultiplier == 1) // [1, 1] { result = PBEResult.Success; } else // (1, infinity) { return(PBEResult.SuperEffective_Type); } PBEAbility kAbility = useKnownInfo ? target.KnownAbility : target.Ability; if (kAbility == PBEAbility.WonderGuard && !user.HasCancellingAbility()) { damageMultiplier = 0; result = PBEResult.Ineffective_Ability; } return(result); }