async Task PlayerMoves(Side Player, Side Opponent, List <PokemonMovePair> SwithInQueue, List <PokemonMovePair> MegaQueue, List <PokemonMovePair> MoveQueue) { for (var i = 0; i < Format; ++i) { if (Player.Battling[i] == null) { continue; } // Recharging Pokemon skip a turn if (Player.Battling[i].Recharging) { await WriteStatus($"{Player.Battling[i]} is recharging"); Player.Battling[i].Recharging = false; continue; } // Until a valid move is chosen or Pokemon is switched out while (true) { BattleState = BattleState.Move; MovingPokemon = Player.Battling[i]; await WriteStatus($"What will {Player.Battling[i]} do?", false); _toMove = null; _toSwitch = null; CanMegaEvolve = !Player.UsedMegaEvolution && Player.Battling[i].CanMegaEvolve(out var _); CanZ = !Player.UsedZ && Player.Battling[i].HeldItem is ZCrystal zCrystal && Player.Battling[i].Moves.Any(M => zCrystal.Supports(Player.Battling[i], M)); if (CanZ) { ZSelector = new ZMoveSelectionViewModel(Player.Battling[i]); } await WaitForPlayer(); CanMegaEvolve = CanZ = false; // Switch if (_toSwitch != null) { SwitchOutEffects(Player.Battling[i]); await WriteStatus($"{Player.Battling[i]}, Come back!"); Player.Battling[i] = _toSwitch; await WriteStatus($"Go {_toSwitch}"); SwithInQueue.Add(new PokemonMovePair(_toSwitch, null)); break; } // Move if (_toMove != null) { var move = Player.Battling[i].Moves[_toMove.Value]; if (move.PPLeft == 0) { await WriteStatus("This move has no PP Left"); continue; } if (move.Disabled) { await WriteStatus($"{GetStatusName(Player.Battling[i])}'s {move} was disabled"); continue; } if (UseZ && Player.Battling[i].HeldItem is ZCrystal z) { move = z.Upgrade(move); UseZ = false; Player.UsedZ = true; BattleState = BattleState.Wait; } Pokemon target = null; if (Format == 1) { target = Opponent.Battling[0]; } else if (move.Info.Target == MoveTarget.Normal) { SelectOpponent.Clear(); foreach (var pokemon in Player.Battling[i].GetAdjacentFoes()) { SelectOpponent.Add(pokemon); } if (SelectOpponent.Count == 0) { await WriteStatus("No available targets"); break; } if (SelectOpponent.Count == 1) { target = SelectOpponent[0]; } else { BattleState = BattleState.Target; await WriteStatus("Select Target", false); if (!await WaitForPlayer(true)) { continue; } target = _target; } } if (UseMegaEvolution && !Player.UsedMegaEvolution && Player.Battling[i].CanMegaEvolve(out var _)) { MegaQueue.Add(new PokemonMovePair(Player.Battling[i], null)); Player.UsedMegaEvolution = true; } MoveQueue.Add(new PokemonMovePair(Player.Battling[i], move) { Target = target }); break; } } } }
private void Start() { select = (SelectOpponent)CharacterSelector.Instance; }