private void DetermineTurnOrder() { _turnOrder.Clear(); IEnumerable <PBEPokemon> pkmnSwitchingOut = ActiveBattlers.Where(p => p.TurnAction.Decision == PBETurnDecision.SwitchOut); IEnumerable <PBEPokemon> pkmnFighting = ActiveBattlers.Where(p => p.TurnAction.Decision == PBETurnDecision.Fight); // Switching happens first: _turnOrder.AddRange(GetActingOrder(pkmnSwitchingOut, true)); // Moves: sbyte GetPrio(PBEPokemon p) { PBEMoveData mData = PBEMoveData.Data[p.TurnAction.FightMove]; return((sbyte)PBEUtils.Clamp(mData.Priority + (p.Ability == PBEAbility.Prankster && mData.Category == PBEMoveCategory.Status ? 1 : 0), sbyte.MinValue, sbyte.MaxValue)); } foreach (sbyte priority in pkmnFighting.Select(p => GetPrio(p)).Distinct().OrderByDescending(p => p)) { PBEPokemon[] pkmnWithThisPriority = pkmnFighting.Where(p => GetPrio(p) == priority).ToArray(); if (pkmnWithThisPriority.Length > 0) { Debug.WriteLine("Priority {0} bracket...", priority); _turnOrder.AddRange(GetActingOrder(pkmnWithThisPriority, false)); } } }
/// <summary> /// Sets and clears all information required for switching out. /// </summary> public void ClearForSwitch() { FieldPosition = PBEFieldPosition.None; if (Ability == PBEAbility.Regenerator) { HP = PBEUtils.Clamp((ushort)(HP + (MaxHP / 3)), ushort.MinValue, MaxHP); HPPercentage = (double)HP / MaxHP; } Ability = Shell.Ability; VisualGender = Shell.Gender; VisualNickname = Shell.Nickname; VisualShiny = Shell.Shiny; VisualSpecies = Shell.Species; AttackChange = DefenseChange = SpAttackChange = SpDefenseChange = SpeedChange = AccuracyChange = EvasionChange = 0; if (Status1 == PBEStatus1.Asleep) { Status1Counter = SleepTurns; } else if (Status1 == PBEStatus1.BadlyPoisoned) { Status1Counter = 1; } Status2 = PBEStatus2.None; ConfusionCounter = ConfusionTurns = 0; DisguisedAsPokemon = null; SeededPosition = PBEFieldPosition.None; SubstituteHP = 0; TempLockedMove = ChoiceLockedMove = PBEMove.None; TempLockedTargets = PBETarget.None; ExecutedMoves.Clear(); if (Id != byte.MaxValue) { CalculateStats(); } }
public sbyte SetStatChange(PBEStat stat, int value) { sbyte val = (sbyte)PBEUtils.Clamp(value, -Team.Battle.Settings.MaxStatChange, Team.Battle.Settings.MaxStatChange); switch (stat) { case PBEStat.Accuracy: return(AccuracyChange = val); case PBEStat.Attack: return(AttackChange = val); case PBEStat.Defense: return(DefenseChange = val); case PBEStat.Evasion: return(EvasionChange = val); case PBEStat.SpAttack: return(SpAttackChange = val); case PBEStat.SpDefense: return(SpDefenseChange = val); case PBEStat.Speed: return(SpeedChange = val); default: throw new ArgumentOutOfRangeException(nameof(stat)); } }
/// <summary>Sets and clears all information required for switching out.</summary> public void ClearForSwitch() { FieldPosition = PBEFieldPosition.None; switch (Ability) { case PBEAbility.NaturalCure: { Status1 = PBEStatus1.None; Status1Counter = SleepTurns = 0; break; } case PBEAbility.Regenerator: { HP = PBEUtils.Clamp((ushort)(HP + (MaxHP / 3)), ushort.MinValue, MaxHP); HPPercentage = (double)HP / MaxHP; break; } } PBEPokemonData pData; if (Shaymin_CannotChangeBackToSkyForm) { pData = PBEPokemonData.GetData(Species = KnownSpecies = PBESpecies.Shaymin); Ability = pData.Abilities[0]; } else { pData = PBEPokemonData.GetData(Species = KnownSpecies = OriginalSpecies); Ability = OriginalAbility; } KnownAbility = PBEAbility.MAX; KnownGender = Gender; KnownItem = (PBEItem)ushort.MaxValue; KnownMoves.SetUnknown(); KnownNickname = Nickname; KnownShiny = Shiny; KnownType1 = Type1 = pData.Type1; KnownType2 = Type2 = pData.Type2; AttackChange = DefenseChange = SpAttackChange = SpDefenseChange = SpeedChange = AccuracyChange = EvasionChange = 0; if (Status1 == PBEStatus1.Asleep) { Status1Counter = 0; } else if (Status1 == PBEStatus1.BadlyPoisoned) { Status1Counter = 1; } ConfusionCounter = ConfusionTurns = 0; DisguisedAsPokemon = null; SeededPosition = PBEFieldPosition.None; SeededTeam = null; SubstituteHP = 0; if (Id != byte.MaxValue && Status2.HasFlag(PBEStatus2.Transformed)) { Moves.Reset(TransformBackupMoves); TransformBackupMoves.SetUnknown(); } Status2 = PBEStatus2.None; TempLockedMove = ChoiceLockedMove = PBEMove.None; TempLockedTargets = PBETurnTarget.None; ExecutedMoves.Clear(); SpeedBoost_AbleToSpeedBoostThisTurn = false; if (Id != byte.MaxValue) { SetStats(); } }