public BattleContext(PBEBattle battle, SocketUser battler0, SocketUser battler1) { lock (_activeBattlesLockObj) { _activeBattles.Add(this); if (battler0 != null) { _activeBattlers.Add(battler0, this); } if (battler1 != null) { _activeBattlers.Add(battler1, this); } _queuedMessages = new StringBuilder(); BattleId = _battleCounter++; _battle = battle; _battler0 = battler0; _battler1 = battler1; SetEmbedTitle(); battle.OnNewEvent += Battle_OnNewEvent; battle.OnStateChanged += Battle_OnStateChanged; } }
internal PBEWeatherDamagePacket(byte[] data, EndianBinaryReader r, PBEBattle battle) { Data = new ReadOnlyCollection <byte>(data); Weather = r.ReadEnum <PBEWeather>(); DamageVictimTrainer = battle.Trainers[r.ReadByte()]; DamageVictim = r.ReadEnum <PBEFieldPosition>(); }
internal PBEPkmnFaintedPacket(byte[] data, EndianBinaryReader r, PBEBattle battle) { Data = new ReadOnlyCollection <byte>(data); PokemonTrainer = battle.Trainers[r.ReadByte()]; Pokemon = r.ReadByte(); OldPosition = r.ReadEnum <PBEFieldPosition>(); }
private void SinglePlayerBattle_OnNewEvent(PBEBattle battle, IPBEPacket packet) { if (!ProcessPacket(packet)) { Thread.Sleep(WaitMilliseconds); } }
public ReplayClient(string path) : base(PBEBattle.LoadReplay(path), ClientMode.Replay) { ShowRawValues0 = true; ShowRawValues1 = true; StartPacketThread(); }
private void SinglePlayerBattle_OnStateChanged(PBEBattle battle) { switch (battle.BattleState) { case PBEBattleState.Ended: { void OnBattleEndedTransitionEnded() { _battleEndedTransition = null; if (_actionsGUI != null) { _actionsGUI.Dispose(); _actionsGUI = null; } _onClosed.Invoke(); _onClosed = null; } _battleEndedTransition = new FadeToColorTransition(20, 0, OnBattleEndedTransitionEnded); break; } case PBEBattleState.ReadyToRunSwitches: new Thread(battle.RunSwitches) { Name = ThreadName }.Start(); break; case PBEBattleState.ReadyToRunTurn: new Thread(battle.RunTurn) { Name = ThreadName }.Start(); break; } }
public async Task Challenge(SocketUser battler1) { if (battler1.Id == Context.User.Id) { // } else if (BattleContext.GetBattleContext(Context.User) != null) { await Context.Channel.SendMessageAsync($"{Context.User.Username} is already participating in a battle."); } else if (BattleContext.GetBattleContext(battler1) != null) { await Context.Channel.SendMessageAsync($"{battler1.Username} is already participating in a battle."); } else { PBESettings settings = PBESettings.DefaultSettings; PBEPokemonShell[] team0Party, team1Party; // Completely Randomized Pokémon team0Party = PBEUtils.CreateCompletelyRandomTeam(settings, true); team1Party = PBEUtils.CreateCompletelyRandomTeam(settings, true); var battle = new PBEBattle(PBEBattleFormat.Single, settings, team0Party, team1Party); battle.Teams[0].TrainerName = Context.User.Username; battle.Teams[1].TrainerName = battler1.Username; var battleContext = new BattleContext(battle, Context.User, battler1, Context.Channel); } }
public void Intimidate_Does_Not_Announce_If_No_Foes() { #region Setup PBERandom.SetSeed(0); PBESettings settings = PBESettings.DefaultSettings; var p0 = new TestPokemonCollection(1); p0[0] = new TestPokemon(settings, PBESpecies.Shuckle, 0, 100, PBEMove.Splash); var p1 = new TestPokemonCollection(2); p1[0] = new TestPokemon(settings, PBESpecies.Luxray, 0, 100, PBEMove.Splash) { Ability = PBEAbility.Intimidate }; p1[1] = new TestPokemon(settings, PBESpecies.Skitty, 0, 100, PBEMove.Splash); var battle = new PBEBattle(PBEBattleFormat.Triple, 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 shuckle = t0.Party[0]; PBEBattlePokemon luxray = t1.Party[0]; PBEBattlePokemon skitty = t1.Party[1]; #endregion #region Check Assert.True(!battle.VerifyAbilityHappened(luxray, luxray, PBEAbility.Intimidate, PBEAbilityAction.Stats)); // Did not activate #endregion #region Cleanup battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler; #endregion }
public async Task Challenge(SocketUser battler1) { if (battler1.Id == Context.User.Id) { // } else if (BattleContext.GetBattleContext(Context.User) != null) { await Context.Channel.SendMessageAsync($"{Context.User.Username} is already participating in a battle."); } else if (BattleContext.GetBattleContext(battler1) != null) { await Context.Channel.SendMessageAsync($"{battler1.Username} is already participating in a battle."); } else { PBETeamShell team1Shell, team2Shell; // Completely Randomized Pokémon team1Shell = new PBETeamShell(PBESettings.DefaultSettings, PBESettings.DefaultMaxPartySize, true); team2Shell = new PBETeamShell(PBESettings.DefaultSettings, PBESettings.DefaultMaxPartySize, true); var battle = new PBEBattle(PBEBattleFormat.Single, team1Shell, Context.User.Username, team2Shell, battler1.Username); new BattleContext(battle, Context.User, battler1, Context.Channel); } }
protected override void OnSwitchesReady() { new Thread(() => PBEBattle.SelectSwitchesIfValid(Trainer, Switches)) { Name = "Battle Thread" }.Start(); }
internal PBEPkmnLevelChangedPacket(byte[] data, EndianBinaryReader r, PBEBattle battle) { Data = new ReadOnlyCollection <byte>(data); PokemonTrainer = battle.Trainers[r.ReadByte()]; Pokemon = r.ReadByte(); NewLevel = r.ReadByte(); }
protected override void OnActionsReady(PBETurnAction[] acts) { new Thread(() => PBEBattle.SelectActionsIfValid(Trainer, acts)) { Name = "Battle Thread" }.Start(); }
public void Camouflage_Fails() { #region Setup PBERandom.SetSeed(0); PBESettings settings = PBESettings.DefaultSettings; var p0 = new TestPokemonCollection(1); p0[0] = new TestPokemon(settings, PBESpecies.Staryu, 0, 100, PBEMove.Camouflage); var p1 = new TestPokemonCollection(1); p1[0] = new TestPokemon(settings, PBESpecies.Magikarp, 0, 100, PBEMove.Splash); var battle = new PBEBattle(PBEBattleFormat.Single, settings, new PBETrainerInfo(p0, "Trainer 0"), new PBETrainerInfo(p1, "Trainer 1"), battleTerrain: PBEBattleTerrain.Water); battle.OnNewEvent += PBEBattle.ConsoleBattleEventHandler; battle.Begin(); PBETrainer t0 = battle.Trainers[0]; PBETrainer t1 = battle.Trainers[1]; PBEBattlePokemon staryu = t0.Party[0]; PBEBattlePokemon magikarp = t1.Party[0]; #endregion #region Use Camouflage and check Assert.True(PBEBattle.SelectActionsIfValid(t0, new PBETurnAction(staryu, PBEMove.Camouflage, PBETurnTarget.AllyCenter))); Assert.True(PBEBattle.SelectActionsIfValid(t1, new PBETurnAction(magikarp, PBEMove.Splash, PBETurnTarget.AllyCenter))); battle.RunTurn(); Assert.True(battle.VerifyMoveResultHappened(staryu, staryu, PBEResult.InvalidConditions)); #endregion #region Cleanup battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler; #endregion }
public void Camouflage_Works(PBEBattleTerrain battleTerrain, PBEType expectedType, PBESpecies species) { #region Setup PBERandom.SetSeed(0); PBESettings settings = PBESettings.DefaultSettings; var p0 = new TestPokemonCollection(1); p0[0] = new TestPokemon(settings, species, 0, 100, PBEMove.Camouflage); var p1 = new TestPokemonCollection(1); p1[0] = new TestPokemon(settings, PBESpecies.Magikarp, 0, 100, PBEMove.Splash); var battle = new PBEBattle(PBEBattleFormat.Single, settings, new PBETrainerInfo(p0, "Trainer 0"), new PBETrainerInfo(p1, "Trainer 1"), battleTerrain: battleTerrain); battle.OnNewEvent += PBEBattle.ConsoleBattleEventHandler; battle.Begin(); PBETrainer t0 = battle.Trainers[0]; PBETrainer t1 = battle.Trainers[1]; PBEBattlePokemon camouflager = t0.Party[0]; PBEBattlePokemon magikarp = t1.Party[0]; #endregion #region Use Camouflage and check Assert.True(PBEBattle.SelectActionsIfValid(t0, new PBETurnAction(camouflager, PBEMove.Camouflage, PBETurnTarget.AllyCenter))); Assert.True(PBEBattle.SelectActionsIfValid(t1, new PBETurnAction(magikarp, PBEMove.Splash, PBETurnTarget.AllyCenter))); battle.RunTurn(); Assert.True(camouflager.Type1 == expectedType && camouflager.Type2 == PBEType.None); #endregion #region Cleanup battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler; #endregion }
public void ActionsLoop(bool begin) { if (begin) { foreach (PBEBattlePokemon pkmn in _trainer.Party) { pkmn.TurnAction = null; } _actions.Clear(); _actions.AddRange(_trainer.ActiveBattlers); StandBy.Clear(); } int i = _actions.FindIndex(p => p.TurnAction == null); if (i == -1) { _actionsGUI.Dispose(); _actionsGUI = null; new Thread(() => PBEBattle.SelectActionsIfValid(_trainer, _actions.Select(p => p.TurnAction).ToArray())) { Name = ThreadName }.Start(); } else { AddMessage($"What will {_actions[i].Nickname} do?"); SpritedBattlePokemonParty party = _spritedParties[_trainer.Id]; _actionsGUI = new ActionsGUI(this, party, party.SpritedParty[i]); } }
private void Battle_OnNewEvent(PBEBattle battle, IPBEPacket packet) { try { switch (packet) { case PBEActionsRequestPacket arp: { GetAI(arp.Trainer).CreateActions(); break; } case PBESwitchInRequestPacket sirp: { GetAI(sirp.Trainer).CreateSwitches(); break; } case PBETurnBeganPacket tbp: { Console.SetOut(_oldWriter); DateTime time = DateTime.Now; Console.WriteLine($"Emulating turn {tbp.TurnNumber}... ({time.Hour:D2}:{time.Minute:D2}:{time.Second:D2}:{time.Millisecond:D3})"); Console.SetOut(_writer); break; } } } catch (Exception e) { CatchException(e); } }
public void SwitchesLoop(bool begin) { // TODO: LMAOOOOOOOOO if (begin) { Switches.Clear(); StandBy.Clear(); PositionStandBy.Clear(); } else { _switchesRequired--; } if (_switchesRequired == 0) { new Thread(() => PBEBattle.SelectSwitchesIfValid(_trainer, Switches)) { Name = ThreadName }.Start(); } else { AddMessage($"You must send in {_switchesRequired} Pokémon."); //BattleView.Actions.DisplaySwitches(); } }
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); } }
public static void Main(string[] args) { Console.WriteLine("----- Pokémon Battle Engine Test -----"); PBESettings settings = PBESettings.DefaultSettings; PBEPokemonShell[] team0Party = PBECompetitivePokemonShells.CreateRandomTeam(settings.MaxPartySize).ToArray(); PBEPokemonShell[] team1Party = PBECompetitivePokemonShells.CreateRandomTeam(settings.MaxPartySize).ToArray(); PBEBattle battle = new PBEBattle(PBEBattleFormat.Triple, settings, team0Party, team1Party); battle.Teams[0].TrainerName = "Team 1"; battle.Teams[1].TrainerName = "Team 2"; battle.OnNewEvent += PBEBattle.ConsoleBattleEventHandler; battle.OnStateChanged += Battle_OnStateChanged; try { writer = new StreamWriter(new FileStream(logFile, FileMode.Create, FileAccess.Write)); } catch (Exception e) { Console.WriteLine($"Cannot open \"{logFile}\" for writing."); Console.WriteLine(e.Message); return; } oldWriter = Console.Out; Console.SetOut(writer); battle.Begin(); }
public void Wild_Pkmn_Positions_Set_Before_Begin() { #region Setup PBEDataProvider.GlobalRandom.Seed = 0; PBESettings settings = PBESettings.DefaultSettings; var p0 = new TestPokemonCollection(1); p0[0] = new TestPokemon(settings, PBESpecies.Magikarp, 0, 100, PBEMove.Splash); var p1 = new TestPokemonCollection(1); p1[0] = new TestPokemon(settings, PBESpecies.Darkrai, 0, 100, PBEMove.Splash) { CaughtBall = PBEItem.None }; var battle = PBEBattle.CreateWildBattle(PBEBattleFormat.Single, settings, new PBETrainerInfo(p0, "Trainer 0", false), new PBEWildInfo(p1)); PBETrainer t1 = battle.Trainers[1]; PBEBattlePokemon darkrai = t1.Party[0]; #endregion #region Check Assert.True(darkrai.FieldPosition == PBEFieldPosition.Center && battle.ActiveBattlers.Single() == darkrai); #endregion }
public PBESpecialMessagePacket(byte[] buffer, PBEBattle battle) { Buffer = buffer; using (var r = new BinaryReader(new MemoryStream(buffer))) { r.ReadInt16(); // Skip Code Message = (PBESpecialMessage)r.ReadByte(); switch (Message) { case PBESpecialMessage.DraggedOut: case PBESpecialMessage.Endure: case PBESpecialMessage.HPDrained: case PBESpecialMessage.Recoil: case PBESpecialMessage.Struggle: { Params = Array.AsReadOnly(new object[] { (PBEFieldPosition)r.ReadByte(), battle.Teams[r.ReadByte()] }); break; } case PBESpecialMessage.Magnitude: { Params = Array.AsReadOnly(new object[] { r.ReadByte() }); break; } case PBESpecialMessage.PainSplit: { Params = Array.AsReadOnly(new object[] { (PBEFieldPosition)r.ReadByte(), battle.Teams[r.ReadByte()], (PBEFieldPosition)r.ReadByte(), battle.Teams[r.ReadByte()] }); break; } } } }
public void Fainted_Pkmn_Not_Sent_Out_Double() { #region Setup PBEDataProvider.GlobalRandom.Seed = 0; PBESettings settings = PBESettings.DefaultSettings; var p0 = new TestPartyPokemonCollection(3); p0[0] = new TestPartyPokemon(settings, PBESpecies.Magikarp, 0, 100, PBEMove.Splash); p0[1] = new TestPartyPokemon(settings, PBESpecies.Absol, 0, 100, PBEMove.Splash) { HP = 0 }; p0[2] = new TestPartyPokemon(settings, PBESpecies.Feebas, 0, 100, PBEMove.Splash); var p1 = new TestPokemonCollection(1); p1[0] = new TestPokemon(settings, PBESpecies.Darkrai, 0, 100, PBEMove.Splash); var battle = PBEBattle.CreateTrainerBattle(PBEBattleFormat.Double, settings, new PBETrainerInfo(p0, "Trainer 0", false), new PBETrainerInfo(p1, "Trainer 1", false)); PBETrainer t0 = battle.Trainers[0]; PBEBattlePokemon magikarp = t0.Party[0]; PBEBattlePokemon absol = t0.Party[1]; PBEBattlePokemon feebas = t0.Party[2]; battle.Begin(); #endregion #region Check Assert.True(magikarp.FieldPosition == PBEFieldPosition.Left && absol.FieldPosition == PBEFieldPosition.None && feebas.FieldPosition == PBEFieldPosition.Right); #endregion }
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); }
internal PBETeamStatusPacket(byte[] data, EndianBinaryReader r, PBEBattle battle) { Data = new ReadOnlyCollection <byte>(data); Team = battle.Teams[r.ReadByte()]; TeamStatus = r.ReadEnum <PBETeamStatus>(); TeamStatusAction = r.ReadEnum <PBETeamStatusAction>(); }
public void Illusion_Does_Copy_Active_Trainer_Teammate() { #region Setup PBEDataProvider.GlobalRandom.Seed = 0; PBESettings settings = PBESettings.DefaultSettings; var p0 = new TestPokemonCollection(1); p0[0] = new TestPokemon(settings, PBESpecies.Magikarp, 0, 100, PBEMove.Splash); var p1 = new TestPokemonCollection(2); p1[0] = new TestPokemon(settings, PBESpecies.Zoroark, 0, 100, PBEMove.Splash) { Ability = PBEAbility.Illusion }; p1[1] = p0[0]; var battle = PBEBattle.CreateTrainerBattle(PBEBattleFormat.Double, settings, new PBETrainerInfo(p0, "Trainer 0", false), new PBETrainerInfo(p1, "Trainer 1", false)); battle.OnNewEvent += PBEBattle.ConsoleBattleEventHandler; PBETrainer t1 = battle.Trainers[1]; PBEBattlePokemon zoroark = t1.Party[0]; battle.Begin(); #endregion #region Check Assert.True(zoroark.Status2.HasFlag(PBEStatus2.Disguised)); #endregion #region Cleanup battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler; #endregion }
public void PartySubmitted(Player player, PBETeamShell teamShell) { if (_state != ServerState.WaitingForParties) { return; } lock (this) { if (_state != ServerState.WaitingForParties) { return; } foreach (PBEPokemonShell shell in teamShell) { try { // Not currently necessary, but it would be necessary eventually because PBEMovesetBuilder cannot check if a moveset "makes sense" for the method the Pokémon was obtained in // Eventually we would probably want to store that sort of information in PBEPokemonShell PBELegalityChecker.MoveLegalityCheck(shell.Moveset); } catch (Exception e) { Console.WriteLine($"Illegal moveset received from {player.TrainerName}"); Console.WriteLine(e.Message); CancelMatch(); return; } } PBEBattle.CreateTeamParty(_battle.Teams[player.BattleId], teamShell, player.TrainerName); } }
internal PBEPkmnEXPEarnedPacket(byte[] data, EndianBinaryReader r, PBEBattle battle) { Data = new ReadOnlyCollection <byte>(data); PokemonTrainer = battle.Trainers[r.ReadByte()]; Pokemon = r.ReadByte(); Earned = r.ReadUInt32(); }
public ReplayClient(string path, string name) : base(name) { Battle = PBEBattle.LoadReplay(path); BattleView = new BattleView(this); ShowAllPokemon(); StartPacketThread(); }
public void Illusion_Does_Not_Copy_Same_Species() { #region Setup PBERandom.SetSeed(0); PBESettings settings = PBESettings.DefaultSettings; var p0 = new TestPokemonCollection(1); p0[0] = new TestPokemon(settings, PBESpecies.Magikarp, 0, 100, PBEMove.Splash); var p1 = new TestPokemonCollection(2); p1[0] = p1[1] = new TestPokemon(settings, PBESpecies.Zoroark, 0, 100, PBEMove.Splash) { Ability = PBEAbility.Illusion }; var battle = new PBEBattle(PBEBattleFormat.Single, settings, new PBETrainerInfo(p0, "Trainer 0"), new PBETrainerInfo(p1, "Trainer 1")); battle.OnNewEvent += PBEBattle.ConsoleBattleEventHandler; battle.Begin(); PBETrainer t1 = battle.Trainers[1]; PBEBattlePokemon zoroark1 = t1.Party[0]; #endregion #region Check Assert.True(zoroark1.DisguisedAsPokemon == null); #endregion #region Cleanup battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler; #endregion }
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 }