public bool AbilityE(int ability) { return(Defender.AbilityE(ability) && (AtkContext.DefenderAbilityAvailable() || Defender.AbilityE(As.Full_Metal_Body) || Defender.AbilityE(As.Shadow_Shield) || Defender.AbilityE(As.Prism_Armor))); }
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); }
public bool AbilityE(int ability) { return(Defender.AbilityE(ability) && AtkContext.DefenderAbilityAvailable()); }