Ejemplo n.º 1
0
 /// <summary>
 /// true if either is available
 /// </summary>
 /// <param name="pm"></param>
 /// <param name="showFail"></param>
 /// <returns></returns>
 private static bool ETSV(PokemonProxy pm, bool showFail)
 {
     if (pm.Controller.Board.HasCondition(Cs.ElectricTerrain) && HasEffect.IsGroundAffectable(pm, true, false))
     {
         if (showFail)
         {
             pm.ShowLogPm("ElectricTerrain");
         }
         return(true);
     }
     foreach (var p in pm.Field.Pokemons)
     {
         if (p.AbilityE(As.SWEET_VEIL)) //not checkability
         {
             if (showFail)
             {
                 p.RaiseAbility();
                 if (pm == p)
                 {
                     pm.ShowLogPm("SweetVeil0");
                 }
                 else
                 {
                     pm.ShowLogPm("SweetVeil1", p.Id);
                 }
             }
             return(true);
         }
     }
     return(false);
 }
Ejemplo n.º 2
0
 /// <summary>
 /// true if mistyterrain is available
 /// </summary>
 /// <param name="pm"></param>
 /// <param name="showFail"></param>
 /// <returns></returns>
 private static bool MistyTerrain(PokemonProxy pm, bool showFail)
 {
     if (pm.Controller.Board.HasCondition(Cs.MistyTerrain) && HasEffect.IsGroundAffectable(pm, true, false))
     {
         if (showFail)
         {
             pm.ShowLogPm("MistyTerrain");
         }
         return(true);
     }
     return(false);
 }
Ejemplo n.º 3
0
        public static void FilterDefContext(AtkContext atk)
        {
            if ((atk.Move.Id == Ms.FUTURE_SIGHT || atk.Move.Id == Ms.DOOM_DESIRE) && !atk.HasCondition(Cs.FSDD))
            {
                return;
            }
            if (atk.Targets == null)
            {
                return;
            }
            var move = atk.Move;
            var aer  = atk.Attacker;

            if (move.GetRange(aer) == MoveRange.SelectedTarget)
            {
                var          all      = atk.Move.IsRemote || aer.Controller.GameSettings.Mode != GameMode.Triple;
                PokemonProxy retarget = null;
                var          rp       = !(aer.OnboardPokemon.HasType(BattleType.Grass) || aer.AbilityE(As.OVERCOAT) || aer.ItemE(Is.SAFETY_GOGGLES));
                foreach (var pm in atk.Controller.OnboardPokemons)
                {
                    if (pm.Pokemon.TeamId != aer.Pokemon.TeamId && pm != atk.Target.Defender && (all || aer.OnboardPokemon.X == 1 || aer.OnboardPokemon.X != pm.OnboardPokemon.X))
                    {
                        var fm = pm.OnboardPokemon.GetCondition <int>(Cs.FollowMe);
                        if (fm != 0 && (rp || fm != Ms.RAGE_POWDER))
                        {
                            retarget = pm;
                            break;
                        }
                    }
                }
                if (retarget == null)
                {
                    int ab = 0;
                    if (atk.Type == BattleType.Electric)
                    {
                        ab = As.LIGHTNINGROD;
                    }
                    else if (atk.Type == BattleType.Water)
                    {
                        ab = As.STORM_DRAIN;
                    }
                    if (ab != 0)
                    {
                        foreach (var pm in atk.Controller.Board.Pokemons)
                        {
                            if (pm != aer && pm != atk.Target.Defender && (all || aer.OnboardPokemon.X == 1 || pm.OnboardPokemon.X == 1 || aer.Pokemon.TeamId != pm.Pokemon.TeamId && aer.OnboardPokemon.X != pm.OnboardPokemon.X) && pm.RaiseAbility(ab))
                            {
                                retarget = pm;
                                break;
                            }
                        }
                    }
                }
                if (retarget != null)
                {
                    retarget.ShowLogPm("ReTarget");
                    atk.SetTargets(new DefContext[] { new DefContext(atk, retarget) });
                }
            }

            List <DefContext> targets = atk.Targets.ToList();

            #region Check CoordY
            {
                var count = 0;
                foreach (DefContext def in targets.ToArray())
                {
                    ++count;
                    if (!(def.Defender.CoordY == CoordY.Plate || def.NoGuard || IsYInRange(def)))
                    {
                        def.Defender.ShowLogPm(Ls.Miss);
                        targets.Remove(def);
                    }
                }
                if (count > 1)
                {
                    atk.MultiTargets = true;
                }
            }
            #endregion
            #region Attack Move and Thunder Wave: Check for Immunity (or Levitate) on the Ally side, position 1, then position 3. Then check Opponent side, position 1, then 2, then 3,
            foreach (DefContext def in targets.ToArray())
            {
                if (!HasEffect.Execute(def))
                {
                    targets.Remove(def);
                    def.Defender.NoEffect();
                }
            }
            #endregion
            #region WideGuard QuickGuard CraftyShield MatBlock
            if (move.Move.Category != MoveCategory.Status && move.Move.Range != MoveRange.SelectedTarget)
            {
                foreach (var def in targets.ToArray())
                {
                    if (def.Defender.Field.HasCondition(Cs.WideGuard))
                    {
                        def.Defender.ShowLogPm("WideGuard");
                        targets.Remove(def);
                    }
                }
            }
            if (aer.Priority > 0 && move.Id != Ms.FEINT)
            {
                foreach (var def in targets.ToArray())
                {
                    if (def.Defender.Field.HasCondition(Cs.QuickGuard))
                    {
                        def.Defender.ShowLogPm("QuickGuard");
                        targets.Remove(def);
                    }
                }
            }
            if (move.Move.Category == MoveCategory.Status)
            {
                foreach (var def in targets.ToArray())
                {
                    if (def.Defender.Field.HasCondition(Cs.CraftyShield))
                    {
                        def.Defender.ShowLogPm("CraftyShield");
                        targets.Remove(def);
                    }
                }
            }
            else
            {
                var d0 = targets.FirstOrDefault();
                if (d0 != null && d0.Defender.Field.HasCondition(Cs.MatBlock))
                {
                    d0.Defender.Controller.ReportBuilder.ShowLog("MatBlock", move.Id);
                    var td = d0.Defender.Pokemon.TeamId;
                    foreach (var d in targets.ToArray())
                    {
                        if (d.Defender.Pokemon.TeamId == td)
                        {
                            targets.Remove(d);
                        }
                    }
                    d0 = targets.FirstOrDefault();
                    if (d0 != null && d0.Defender.Field.HasCondition(Cs.MatBlock))
                    {
                        targets.Clear();
                    }
                }
            }
            #endregion
            #region Protect KingsShield SpikyShield
            if (move.Protectable)
            {
                foreach (DefContext d in targets.ToArray())
                {
                    if (d.Defender.OnboardPokemon.HasCondition(Cs.Protect))
                    {
                        d.Defender.ShowLogPm("Protect");
                        targets.Remove(d);
                    }
                }
            }
            if (move.Move.Category != MoveCategory.Status)
            {
                foreach (var d in targets.ToArray())
                {
                    if (d.Defender.OnboardPokemon.HasCondition(Cs.SpikyShield))
                    {
                        d.Defender.ShowLogPm("Protect");
                        if (move.NeedTouch)
                        {
                            aer.EffectHurtByOneNth(8);
                        }
                        targets.Remove(d);
                    }
                }
                foreach (var d in targets.ToArray())
                {
                    if (d.Defender.OnboardPokemon.HasCondition(Cs.KingsShield))
                    {
                        d.Defender.ShowLogPm("Protect");
                        if (move.NeedTouch)
                        {
                            aer.ChangeLv7D(d.Defender, StatType.Atk, -2, false);
                        }
                        targets.Remove(d);
                    }
                }
            }
            #endregion
            #region Check for Telepathy (and possibly other abilities)
            {
                var mc = move.MagicCoat && !atk.HasCondition(Cs.IgnoreMagicCoat);
                var ab = atk.DefenderAbilityAvailable();
                foreach (DefContext def in targets.ToArray())
                {
                    if (def.Defender != atk.Attacker && (mc && STs.MagicCoat(atk, def.Defender) || ab && !CanImplement.Execute(def)))
                    {
                        targets.Remove(def);
                    }
                }
            }
            #endregion
            if (move.Move.Category == MoveCategory.Status && !atk.IgnoreSubstitute())
            {
                foreach (DefContext d in targets.ToArray())
                {
                    if (d.Defender != aer && d.Defender.OnboardPokemon.HasCondition(Cs.Substitute))
                    {
                        d.Fail();
                        targets.Remove(d);
                    }
                }
            }
            if (move.Id == Ms.SKY_DROP)
            {
                foreach (var d in targets.ToArray())
                {
                    if (d.Defender.OnboardPokemon.Weight >= 200)
                    {
                        d.Fail();
                        targets.Remove(d);
                    }
                }
            }
            #region Check for misses
            if (!MustHit(atk))
            {
                if (move.Class != MoveClass.OHKO)
                {
                    atk.AccuracyModifier = STs.AccuracyModifier(atk);
                }
                foreach (DefContext def in targets.ToArray())
                {
                    if (!(MustHit(def) || CanHit(def)))
                    {
                        targets.Remove(def);
                        def.Defender.ShowLogPm(Ls.Miss);
                    }
                }
            }
            #endregion
            atk.SetTargets(targets);
        }