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
        }
예제 #2
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
        }
        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
        }
예제 #4
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
        }
예제 #5
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
        }
예제 #6
0
        public void Basic_Actions()
        {
            #region Setup
            PBERandom.SetSeed(0);
            PBESettings settings = PBESettings.DefaultSettings;

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

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

            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 koffing  = t0.Party[0];
            PBEBattlePokemon magikarp = t0.Party[1];
            PBEBattlePokemon darkrai  = t1.Party[0];
            #endregion

            #region Darkrai uses Protect, Koffing uses Selfdestruct and faints
            var a = new PBETurnAction(koffing, PBEMove.Selfdestruct, PBETurnTarget.FoeCenter);
            Assert.Throws <ArgumentNullException>(() => PBEBattle.SelectActionsIfValid(null, a));                                   // Throw for null team
            Assert.Throws <ArgumentNullException>(() => PBEBattle.SelectActionsIfValid(t0, (IReadOnlyList <PBETurnAction>)null));   // Throw for null collection
            Assert.Throws <ArgumentNullException>(() => PBEBattle.SelectActionsIfValid(t0, new PBETurnAction[] { null }));          // Throw for null elements
            Assert.False(PBEBattle.SelectActionsIfValid(t0, a, a));                                                                 // False for too many actions
            Assert.True(PBEBattle.SelectActionsIfValid(t0, a));                                                                     // True for good actions
                                                                                                                                    // TODO: bad field position to switch into, bad move, bad targets, bad targets with templockedmove, battle status, bad pkmn id, wrong team pkmn id, duplicate pkmn id, can't switch out but tried, invalid switch mon (null hp pos), duplicate switch mon
            Assert.False(PBEBattle.SelectActionsIfValid(t0, a));                                                                    // False because actions were already submitted
            Assert.False(PBEBattle.SelectActionsIfValid(t0, Array.Empty <PBETurnAction>()));                                        // False for 0 despite us now needing 0 additional actions

            Assert.True(PBEBattle.SelectActionsIfValid(t1, new PBETurnAction(darkrai, PBEMove.Protect, PBETurnTarget.AllyCenter))); // True for good actions

            battle.RunTurn();
            #endregion

            #region More checks
            var s = new PBESwitchIn(magikarp, PBEFieldPosition.Center);
            Assert.Throws <ArgumentNullException>(() => PBEBattle.SelectSwitchesIfValid(null, s));                               // Throw for null team
            Assert.Throws <ArgumentNullException>(() => PBEBattle.SelectSwitchesIfValid(t0, (IReadOnlyList <PBESwitchIn>)null)); // Throw for null collection
            Assert.Throws <ArgumentNullException>(() => PBEBattle.SelectSwitchesIfValid(t0, new PBESwitchIn[] { null }));        // Throw for null elements
            Assert.False(PBEBattle.SelectSwitchesIfValid(t0, s, s));                                                             // False for too many
            Assert.True(PBEBattle.SelectSwitchesIfValid(t0, s));                                                                 // True for good switches

            // Below two wouldn't work because of battle status lol
            //Assert.False(PBEBattle.SelectSwitchesIfValid(t0, s)); // False because switches were already submitted
            //Assert.False(PBEBattle.SelectSwitchesIfValid(t0, Array.Empty<PBESwitchIn>())); // False for 0 despite us now needing 0 additional actions

            //battle.RunSwitches();
            #endregion

            #region Cleanup
            battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler;
            #endregion
        }
예제 #7
0
        public static void InitEngine(string databasePath, int?randomSeed = null, PBEDataProvider dataProvider = null)
        {
            InitDB(databasePath);
            var cultureInfo = CultureInfo.ReadOnly(CultureInfo.CurrentUICulture);

            PBECulture   = PBELocalizedString.IsCultureValid(cultureInfo) ? cultureInfo : CultureInfo.GetCultureInfo("en-US");
            GlobalRandom = new PBERandom(randomSeed);
            Instance     = dataProvider ?? new PBEDataProvider();
        }
예제 #8
0
        // Verified: Sturdy and Substitute only activate on damaging attacks (so draining HP or liquid ooze etc can bypass sturdy)
        private ushort DealDamage(PBEBattlePokemon culprit, PBEBattlePokemon victim, int hp, bool ignoreSubstitute = true, bool ignoreSturdy = true)
        {
            if (hp < 1)
            {
                hp = 1;
            }
            if (!ignoreSubstitute && victim.Status2.HasFlag(PBEStatus2.Substitute))
            {
                ushort oldSubHP = victim.SubstituteHP;
                victim.SubstituteHP = (ushort)Math.Max(0, victim.SubstituteHP - hp);
                ushort damageAmt = (ushort)(oldSubHP - victim.SubstituteHP);
                BroadcastStatus2(victim, culprit, PBEStatus2.Substitute, PBEStatusAction.Damage);
                return(damageAmt);
            }
            ushort oldHP         = victim.HP;
            double oldPercentage = victim.HPPercentage;

            victim.HP = (ushort)Math.Max(0, victim.HP - hp);
            bool sturdyHappened = false, focusBandHappened = false, focusSashHappened = false;

            if (!ignoreSturdy && victim.HP == 0)
            {
                // TODO: Endure
                if (oldHP == victim.MaxHP && victim.Ability == PBEAbility.Sturdy && !culprit.HasCancellingAbility())
                {
                    sturdyHappened = true;
                    victim.HP      = 1;
                }
                else if (victim.Item == PBEItem.FocusBand && PBERandom.RandomBool(10, 100))
                {
                    focusBandHappened = true;
                    victim.HP         = 1;
                }
                else if (oldHP == victim.MaxHP && victim.Item == PBEItem.FocusSash)
                {
                    focusSashHappened = true;
                    victim.HP         = 1;
                }
            }
            victim.UpdateHPPercentage();
            BroadcastPkmnHPChanged(victim, oldHP, oldPercentage);
            if (sturdyHappened)
            {
                BroadcastAbility(victim, culprit, PBEAbility.Sturdy, PBEAbilityAction.Damage);
                BroadcastEndure(victim);
            }
            else if (focusBandHappened)
            {
                BroadcastItem(victim, culprit, PBEItem.FocusBand, PBEItemAction.Damage);
            }
            else if (focusSashHappened)
            {
                BroadcastItem(victim, culprit, PBEItem.FocusSash, PBEItemAction.Consumed);
            }
            return((ushort)(oldHP - victim.HP));
        }
        public void CastformCherrim_Interacts_With_AirLock(PBESpecies species, PBEAbility ability, PBEForm form)
        {
            #region Setup
            PBERandom.SetSeed(0);
            PBESettings settings = PBESettings.DefaultSettings;

            var p0 = new TestPokemonCollection(2);
            p0[0] = new TestPokemon(settings, PBESpecies.Magikarp, 0, 100, PBEMove.Splash);
            p0[1] = new TestPokemon(settings, PBESpecies.Rayquaza, 0, 100, PBEMove.Splash)
            {
                Ability = PBEAbility.AirLock
            };

            var p1 = new TestPokemonCollection(1);
            p1[0] = new TestPokemon(settings, species, 0, 100, PBEMove.Splash)
            {
                Ability = ability
            };

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

            PBETrainer       t0              = battle.Trainers[0];
            PBETrainer       t1              = battle.Trainers[1];
            PBEBattlePokemon magikarp        = t0.Party[0];
            PBEBattlePokemon rayquaza        = t0.Party[1];
            PBEBattlePokemon castformCherrim = t1.Party[0];
            #endregion

            #region Check Castform/Cherrim for correct form
            Assert.True(battle.Weather == PBEWeather.HarshSunlight && castformCherrim.Form == form);
            #endregion

            #region Swap Magikarp for Rayquaza and check for no form
            Assert.True(PBEBattle.SelectActionsIfValid(t0, new PBETurnAction(magikarp, rayquaza)));
            Assert.True(PBEBattle.SelectActionsIfValid(t1, new PBETurnAction(castformCherrim, PBEMove.Splash, PBETurnTarget.AllyCenter)));

            battle.RunTurn();

            Assert.True(battle.Weather == PBEWeather.HarshSunlight && castformCherrim.Form == 0);
            #endregion

            #region Swap Rayquaza for Magikarp and check for correct form
            Assert.True(PBEBattle.SelectActionsIfValid(t0, new PBETurnAction(rayquaza, magikarp)));
            Assert.True(PBEBattle.SelectActionsIfValid(t1, new PBETurnAction(castformCherrim, PBEMove.Splash, PBETurnTarget.AllyCenter)));

            battle.RunTurn();

            Assert.True(battle.Weather == PBEWeather.HarshSunlight && castformCherrim.Form == form);
            #endregion

            #region Cleanup
            battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler;
            #endregion
        }
예제 #10
0
 protected PBEDataProvider(PBELanguage language, PBERandom rand)
 {
     if (language >= PBELanguage.MAX)
     {
         throw new ArgumentOutOfRangeException(nameof(language));
     }
     GlobalLanguage = language;
     GlobalRandom   = rand;
     Instance       = this;
 }
예제 #11
0
        private int CalculateDamage(PBEBattlePokemon user, double a, double d, double basePower)
        {
            double damage;

            damage  = (2 * user.Level / 5) + 2;
            damage  = damage * a * basePower / d;
            damage /= 50;
            damage += 2;
            return((int)(damage * ((100d - PBERandom.RandomInt(0, 15)) / 100)));
        }
예제 #12
0
        public void Gem_Does_Not_Activate__Effectiveness()
        {
            #region Setup
            PBERandom.SetSeed(0);
            PBESettings settings = PBESettings.DefaultSettings;

            var p0 = new TestPokemonCollection(2);
            p0[0] = new TestPokemon(settings, PBESpecies.Excadrill, 0, 100, PBEMove.Earthquake)
            {
                Item = PBEItem.GroundGem
            };
            p0[1] = new TestPokemon(settings, PBESpecies.Starly, 0, 1, PBEMove.Splash);

            var p1 = new TestPokemonCollection(2);
            p1[0] = new TestPokemon(settings, PBESpecies.Rotom, 0, 1, PBEMove.Splash)
            {
                Ability = PBEAbility.Levitate
            };
            p1[1] = new TestPokemon(settings, PBESpecies.Shedinja, 0, 1, PBEMove.Splash)
            {
                Ability = PBEAbility.WonderGuard
            };

            var battle = new PBEBattle(PBEBattleFormat.Double, 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 excadrill = t0.Party[0];
            PBEBattlePokemon starly    = t0.Party[1];
            PBEBattlePokemon rotom     = t1.Party[0];
            PBEBattlePokemon shedinja  = t1.Party[1];
            #endregion

            #region Use and check
            Assert.True(PBEBattle.SelectActionsIfValid(t0,
                                                       new PBETurnAction(excadrill, PBEMove.Earthquake, PBETurnTarget.AllyRight | PBETurnTarget.FoeLeft | PBETurnTarget.FoeRight),
                                                       new PBETurnAction(starly, PBEMove.Splash, PBETurnTarget.AllyRight)));
            Assert.True(PBEBattle.SelectActionsIfValid(t1,
                                                       new PBETurnAction(rotom, PBEMove.Splash, PBETurnTarget.AllyLeft),
                                                       new PBETurnAction(shedinja, PBEMove.Splash, PBETurnTarget.AllyRight)));

            battle.RunTurn();

            Assert.True(battle.VerifyMoveResultHappened(excadrill, starly, PBEResult.Ineffective_Type) && starly.HPPercentage == 1 && // Doesn't affect Flying
                        battle.VerifyMoveResultHappened(excadrill, rotom, PBEResult.Ineffective_Ability) && rotom.HPPercentage == 1 && // Doesn't affect Levitate
                        battle.VerifyMoveResultHappened(excadrill, shedinja, PBEResult.Ineffective_Ability) && shedinja.HPPercentage == 1 && // Doesn't affect WonderGuard
                        excadrill.Item == PBEItem.GroundGem); // Gem not consumed
            #endregion

            #region Cleanup
            battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler;
            #endregion
        }
예제 #13
0
        public void Gem_Does_Not_Activate__Miss()
        {
            #region Setup
            PBERandom.SetSeed(1); // Seed ensures all miss
            PBESettings settings = PBESettings.DefaultSettings;

            var p0 = new TestPokemonCollection(2);
            p0[0] = new TestPokemon(settings, PBESpecies.Corsola, 0, 100, PBEMove.Earthquake)
            {
                Ability = PBEAbility.Hustle,
                Item    = PBEItem.GroundGem
            };
            p0[1] = new TestPokemon(settings, PBESpecies.Magikarp, 0, 1, PBEMove.Splash);

            var p1 = new TestPokemonCollection(2);
            p1[0] = new TestPokemon(settings, PBESpecies.Happiny, 0, 1, PBEMove.Splash);
            p1[1] = new TestPokemon(settings, PBESpecies.Qwilfish, 0, 1, PBEMove.Splash);

            var battle = new PBEBattle(PBEBattleFormat.Double, 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 corsola  = t0.Party[0];
            PBEBattlePokemon magikarp = t0.Party[1];
            PBEBattlePokemon happiny  = t1.Party[0];
            PBEBattlePokemon qwilfish = t1.Party[1];
            corsola.AccuracyChange = (sbyte)-settings.MaxStatChange;
            magikarp.EvasionChange = settings.MaxStatChange;
            happiny.EvasionChange  = settings.MaxStatChange;
            qwilfish.EvasionChange = settings.MaxStatChange;
            #endregion

            #region Use and check
            Assert.True(PBEBattle.SelectActionsIfValid(t0,
                                                       new PBETurnAction(corsola, PBEMove.Earthquake, PBETurnTarget.AllyRight | PBETurnTarget.FoeLeft | PBETurnTarget.FoeRight),
                                                       new PBETurnAction(magikarp, PBEMove.Splash, PBETurnTarget.AllyRight)));
            Assert.True(PBEBattle.SelectActionsIfValid(t1,
                                                       new PBETurnAction(happiny, PBEMove.Splash, PBETurnTarget.AllyLeft),
                                                       new PBETurnAction(qwilfish, PBEMove.Splash, PBETurnTarget.AllyRight)));

            battle.RunTurn();

            Assert.True(battle.VerifyMoveResultHappened(corsola, magikarp, PBEResult.Missed) && magikarp.HPPercentage == 1 && // Miss everyone
                        battle.VerifyMoveResultHappened(corsola, happiny, PBEResult.Missed) && happiny.HPPercentage == 1 &&
                        battle.VerifyMoveResultHappened(corsola, qwilfish, PBEResult.Missed) && qwilfish.HPPercentage == 1 &&
                        corsola.Item == PBEItem.GroundGem); // Gem not consumed
            #endregion

            #region Cleanup
            battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler;
            #endregion
        }
예제 #14
0
        [InlineData(PBESpecies.Gyarados, false)]                    // Flying dual-type-secondary
        public void Roost_Works(PBESpecies species, bool swapTypes) // Swap types around since there's no primary flying-type
        {
            #region Setup
            PBERandom.SetSeed(0);
            PBESettings settings = PBESettings.DefaultSettings;

            var p0 = new TestPokemonCollection(1);
            p0[0] = new TestPokemon(settings, PBESpecies.Lucario, 0, 50, PBEMove.Earthquake, PBEMove.VacuumWave);

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

            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 lucario = t0.Party[0];
            PBEBattlePokemon rooster = t1.Party[0];
            PBEType          type1   = rooster.Type1;
            PBEType          type2   = rooster.Type2;
            if (swapTypes)
            {
                rooster.Type1      = type2;
                rooster.Type2      = type1;
                rooster.KnownType1 = type2;
                rooster.KnownType2 = type1;
            }
            #endregion

            #region Use VacuumWave to lower HP
            Assert.True(PBEBattle.SelectActionsIfValid(t0, new PBETurnAction(lucario, PBEMove.VacuumWave, PBETurnTarget.FoeCenter)));
            Assert.True(PBEBattle.SelectActionsIfValid(t1, new PBETurnAction(rooster, PBEMove.Splash, PBETurnTarget.AllyCenter)));

            battle.RunTurn();
            #endregion

            #region Use Roost and check
            Assert.True(PBEBattle.SelectActionsIfValid(t0, new PBETurnAction(lucario, PBEMove.Earthquake, PBETurnTarget.FoeCenter)));
            Assert.True(PBEBattle.SelectActionsIfValid(t1, new PBETurnAction(rooster, PBEMove.Roost, PBETurnTarget.AllyCenter)));

            battle.RunTurn();

            Assert.True(!battle.VerifyMoveResultHappened(lucario, rooster, PBEResult.Ineffective_Type) && // Earthquake hit
                        !rooster.Status2.HasFlag(PBEStatus2.Roost) && // Roost ended properly
                        rooster.Type1 == type1 && rooster.Type2 == type2 && // Types restored properly
                        rooster.KnownType1 == type1 && rooster.KnownType2 == type2);
            #endregion

            #region Cleanup
            battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler;
            #endregion
        }
예제 #15
0
 public TestPokemon(PBESettings settings, PBESpecies species, PBEForm form, byte level, params PBEMove[] moves)
 {
     Species          = species;
     Form             = form;
     Level            = level;
     Nickname         = species.ToString();
     Gender           = PBERandom.RandomGender(PBEPokemonData.GetData(species, form).GenderRatio);
     EffortValues     = new PBEStatCollection(0, 0, 0, 0, 0, 0);
     IndividualValues = new PBEStatCollection(0, 0, 0, 0, 0, 0);
     Moveset          = new TestMoveset(settings, moves);
 }
예제 #16
0
 public static void InitEngine(string databasePath, CultureInfo cultureInfo, int?randomSeed = null, PBEDataProvider dataProvider = null)
 {
     if (cultureInfo is null)
     {
         throw new ArgumentNullException(nameof(cultureInfo));
     }
     InitDB(databasePath);
     cultureInfo  = CultureInfo.ReadOnly(cultureInfo);
     PBECulture   = PBELocalizedString.IsCultureValid(cultureInfo) ? cultureInfo : throw new ArgumentOutOfRangeException(nameof(cultureInfo));
     GlobalRandom = new PBERandom(randomSeed);
     Instance     = dataProvider ?? new PBEDataProvider();
 }
예제 #17
0
        public void Confusion_Heal__Bug(bool bugFix)
        {
            #region Setup
            PBERandom.SetSeed(40703); // Seed ensures Swagger does not miss and Deoxys hurts itself
            var settings = new PBESettings {
                BugFix = bugFix
            };
            settings.MakeReadOnly();

            var p0 = new TestPokemonCollection(1);
            p0[0] = new TestPokemon(settings, PBESpecies.Deoxys, PBEForm.Deoxys, 50, PBEMove.Splash)
            {
                Item = PBEItem.SitrusBerry
            };

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

            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 deoxys   = t0.Party[0];
            PBEBattlePokemon accelgor = t1.Party[0];
            #endregion

            #region Use and check
            Assert.True(PBEBattle.SelectActionsIfValid(t0, new PBETurnAction(deoxys, PBEMove.Splash, PBETurnTarget.AllyCenter)));
            Assert.True(PBEBattle.SelectActionsIfValid(t1, new PBETurnAction(accelgor, PBEMove.Swagger, PBETurnTarget.FoeCenter)));

            battle.RunTurn();

            Assert.True(battle.VerifyStatus2Happened(deoxys, accelgor, PBEStatus2.Confused, PBEStatusAction.Added) &&
                        battle.VerifyStatus2Happened(deoxys, deoxys, PBEStatus2.Confused, PBEStatusAction.Damage));
            if (settings.BugFix)
            {
                Assert.True(battle.VerifyItemHappened(deoxys, deoxys, PBEItem.SitrusBerry, PBEItemAction.Consumed) &&
                            deoxys.Item == PBEItem.None); // Healed
            }
            else
            {
                Assert.True(!battle.VerifyItemHappened(deoxys, deoxys, PBEItem.SitrusBerry, PBEItemAction.Consumed) &&
                            deoxys.Item == PBEItem.SitrusBerry); // Buggy
            }
            #endregion

            #region Cleanup
            battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler;
            #endregion
        }
예제 #18
0
        //[InlineData(PBEMove.SkyDrop, PBEStatus2.Airborne)]
        public void HelpingHand_HitsSemiInvulnerable(PBEMove move, PBEStatus2 status2)
        {
            #region Setup
            PBERandom.SetSeed(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 = new PBEBattle(PBEBattleFormat.Double, 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 minun    = t0.Party[0];
            PBEBattlePokemon giratina = t0.Party[1];
            PBEBattlePokemon magikarp = t1.Party[0];
            #endregion

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

            battle.RunTurn();

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

            #region Use Helping Hand and check
            Assert.True(PBEBattle.SelectActionsIfValid(t0,
                                                       new PBETurnAction(minun, PBEMove.HelpingHand, PBETurnTarget.AllyRight),
                                                       new PBETurnAction(giratina, move, PBETurnTarget.FoeLeft)));
            Assert.True(PBEBattle.SelectActionsIfValid(t1,
                                                       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
        }
예제 #19
0
        public void BellyDrum_Contrary__Bug(bool bugFix)
        {
            #region Setup
            PBERandom.SetSeed(0);
            var settings = new PBESettings {
                BugFix = bugFix
            };
            settings.MakeReadOnly();

            var p0 = new TestPokemonCollection(1);
            p0[0] = new TestPokemon(settings, PBESpecies.Hariyama, 0, 100, PBEMove.BellyDrum)
            {
                Ability = PBEAbility.Contrary
            };

            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"));
            battle.OnNewEvent += PBEBattle.ConsoleBattleEventHandler;
            battle.Begin();

            PBETrainer       t0       = battle.Trainers[0];
            PBETrainer       t1       = battle.Trainers[1];
            PBEBattlePokemon hariyama = t0.Party[0];
            PBEBattlePokemon magikarp = t1.Party[0];
            hariyama.AttackChange = settings.MaxStatChange;
            #endregion

            #region Use and check
            Assert.True(PBEBattle.SelectActionsIfValid(t0, new PBETurnAction(hariyama, PBEMove.BellyDrum, PBETurnTarget.AllyCenter)));
            Assert.True(PBEBattle.SelectActionsIfValid(t1, new PBETurnAction(magikarp, PBEMove.Splash, PBETurnTarget.AllyCenter)));

            battle.RunTurn();

            if (settings.BugFix)
            {
                Assert.True(!battle.VerifyMoveResultHappened(hariyama, hariyama, PBEResult.InvalidConditions) &&
                            hariyama.AttackChange == -settings.MaxStatChange); // Stat minimized because of Contrary
            }
            else
            {
                Assert.True(battle.VerifyMoveResultHappened(hariyama, hariyama, PBEResult.InvalidConditions) &&
                            hariyama.AttackChange == settings.MaxStatChange); // Buggy
            }
            #endregion

            #region Cleanup
            battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler;
            #endregion
        }
예제 #20
0
        public void Explosion_User_Loses_Multiple()
        {
            #region Setup
            PBERandom.SetSeed(0);
            PBESettings settings = PBESettings.DefaultSettings;

            var p0 = new TestPokemonCollection(3);
            p0[0] = new TestPokemon(settings, PBESpecies.Qwilfish, 0, 1, PBEMove.Splash);
            p0[1] = new TestPokemon(settings, PBESpecies.Golem, 0, 100, PBEMove.Explosion);
            p0[2] = new TestPokemon(settings, PBESpecies.Magikarp, 0, 1, PBEMove.Splash);

            var p1 = new TestPokemonCollection(3);
            p1[0] = new TestPokemon(settings, PBESpecies.Patrat, 0, 1, PBEMove.Splash);
            p1[1] = new TestPokemon(settings, PBESpecies.Lickilicky, 0, 1, PBEMove.Splash);
            p1[2] = new TestPokemon(settings, PBESpecies.Happiny, 0, 1, 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 qwilfish   = t0.Party[0];
            PBEBattlePokemon golem      = t0.Party[1];
            PBEBattlePokemon magikarp   = t0.Party[2];
            PBEBattlePokemon patrat     = t1.Party[0];
            PBEBattlePokemon lickilicky = t1.Party[1];
            PBEBattlePokemon happiny    = t1.Party[2];
            #endregion

            #region Use move and check
            Assert.True(PBEBattle.SelectActionsIfValid(t0,
                                                       new PBETurnAction(qwilfish, PBEMove.Splash, PBETurnTarget.AllyLeft),
                                                       new PBETurnAction(golem, PBEMove.Explosion, PBETurnTarget.AllyLeft | PBETurnTarget.AllyRight | PBETurnTarget.FoeLeft | PBETurnTarget.FoeCenter | PBETurnTarget.FoeRight),
                                                       new PBETurnAction(magikarp, PBEMove.Splash, PBETurnTarget.AllyRight)));
            Assert.True(PBEBattle.SelectActionsIfValid(t1,
                                                       new PBETurnAction(patrat, PBEMove.Splash, PBETurnTarget.AllyLeft),
                                                       new PBETurnAction(lickilicky, PBEMove.Splash, PBETurnTarget.AllyCenter),
                                                       new PBETurnAction(happiny, PBEMove.Splash, PBETurnTarget.AllyRight)));

            battle.RunTurn();

            Assert.True(qwilfish.HP == 0 && golem.HP == 0 && magikarp.HP == 0 && patrat.HP == 0 && lickilicky.HP == 0 && happiny.HP == 0 && // All faint
                        battle.Winner == battle.Teams[1]); // Golem's team loses
            #endregion

            #region Cleanup
            battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler;
            #endregion
        }
예제 #21
0
        public void Intimidate_Does_Not_Hit_Through_Substitute()
        {
            #region Setup
            PBERandom.SetSeed(0);
            PBESettings settings = PBESettings.DefaultSettings;

            var p0 = new TestPokemonCollection(1);
            p0[0] = new TestPokemon(settings, PBESpecies.Shuckle, 0, 100, PBEMove.Substitute, PBEMove.Splash);

            var p1 = new TestPokemonCollection(2);
            p1[0] = new TestPokemon(settings, PBESpecies.Skitty, 0, 100, PBEMove.Splash);
            p1[1] = new TestPokemon(settings, PBESpecies.Luxray, 0, 100, PBEMove.Splash)
            {
                Ability = PBEAbility.Intimidate
            };

            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 shuckle = t0.Party[0];
            PBEBattlePokemon skitty  = t1.Party[0];
            PBEBattlePokemon luxray  = t1.Party[1];
            #endregion

            #region Use Substitute
            Assert.True(PBEBattle.SelectActionsIfValid(t0, new PBETurnAction(shuckle, PBEMove.Substitute, PBETurnTarget.AllyCenter)));
            Assert.True(PBEBattle.SelectActionsIfValid(t1, new PBETurnAction(skitty, PBEMove.Splash, PBETurnTarget.AllyCenter)));

            battle.RunTurn();

            Assert.True(shuckle.Status2.HasFlag(PBEStatus2.Substitute));
            #endregion

            #region Switch in Luxray and check
            Assert.True(PBEBattle.SelectActionsIfValid(t0, new PBETurnAction(shuckle, PBEMove.Splash, PBETurnTarget.AllyCenter)));
            Assert.True(PBEBattle.SelectActionsIfValid(t1, new PBETurnAction(skitty, luxray)));

            battle.RunTurn();

            Assert.True(battle.VerifyAbilityHappened(luxray, luxray, PBEAbility.Intimidate, PBEAbilityAction.Stats) && // Activated
                        battle.VerifyMoveResultHappened(luxray, shuckle, PBEResult.Ineffective_Substitute) && shuckle.AttackChange == 0); // Did not affect
            #endregion

            #region Cleanup
            battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler;
            #endregion
        }
예제 #22
0
        public void Gem_Activates__FixedDamage__Bug(bool bugFix)
        {
            #region Setup
            PBERandom.SetSeed(0);
            var settings = new PBESettings {
                BugFix = bugFix
            };
            settings.MakeReadOnly();

            var p0 = new TestPokemonCollection(1);
            p0[0] = new TestPokemon(settings, PBESpecies.Swellow, 0, 1, PBEMove.Endeavor)
            {
                Item = PBEItem.NormalGem
            };

            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"));
            battle.OnNewEvent += PBEBattle.ConsoleBattleEventHandler;
            battle.Begin();

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

            #region Use and check
            Assert.True(PBEBattle.SelectActionsIfValid(t0, new PBETurnAction(swellow, PBEMove.Endeavor, PBETurnTarget.FoeCenter)));
            Assert.True(PBEBattle.SelectActionsIfValid(t1, new PBETurnAction(magikarp, PBEMove.Splash, PBETurnTarget.AllyCenter)));

            battle.RunTurn();

            if (settings.BugFix)
            {
                Assert.True(!battle.VerifyItemHappened(swellow, swellow, PBEItem.NormalGem, PBEItemAction.Consumed) &&
                            swellow.Item == PBEItem.NormalGem); // Not consumed
            }
            else
            {
                Assert.True(battle.VerifyItemHappened(swellow, swellow, PBEItem.NormalGem, PBEItemAction.Consumed) &&
                            swellow.Item == PBEItem.None); // Buggy
            }
            #endregion

            #region Cleanup
            battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler;
            #endregion
        }
예제 #23
0
        public void SecretPower_SereneGrace__Bug(bool bugFix)
        {
            #region Setup
            PBERandom.SetSeed(4); // Seed ensures SecretPower does not freeze without the bugfix
            var settings = new PBESettings {
                BugFix = bugFix
            };
            settings.MakeReadOnly();

            var p0 = new TestPokemonCollection(1);
            p0[0] = new TestPokemon(settings, PBESpecies.Makuhita, 0, 1, PBEMove.SecretPower)
            {
                Ability = PBEAbility.SereneGrace
            };

            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.Snow);
            battle.OnNewEvent += PBEBattle.ConsoleBattleEventHandler;
            battle.Begin();

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

            #region Use and check
            Assert.True(PBEBattle.SelectActionsIfValid(t0, new PBETurnAction(makuhita, PBEMove.SecretPower, PBETurnTarget.FoeCenter)));
            Assert.True(PBEBattle.SelectActionsIfValid(t1, new PBETurnAction(magikarp, PBEMove.Splash, PBETurnTarget.AllyCenter)));

            battle.RunTurn();

            if (settings.BugFix)
            {
                Assert.True(battle.VerifyStatus1Happened(magikarp, makuhita, PBEStatus1.Frozen, PBEStatusAction.Added) &&
                            magikarp.Status1 == PBEStatus1.Frozen); // Frozen because of Serene Grace
            }
            else
            {
                Assert.True(!battle.VerifyStatus1Happened(magikarp, makuhita, PBEStatus1.Frozen, PBEStatusAction.Added) &&
                            magikarp.Status1 == PBEStatus1.None); // Buggy
            }
            #endregion

            #region Cleanup
            battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler;
            #endregion
        }
        public SinglePlayerClient(PBEBattleFormat battleFormat, PBESettings settings, IReadOnlyList <PBETrainerInfo> ti0, IReadOnlyList <PBETrainerInfo> ti1, string name) : base(name)
        {
            var b = new PBEBattle(battleFormat, settings, ti0, ti1, battleTerrain: PBERandom.RandomBattleTerrain());

            Battle            = b;
            Trainer           = b.Trainers[0];
            BattleView        = new BattleView(this);
            b.OnNewEvent     += SinglePlayerBattle_OnNewEvent;
            b.OnStateChanged += SinglePlayerBattle_OnStateChanged;
            new Thread(b.Begin)
            {
                Name = "Battle Thread"
            }.Start();
        }
예제 #25
0
        public void AutoCenter_Works_MultiBattle(bool left)
        {
            #region Setup
            PBERandom.SetSeed(0);
            PBESettings settings = PBESettings.DefaultSettings;

            var pM = new TestPokemonCollection(1);
            pM[0] = new TestPokemon(settings, PBESpecies.Magikarp, 0, 1, PBEMove.Protect, PBEMove.Splash);
            var pG = new TestPokemonCollection(1);
            pG[0] = new TestPokemon(settings, PBESpecies.Golem, 0, 100, PBEMove.Explosion);
            var pH = new TestPokemonCollection(1);
            pH[0] = new TestPokemon(settings, PBESpecies.Happiny, 0, 1, PBEMove.Protect, PBEMove.Splash);

            var battle = new PBEBattle(PBEBattleFormat.Triple, settings,
                                       new[] { new PBETrainerInfo(pM, "Trainer 0"), new PBETrainerInfo(pG, "Trainer 1"), new PBETrainerInfo(pH, "Trainer 3") },
                                       new[] { new PBETrainerInfo(pM, "Trainer 3"), new PBETrainerInfo(pG, "Trainer 4"), new PBETrainerInfo(pH, "Trainer 5") });
            battle.OnNewEvent += PBEBattle.ConsoleBattleEventHandler;
            battle.Begin();

            PBETrainer       t0M       = battle.Trainers[0];
            PBETrainer       t0G       = battle.Trainers[1];
            PBETrainer       t0H       = battle.Trainers[2];
            PBETrainer       t1M       = battle.Trainers[3];
            PBETrainer       t1G       = battle.Trainers[4];
            PBETrainer       t1H       = battle.Trainers[5];
            PBEBattlePokemon magikarp0 = t0M.Party[0];
            PBEBattlePokemon golem0    = t0G.Party[0];
            PBEBattlePokemon happiny0  = t0H.Party[0];
            PBEBattlePokemon magikarp1 = t1M.Party[0];
            PBEBattlePokemon golem1    = t1G.Party[0];
            PBEBattlePokemon happiny1  = t1H.Party[0];
            #endregion

            #region Force auto-center and check
            Assert.True(PBEBattle.SelectActionsIfValid(t0M, new PBETurnAction(magikarp0, left ? PBEMove.Splash : PBEMove.Protect, PBETurnTarget.AllyLeft)));
            Assert.True(PBEBattle.SelectActionsIfValid(t0G, new PBETurnAction(golem0, PBEMove.Explosion, PBETurnTarget.AllyLeft | PBETurnTarget.AllyRight | PBETurnTarget.FoeLeft | PBETurnTarget.FoeCenter | PBETurnTarget.FoeRight)));
            Assert.True(PBEBattle.SelectActionsIfValid(t0H, new PBETurnAction(happiny0, left ? PBEMove.Protect : PBEMove.Splash, PBETurnTarget.AllyRight)));
            Assert.True(PBEBattle.SelectActionsIfValid(t1M, new PBETurnAction(magikarp1, left ? PBEMove.Splash : PBEMove.Protect, PBETurnTarget.AllyLeft)));
            Assert.True(PBEBattle.SelectActionsIfValid(t1G, new PBETurnAction(golem1, PBEMove.Explosion, PBETurnTarget.AllyLeft | PBETurnTarget.AllyRight | PBETurnTarget.FoeLeft | PBETurnTarget.FoeCenter | PBETurnTarget.FoeRight)));
            Assert.True(PBEBattle.SelectActionsIfValid(t1H, new PBETurnAction(happiny1, left ? PBEMove.Protect : PBEMove.Splash, PBETurnTarget.AllyRight)));

            battle.RunTurn();

            Assert.True((left ? happiny0 : magikarp0).FieldPosition == PBEFieldPosition.Center && (left ? happiny1 : magikarp1).FieldPosition == PBEFieldPosition.Center);
            #endregion

            #region Cleanup
            battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler;
            #endregion
        }
예제 #26
0
        public void Shaymin_Reverts_To_Normal_Form_Forever()
        {
            #region Setup
            PBERandom.SetSeed(1); // Seed ensures SecretPower freezes
            PBESettings settings = PBESettings.DefaultSettings;

            var p0 = new TestPokemonCollection(1);
            p0[0] = new TestPokemon(settings, PBESpecies.Happiny, 0, 100, PBEMove.SecretPower, PBEMove.Splash)
            {
                Ability = PBEAbility.SereneGrace
            };

            var p1 = new TestPokemonCollection(2);
            p1[0] = new TestPokemon(settings, PBESpecies.Shaymin, PBEForm.Shaymin_Sky, 100, PBEMove.Splash);
            p1[1] = 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.Snow);
            battle.OnNewEvent += PBEBattle.ConsoleBattleEventHandler;
            battle.Begin();

            PBETrainer       t0       = battle.Trainers[0];
            PBETrainer       t1       = battle.Trainers[1];
            PBEBattlePokemon happiny  = t0.Party[0];
            PBEBattlePokemon shaymin  = t1.Party[0];
            PBEBattlePokemon magikarp = t1.Party[1];
            #endregion

            #region Freeze Shaymin
            Assert.True(PBEBattle.SelectActionsIfValid(t0, new PBETurnAction(happiny, PBEMove.SecretPower, PBETurnTarget.FoeCenter)));
            Assert.True(PBEBattle.SelectActionsIfValid(t1, new PBETurnAction(shaymin, PBEMove.Splash, PBETurnTarget.AllyCenter)));

            battle.RunTurn();

            Assert.True(shaymin.Status1 == PBEStatus1.Frozen && shaymin.Form == PBEForm.Shaymin);
            #endregion

            #region Swap Shaymin for Magikarp and check
            Assert.True(PBEBattle.SelectActionsIfValid(t0, new PBETurnAction(happiny, PBEMove.Splash, PBETurnTarget.AllyCenter)));
            Assert.True(PBEBattle.SelectActionsIfValid(t1, new PBETurnAction(shaymin, magikarp)));

            battle.RunTurn();

            Assert.True(shaymin.Form == PBEForm.Shaymin);
            #endregion

            #region Cleanup
            battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler;
            #endregion
        }
        public void CastformCherrim_Loses_Form(PBESpecies species, PBEAbility ability, PBEForm form)
        {
            #region Setup
            PBERandom.SetSeed(0);
            PBESettings settings = PBESettings.DefaultSettings;

            var p0 = new TestPokemonCollection(1);
            p0[0] = new TestPokemon(settings, PBESpecies.Shuckle, 0, 100, PBEMove.GastroAcid, PBEMove.Splash);

            var p1 = new TestPokemonCollection(1);
            p1[0] = new TestPokemon(settings, species, 0, 100, PBEMove.Splash, PBEMove.SunnyDay)
            {
                Ability = ability
            };

            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 shuckle         = t0.Party[0];
            PBEBattlePokemon castformCherrim = t1.Party[0];
            #endregion

            #region Use Sunny Day and check for correct form
            Assert.True(PBEBattle.SelectActionsIfValid(t0, new[] { new PBETurnAction(shuckle, PBEMove.Splash, PBETurnTarget.AllyCenter) }));
            Assert.True(PBEBattle.SelectActionsIfValid(t1, new[] { new PBETurnAction(castformCherrim, PBEMove.SunnyDay, PBETurnTarget.AllyCenter | PBETurnTarget.FoeCenter) }));

            battle.RunTurn();

            Assert.True(battle.Weather == PBEWeather.HarshSunlight && castformCherrim.Form == form);
            #endregion

            #region Use Gastro Acid and check for no form
            Assert.True(PBEBattle.SelectActionsIfValid(t0, new[] { new PBETurnAction(shuckle, PBEMove.GastroAcid, PBETurnTarget.FoeCenter) }));
            Assert.True(PBEBattle.SelectActionsIfValid(t1, new[] { new PBETurnAction(castformCherrim, PBEMove.Splash, PBETurnTarget.AllyCenter) }));

            battle.RunTurn();

            Assert.True(battle.Weather == PBEWeather.HarshSunlight && castformCherrim.Form == 0);
            #endregion

            #region Cleanup
            battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler;
            #endregion
        }
예제 #28
0
        public void Gem_Does_Not_Activate__Protection()
        {
            #region Setup
            PBERandom.SetSeed(0);
            PBESettings settings = PBESettings.DefaultSettings;

            var p0 = new TestPokemonCollection(1);
            p0[0] = new TestPokemon(settings, PBESpecies.Excadrill, 0, 100, PBEMove.Earthquake)
            {
                Item = PBEItem.GroundGem
            };

            var p1 = new TestPokemonCollection(2);
            p1[0] = new TestPokemon(settings, PBESpecies.Happiny, 0, 1, PBEMove.WideGuard);
            p1[1] = new TestPokemon(settings, PBESpecies.Qwilfish, 0, 1, PBEMove.Splash);

            var battle = new PBEBattle(PBEBattleFormat.Double, 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 excadrill = t0.Party[0];
            PBEBattlePokemon happiny   = t1.Party[0];
            PBEBattlePokemon qwilfish  = t1.Party[1];
            #endregion

            #region Use and check
            Assert.True(PBEBattle.SelectActionsIfValid(t0,
                                                       new PBETurnAction(excadrill, PBEMove.Earthquake, PBETurnTarget.AllyRight | PBETurnTarget.FoeLeft | PBETurnTarget.FoeRight)));
            Assert.True(PBEBattle.SelectActionsIfValid(t1,
                                                       new PBETurnAction(happiny, PBEMove.WideGuard, PBETurnTarget.AllyLeft | PBETurnTarget.AllyRight),
                                                       new PBETurnAction(qwilfish, PBEMove.Splash, PBETurnTarget.AllyRight)));

            battle.RunTurn();

            Assert.True(battle.VerifyTeamStatusHappened(t1.Team, PBETeamStatus.WideGuard, PBETeamStatusAction.Damage, damageVictim: happiny) && happiny.HPPercentage == 1 &&
                        battle.VerifyTeamStatusHappened(t1.Team, PBETeamStatus.WideGuard, PBETeamStatusAction.Damage, damageVictim: qwilfish) && qwilfish.HPPercentage == 1 &&
                        excadrill.Item == PBEItem.GroundGem); // Gem not consumed
            #endregion

            #region Cleanup
            battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler;
            #endregion
        }
        public void Protection_Counter_Resets(PBEMove move)
        {
            #region Setup
            PBERandom.SetSeed(0);
            PBESettings settings = PBESettings.DefaultSettings;

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

            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"));
            battle.OnNewEvent += PBEBattle.ConsoleBattleEventHandler;
            battle.Begin();

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

            #region Use move
            Assert.True(PBEBattle.SelectActionsIfValid(t0, new PBETurnAction(mienshao, move, PBETurnTarget.AllyCenter)));
            Assert.True(PBEBattle.SelectActionsIfValid(t1, new PBETurnAction(magikarp, PBEMove.Splash, PBETurnTarget.AllyCenter)));

            battle.RunTurn();

            Assert.True(mienshao.Protection_Counter == 1);
            #endregion

            #region Use Calm Mind and check
            Assert.True(PBEBattle.SelectActionsIfValid(t0, new PBETurnAction(mienshao, PBEMove.CalmMind, PBETurnTarget.AllyCenter)));
            Assert.True(PBEBattle.SelectActionsIfValid(t1, new PBETurnAction(magikarp, PBEMove.Splash, PBETurnTarget.AllyCenter)));

            battle.RunTurn();

            Assert.True(mienshao.Protection_Counter == 0);
            #endregion

            #region Cleanup
            battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler;
            #endregion
        }
예제 #30
0
        public void AutoCenter_Works(bool left)
        {
            #region Setup
            PBERandom.SetSeed(0);
            PBESettings settings = PBESettings.DefaultSettings;

            var p = new TestPokemonCollection(3);
            p[0] = new TestPokemon(settings, PBESpecies.Magikarp, 0, 1, PBEMove.Protect, PBEMove.Splash);
            p[1] = new TestPokemon(settings, PBESpecies.Golem, 0, 100, PBEMove.Explosion);
            p[2] = new TestPokemon(settings, PBESpecies.Happiny, 0, 1, PBEMove.Protect, PBEMove.Splash);

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

            PBETrainer       t0        = battle.Trainers[0];
            PBETrainer       t1        = battle.Trainers[1];
            PBEBattlePokemon magikarp0 = t0.Party[0];
            PBEBattlePokemon golem0    = t0.Party[1];
            PBEBattlePokemon happiny0  = t0.Party[2];
            PBEBattlePokemon magikarp1 = t1.Party[0];
            PBEBattlePokemon golem1    = t1.Party[1];
            PBEBattlePokemon happiny1  = t1.Party[2];
            #endregion

            #region Force auto-center and check
            Assert.True(PBEBattle.SelectActionsIfValid(t0,
                                                       new PBETurnAction(magikarp0, left ? PBEMove.Splash : PBEMove.Protect, PBETurnTarget.AllyLeft),
                                                       new PBETurnAction(golem0, PBEMove.Explosion, PBETurnTarget.AllyLeft | PBETurnTarget.AllyRight | PBETurnTarget.FoeLeft | PBETurnTarget.FoeCenter | PBETurnTarget.FoeRight),
                                                       new PBETurnAction(happiny0, left ? PBEMove.Protect : PBEMove.Splash, PBETurnTarget.AllyRight)));
            Assert.True(PBEBattle.SelectActionsIfValid(t1,
                                                       new PBETurnAction(magikarp1, left ? PBEMove.Splash : PBEMove.Protect, PBETurnTarget.AllyLeft),
                                                       new PBETurnAction(golem1, PBEMove.Explosion, PBETurnTarget.AllyLeft | PBETurnTarget.AllyRight | PBETurnTarget.FoeLeft | PBETurnTarget.FoeCenter | PBETurnTarget.FoeRight),
                                                       new PBETurnAction(happiny1, left ? PBEMove.Protect : PBEMove.Splash, PBETurnTarget.AllyRight)));

            battle.RunTurn();

            Assert.True((left ? happiny0 : magikarp0).FieldPosition == PBEFieldPosition.Center && (left ? happiny1 : magikarp1).FieldPosition == PBEFieldPosition.Center);
            #endregion

            #region Cleanup
            battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler;
            #endregion
        }