public static void BuildDefContext(AtkContext atk, Tile select) { switch (atk.Move.Id) { case Ms.COUNTER: //68 Counter(atk, Cs.PhysicalDamage); break; case Ms.MIRROR_COAT: //243 Counter(atk, Cs.SpecialDamage); break; case Ms.METAL_BURST: //368 Counter(atk, Cs.Damage); break; case Ms.BIDE: if (atk.GetCondition(Cs.MultiTurn).Turn == 1) { var o = atk.GetCondition(Cs.Bide); var targets = new List <DefContext>(); if (o.By != null) { var t = GetRangeTiles(atk, MoveRange.SelectedTarget, o.By.Tile).FirstOrDefault(); if (t != null && t.Pokemon != null) { targets.Add(new DefContext(atk, t.Pokemon)); } } if (!targets.Any()) { atk.Attacker.ShowLogPm("UseMove", Ms.BIDE); //奇葩的战报 } atk.SetTargets(targets); } break; default: IEnumerable <Tile> ts = GetRangeTiles(atk, atk.Move.GetRange(atk.Attacker), select); if (ts != null) { var targets = new List <DefContext>(); foreach (Tile t in ts) { if (t.Pokemon != null) { targets.Add(new DefContext(atk, t.Pokemon)); } } atk.SetTargets(targets); } break; } }
private static void Counter(AtkContext atk, Cs condition) { var o = atk.Attacker.OnboardPokemon.GetCondition(condition); if (o != null) { var pm = o.By; if (pm.Tile != null && pm.Pokemon.TeamId != atk.Attacker.Pokemon.TeamId) { atk.SetTargets(new DefContext[] { new DefContext(atk, pm) }); return; } } atk.SetTargets(new DefContext[0]); }
internal void Move() { if (SelectZmove) { Pokemon.Zmove = true; } STs.FocusPunch(Controller); LastMoveTurn = Controller.TurnNumber; STs.WillAct(this); switch (Action) { case PokemonAction.Stiff: PTs.ShowLogPm(this, "Stiff"); Action = PokemonAction.Done; break; case PokemonAction.Moving: if (AtkContext.Move.Id == Ms.SKY_DROP) { CoordY = CoordY.Plate; if (AtkContext.Target.Defender.AliveOnboard) { AtkContext.Target.Defender.CoordY = CoordY.Plate; AtkContext.Target.Defender.OnboardPokemon.RemoveCondition(Cs.SkyDrop); } else { AtkContext.SetTargets(Enumerable.Empty <DefContext>()); } } if (CanExecute()) { if (AtkContext.Move.Id != Ms.BIDE) { PTs.ShowLogPm(this, "UseMove", AtkContext.Move.Id); } AtkContext.ContinueExecute(SelectedTarget); } else { Action = PokemonAction.Done; } break; case PokemonAction.MoveAttached: { var o = OnboardPokemon.GetCondition(Cs.Encore); if (o != null) { foreach (var m in Moves) { if (m.MoveE == o.Move) { SelectedMove = m; } } } } ATs.StanceChange(this); if (SelectZmove && SelectedMove.MoveE.Move.Category == MoveCategory.Status) { switch (GameHelper.ZStatus(SelectedMove.MoveE.Move.Id)) { case 0: break; case 1: this.ChangeLv7D(this, StatType.Atk, 1, false); break; case 2: this.ChangeLv7D(this, StatType.Atk, 2, false); break; case 3: this.ChangeLv7D(this, StatType.Atk, 3, false); break; case 4: this.ChangeLv7D(this, StatType.Def, 1, false); break; case 5: this.ChangeLv7D(this, StatType.SpAtk, 1, false); break; case 6: this.ChangeLv7D(this, StatType.SpAtk, 2, false); break; case 7: this.ChangeLv7D(this, StatType.SpDef, 1, false); break; case 8: this.ChangeLv7D(this, StatType.SpDef, 2, false); break; case 9: this.ChangeLv7D(this, StatType.Speed, 1, false); break; case 10: this.ChangeLv7D(this, StatType.Speed, 2, false); break; case 11: this.ChangeLv7D(this, StatType.Accuracy, 1, false); break; case 12: this.ChangeLv7D(this, StatType.Evasion, 1, false); break; case 13: this.ChangeLv7D(this, false, false, 1, 1, 1, 1, 1, 0, 0); break; case 14: if (OnboardPokemon.AddCondition(Cs.FocusEnergy)) { this.ShowLogPm("En" + Cs.FocusEnergy); } break; case 15: ITs.Reset7D(this); break; case 16: this.HpRecover(Pokemon.MaxHp); break; case 17: if (Pokemon.Owner.PmsAlive > Controller.GameSettings.Mode.OnboardPokemonsPerPlayer()) { Tile.SetTurnCondition(Cs.Zheal); } break; case 18: OnboardPokemon.AddTurnCondition(Cs.FollowMe, SelectedMove.MoveE.Move.Id); this.ShowLogPm(Ls.EnFollowMe); break; default: break; } if (SelectedMove.MoveE.Move.Id == Ms.CURSE) { if (OnboardPokemon.HasType(BattleType.Ghost)) { this.HpRecover(Pokemon.MaxHp); } else { this.ChangeLv7D(this, StatType.Atk, 1, false); } } } if (CanExecute() && SelectedMove.CanExecute()) { _atkContext = null; SelectedMove.Execute(); var o = OnboardPokemon.GetCondition(Cs.LastMove); if (o == null) { o = new Condition(); o.Move = AtkContext.Move; OnboardPokemon.SetCondition(Cs.LastMove, o); } else if (o.Move != AtkContext.Move) { o.Move = AtkContext.Move; o.Int = 0; } if (AtkContext.Fail) { o.Int = 0; } else { o.Int++; } Controller.Board.SetCondition(Cs.LastMove, o); } else { OnboardPokemon.RemoveCondition(Cs.LastMove); Action = PokemonAction.Done; } if (AtkContext != null && AtkContext.Move.Dance && AtkContext.Attacker.LastMoveTurn == Controller.TurnNumber) { foreach (var p in Controller.Board.Pokemons) { if (p != null && p.AbilityE(As.Dancer) && p != AtkContext.Attacker) { p.RaiseAbility(); AtkContext dance = new AtkContext(p); dance.StartExecute(AtkContext.Move, null, "UseMove", false); } } } break; } //switch(Action) }
internal void Move() { STs.FocusPunch(Controller); LastMoveTurn = Controller.TurnNumber; STs.WillAct(this); switch (Action) { case PokemonAction.Stiff: PTs.ShowLogPm(this, "Stiff"); Action = PokemonAction.Done; break; case PokemonAction.Moving: if (AtkContext.Move.Id == Ms.SKY_DROP) { CoordY = CoordY.Plate; if (AtkContext.Target.Defender.AliveOnboard) { AtkContext.Target.Defender.CoordY = CoordY.Plate; AtkContext.Target.Defender.OnboardPokemon.RemoveCondition(Cs.SkyDrop); } else { AtkContext.SetTargets(Enumerable.Empty <DefContext>()); } } if (CanExecute()) { if (AtkContext.Move.Id != Ms.BIDE) { PTs.ShowLogPm(this, "UseMove", AtkContext.Move.Id); } AtkContext.ContinueExecute(SelectedTarget); } else { Action = PokemonAction.Done; } break; case PokemonAction.MoveAttached: { var o = OnboardPokemon.GetCondition(Cs.Encore); if (o != null) { foreach (var m in Moves) { if (m.MoveE == o.Move) { SelectedMove = m; } } } } ATs.StanceChange(this); if (CanExecute() && SelectedMove.CanExecute()) { _atkContext = null; SelectedMove.Execute(); var o = OnboardPokemon.GetCondition(Cs.LastMove); if (o == null) { o = new Condition(); o.Move = AtkContext.Move; OnboardPokemon.SetCondition(Cs.LastMove, o); } else if (o.Move != AtkContext.Move) { o.Move = AtkContext.Move; o.Int = 0; } if (AtkContext.Fail) { o.Int = 0; } else { o.Int++; } Controller.Board.SetCondition(Cs.LastMove, o); } else { OnboardPokemon.RemoveCondition(Cs.LastMove); Action = PokemonAction.Done; } break; } //switch(Action) }
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); }