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