private static void SleepTalk(AtkContext atk) { var aer = atk.Attacker; var moves = new List <MoveTypeE>(); foreach (var m in aer.Moves) { if (!(m.MoveE.PrepareOneTurn || SLEEPTALK_BLOCK.Contains(m.MoveE.Id))) { moves.Add(m.MoveE); } } var n = moves.Count; if (n == 0) { atk.FailAll(); } else { atk.StartExecute(moves[aer.Controller.GetRandomInt(0, moves.Count - 1)]); } }
private static void Assist(AtkContext atk) { var aer = atk.Attacker; var moves = new List <MoveTypeE>(); foreach (var pm in aer.Field.Pokemons) { if (pm != aer && pm.Pokemon.Owner == aer.Pokemon.Owner) { foreach (var m in pm.Moves) { if (!ASSIST_BLOCK.Contains(m.MoveE.Id)) { moves.Add(m.MoveE); } } } } for (int i = aer.Controller.GameSettings.Mode.OnboardPokemonsPerPlayer(); i < aer.Pokemon.Owner.Pokemons.Count(); ++i) { foreach (var m in aer.Pokemon.Owner.GetPokemon(i).Moves) { if (!ASSIST_BLOCK.Contains(m.MoveE.Id)) { moves.Add(m.MoveE); } } } if (moves.Count == 0) { atk.FailAll(); } else { atk.StartExecute(moves[aer.Controller.GetRandomInt(0, moves.Count - 1)]); } }
private static void Assist(AtkContext atk) { var aer = atk.Attacker; var moves = new List <MoveTypeE>(); foreach (var pm in aer.Pokemon.Owner.Pokemons) { foreach (var m in pm.Pokemon.Moves) { if (pm != aer && !(ASSIST_BLOCK.Contains(m.Type.Id))) { moves.Add(MoveTypeE.Get(m.Type)); } } } if (moves.Count == 0) { atk.FailAll(); } else { atk.StartExecute(moves[aer.Controller.GetRandomInt(0, moves.Count - 1)]); } }
private static void Generic(AtkContext atk) { var move = atk.Move; var aer = atk.Attacker; if (move.PrepareOneTurn && PrepareOneTurn(atk)) { return; } if (aer.Controller.GameSettings.Mode.XBound() != 1 && (move.Id == Ms.WATER_PLEDGE || move.Id == Ms.FIRE_PLEDGE || move.Id == Ms.GRASS_PLEDGE)) { if (aer.Field.AddTurnCondition(Cs.Plege, move.Id)) { foreach (var pm in aer.Controller.ActingPokemons) { if (pm.Pokemon.TeamId == aer.Pokemon.TeamId && pm.SelectedMove != null && pm.SelectedMove.MoveE.Id != move.Id && (pm.SelectedMove.MoveE.Id == Ms.WATER_PLEDGE || pm.SelectedMove.MoveE.Id == Ms.FIRE_PLEDGE || pm.SelectedMove.MoveE.Id == Ms.GRASS_PLEDGE) && pm.CanMove) { aer.ShowLogPm(Ls.Pledge, pm.Id); aer.Controller.Board.SetTurnCondition(Cs.NextActingPokemon, pm); return; } } } } if (move.Snatchable) { foreach (var pm in atk.Controller.OnboardPokemons) { if (pm.OnboardPokemon.HasCondition(Cs.Snatch)) { pm.OnboardPokemon.RemoveCondition(Cs.Snatch); pm.ShowLogPm("Snatch", aer.Id); var s = new AtkContext(pm) { Move = move }; InitAtkContext.Execute(s); MoveE.BuildDefContext(s, null); if (MoveNotFail.Execute(s)) { MoveAct.Execute(s); } else { s.FailAll(); } atk.SetAttackerAction(PokemonAction.Done); return; } } } if (move.MagicCoat && atk.Targets == null && !atk.HasCondition(Cs.IgnoreMagicCoat)) { foreach (var p in aer.Controller.GetOnboardPokemons(1 - aer.Pokemon.TeamId)) { if (STs.MagicCoat(atk, p)) { atk.SetCondition(Cs.MagicCoat, new List <PokemonProxy>() { p }); atk.FailAll(null); MoveE.MagicCoat(atk); return; } } } CalculateType.Execute(atk); if (atk.Type == BattleType.Fire && aer.OnboardPokemon.HasCondition(Cs.Powder)) { aer.EffectHurtByOneNth(4, Ls.Powder); atk.FailAll(null); return; } if (atk.Move.Move.Category != MoveCategory.Status) { if (atk.Type == BattleType.Fire && aer.Controller.Board.GetCondition <int>(Cs.SpWeather) == As.PRIMORDIAL_SEA) { atk.FailAll(Ls.HeavyRain); return; } if (atk.Type == BattleType.Water && aer.Controller.Board.GetCondition <int>(Cs.SpWeather) == As.DESOLATE_LAND) { atk.FailAll(Ls.HarshSunlight); return; } } if (aer.AbilityE(As.PROTEAN) && aer.OnboardPokemon.SetTypes(atk.Type)) { aer.RaiseAbility(); aer.ShowLogPm("TypeChange", (int)atk.Type); } MoveE.FilterDefContext(atk); if (atk.Targets != null && atk.Target == null) { atk.FailAll(null); } else { MoveAct.Execute(atk); MoveE.MoveEnding(atk); } if (move.MagicCoat && atk.Targets != null) { MoveE.MagicCoat(atk); } }
/// <summary> /// contains battle log /// </summary> /// <param name="atk"></param> /// <returns></returns> public static bool Execute(AtkContext atk) { var aer = atk.Attacker; if (atk.Targets == null || atk.Target != null) { switch (atk.Move.Id) { case Ms.SKETCH: //166 case Ms.TELEPORT: case Ms.HAPPY_HOUR: break; case Ms.SELFDESTRUCT: //120 case Ms.EXPLOSION: if (aer.Controller.Board.Pokemons.RaiseAbility(As.DAMP) != null) { atk.FailAll("FailSp", atk.Attacker.Id, atk.Move.Id); return(false); } return(true); case Ms.REST: //156 if (aer.Hp == aer.Pokemon.MaxHp) { atk.FailAll("FullHp", aer.Id); return(false); } if (!PTs.CanAddXXX(aer, aer, true, AttachedState.SLP, true)) { atk.FailAll(null); return(false); } return(true); case Ms.SNORE: //173 case Ms.SLEEP_TALK: if (aer.State == PokemonState.SLP) { return(true); } break; case Ms.FAKE_OUT: //252 case Ms.MAT_BLOCK: foreach (var m in aer.Moves) { if (m.HasUsed) { goto FAIL; } } return(true); case Ms.STOCKPILE: //254 if (aer.OnboardPokemon.GetCondition <int>(Cs.Stockpile) != 3) { return(true); } break; case Ms.SPIT_UP: //255 case Ms.SWALLOW: if (aer.OnboardPokemon.HasCondition(Cs.Stockpile)) { return(true); } break; case Ms.NATURAL_GIFT: //363 if (ITs.CanLostItem(aer) && ITs.CanUseItem(aer) && ITs.Berry(aer.Pokemon.Item)) { return(true); } break; case Ms.FLING: //374 if (ITs.CanLostItem(aer) && ITs.CanUseItem(aer) && MoveBasePower.FlingPower(aer.Pokemon.Item) != 0) { return(true); } break; case Ms.ME_FIRST: //382 case Ms.SUCKER_PUNCH: //389 { var der = atk.Target.Defender; var dm = der.SelectedMove; if (!(der.LastMoveTurn == der.Controller.TurnNumber || dm == null || dm.Move.Type.Category == MoveCategory.Status)) { return(true); } } break; case Ms.LAST_RESORT: //387 foreach (var m in aer.Moves) { if (!m.HasUsed && m.MoveE.Id != Ms.LAST_RESORT) { goto FAIL; } } return(true); case Ms.ALLY_SWITCH: if (aer.Controller.GameSettings.Mode == GameMode.Double || aer.Controller.GameSettings.Mode == GameMode.Triple && aer.OnboardPokemon.X != 1) { return(true); } break; case Ms.BESTOW: //516 if (aer.Pokemon.Item == 0 || ITs.NeverLostItem(aer.Pokemon)) { return(true); } break; case Ms.BELCH: //562 if (aer.OnboardPokemon.HasCondition(Cs.Belch)) { return(true); } break; case Ms.HYPERSPACE_FURY: if (aer.Pokemon.Form.Species.Number == Ps.HOOPA) { return(true); } break; default: if (!atk.Move.HardToUseContinuously || ContinuousUse(atk)) { return(true); } break; } } FAIL: atk.FailAll(); return(false); }