Esempio n. 1
0
        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);
        }