Exemple #1
0
 internal PBEPkmnFaintedPacket(byte[] data, EndianBinaryReader r, PBEBattle battle)
 {
     Data            = new ReadOnlyCollection <byte>(data);
     PokemonId       = r.ReadByte();
     PokemonPosition = r.ReadEnum <PBEFieldPosition>();
     PokemonTeam     = battle.Teams[r.ReadByte()];
 }
 internal PBEPkmnFaintedPacket(ReadOnlyCollection <byte> buffer, BinaryReader r, PBEBattle battle)
 {
     Buffer          = buffer;
     PokemonId       = r.ReadByte();
     PokemonPosition = (PBEFieldPosition)r.ReadByte();
     PokemonTeam     = battle.Teams[r.ReadByte()];
 }
        public PBEWinnerPacket(PBETeam winningTeam)
        {
            var bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(Code));
            bytes.Add((WinningTeam = winningTeam).Id);
            Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes);
        }
 internal static PokemonInfo?From(BattleClient client, PBETeam team, PBEFieldPosition pos)
 {
     if (!team.TryGetPokemon(pos, out PBEBattlePokemon? pkmn))
     {
         return(null);
     }
     return(new PokemonInfo(pkmn, client.ShouldUseKnownInfo(pkmn.Trainer)));
 }
Exemple #5
0
 internal PBEMoveMissedPacket(byte[] data, EndianBinaryReader r, PBEBattle battle)
 {
     Data         = new ReadOnlyCollection <byte>(data);
     MoveUser     = r.ReadEnum <PBEFieldPosition>();
     MoveUserTeam = battle.Teams[r.ReadByte()];
     Pokemon2     = r.ReadEnum <PBEFieldPosition>();
     Pokemon2Team = battle.Teams[r.ReadByte()];
 }
 internal PBEMoveMissedPacket(ReadOnlyCollection <byte> buffer, BinaryReader r, PBEBattle battle)
 {
     Buffer       = buffer;
     MoveUser     = (PBEFieldPosition)r.ReadByte();
     MoveUserTeam = battle.Teams[r.ReadByte()];
     Pokemon2     = (PBEFieldPosition)r.ReadByte();
     Pokemon2Team = battle.Teams[r.ReadByte()];
 }
        internal PBEWinnerPacket(PBETeam winningTeam)
        {
            var bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(Code));
            bytes.Add((WinningTeam = winningTeam).Id);
            bytes.InsertRange(0, BitConverter.GetBytes((short)bytes.Count));
            Buffer = new ReadOnlyCollection <byte>(bytes);
        }
 public PBEWinnerPacket(byte[] buffer, PBEBattle battle)
 {
     Buffer = buffer;
     using (var r = new BinaryReader(new MemoryStream(buffer)))
     {
         r.ReadInt16(); // Skip Code
         WinningTeam = battle.Teams[r.ReadByte()];
     }
 }
        public PBESwitchInRequestPacket(PBETeam team)
        {
            var bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(Code));
            bytes.Add((Team = team).Id);
            bytes.Add(Amount = Team.SwitchInsRequired);
            Buffer           = BitConverter.GetBytes((short)bytes.Count).Concat(bytes);
        }
Exemple #10
0
 internal PBEWinnerPacket(PBETeam winningTeam)
 {
     using (var ms = new MemoryStream())
         using (var w = new EndianBinaryWriter(ms, encoding: EncodingType.UTF16))
         {
             w.Write(Code);
             w.Write((WinningTeam = winningTeam).Id);
             Data = new ReadOnlyCollection <byte>(ms.ToArray());
         }
 }
Exemple #11
0
        internal PBEWeatherPacket(ReadOnlyCollection <byte> buffer, BinaryReader r, PBEBattle battle)
        {
            Buffer        = buffer;
            Weather       = (PBEWeather)r.ReadByte();
            WeatherAction = (PBEWeatherAction)r.ReadByte();
            DamageVictim  = (PBEFieldPosition)r.ReadByte();
            byte teamId = r.ReadByte();

            DamageVictimTeam = teamId == byte.MaxValue ? null : battle.Teams[teamId];
        }
Exemple #12
0
        internal PBEMoveCritPacket(PBEPokemon victim)
        {
            var bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(Code));
            bytes.Add((byte)(Victim = victim.FieldPosition));
            bytes.Add((VictimTeam = victim.Team).Id);
            bytes.InsertRange(0, BitConverter.GetBytes((short)bytes.Count));
            Buffer = new ReadOnlyCollection <byte>(bytes);
        }
Exemple #13
0
 public Battler(PBETeam t, SocketUser?u)
 {
     Team    = t;
     Trainer = t.Trainers[0];
     User    = u;
     if (u is null)
     {
         AI = new PBEDDAI(Trainer);
     }
 }
        public PBEPkmnFaintedPacket(byte pokemonId, PBEFieldPosition pokemonPosition, PBETeam pokemonTeam)
        {
            var bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(Code));
            bytes.Add(PokemonId = pokemonId);
            bytes.Add((byte)(PokemonPosition = pokemonPosition));
            bytes.Add((PokemonTeam = pokemonTeam).Id);
            Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes);
        }
        internal PBESwitchInRequestPacket(PBETeam team)
        {
            var bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(Code));
            bytes.Add((Team = team).Id);
            bytes.Add(Amount = Team.SwitchInsRequired);
            bytes.InsertRange(0, BitConverter.GetBytes((short)bytes.Count));
            Buffer = new ReadOnlyCollection <byte>(bytes);
        }
 internal PBEAutoCenterPacket(ReadOnlyCollection <byte> buffer, BinaryReader r, PBEBattle battle)
 {
     Buffer           = buffer;
     Pokemon1Id       = r.ReadByte();
     Pokemon1Position = (PBEFieldPosition)r.ReadByte();
     Pokemon1Team     = battle.Teams[r.ReadByte()];
     Pokemon2Id       = r.ReadByte();
     Pokemon2Position = (PBEFieldPosition)r.ReadByte();
     Pokemon2Team     = battle.Teams[r.ReadByte()];
 }
Exemple #17
0
 internal PBEAutoCenterPacket(byte[] data, EndianBinaryReader r, PBEBattle battle)
 {
     Data             = new ReadOnlyCollection <byte>(data);
     Pokemon1Id       = r.ReadByte();
     Pokemon1Position = r.ReadEnum <PBEFieldPosition>();
     Pokemon1Team     = battle.Teams[r.ReadByte()];
     Pokemon2Id       = r.ReadByte();
     Pokemon2Position = r.ReadEnum <PBEFieldPosition>();
     Pokemon2Team     = battle.Teams[r.ReadByte()];
 }
Exemple #18
0
        public PBESetPartyPacket(PBETeam team)
        {
            var bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(Code));
            bytes.Add((Team = team).Id);
            bytes.Add((byte)(Party = Team.Party.AsReadOnly()).Count);
            bytes.AddRange(Party.SelectMany(p => p.ToBytes()));
            Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes);
        }
        public PBEActionsRequestPacket(PBETeam team)
        {
            var bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(Code));
            bytes.Add((Team = team).Id);
            bytes.Add((byte)(Pokemon = Team.ActionsRequired.Select(p => p.FieldPosition).ToList().AsReadOnly()).Count);
            bytes.AddRange(Pokemon.Select(p => (byte)p));
            Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes);
        }
 public PBEPkmnFaintedPacket(byte[] buffer, PBEBattle battle)
 {
     Buffer = buffer;
     using (var r = new BinaryReader(new MemoryStream(buffer)))
     {
         r.ReadInt16(); // Skip Code
         PokemonId       = r.ReadByte();
         PokemonPosition = (PBEFieldPosition)r.ReadByte();
         PokemonTeam     = battle.Teams[r.ReadByte()];
     }
 }
        public PBEPkmnSwitchOutPacket(byte pokemonId, PBEFieldPosition pokemonPosition, PBETeam pokemonTeam, bool forced)
        {
            var bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(Code));
            bytes.Add(PokemonId = pokemonId);
            bytes.Add((byte)(PokemonPosition = pokemonPosition));
            bytes.Add((PokemonTeam = pokemonTeam).Id);
            bytes.Add((byte)((Forced = forced) ? 1 : 0));
            Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes);
        }
        /// <summary>
        /// Creates valid actions for a battle turn for a specific team.
        /// </summary>
        /// <param name="team">The team to create actions for.</param>
        /// <exception cref="InvalidOperationException">Thrown when <paramref name="team"/> has no active battlers or <paramref name="team"/>'s <see cref="PBETeam.Battle"/>'s <see cref="PBEBattle.BattleState"/> is not <see cref="PBEBattleState.WaitingForActions"/>.</exception>
        /// <exception cref="ArgumentOutOfRangeException">Thrown when a Pokémon has no moves, the AI tries to use a move with invalid targets, or <paramref name="team"/>'s <see cref="PBETeam.Battle"/>'s <see cref="PBEBattle.BattleFormat"/> is invalid.</exception>
        public static IEnumerable <PBEAction> CreateActions(PBETeam team)
        {
            if (team.Battle.BattleState != PBEBattleState.WaitingForActions)
            {
                throw new InvalidOperationException($"{nameof(team.Battle.BattleState)} must be {PBEBattleState.WaitingForActions} to create actions.");
            }
            PBEPokemon[] active = team.ActiveBattlers.ToArray();
            if (active.Length == 0)
            {
                throw new InvalidOperationException($"{nameof(team)} must have active battlers.");
            }
            var actions = new PBEAction[active.Length];

            for (int i = 0; i < active.Length; i++)
            {
                PBEPokemon pkmn = active[i];
                if (pkmn.Moves.All(m => m == PBEMove.None))
                {
                    throw new ArgumentOutOfRangeException(nameof(pkmn.Moves), $"{pkmn.Shell.Nickname} has no moves.");
                }
                actions[i].PokemonId = pkmn.Id;
                actions[i].Decision  = PBEDecision.Fight;
                if (pkmn.IsForcedToStruggle())
                {
                    actions[i].FightMove = PBEMove.Struggle;
                }
                else if (pkmn.TempLockedMove != PBEMove.None)
                {
                    actions[i].FightMove = pkmn.TempLockedMove;
                }
                else if (pkmn.ChoiceLockedMove != PBEMove.None)
                {
                    actions[i].FightMove = pkmn.ChoiceLockedMove;
                }
                else
                {
                    int index;
                    do
                    {
                        index = PBEUtils.RNG.Next(0, pkmn.Moves.Length);
                        actions[i].FightMove = pkmn.Moves[index];
                    } while (pkmn.PP[index] == 0); // PP of PBEMove.None is always 0 as well
                }
                if (pkmn.TempLockedTargets != PBETarget.None)
                {
                    actions[i].FightTargets = pkmn.TempLockedTargets;
                }
                else
                {
                    actions[i].FightTargets = DecideTargets(pkmn, actions[i].FightMove);
                }
            }
            return(actions);
        }
        internal PBEPkmnFaintedPacket(byte pokemonId, PBEFieldPosition pokemonPosition, PBETeam pokemonTeam)
        {
            var bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(Code));
            bytes.Add(PokemonId = pokemonId);
            bytes.Add((byte)(PokemonPosition = pokemonPosition));
            bytes.Add((PokemonTeam = pokemonTeam).Id);
            bytes.InsertRange(0, BitConverter.GetBytes((short)bytes.Count));
            Buffer = new ReadOnlyCollection <byte>(bytes);
        }
Exemple #24
0
        }                                        // null means no victim

        public PBEWeatherPacket(PBEWeather weather, PBEWeatherAction weatherAction, PBEPokemon damageVictim)
        {
            var bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(Code));
            bytes.Add((byte)(Weather = weather));
            bytes.Add((byte)(WeatherAction = weatherAction));
            bytes.Add((byte)(DamageVictim = damageVictim == null ? PBEFieldPosition.None : damageVictim.FieldPosition));
            bytes.Add((DamageVictimTeam = damageVictim?.Team) == null ? byte.MaxValue : damageVictim.Team.Id);
            Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes);
        }
        }                                             // PBEFieldPosition.None means no victim

        public PBETeamStatusPacket(PBETeam team, PBETeamStatus teamStatus, PBETeamStatusAction teamStatusAction, PBEPokemon damageVictim)
        {
            var bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(Code));
            bytes.Add((Team = team).Id);
            bytes.Add((byte)(TeamStatus = teamStatus));
            bytes.Add((byte)(TeamStatusAction = teamStatusAction));
            bytes.Add((byte)(DamageVictim = damageVictim == null ? PBEFieldPosition.None : damageVictim.FieldPosition));
            Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes);
        }
 internal PBEMoveCritPacket(PBEPokemon victim)
 {
     using (var ms = new MemoryStream())
         using (var w = new EndianBinaryWriter(ms, encoding: EncodingType.UTF16))
         {
             w.Write(Code);
             w.Write(Victim = victim.FieldPosition);
             w.Write((VictimTeam = victim.Team).Id);
             Data = new ReadOnlyCollection <byte>(ms.ToArray());
         }
 }
 internal PBESwitchInRequestPacket(PBETeam team)
 {
     using (var ms = new MemoryStream())
         using (var w = new EndianBinaryWriter(ms, encoding: EncodingType.UTF16))
         {
             w.Write(Code);
             w.Write((Team = team).Id);
             w.Write(Amount = Team.SwitchInsRequired);
             Data           = new ReadOnlyCollection <byte>(ms.ToArray());
         }
 }
        public PBEMoveMissedPacket(PBEPokemon moveUser, PBEPokemon pokemon2)
        {
            var bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(Code));
            bytes.Add((byte)(MoveUser = moveUser.FieldPosition));
            bytes.Add((MoveUserTeam = moveUser.Team).Id);
            bytes.Add((byte)(Pokemon2 = pokemon2.FieldPosition));
            bytes.Add((Pokemon2Team = pokemon2.Team).Id);
            Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes);
        }
Exemple #29
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);
        }
Exemple #30
0
 private PBEPkmnFaintedPacket(byte pokemonId, PBEFieldPosition pokemonPosition, PBETeam pokemonTeam)
 {
     using (var ms = new MemoryStream())
         using (var w = new EndianBinaryWriter(ms, encoding: EncodingType.UTF16))
         {
             w.Write(Code);
             w.Write(PokemonId       = pokemonId);
             w.Write(PokemonPosition = pokemonPosition);
             w.Write((PokemonTeam = pokemonTeam).Id);
             Data = new ReadOnlyCollection <byte>(ms.ToArray());
         }
 }