Exemple #1
0
        private void SwitchesOrActions()
        {
            BattleState = PBEBattleState.Processing;
            OnStateChanged?.Invoke(this);

            PBETeam[] teamsWithSwitchIns = Teams.Where(t => t.SwitchInQueue.Count > 0).ToArray();
            if (teamsWithSwitchIns.Length > 0)
            {
                foreach (PBETeam team in teamsWithSwitchIns)
                {
                    ActiveBattlers.AddRange(team.SwitchInQueue);
                    BroadcastPkmnSwitchIn(team, team.SwitchInQueue.Select(p => CreateSwitchInInfo(p)).ToArray(), false);
                }
                DoSwitchInEffects(teamsWithSwitchIns.SelectMany(t => t.SwitchInQueue));
            }

            foreach (PBETeam team in Teams)
            {
                int available = team.NumPkmnAlive - team.NumPkmnOnField;
                team.SwitchInsRequired = 0;
                team.SwitchInQueue.Clear();
                switch (BattleFormat)
                {
                case PBEBattleFormat.Single:
                {
                    if (available > 0 && team.TryGetPokemon(PBEFieldPosition.Center) == null)
                    {
                        team.SwitchInsRequired = 1;
                    }
                    break;
                }

                case PBEBattleFormat.Double:
                {
                    if (available > 0 && team.TryGetPokemon(PBEFieldPosition.Left) == null)
                    {
                        available--;
                        team.SwitchInsRequired++;
                    }
                    if (available > 0 && team.TryGetPokemon(PBEFieldPosition.Right) == null)
                    {
                        team.SwitchInsRequired++;
                    }
                    break;
                }

                case PBEBattleFormat.Rotation:
                case PBEBattleFormat.Triple:
                {
                    if (available > 0 && team.TryGetPokemon(PBEFieldPosition.Left) == null)
                    {
                        available--;
                        team.SwitchInsRequired++;
                    }
                    if (available > 0 && team.TryGetPokemon(PBEFieldPosition.Center) == null)
                    {
                        available--;
                        team.SwitchInsRequired++;
                    }
                    if (available > 0 && team.TryGetPokemon(PBEFieldPosition.Right) == null)
                    {
                        team.SwitchInsRequired++;
                    }
                    break;
                }

                default: throw new ArgumentOutOfRangeException(nameof(BattleFormat));
                }
            }
            teamsWithSwitchIns = Teams.Where(t => t.SwitchInsRequired > 0).ToArray();
            if (teamsWithSwitchIns.Length > 0)
            {
                BattleState = PBEBattleState.WaitingForSwitchIns;
                OnStateChanged?.Invoke(this);
                foreach (PBETeam team in teamsWithSwitchIns)
                {
                    BroadcastSwitchInRequest(team);
                }
            }
            else
            {
                if (WinCheck())
                {
                    return;
                }

                foreach (PBEPokemon pkmn in ActiveBattlers)
                {
                    pkmn.SpeedBoost_AbleToSpeedBoostThisTurn = pkmn.Ability == PBEAbility.SpeedBoost;
                    if (pkmn.Status2.HasFlag(PBEStatus2.Flinching))
                    {
                        pkmn.Status2 &= ~PBEStatus2.Flinching;
                        BroadcastStatus2(pkmn, pkmn, PBEStatus2.Flinching, PBEStatusAction.Ended);
                    }
                    if (pkmn.Status2.HasFlag(PBEStatus2.HelpingHand))
                    {
                        pkmn.Status2 &= ~PBEStatus2.HelpingHand;
                        BroadcastStatus2(pkmn, pkmn, PBEStatus2.HelpingHand, PBEStatusAction.Ended);
                    }
                    if (pkmn.Status2.HasFlag(PBEStatus2.Protected))
                    {
                        pkmn.Status2 &= ~PBEStatus2.Protected;
                        BroadcastStatus2(pkmn, pkmn, PBEStatus2.Protected, PBEStatusAction.Ended);
                    }
                }
                foreach (PBETeam team in Teams)
                {
                    if (team.TeamStatus.HasFlag(PBETeamStatus.WideGuard))
                    {
                        team.TeamStatus &= ~PBETeamStatus.WideGuard;
                        BroadcastTeamStatus(team, PBETeamStatus.WideGuard, PBETeamStatusAction.Ended);
                    }
                }
                foreach (PBETeam team in Teams)
                {
                    team.ActionsRequired.Clear();
                    team.ActionsRequired.AddRange(team.ActiveBattlers);
                }

                if (BattleFormat == PBEBattleFormat.Triple && Teams.All(t => t.NumPkmnAlive == 1))
                {
                    PBEPokemon pkmn1 = ActiveBattlers[0],
                               pkmn2 = ActiveBattlers[1];
                    if ((pkmn1.FieldPosition == PBEFieldPosition.Left && pkmn2.FieldPosition == PBEFieldPosition.Right) || (pkmn1.FieldPosition == PBEFieldPosition.Right && pkmn2.FieldPosition == PBEFieldPosition.Left))
                    {
                        PBEFieldPosition pkmn1OldPos = pkmn1.FieldPosition,
                                         pkmn2OldPos = pkmn2.FieldPosition;
                        pkmn2.FieldPosition = pkmn1.FieldPosition = PBEFieldPosition.Center;
                        BroadcastAutoCenter(pkmn1.Id, pkmn1OldPos, pkmn1.Team, pkmn2.Id, pkmn2OldPos, pkmn2.Team);
                    }
                }

                TurnNumber++;
                BroadcastTurnBegan();
                foreach (PBETeam team in Teams)
                {
                    bool old = team.MonFaintedThisTurn; // Fire events in a specific order
                    team.MonFaintedThisTurn = false;
                    team.MonFaintedLastTurn = old;
                }
                BattleState = PBEBattleState.WaitingForActions;
                OnStateChanged?.Invoke(this);
                foreach (PBETeam team in Teams)
                {
                    BroadcastActionsRequest(team);
                }
            }
        }
Exemple #2
0
        // Sets BattleState to PBEBattleState.Processing/PBEBattleState.WaitingForActions/PBEBattleState.WaitingForSwitches/PBEBattleState.Ended
        void SwitchesOrActions()
        {
            BattleState = PBEBattleState.Processing;
            OnStateChanged?.Invoke(this);

            IEnumerable <PBETeam> teamsWithSwitchIns = Teams.Where(t => t.SwitchInQueue.Count > 0);

            if (teamsWithSwitchIns.Count() > 0)
            {
                foreach (PBETeam team in teamsWithSwitchIns)
                {
                    ActiveBattlers.AddRange(team.SwitchInQueue);
                    BroadcastPkmnSwitchIn(team, team.SwitchInQueue.Select(p => CreateSwitchInInfo(p)), false);
                }
                DoSwitchInEffects(teamsWithSwitchIns.SelectMany(t => t.SwitchInQueue));
            }

            foreach (PBETeam team in Teams)
            {
                int available = team.NumPkmnAlive - team.NumPkmnOnField;
                team.SwitchInsRequired = 0;
                team.SwitchInQueue.Clear();
                switch (BattleFormat)
                {
                case PBEBattleFormat.Single:
                {
                    if (available > 0 && team.TryGetPokemon(PBEFieldPosition.Center) == null)
                    {
                        team.SwitchInsRequired = 1;
                    }
                    break;
                }

                case PBEBattleFormat.Double:
                {
                    if (available > 0 && team.TryGetPokemon(PBEFieldPosition.Left) == null)
                    {
                        available--;
                        team.SwitchInsRequired++;
                    }
                    if (available > 0 && team.TryGetPokemon(PBEFieldPosition.Right) == null)
                    {
                        team.SwitchInsRequired++;
                    }
                    break;
                }

                case PBEBattleFormat.Rotation:
                case PBEBattleFormat.Triple:
                {
                    if (available > 0 && team.TryGetPokemon(PBEFieldPosition.Left) == null)
                    {
                        available--;
                        team.SwitchInsRequired++;
                    }
                    if (available > 0 && team.TryGetPokemon(PBEFieldPosition.Center) == null)
                    {
                        available--;
                        team.SwitchInsRequired++;
                    }
                    if (available > 0 && team.TryGetPokemon(PBEFieldPosition.Right) == null)
                    {
                        team.SwitchInsRequired++;
                    }
                    break;
                }

                default: throw new ArgumentOutOfRangeException(nameof(BattleFormat));
                }
            }
            teamsWithSwitchIns = Teams.Where(t => t.SwitchInsRequired > 0);
            if (teamsWithSwitchIns.Count() > 0)
            {
                BattleState = PBEBattleState.WaitingForSwitchIns;
                OnStateChanged?.Invoke(this);
                foreach (PBETeam team in teamsWithSwitchIns)
                {
                    BroadcastSwitchInRequest(team);
                }
            }
            else
            {
                if (WinCheck())
                {
                    return;
                }

                foreach (PBEPokemon pkmn in ActiveBattlers)
                {
                    pkmn.Status2 &= ~PBEStatus2.Flinching;
                    pkmn.Status2 &= ~PBEStatus2.Protected;
                }
                foreach (PBETeam team in Teams)
                {
                    team.ActionsRequired.Clear();
                    team.ActionsRequired.AddRange(team.ActiveBattlers);
                }

                TurnNumber++;
                BroadcastTurnBegan();
                BattleState = PBEBattleState.WaitingForActions;
                OnStateChanged?.Invoke(this);
                foreach (PBETeam team in Teams)
                {
                    BroadcastActionsRequest(team);
                }
            }
        }