/// <summary> /// check canwithdraw first, null log to show nothing /// </summary> /// <param name="pm"></param> /// <param name="ability"></param> /// <param name="log"></param> /// <param name="arg1"></param> /// <returns></returns> public static bool ForceSwitchImplement(PokemonProxy pm, bool ability) { if (ability && pm.RaiseAbility(As.SUCTION_CUPS)) { pm.ShowLogPm("SuctionCups"); return(false); } if (pm.OnboardPokemon.HasCondition(Cs.Ingrain)) { pm.ShowLogPm("IngrainCantMove"); return(false); } var c = pm.Controller; var sendouts = new List <int>(); { var pms = pm.Pokemon.Owner.Pokemons.ToArray(); for (int i = pm.Controller.GameSettings.Mode.OnboardPokemonsPerPlayer(); i < pms.Length; ++i) { if (c.CanSendOut(pms[i])) { sendouts.Add(i); } } } var tile = pm.Tile; ITs.Attach(pm); c.Withdraw(pm, Ls.forceWithdraw, 0, false); tile.WillSendOutPokemonIndex = sendouts[c.GetRandomInt(0, sendouts.Count - 1)]; c.SendOut(tile, true, "ForceSendOut"); return(true); }
internal void Debut() { if (Action == PokemonAction.Debuting) { Tile.Debut(); if (!(OnboardPokemon.HasCondition(Cs.Substitute) || AbilityE(As.OVERCOAT))) { EHTs.Debut(this); } if (!PTs.CheckFaint(this)) { if (ItemE(Is.BLUE_ORB) && PTs.CanChangeForm(this, Ps.KYOGRE, 1) || ItemE(Is.RED_ORB) && PTs.CanChangeForm(this, Ps.GROUNDON, 1)) { PTs.ChangeForm(this, 1, true, Ls.Primal); } if (OnboardPokemon.Ability != As.FLOWER_GIFT && OnboardPokemon.Ability != As.FORECAST) { AbilityAttach.Execute(this); } if (!ITs.AirBalloon(this)) { ITs.Attach(this); } } Action = PokemonAction.Done; } }
public static bool ChangeLv7D(this PokemonProxy pm, PokemonProxy by, bool showFail, bool ability, int a, int d = 0, int sa = 0, int sd = 0, int s = 0, int ac = 0, int e = 0) { a = CanChangeLv7D(pm, by, StatType.Atk, a, false); d = CanChangeLv7D(pm, by, StatType.Def, d, false); sa = CanChangeLv7D(pm, by, StatType.SpAtk, sa, false); sd = CanChangeLv7D(pm, by, StatType.SpDef, sd, false); s = CanChangeLv7D(pm, by, StatType.Speed, s, false); ac = CanChangeLv7D(pm, by, StatType.Accuracy, ac, false); e = CanChangeLv7D(pm, by, StatType.Evasion, e, false); if (a != 0 || d != 0 || sa != 0 || sd != 0 || s != 0 || ac != 0 || e != 0) { if (ability) { ATs.RaiseAbility(pm); } ChangeLv7DImplement(pm, by, StatType.Atk, a, null); ChangeLv7DImplement(pm, by, StatType.SpAtk, sa, null); ChangeLv7DImplement(pm, by, StatType.Def, d, null); ChangeLv7DImplement(pm, by, StatType.SpDef, sd, null); ChangeLv7DImplement(pm, by, StatType.Speed, s, null); ChangeLv7DImplement(pm, by, StatType.Accuracy, ac, null); ChangeLv7DImplement(pm, by, StatType.Evasion, e, null); ITs.WhiteHerb(pm); return(true); } return(false); }
private void Mega() { var m = false; foreach (var p in ActingPokemons) { p.BeforeMegaSpeed = p.Speed; } foreach (var p in ActingPokemons) { if (p.Action == PokemonAction.MoveAttached && p.SelectMega) { if (p.Pokemon.Item == 0) { p.ShowLogPm(Ls.MegaPre384); } else { p.ShowLogPm("MegaPre", p.Pokemon.Item); } p.Pokemon.Mega = true; p.ChangeForm(ITs.MegaForm(p.Pokemon.Item), true, "Mega"); p.CalculatePriority(); p.BeforeMegaSpeed = p.Speed; //mega速度刷新只对自己有效 雨天下mega轻快会变快,正常天气mega降雨不会使轻快队友变快 m = true; } } if (m) { ReportBuilder.AddHorizontalLine(); ActingPokemons.Sort(MegaComparer); } }
private void Mega() { var m = false; foreach (var p in ActingPokemons) { if (p.Action == PokemonAction.MoveAttached && p.SelectMega) { if (p.Pokemon.Item == 0) { p.ShowLogPm(Ls.MegaPre384); } else { p.ShowLogPm("MegaPre", p.Pokemon.Item); } p.Pokemon.Mega = true; p.ChangeForm(ITs.MegaForm(p.Pokemon.Item), true, "Mega"); m = true; } } if (m) { ReportBuilder.AddHorizontalLine(); } }
public static void MoveEnding(AtkContext atk) { var aer = atk.Attacker; if (atk.Move.Id == Ms.SPIT_UP || atk.Move.Id == Ms.SWALLOW) { int i = aer.OnboardPokemon.GetCondition <int>(Cs.Stockpile); aer.ChangeLv7D(atk.Attacker, false, false, 0, -i, 0, -i); aer.OnboardPokemon.RemoveCondition(Cs.Stockpile); aer.ShowLogPm("DeStockpile"); } MagicCoat(atk); atk.SetAttackerAction(atk.Move.StiffOneTurn ? PokemonAction.Stiff : PokemonAction.Done); if (atk.Targets != null) { foreach (var d in atk.Targets) { ITs.Attach(d.Defender); ATs.RecoverAfterMoldBreaker(d.Defender); } } ITs.Attach(atk.Attacker); //先树果汁后PP果 var c = aer.Controller; { var o = atk.GetCondition(Cs.MultiTurn); if (o != null) { o.Turn--; if (o.Turn != 0) { atk.SetAttackerAction(PokemonAction.Moving); } else if (o.Bool) { aer.AddState(aer, AttachedState.Confuse, false, 0, "EnConfuse2"); } } } { var o = atk.GetCondition <Tile>(Cs.EjectButton); if (o != null) { c.PauseForSendOutInput(o); return; } } { var tile = aer.Tile; if (atk.Move.Switch && tile != null) { c.Withdraw(aer, "SelfWithdraw", 0, true); c.PauseForSendOutInput(tile); } } }
internal void Execute() { if (ITs.ChoiceItem(Owner.Item)) { Owner.OnboardPokemon.AddCondition(Cs.ChoiceItem, MoveE); } Owner.ShowLogPm("UseMove", MoveE.Id); Owner.BuildAtkContext(this); Owner.AtkContext.StartExecute(MoveE, Owner.SelectedTarget, null); HasUsed = true; }
public static void ConsumeItem(this PokemonProxy pm, bool cheekPouch = true) { pm.OnboardPokemon.SetTurnCondition(Cs.UsedItem, pm.Pokemon.Item); pm.Pokemon.UsedItem = pm.Pokemon.Item; if (ITs.Berry(pm.Pokemon.Item)) { pm.OnboardPokemon.SetCondition(Cs.Belch); pm.Pokemon.UsedBerry = pm.Pokemon.Item; if (CanHpRecover(pm) && ATs.RaiseAbility(pm, As.CHEEK_POUCH)) { HpRecoverByOneNth(pm, 3); } } RemoveItem(pm); }
/// <summary> /// null log to show default log /// </summary> /// <param name="by"></param> /// <param name="stat"></param> /// <param name="change"></param> /// <param name="showFail"></param> /// <param name="log"></param> /// <returns></returns> public static bool ChangeLv7D(this PokemonProxy pm, PokemonProxy by, StatType stat, int change, bool showFail, bool ability = false, string log = null) { change = CanChangeLv7D(pm, by, stat, change, showFail); if (change != 0) { if (ability) { ATs.RaiseAbility(pm); } ChangeLv7DImplement(pm, by, stat, change, log); ITs.WhiteHerb(pm); return(true); } return(false); }
internal bool CheckNeedInput() { if (Action == PokemonAction.Done || State == PokemonState.SLP && Action == PokemonAction.Moving && AtkContext.Move.SkipSleepMTA) { { var o = OnboardPokemon.GetCondition(Cs.Encore); if (o != null) { foreach (var m in Moves) { if (m.MoveE == o.Move) { if (m.PP == 0) { break; } else { goto DONE1; } } } OnboardPokemon.RemoveCondition(Cs.Encore); } } DONE1: if (ITs.ChoiceItem(Item)) { var o = OnboardPokemon.GetCondition <MoveTypeE>(Cs.ChoiceItem); if (o != null) { foreach (var m in Moves) { if (m.MoveE == o) { goto DONE2; } } OnboardPokemon.RemoveCondition(Cs.ChoiceItem); } } DONE2: Action = PokemonAction.WaitingForInput; return(true); } return(false); }
internal void Execute() { if (ITs.ChoiceItem(Owner.Item)) { Owner.OnboardPokemon.AddCondition(Cs.ChoiceItem, MoveE); } if (Owner.SelectZmove) { Owner.ShowLogPm("Zmove"); } Owner.ShowLogPm("UseMove", MoveE.Id); if (Owner.SelectZmove && MoveE.Move.Category == MoveCategory.Status) { StatusZmove(Owner, MoveE); } Owner.BuildAtkContext(this); Owner.AtkContext.StartExecute(MoveE, Owner.SelectedTarget, null); HasUsed = true; }
public static bool ChangeLv7D(this PokemonProxy pm, PokemonProxy by, MoveTypeE move) { bool r = false; var c = move.Lv7DChanges; if (c != null) { bool showFail = move.Move.Category == MoveCategory.Status; if (c.Type1 == StatType.All) { r = ChangeLv7D(pm, by, showFail, false, c.Change1, c.Change1, c.Change1, c.Change1, c.Change1); } else { var ac = CanChangeLv7D(pm, by, c.Type1, c.Change1, showFail); if (ac != 0) { ChangeLv7DImplement(pm, by, c.Type1, ac, null); r = true; } ac = CanChangeLv7D(pm, by, c.Type2, c.Change2, showFail); if (ac != 0) { ChangeLv7DImplement(pm, by, c.Type2, ac, null); r = true; } ac = CanChangeLv7D(pm, by, c.Type3, c.Change3, showFail); if (ac != 0) { ChangeLv7DImplement(pm, by, c.Type3, ac, null); r = true; } if (r) { ITs.WhiteHerb(pm); } } } return(r); }
public static void Withdrawn(PokemonProxy pm, int ability) { switch (ability) { case As.REGENERATOR: if (pm.Hp != 0) { pm.Pokemon.Hp += pm.Pokemon.MaxHp / 3; } break; case As.NATURAL_CURE: if (pm.Hp != 0) { pm.Pokemon.State = PokemonState.Normal; } break; case As.UNNERVE: foreach (var p in pm.Controller.GetOnboardPokemons(1 - pm.Pokemon.TeamId)) { ITs.Attach(p); } break; case As.PRIMORDIAL_SEA: DeSpWeather(pm, ability, Ls.DeHeavyRain); break; case As.DESOLATE_LAND: DeSpWeather(pm, ability, Ls.DeHarshSunlight); break; case As.DELTA_STREAM: DeSpWeather(pm, ability, Ls.DeMysteriousAirCurrent); break; } }
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) }
private static void AddStateImplement(this PokemonProxy pm, PokemonProxy by, AttachedState state, int turn, string log, int arg1) { switch (state) { case AttachedState.BRN: pm.Pokemon.State = PokemonState.BRN; goto POKEMON_STATE; case AttachedState.FRZ: pm.Pokemon.State = PokemonState.FRZ; pm.ShowLogPm(log ?? "EnFRZ", arg1); if (pm.CanChangeForm(492, 0)) { pm.ChangeForm(0, true); } goto DONE; case AttachedState.PAR: pm.Pokemon.State = PokemonState.PAR; goto POKEMON_STATE; case AttachedState.PSN: if (turn == 0) { pm.Pokemon.State = PokemonState.PSN; } else { pm.Pokemon.State = PokemonState.BadlyPSN; pm.OnboardPokemon.SetCondition(Cs.BadlyPSN, pm.Controller.TurnNumber); } goto POKEMON_STATE; case AttachedState.SLP: pm.Pokemon.State = PokemonState.SLP; pm.Pokemon.SLPTurn = turn == 0 ? pm.Controller.GetRandomInt(2, 4) : turn; goto POKEMON_STATE; case AttachedState.Confuse: pm.OnboardPokemon.SetCondition(Cs.Confuse, turn == 0 ? pm.Controller.GetRandomInt(2, 5) : turn); pm.ShowLogPm(log ?? "Confuse"); goto DONE; case AttachedState.Attract: pm.OnboardPokemon.SetCondition(Cs.Attract, by); pm.ShowLogPm(log ?? "EnAttract", arg1); ITs.DestinyKnot(pm, by); goto DONE; case AttachedState.Trap: { var move = by.AtkContext.Move; var c = new Condition(); c.By = by; c.Turn = pm.Controller.TurnNumber + (turn == 0 ? pm.Controller.GetRandomInt(4, 5) : turn) - 1; c.Move = move; c.Bool = by.Item == Is.BINDING_BAND; pm.OnboardPokemon.SetCondition(Cs.Trap, c); pm.ShowLogPm("EnTrap" + move.Id.ToString(), by.Id); } goto DONE; case AttachedState.Nightmare: pm.OnboardPokemon.SetCondition(Cs.Nightmare); pm.ShowLogPm("EnNightmare"); goto DONE; case AttachedState.Torment: pm.OnboardPokemon.SetCondition(Cs.Torment, by); pm.ShowLogPm("EnTorment"); goto DONE; case AttachedState.Disable: { var c = new Condition(); c.Move = pm.LastMove; c.Turn = pm.Controller.TurnNumber + 3; //4 - 1 pm.OnboardPokemon.SetCondition(Cs.Disable, c); pm.ShowLogPm("EnDisable", c.Move.Id); } goto DONE; case AttachedState.Yawn: { var o = new Condition(); o.Turn = pm.Controller.TurnNumber + 1; o.By = by; //睡眠规则 pm.OnboardPokemon.AddCondition(Cs.Yawn, o); } pm.ShowLogPm("EnYawn"); goto DONE; case AttachedState.HealBlock: { var o = new Condition(); o.Turn = pm.Controller.TurnNumber + 5; o.By = by; pm.OnboardPokemon.SetCondition(Cs.HealBlock, o); } pm.ShowLogPm("EnHealBlock"); goto DONE; case AttachedState.SoundBlock: { var o = new Condition(); o.Turn = pm.Controller.TurnNumber + 2; o.By = by; pm.OnboardPokemon.SetCondition(Cs.SoundBlock, o); } pm.ShowLogPm("EnSoundBlock"); goto DONE; case AttachedState.CanAttack: { var o = new Condition(); o.BattleType = by.AtkContext.Move.Id == Ms.MIRACLE_EYE ? BattleType.Dark : BattleType.Ghost; o.By = by; pm.OnboardPokemon.SetCondition(Cs.CanAttack, o); pm.ShowLogPm("CanAttack"); } goto DONE; case AttachedState.LeechSeed: pm.OnboardPokemon.SetCondition(Cs.LeechSeed, by.Tile); pm.ShowLogPm("EnLeechSeed"); goto DONE; case AttachedState.Embargo: pm.OnboardPokemon.SetCondition(Cs.Embargo); pm.ShowLogPm("EnEmbargo"); goto DONE; case AttachedState.PerishSong: pm.OnboardPokemon.SetCondition(Cs.PerishSong, 3); goto DONE; case AttachedState.Ingrain: pm.OnboardPokemon.SetCondition(Cs.Ingrain); pm.ShowLogPm("EnIngrain"); goto DONE; #if DEBUG default: System.Diagnostics.Debugger.Break(); return; #endif } POKEMON_STATE: pm.ShowLogPm(log ?? "En" + state.ToString(), arg1); if (state != AttachedState.FRZ && state != AttachedState.SLP) { ATs.Synchronize(pm, by, state, turn); } DONE: StateAdded.Execute(pm); }
/// <summary> /// CanSelect不代表技能一定能用,http://www.smogon.com/dp/articles/move_restrictions#disable /// </summary> /// <returns>key, null if no problem</returns> internal SelectMoveFail IfSelected() { if (MoveE.Id != Ms.STRUGGLE) { var op = Owner.OnboardPokemon; //专爱 { var o = op.GetCondition <MoveTypeE>(Cs.ChoiceItem); if (o != null && o != MoveE && ITs.ChoiceItem(Owner.Item)) { return(new SelectMoveFail("ChoiceItem", o.Id)); } } //寻衅 if (op.HasCondition(Cs.Torment) && Owner.LastMove == MoveE) { return(new SelectMoveFail("Torment", Owner.AtkContext.MoveProxy.MoveE.Id)); } //鼓掌 { var o = op.GetCondition(Cs.Encore); if (o != null && o.Move != MoveE) { return(new SelectMoveFail("Encore", Owner.AtkContext.MoveProxy.MoveE.Id)); } } //封印 foreach (var pm in Owner.Controller.Board[1 - Owner.Pokemon.TeamId].GetAdjacentPokemonsByOppositeX(Owner.OnboardPokemon.X)) { if (pm.OnboardPokemon.HasCondition(Cs.Imprison)) { foreach (var m in pm.Moves) { if (m.MoveE == MoveE) { return(new SelectMoveFail("Imprison", MoveE.Id)); } } } } //残废 { var o = op.GetCondition(Cs.Disable); if (o != null && o.Move == MoveE) { return(new SelectMoveFail("Disable", MoveE.Id)); } } //重力 if (MoveE.UnavailableWithGravity && Owner.Controller.Board.HasCondition(Cs.Gravity)) { return(new SelectMoveFail("GravityCantUseMove", MoveE.Id)); } //回复封印 if (MoveE.Heal && op.HasCondition(Cs.HealBlock)) { return(new SelectMoveFail("HealBlockCantUseMove", MoveE.Id)); } //地狱突刺 if (MoveE.Sound && op.HasCondition(Cs.SoundBlock)) { return(new SelectMoveFail("SoundBlockCantUseMove", MoveE.Id)); } //挑拨 if (MoveE.Move.Category == MoveCategory.Status && op.HasCondition(Cs.Taunt)) { return(new SelectMoveFail("Taunt", MoveE.Id)); } //突击背心 if (MoveE.Move.Category == MoveCategory.Status && Owner.ItemE(Is.ASSAULT_VEST)) { return(new SelectMoveFail("AssaultVest", MoveE.Id)); } } return(null); }