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); } } }
// 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); } } }