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();
 }
Example #6
0
        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);
                }
            }
Example #8
0
        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();
 }
Example #11
0
 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();
 }
Example #13
0
        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
        }
Example #14
0
        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
        }
Example #15
0
        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]);
            }
        }
Example #16
0
        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);
            }
        }
Example #17
0
 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);
     }
 }
Example #19
0
        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);
        }
Example #24
0
 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
        }
Example #26
0
 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);
     }
 }
Example #27
0
 internal PBEPkmnEXPEarnedPacket(byte[] data, EndianBinaryReader r, PBEBattle battle)
 {
     Data           = new ReadOnlyCollection <byte>(data);
     PokemonTrainer = battle.Trainers[r.ReadByte()];
     Pokemon        = r.ReadByte();
     Earned         = r.ReadUInt32();
 }
Example #28
0
 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
        }