Пример #1
0
        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;
                    }
                }
            }
        }
Пример #2
0
 private void Start()
 {
     select = (SelectOpponent)CharacterSelector.Instance;
 }