Exemple #1
0
        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));
                }
            }
        }
Exemple #2
0
        /// <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();
            }
        }