public void TeamProtection_Works(PBEMove move, PBEMove move2, PBETeamStatus teamStatus)
        {
            #region Setup
            PBERandom.SetSeed(0);
            PBESettings settings = PBESettings.DefaultSettings;

            var p0 = new TestPokemonCollection(1);
            p0[0] = new TestPokemon(settings, PBESpecies.Mienshao, 0, 100, move);

            var p1 = new TestPokemonCollection(1);
            p1[0] = new TestPokemon(settings, PBESpecies.Lucario, 0, 100, move2);

            var battle = new PBEBattle(PBEBattleFormat.Single, settings, new PBETrainerInfo(p0, "Trainer 0"), new PBETrainerInfo(p1, "Trainer 1"));
            battle.OnNewEvent += PBEBattle.ConsoleBattleEventHandler;
            battle.Begin();

            PBETrainer       t0       = battle.Trainers[0];
            PBETrainer       t1       = battle.Trainers[1];
            PBEBattlePokemon mienshao = t0.Party[0];
            PBEBattlePokemon lucario  = t1.Party[0];
            #endregion

            #region Use move and check
            Assert.True(PBEBattle.SelectActionsIfValid(t0, new PBETurnAction(mienshao, move, PBETurnTarget.AllyCenter)));
            Assert.True(PBEBattle.SelectActionsIfValid(t1, new PBETurnAction(lucario, move2, PBETurnTarget.FoeCenter)));

            battle.RunTurn();

            Assert.True(battle.VerifyTeamStatusHappened(t0.Team, teamStatus, PBETeamStatusAction.Damage, damageVictim: mienshao) && !t0.Team.TeamStatus.HasFlag(teamStatus));
            #endregion

            #region Cleanup
            battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler;
            #endregion
        }
Exemple #2
0
        private void SelectMoveForTurn(PBEMove move)
        {
            PBEBattlePokemon pkmn            = _pkmn.Pkmn;
            PBEMoveTarget    possibleTargets = pkmn.GetMoveTargets(move);
            // Single battle only
            PBETurnTarget targets;

            switch (possibleTargets)
            {
            case PBEMoveTarget.All: targets = PBETurnTarget.AllyCenter | PBETurnTarget.FoeCenter; break;

            case PBEMoveTarget.AllFoes:
            case PBEMoveTarget.AllFoesSurrounding:
            case PBEMoveTarget.AllSurrounding:
            case PBEMoveTarget.RandomFoeSurrounding:
            case PBEMoveTarget.SingleFoeSurrounding:
            case PBEMoveTarget.SingleNotSelf:
            case PBEMoveTarget.SingleSurrounding: targets = PBETurnTarget.FoeCenter; break;

            case PBEMoveTarget.AllTeam:
            case PBEMoveTarget.Self:
            case PBEMoveTarget.SelfOrAllySurrounding:
            case PBEMoveTarget.SingleAllySurrounding: targets = PBETurnTarget.AllyCenter; break;

            default: throw new ArgumentOutOfRangeException(nameof(possibleTargets));
            }
            pkmn.TurnAction = new PBETurnAction(pkmn, move, targets);
            _parent.ActionsLoop(false);
        }
 public PBETransformPacket(byte[] buffer, PBEBattle battle)
 {
     Buffer = buffer;
     using (var r = new BinaryReader(new MemoryStream(buffer)))
     {
         r.ReadInt16(); // Skip Code
         User                  = (PBEFieldPosition)r.ReadByte();
         UserTeam              = battle.Teams[r.ReadByte()];
         Target                = (PBEFieldPosition)r.ReadByte();
         TargetTeam            = battle.Teams[r.ReadByte()];
         TargetAttack          = r.ReadUInt16();
         TargetDefense         = r.ReadUInt16();
         TargetSpAttack        = r.ReadUInt16();
         TargetSpDefense       = r.ReadUInt16();
         TargetSpeed           = r.ReadUInt16();
         TargetAttackChange    = r.ReadSByte();
         TargetDefenseChange   = r.ReadSByte();
         TargetSpAttackChange  = r.ReadSByte();
         TargetSpDefenseChange = r.ReadSByte();
         TargetSpeedChange     = r.ReadSByte();
         TargetAccuracyChange  = r.ReadSByte();
         TargetEvasionChange   = r.ReadSByte();
         TargetAbility         = (PBEAbility)r.ReadByte();
         TargetSpecies         = (PBESpecies)r.ReadUInt16();
         TargetType1           = (PBEType)r.ReadByte();
         TargetType2           = (PBEType)r.ReadByte();
         TargetWeight          = r.ReadDouble();
         var moves = new PBEMove[r.ReadByte()];
         for (int i = 0; i < moves.Length; i++)
         {
             moves[i] = (PBEMove)r.ReadUInt16();
         }
         TargetMoves = Array.AsReadOnly(moves);
     }
 }
Exemple #4
0
        // Stats & PP are set from the shell info
        public PBEPokemon(PBETeam team, byte id, PBEPokemonShell shell)
        {
            Team = team;
            SelectedAction.PokemonId = Id = id;
            Shell          = shell;
            VisualGender   = Shell.Gender;
            VisualNickname = Shell.Nickname;
            VisualShiny    = Shell.Shiny;
            VisualSpecies  = Shell.Species;
            Ability        = Shell.Ability;
            Item           = Shell.Item;
            CalculateStats();
            HP           = MaxHP;
            HPPercentage = 1.0;
            Moves        = Shell.Moves;
            PP           = new byte[Moves.Length];
            MaxPP        = new byte[Moves.Length];
            for (int i = 0; i < Moves.Length; i++)
            {
                PBEMove move = Shell.Moves[i];
                if (move != PBEMove.None)
                {
                    byte tier = PBEMoveData.Data[move].PPTier;
                    PP[i] = MaxPP[i] = (byte)Math.Max(1, (tier * Team.Battle.Settings.PPMultiplier) + (tier * Shell.PPUps[i]));
                }
            }
            PBEPokemonData pData = PBEPokemonData.Data[Shell.Species];

            Type1  = pData.Type1;
            Type2  = pData.Type2;
            Weight = pData.Weight;
            Team.Party.Add(this);
        }
        internal PBETransformPacket(byte[] data, EndianBinaryReader r, PBEBattle battle)
        {
            Data                  = new ReadOnlyCollection <byte>(data);
            UserTrainer           = battle.Trainers[r.ReadByte()];
            User                  = r.ReadEnum <PBEFieldPosition>();
            TargetTrainer         = battle.Trainers[r.ReadByte()];
            Target                = r.ReadEnum <PBEFieldPosition>();
            TargetAttack          = r.ReadUInt16();
            TargetDefense         = r.ReadUInt16();
            TargetSpAttack        = r.ReadUInt16();
            TargetSpDefense       = r.ReadUInt16();
            TargetSpeed           = r.ReadUInt16();
            TargetAttackChange    = r.ReadSByte();
            TargetDefenseChange   = r.ReadSByte();
            TargetSpAttackChange  = r.ReadSByte();
            TargetSpDefenseChange = r.ReadSByte();
            TargetSpeedChange     = r.ReadSByte();
            TargetAccuracyChange  = r.ReadSByte();
            TargetEvasionChange   = r.ReadSByte();
            TargetAbility         = r.ReadEnum <PBEAbility>();
            TargetSpecies         = r.ReadEnum <PBESpecies>();
            TargetForm            = r.ReadEnum <PBEForm>();
            TargetType1           = r.ReadEnum <PBEType>();
            TargetType2           = r.ReadEnum <PBEType>();
            TargetWeight          = r.ReadSingle();
            var moves = new PBEMove[battle.Settings.NumMoves];

            for (int i = 0; i < moves.Length; i++)
            {
                moves[i] = r.ReadEnum <PBEMove>();
            }
            TargetMoves = new ReadOnlyCollection <PBEMove>(moves);
        }
 public PBEExecutedMove(ushort turnNumber, PBEMove move, PBEFailReason failReason, IList <PBETargetSuccess> targets)
 {
     TurnNumber = turnNumber;
     Move       = move;
     FailReason = failReason;
     Targets    = new ReadOnlyCollection <PBETargetSuccess>(targets);
 }
Exemple #7
0
 /// <summary>
 /// Transforms into <paramref name="target"/> and sets <see cref="PBEStatus2.Transformed"/>.
 /// </summary>
 /// <param name="target">The Pokémon to transform into.</param>
 /// <remarks>Frees the Pokémon of its <see cref="ChoiceLockedMove"/>.</remarks>
 public void Transform(PBEPokemon target)
 {
     VisualSpecies   = target.Shell.Species;
     VisualShiny     = target.Shell.Shiny;
     VisualGender    = target.Shell.Gender;
     Ability         = target.Ability;
     Type1           = target.Type1;
     Type2           = target.Type2;
     Weight          = target.Weight;
     Attack          = target.Attack;
     Defense         = target.Defense;
     SpAttack        = target.SpAttack;
     SpDefense       = target.SpDefense;
     Speed           = target.Speed;
     AttackChange    = target.AttackChange;
     DefenseChange   = target.DefenseChange;
     SpAttackChange  = target.SpAttackChange;
     SpDefenseChange = target.SpDefenseChange;
     SpeedChange     = target.SpeedChange;
     AccuracyChange  = target.AccuracyChange;
     EvasionChange   = target.EvasionChange;
     Moves           = (PBEMove[])target.Moves.Clone();
     if (Id != byte.MaxValue)
     {
         for (int i = 0; i < Moves.Length; i++)
         {
             PP[i] = MaxPP[i] = (byte)(Moves[i] == PBEMove.None ? 0 : PBEMoveData.Data[Moves[i]].PPTier == 0 ? 1 : Team.Battle.Settings.PPMultiplier);
         }
     }
     if (!Moves.Contains(ChoiceLockedMove))
     {
         ChoiceLockedMove = PBEMove.None;
     }
     Status2 |= PBEStatus2.Transformed;
 }
 private void CheckForLearnMoves()
 {
     if (_learningMoves.Count != 0)
     {
         int index = _pkmn.Moveset.GetFirstEmptySlot();
         if (index == -1)
         {
             SetWantsToLearnMove();
         }
         else
         {
             Moveset.MovesetSlot slot = _pkmn.Moveset[index];
             PBEMove             move = _learningMoves.Dequeue(); // Remove from queue
             string moveStr           = PBELocalizedString.GetMoveName(move).English;
             slot.Move = move;
             PBEMoveData mData = PBEMoveData.Data[move];
             slot.PP    = PBEDataUtils.CalcMaxPP(mData.PPTier, 0, PkmnConstants.PBESettings);
             slot.PPUps = 0;
             CreateMessage(string.Format("{0} learned {1}!", _pkmn.Nickname, moveStr));
             _state = State.LearnMove_ForgotMsg;
         }
     }
     else
     {
         SetFadeOut();
     }
 }
        private void CheckPartyHasMoveCommand()
        {
            PBEMove move = ReadVarOrEnum <PBEMove>();

            Overworld.GetNonEggPartyMonWithMove(move, out _, out int index);
            Game.Instance.Save.Vars[Var.SpecialVar_Result] = (short)index;
        }
        internal PBETransformPacket(ReadOnlyCollection <byte> buffer, BinaryReader r, PBEBattle battle)
        {
            Buffer                = buffer;
            User                  = (PBEFieldPosition)r.ReadByte();
            UserTeam              = battle.Teams[r.ReadByte()];
            Target                = (PBEFieldPosition)r.ReadByte();
            TargetTeam            = battle.Teams[r.ReadByte()];
            TargetAttack          = r.ReadUInt16();
            TargetDefense         = r.ReadUInt16();
            TargetSpAttack        = r.ReadUInt16();
            TargetSpDefense       = r.ReadUInt16();
            TargetSpeed           = r.ReadUInt16();
            TargetAttackChange    = r.ReadSByte();
            TargetDefenseChange   = r.ReadSByte();
            TargetSpAttackChange  = r.ReadSByte();
            TargetSpDefenseChange = r.ReadSByte();
            TargetSpeedChange     = r.ReadSByte();
            TargetAccuracyChange  = r.ReadSByte();
            TargetEvasionChange   = r.ReadSByte();
            TargetAbility         = (PBEAbility)r.ReadByte();
            TargetSpecies         = (PBESpecies)r.ReadUInt16();
            TargetType1           = (PBEType)r.ReadByte();
            TargetType2           = (PBEType)r.ReadByte();
            TargetWeight          = r.ReadDouble();
            var moves = new PBEMove[battle.Settings.NumMoves];

            for (int i = 0; i < moves.Length; i++)
            {
                moves[i] = (PBEMove)r.ReadUInt16();
            }
            TargetMoves = new ReadOnlyCollection <PBEMove>(moves);
        }
 public PBETurnAction(byte pokemonId, PBEMove fightMove, PBETurnTarget fightTargets)
 {
     PokemonId    = pokemonId;
     Decision     = PBETurnDecision.Fight;
     FightMove    = fightMove;
     FightTargets = fightTargets;
 }
        // This constructor is to define a remote Pokémon
        public PBEPokemon(PBETeam team, PBEPkmnSwitchInPacket.PBESwitchInInfo info)
        {
            Team          = team;
            Id            = info.PokemonId;
            FieldPosition = info.FieldPosition;
            HP            = info.HP;
            MaxHP         = info.MaxHP;
            HPPercentage  = info.HPPercentage;
            Status1       = info.Status1;
            Level         = info.Level;
            KnownAbility  = Ability = OriginalAbility = PBEAbility.MAX;
            KnownGender   = Gender = info.Gender;
            KnownItem     = Item = (PBEItem)ushort.MaxValue;
            Moves         = new PBEMove[Team.Battle.Settings.NumMoves];
            KnownMoves    = new PBEMove[Team.Battle.Settings.NumMoves];
            for (int i = 0; i < Team.Battle.Settings.NumMoves; i++)
            {
                KnownMoves[i] = Moves[i] = PBEMove.MAX;
            }
            PP            = new byte[Team.Battle.Settings.NumMoves];
            MaxPP         = new byte[Team.Battle.Settings.NumMoves];
            KnownNickname = Nickname = info.Nickname;
            KnownShiny    = Shiny = info.Shiny;
            KnownSpecies  = Species = OriginalSpecies = info.Species;
            var pData = PBEPokemonData.GetData(KnownSpecies);

            KnownType1  = Type1 = pData.Type1;
            KnownType2  = Type2 = pData.Type2;
            KnownWeight = Weight = pData.Weight;
            Team.Party.Add(this);
        }
 public static PBELocalizedString GetMoveName(PBEMove move)
 {
     if (move >= PBEMove.MAX)
     {
         throw new ArgumentOutOfRangeException(nameof(move));
     }
     return(new PBELocalizedString(PBEUtils.QueryDatabase <SearchResult>(string.Format(QueryId, "MoveNames", (ushort)move))[0]));
 }
        private void SetGiveUpLearningMove()
        {
            PBEMove move = _learningMoves.Peek();
            string  str  = PBELocalizedString.GetMoveName(move).English;

            CreateMessage(string.Format("Give up on learning {0}?", str));
            _state = State.LearnMove_GiveUpLearningMsg;
        }
        private void SetWantsToLearnMove()
        {
            PBEMove move = _learningMoves.Peek();
            string  str  = PBELocalizedString.GetMoveName(move).English;

            CreateMessage(string.Format("{0} wants to learn {1},\nbut {0} already knows {2} moves.\fForget a move and learn {1}?", _pkmn.Nickname, str, PkmnConstants.NumMoves));
            _state = State.LearnMove_WantsToLearnMoveMsg;
        }
Exemple #16
0
 public static PBELocalizedString GetMoveDescription(PBEMove move)
 {
     if (move >= PBEMove.MAX || !Enum.IsDefined(typeof(PBEMove), move))
     {
         throw new ArgumentOutOfRangeException(nameof(move));
     }
     return(new PBELocalizedString(PBEUtils.QueryDatabase <SearchResult>(string.Format(queryId, "MoveDescriptions", (ushort)move))[0]));
 }
        private ushort CalculateDamage(PBEPokemon user, PBEPokemon target, PBEMove move, PBEType moveType, PBEMoveCategory moveCategory, double basePower, bool criticalHit)
        {
            ushort damage;
            double a = 0, d = 0;

            bool unawareA = user != target && target.Ability == PBEAbility.Unaware && !user.HasCancellingAbility();
            bool unawareD = user != target && user.Ability == PBEAbility.Unaware && !target.HasCancellingAbility(); // Verified: A target with Mold Breaker will accept more damage from a user with Unaware

            switch (move)
            {
            case PBEMove.FoulPlay:
            {
                double aMod = unawareA ? 1 : GetStatChangeModifier(criticalHit ? Math.Max((sbyte)0, target.AttackChange) : target.AttackChange, false);
                a = CalculateAttack(user, target, moveType, target.Attack * aMod);
                double dMod = unawareD ? 1 : GetStatChangeModifier(criticalHit ? Math.Min((sbyte)0, target.DefenseChange) : target.DefenseChange, false);
                d = CalculateDefense(user, target, target.Defense * dMod);
                break;
            }

            case PBEMove.Psyshock:
            case PBEMove.Psystrike:
            case PBEMove.SecretSword:
            {
                double aMod = unawareA ? 1 : GetStatChangeModifier(criticalHit ? Math.Max((sbyte)0, user.SpAttackChange) : user.SpAttackChange, false);
                a = CalculateSpAttack(user, target, moveType, user.SpAttack * aMod);
                double dMod = unawareD ? 1 : GetStatChangeModifier(criticalHit ? Math.Min((sbyte)0, target.DefenseChange) : target.DefenseChange, false);
                d = CalculateDefense(user, target, target.Defense * dMod);
                break;
            }

            default:
            {
                if (moveCategory == PBEMoveCategory.Physical)
                {
                    double aMod = unawareA ? 1 : GetStatChangeModifier(criticalHit ? Math.Max((sbyte)0, user.AttackChange) : user.AttackChange, false);
                    a = CalculateAttack(user, target, moveType, user.Attack * aMod);
                    double dMod = unawareD ? 1 : GetStatChangeModifier(criticalHit ? Math.Min((sbyte)0, target.DefenseChange) : target.DefenseChange, false);
                    d = CalculateDefense(user, target, target.Defense * dMod);
                }
                else if (moveCategory == PBEMoveCategory.Special)
                {
                    double aMod = unawareA ? 1 : GetStatChangeModifier(criticalHit ? Math.Max((sbyte)0, user.SpAttackChange) : user.SpAttackChange, false);
                    a = CalculateSpAttack(user, target, moveType, user.SpAttack * aMod);
                    double dMod = unawareD ? 1 : GetStatChangeModifier(criticalHit ? Math.Min((sbyte)0, target.SpDefenseChange) : target.SpDefenseChange, false);
                    d = CalculateSpDefense(user, target, target.SpDefense * dMod);
                }
                break;
            }
            }

            damage  = (ushort)((2 * user.Level / 5) + 2);
            damage  = (ushort)(damage * a * basePower / d);
            damage /= 50;
            damage += 2;
            return((ushort)(damage * (100 - PBEUtils.RandomInt(0, 15)) / 100));
        }
Exemple #18
0
        public void PushMove(PBEMove move, PBETurnTarget targets)
        {
            PBEBattlePokemon pkmn = _pkmn[_index];
            var a = new PBETurnAction(pkmn, move, targets);

            pkmn.TurnAction  = a;
            _actions[_index] = a;
            _standBy[_index] = null;
            _index++;
            ActionsLoop();
        }
Exemple #19
0
        // Wild Pokémon always select a random usable move (unless they are forced to use a move)
        // They will flee randomly based on their PBEPokemonData.FleeRate only if it's a single battle and they are allowed to flee
        public static void CreateWildAIActions(this PBETrainer trainer)
        {
            if (trainer is null)
            {
                throw new ArgumentNullException(nameof(trainer));
            }
            if (trainer.Battle.BattleState != PBEBattleState.WaitingForActions)
            {
                throw new InvalidOperationException($"{nameof(trainer.Battle.BattleState)} must be {PBEBattleState.WaitingForActions} to create actions.");
            }
            // Try to flee if it's a single wild battle and the Pokémon is a runner
            if (trainer.IsWild && trainer.Battle.BattleFormat == PBEBattleFormat.Single && trainer.IsFleeValid() is null)
            {
                PBEBattlePokemon user  = trainer.ActionsRequired[0];
                IPBEPokemonData  pData = PBEDataProvider.Instance.GetPokemonData(user);
                if (PBEDataProvider.GlobalRandom.RandomBool(pData.FleeRate, 255))
                {
                    string valid = trainer.SelectFleeIfValid();
                    if (valid != null)
                    {
                        throw new Exception("Wild AI tried to flee but couldn't. - " + valid);
                    }
                    return;
                }
            }
            var actions = new PBETurnAction[trainer.ActionsRequired.Count];

            for (int i = 0; i < actions.Length; i++)
            {
                PBEBattlePokemon user = trainer.ActionsRequired[i];
                // If a Pokémon is forced to struggle, it must use Struggle
                if (user.IsForcedToStruggle())
                {
                    actions[i] = new PBETurnAction(user, PBEMove.Struggle, PBEBattleUtils.GetPossibleTargets(user, user.GetMoveTargets(PBEMove.Struggle))[0]);
                    continue;
                }
                // If a Pokémon has a temp locked move (Dig, Dive, ShadowForce) it must be used
                if (user.TempLockedMove != PBEMove.None)
                {
                    actions[i] = new PBETurnAction(user, user.TempLockedMove, user.TempLockedTargets);
                    continue;
                }
                // The Pokémon is free to fight
                PBEMove[] usableMoves = user.GetUsableMoves();
                PBEMove   move        = PBEDataProvider.GlobalRandom.RandomElement(usableMoves);
                actions[i] = new PBETurnAction(user, move, PBEBattle.GetRandomTargetForMetronome(user, move, PBEDataProvider.GlobalRandom));
            }
            string valid2 = trainer.SelectActionsIfValid(actions);

            if (valid2 != null)
            {
                throw new Exception("Wild AI created bad actions. - " + valid2);
            }
        }
        public PBEMoveUsedPacket(PBEPokemon moveUser, PBEMove move)
        {
            var bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(Code));
            bytes.Add((byte)(MoveUser = moveUser.FieldPosition));
            bytes.Add((MoveUserTeam = moveUser.Team).Id);
            bytes.AddRange(BitConverter.GetBytes((ushort)(Move = move)));
            bytes.Add((byte)((OwnsMove = moveUser.Moves.Contains(Move)) ? 1 : 0));
            Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes);
        }
Exemple #21
0
 public int IndexOf(PBEMove move)
 {
     for (int i = 0; i < PkmnConstants.NumMoves; i++)
     {
         if (_slots[i].Move == move)
         {
             return(i);
         }
     }
     return(-1);
 }
Exemple #22
0
        public PBEMoveLockPacket(PBEPokemon moveUser, PBEMove lockedMove, PBETarget lockedTargets, PBEMoveLockType moveLockType)
        {
            var bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(Code));
            bytes.Add((byte)(MoveUser = moveUser.FieldPosition));
            bytes.Add((MoveUserTeam = moveUser.Team).Id);
            bytes.AddRange(BitConverter.GetBytes((ushort)(LockedMove = lockedMove)));
            bytes.Add((byte)(LockedTargets = lockedTargets));
            bytes.Add((byte)(MoveLockType = moveLockType));
            Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes);
        }
        internal PBEMoveUsedPacket(PBEPokemon moveUser, PBEMove move, bool reveal)
        {
            var bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(Code));
            bytes.Add((byte)(MoveUser = moveUser.FieldPosition));
            bytes.Add((MoveUserTeam = moveUser.Team).Id);
            bytes.AddRange(BitConverter.GetBytes((ushort)(Move = move)));
            bytes.Add((byte)((Reveal = reveal) ? 1 : 0));
            bytes.InsertRange(0, BitConverter.GetBytes((short)bytes.Count));
            Buffer = new ReadOnlyCollection <byte>(bytes);
        }
Exemple #24
0
        internal PBEMovePPChangedPacket(PBEFieldPosition moveUser, PBETeam moveUserTeam, PBEMove move, int amountReduced)
        {
            var bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(Code));
            bytes.Add((byte)(MoveUser = moveUser));
            bytes.Add((MoveUserTeam = moveUserTeam).Id);
            bytes.AddRange(BitConverter.GetBytes((ushort)(Move = move)));
            bytes.AddRange(BitConverter.GetBytes(AmountReduced = amountReduced));
            bytes.InsertRange(0, BitConverter.GetBytes((short)bytes.Count));
            Buffer = new ReadOnlyCollection <byte>(bytes);
        }
        //[InlineData(PBEMove.SkyDrop, PBEStatus2.Airborne)]
        public void HelpingHand_HitsSemiInvulnerable(PBEMove move, PBEStatus2 status2)
        {
            #region Setup
            PBEDataProvider.GlobalRandom.Seed = 0;
            PBESettings settings = PBESettings.DefaultSettings;

            var p0 = new TestPokemonCollection(2);
            p0[0] = new TestPokemon(settings, PBESpecies.Minun, 0, 100, PBEMove.HelpingHand, PBEMove.Splash);
            p0[1] = new TestPokemon(settings, PBESpecies.Giratina, 0, 1, move);

            var p1 = new TestPokemonCollection(1);
            p1[0] = new TestPokemon(settings, PBESpecies.Magikarp, 0, 100, PBEMove.Splash);

            var battle = PBEBattle.CreateTrainerBattle(PBEBattleFormat.Double, settings, new PBETrainerInfo(p0, "Trainer 0", false), new PBETrainerInfo(p1, "Trainer 1", false));
            battle.OnNewEvent += PBEBattle.ConsoleBattleEventHandler;

            PBETrainer       t0       = battle.Trainers[0];
            PBETrainer       t1       = battle.Trainers[1];
            PBEBattlePokemon minun    = t0.Party[0];
            PBEBattlePokemon giratina = t0.Party[1];
            PBEBattlePokemon magikarp = t1.Party[0];

            battle.Begin();
            #endregion

            #region Use Shadow Force
            Assert.True(t0.SelectActionsIfValid(out _,
                                                new PBETurnAction(minun, PBEMove.Splash, PBETurnTarget.AllyLeft),
                                                new PBETurnAction(giratina, move, PBETurnTarget.FoeLeft)));
            Assert.True(t1.SelectActionsIfValid(out _,
                                                new PBETurnAction(magikarp, PBEMove.Splash, PBETurnTarget.AllyLeft)));

            battle.RunTurn();

            Assert.True(giratina.Status2.HasFlag(status2));
            #endregion

            #region Use Helping Hand and check
            Assert.True(t0.SelectActionsIfValid(out _,
                                                new PBETurnAction(minun, PBEMove.HelpingHand, PBETurnTarget.AllyRight),
                                                new PBETurnAction(giratina, move, PBETurnTarget.FoeLeft)));
            Assert.True(t1.SelectActionsIfValid(out _,
                                                new PBETurnAction(magikarp, PBEMove.Splash, PBETurnTarget.AllyLeft)));

            battle.RunTurn();

            Assert.True(battle.VerifyStatus2Happened(giratina, minun, PBEStatus2.HelpingHand, PBEStatusAction.Added));
            #endregion

            #region Cleanup
            battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler;
            #endregion
        }
        public PBEMovePPChangedPacket(PBEFieldPosition moveUser, PBETeam moveUserTeam, PBEMove move, byte oldValue, byte newValue)
        {
            var bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(Code));
            bytes.Add((byte)(MoveUser = moveUser));
            bytes.Add((MoveUserTeam = moveUserTeam).Id);
            bytes.AddRange(BitConverter.GetBytes((ushort)(Move = move)));
            bytes.Add(OldValue = oldValue);
            bytes.Add(NewValue = newValue);
            Buffer             = BitConverter.GetBytes((short)bytes.Count).Concat(bytes);
        }
 internal PBEMovePPChangedPacket(PBEPokemon moveUser, PBEMove move, int amountReduced)
 {
     using (var ms = new MemoryStream())
         using (var w = new EndianBinaryWriter(ms, encoding: EncodingType.UTF16))
         {
             w.Write(Code);
             w.Write(MoveUser = moveUser.FieldPosition);
             w.Write((MoveUserTeam = moveUser.Team).Id);
             w.Write(Move          = move);
             w.Write(AmountReduced = amountReduced);
             Data = new ReadOnlyCollection <byte>(ms.ToArray());
         }
 }
Exemple #28
0
 internal PBEMoveUsedPacket(PBEBattlePokemon moveUser, PBEMove move, bool owned)
 {
     using (var ms = new MemoryStream())
         using (var w = new EndianBinaryWriter(ms, encoding: EncodingType.UTF16))
         {
             w.Write(Code);
             w.Write((MoveUserTrainer = moveUser.Trainer).Id);
             w.Write(MoveUser = moveUser.FieldPosition);
             w.Write(Move     = move);
             w.Write(Owned    = owned);
             Data             = new ReadOnlyCollection <byte>(ms.ToArray());
         }
 }
Exemple #29
0
        internal PBEMoveLockPacket(PBEPokemon moveUser, PBEMove lockedMove, PBETurnTarget lockedTargets, PBEMoveLockType moveLockType)
        {
            var bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(Code));
            bytes.Add((byte)(MoveUser = moveUser.FieldPosition));
            bytes.Add((MoveUserTeam = moveUser.Team).Id);
            bytes.AddRange(BitConverter.GetBytes((ushort)(LockedMove = lockedMove)));
            bytes.Add((byte)(LockedTargets = lockedTargets));
            bytes.Add((byte)(MoveLockType = moveLockType));
            bytes.InsertRange(0, BitConverter.GetBytes((short)bytes.Count));
            Buffer = new ReadOnlyCollection <byte>(bytes);
        }
Exemple #30
0
        internal PBEReadOnlyMoveset(JArray jArray)
        {
            int count = jArray.Count;

            _list = new PBEReadOnlyMovesetSlot[count];
            for (int i = 0; i < count; i++)
            {
                JToken  jToken = jArray[i];
                PBEMove move   = PBELocalizedString.GetMoveByName(jToken[nameof(IPBEMovesetSlot.Move)].Value <string>()).Value;
                byte    ppUps  = jToken[nameof(IPBEMovesetSlot.PPUps)].Value <byte>();
                _list[i] = new PBEReadOnlyMovesetSlot(move, ppUps);
            }
        }