Exemple #1
0
 public static void ValidateAbility(PBEAlphabeticalList <PBEAbility> valid, PBEAbility value)
 {
     if (!valid.Contains(value))
     {
         throw new ArgumentOutOfRangeException(nameof(value));
     }
 }
 public static bool HasAbility(this IPBEPokemonData pData, PBEAbility ability)
 {
     if (ability == PBEAbility.None || ability >= PBEAbility.MAX)
     {
         throw new ArgumentOutOfRangeException(nameof(ability));
     }
     return(pData.Abilities.Contains(ability));
 }
 public static PBELocalizedString GetAbilityName(PBEAbility ability)
 {
     if (ability >= PBEAbility.MAX)
     {
         throw new ArgumentOutOfRangeException(nameof(ability));
     }
     return(new PBELocalizedString(PBEUtils.QueryDatabase <SearchResult>(string.Format(QueryId, "AbilityNames", (byte)ability))[0]));
 }
Exemple #4
0
        public void CastformCherrim_Interacts_With_AirLock(PBESpecies species, PBEAbility ability, PBEForm form)
        {
            #region Setup
            PBEDataProvider.GlobalRandom.Seed = 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;

            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];

            battle.Begin();
            #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.Null(t0.SelectActionsIfValid(new PBETurnAction(magikarp, rayquaza)));
            Assert.Null(t1.SelectActionsIfValid(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.Null(t0.SelectActionsIfValid(new PBETurnAction(rayquaza, magikarp)));
            Assert.Null(t1.SelectActionsIfValid(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
        }
Exemple #5
0
        public static PBEResult IsAffectedByAttack(PBEBattlePokemon user, PBEBattlePokemon target, PBEType moveType, out double damageMultiplier, bool useKnownInfo = false)
        {
            if (user == null)
            {
                throw new ArgumentNullException(nameof(user));
            }
            if (target == null)
            {
                throw new ArgumentNullException(nameof(target));
            }
            if (moveType >= PBEType.MAX)
            {
                throw new ArgumentOutOfRangeException(nameof(moveType));
            }

            PBEResult result;

            if (moveType == PBEType.Ground)
            {
                result = target.IsGrounded(user, useKnownInfo: useKnownInfo);
                if (result != PBEResult.Success)
                {
                    damageMultiplier = 0;
                    return(result);
                }
            }
            bool ignoreGhost = user.Ability == PBEAbility.Scrappy || target.Status2.HasFlag(PBEStatus2.Identified),
                 ignoreDark  = target.Status2.HasFlag(PBEStatus2.MiracleEye);

            damageMultiplier = GetEffectiveness(moveType, target, useKnownInfo, ignoreGhost: ignoreGhost, ignoreDark: ignoreDark);
            if (damageMultiplier <= 0) // (-infinity, 0]
            {
                damageMultiplier = 0;
                return(PBEResult.Ineffective_Type);
            }
            else if (damageMultiplier < 1) // (0, 1)
            {
                result = PBEResult.NotVeryEffective_Type;
            }
            else if (damageMultiplier == 1) // [1, 1]
            {
                result = PBEResult.Success;
            }
            else // (1, infinity)
            {
                return(PBEResult.SuperEffective_Type);
            }
            PBEAbility kAbility = useKnownInfo ? target.KnownAbility : target.Ability;

            if (kAbility == PBEAbility.WonderGuard && !user.HasCancellingAbility())
            {
                damageMultiplier = 0;
                result           = PBEResult.Ineffective_Ability;
            }
            return(result);
        }
Exemple #6
0
 internal PBEAbilityReplacedPacket(byte[] data, EndianBinaryReader r, PBEBattle battle)
 {
     Data = new ReadOnlyCollection <byte>(data);
     AbilityOwnerTrainer = battle.Trainers[r.ReadByte()];
     AbilityOwner        = r.ReadEnum <PBEFieldPosition>();
     if (r.ReadBoolean())
     {
         OldAbility = r.ReadEnum <PBEAbility>();
     }
     NewAbility = r.ReadEnum <PBEAbility>();
 }
Exemple #7
0
        public PBEAbilityPacket(PBEPokemon abilityOwner, PBEPokemon pokemon2, PBEAbility ability, PBEAbilityAction abilityAction)
        {
            var bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(Code));
            bytes.Add((byte)(AbilityOwner = abilityOwner.FieldPosition));
            bytes.Add((AbilityOwnerTeam = abilityOwner.Team).Id);
            bytes.Add((byte)(Pokemon2 = pokemon2.FieldPosition));
            bytes.Add((Pokemon2Team = pokemon2.Team).Id);
            bytes.Add((byte)(Ability = ability));
            bytes.Add((byte)(AbilityAction = abilityAction));
            Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes);
        }
        public static PBEReadOnlyLocalizedString GetAbilityName(PBEAbility ability)
        {
            if (ability >= PBEAbility.MAX)
            {
                throw new ArgumentOutOfRangeException(nameof(ability));
            }
            List <SearchResult> results = PBEDefaultDataProvider.Instance.QueryDatabase <SearchResult>(string.Format(QueryId, "AbilityNames", ability));

            if (results.Count == 1)
            {
                return(new PBEReadOnlyLocalizedString(results[0]));
            }
            throw new InvalidDataException();
        }
Exemple #9
0
        internal PBEAbilityPacket(PBEPokemon abilityOwner, PBEPokemon pokemon2, PBEAbility ability, PBEAbilityAction abilityAction)
        {
            var bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(Code));
            bytes.Add((byte)(AbilityOwner = abilityOwner.FieldPosition));
            bytes.Add((AbilityOwnerTeam = abilityOwner.Team).Id);
            bytes.Add((byte)(Pokemon2 = pokemon2.FieldPosition));
            bytes.Add((Pokemon2Team = pokemon2.Team).Id);
            bytes.Add((byte)(Ability = ability));
            bytes.Add((byte)(AbilityAction = abilityAction));
            bytes.InsertRange(0, BitConverter.GetBytes((short)bytes.Count));
            Buffer = new ReadOnlyCollection <byte>(bytes);
        }
Exemple #10
0
 internal PBEAbilityPacket(PBEPokemon abilityOwner, PBEPokemon pokemon2, PBEAbility ability, PBEAbilityAction abilityAction)
 {
     using (var ms = new MemoryStream())
         using (var w = new EndianBinaryWriter(ms, encoding: EncodingType.UTF16))
         {
             w.Write(Code);
             w.Write(AbilityOwner = abilityOwner.FieldPosition);
             w.Write((AbilityOwnerTeam = abilityOwner.Team).Id);
             w.Write(Pokemon2 = pokemon2.FieldPosition);
             w.Write((Pokemon2Team = pokemon2.Team).Id);
             w.Write(Ability       = ability);
             w.Write(AbilityAction = abilityAction);
             Data = new ReadOnlyCollection <byte>(ms.ToArray());
         }
 }
Exemple #11
0
        public void CastformCherrim_Loses_Form(PBESpecies species, PBEAbility ability, PBEForm form)
        {
            #region Setup
            PBEDataProvider.GlobalRandom.Seed = 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;

            PBETrainer       t0              = battle.Trainers[0];
            PBETrainer       t1              = battle.Trainers[1];
            PBEBattlePokemon shuckle         = t0.Party[0];
            PBEBattlePokemon castformCherrim = t1.Party[0];

            battle.Begin();
            #endregion

            #region Use Sunny Day and check for correct form
            Assert.Null(t0.SelectActionsIfValid(new[] { new PBETurnAction(shuckle, PBEMove.Splash, PBETurnTarget.AllyCenter) }));
            Assert.Null(t1.SelectActionsIfValid(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.Null(t0.SelectActionsIfValid(new[] { new PBETurnAction(shuckle, PBEMove.GastroAcid, PBETurnTarget.FoeCenter) }));
            Assert.Null(t1.SelectActionsIfValid(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
        }
Exemple #12
0
 internal PBEAbilityReplacedPacket(PBEBattlePokemon abilityOwner, PBEAbility?oldAbility, PBEAbility newAbility)
 {
     using (var ms = new MemoryStream())
         using (var w = new EndianBinaryWriter(ms, encoding: EncodingType.UTF16))
         {
             w.Write(Code);
             w.Write((AbilityOwnerTrainer = abilityOwner.Trainer).Id);
             w.Write(AbilityOwner = abilityOwner.FieldPosition);
             w.Write(oldAbility is not null);
             if (oldAbility is not null)
             {
                 w.Write((OldAbility = oldAbility).Value);
             }
             w.Write(NewAbility = newAbility);
             Data = new ReadOnlyCollection <byte>(ms.ToArray());
         }
 }
Exemple #13
0
 public async Task Info([Remainder] string abilityName)
 {
     if (!PBEDataProvider.Instance.GetAbilityByName(abilityName, out PBEAbility? nAbility) || nAbility.Value == PBEAbility.None)
     {
         await Context.Channel.SendMessageAsync($"{Context.User.Mention} ― Invalid ability!");
     }
     else
     {
         PBEAbility   ability = nAbility.Value;
         EmbedBuilder embed   = new EmbedBuilder()
                                .WithAuthor(Context.User)
                                .WithColor(Utils.RandomColor())
                                .WithTitle(PBEDataProvider.Instance.GetAbilityName(ability).English)
                                .WithUrl(Utils.URL)
                                .WithDescription(PBEDefaultDataProvider.Instance.GetAbilityDescription(ability).English.Replace('\n', ' '));
         await Context.Channel.SendMessageAsync(string.Empty, embed: embed.Build());
     }
 }
        public PBEPkmnFormChangedPacket(PBEFieldPosition pokemonPosition, PBETeam pokemonTeam, ushort newAttack, ushort newDefense, ushort newSpAttack, ushort newSpDefense, ushort newSpeed, PBEAbility newAbility, PBEAbility newKnownAbility, PBESpecies newSpecies, PBEType newType1, PBEType newType2, double newWeight)
        {
            var bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(Code));
            bytes.Add((byte)(Pokemon = pokemonPosition));
            bytes.Add((PokemonTeam = pokemonTeam).Id);
            bytes.AddRange(BitConverter.GetBytes(NewAttack    = newAttack));
            bytes.AddRange(BitConverter.GetBytes(NewDefense   = newDefense));
            bytes.AddRange(BitConverter.GetBytes(NewSpAttack  = newSpAttack));
            bytes.AddRange(BitConverter.GetBytes(NewSpDefense = newSpDefense));
            bytes.AddRange(BitConverter.GetBytes(NewSpeed     = newSpeed));
            bytes.Add((byte)(NewAbility = newAbility));
            bytes.Add((byte)(NewKnownAbility = newKnownAbility));
            bytes.AddRange(BitConverter.GetBytes((uint)(NewSpecies = newSpecies)));
            bytes.Add((byte)(NewType1 = newType1));
            bytes.Add((byte)(NewType2 = newType2));
            bytes.AddRange(BitConverter.GetBytes(NewWeight = newWeight));
            Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes);
        }
        public void SkillLink_Works__2To5(PBEAbility ability, byte numHits)
        {
            #region Setup
            PBEDataProvider.GlobalRandom.Seed = 1230; // Seed ensures hits would normally not be 5
            PBESettings settings = PBESettings.DefaultSettings;

            var p0 = new TestPokemonCollection(1);
            p0[0] = new TestPokemon(settings, PBESpecies.Cinccino, 0, 1, PBEMove.TailSlap)
            {
                Ability = ability
            };

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

            var battle = PBEBattle.CreateTrainerBattle(PBEBattleFormat.Single, settings, new PBETrainerInfo(p0, "Trainer 0", false), new PBETrainerInfo(p1, "Trainer 1", false));
            battle.OnNewEvent += PBEBattle.ConsoleBattleEventHandler;

            PBETrainer       t0       = battle.Trainers[0];
            PBETrainer       t1       = battle.Trainers[1];
            PBEBattlePokemon cinccino = t0.Party[0];
            PBEBattlePokemon magikarp = t1.Party[0];

            battle.Begin();
            #endregion

            #region Use and check
            Assert.True(t0.SelectActionsIfValid(out _, new PBETurnAction(cinccino, PBEMove.TailSlap, PBETurnTarget.FoeCenter)));
            Assert.True(t1.SelectActionsIfValid(out _, new PBETurnAction(magikarp, PBEMove.Splash, PBETurnTarget.AllyCenter)));

            battle.RunTurn();

            Assert.True(battle.VerifySpecialMessageHappened(PBESpecialMessage.MultiHit, numHits)); // Correct number of hits
            #endregion

            #region Cleanup
            battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler;
            #endregion
        }
 private PBEPkmnFormChangedPacket(PBEFieldPosition pokemonPosition, PBETeam pokemonTeam, ushort newAttack, ushort newDefense, ushort newSpAttack, ushort newSpDefense, ushort newSpeed,
                                  PBEAbility newAbility, PBEAbility newKnownAbility, PBESpecies newSpecies, PBEType newType1, PBEType newType2, double newWeight)
 {
     using (var ms = new MemoryStream())
         using (var w = new EndianBinaryWriter(ms, encoding: EncodingType.UTF16))
         {
             w.Write(Code);
             w.Write(Pokemon = pokemonPosition);
             w.Write((PokemonTeam = pokemonTeam).Id);
             w.Write(NewAttack       = newAttack);
             w.Write(NewDefense      = newDefense);
             w.Write(NewSpAttack     = newSpAttack);
             w.Write(NewSpDefense    = newSpDefense);
             w.Write(NewSpeed        = newSpeed);
             w.Write(NewAbility      = newAbility);
             w.Write(NewKnownAbility = newKnownAbility);
             w.Write(NewSpecies      = newSpecies);
             w.Write(NewType1        = newType1);
             w.Write(NewType2        = newType2);
             w.Write(NewWeight       = newWeight);
             Data = new ReadOnlyCollection <byte>(ms.ToArray());
         }
 }
Exemple #17
0
 public BaseStats(JToken j)
 {
     HP             = j[nameof(HP)].Value <byte>();
     Attack         = j[nameof(Attack)].Value <byte>();
     Defense        = j[nameof(Defense)].Value <byte>();
     SpAttack       = j[nameof(SpAttack)].Value <byte>();
     SpDefense      = j[nameof(SpDefense)].Value <byte>();
     Speed          = j[nameof(Speed)].Value <byte>();
     Type1          = j[nameof(Type1)].ReadEnumValue <PBEType>();
     Type2          = j[nameof(Type2)].ReadEnumValue <PBEType>();
     CatchRate      = j[nameof(CatchRate)].Value <byte>();
     BaseFriendship = j[nameof(BaseFriendship)].Value <byte>();
     EggCycles      = j[nameof(EggCycles)].Value <byte>();
     GenderRatio    = j[nameof(GenderRatio)].ReadEnumValue <PBEGenderRatio>();
     GrowthRate     = j[nameof(GrowthRate)].ReadEnumValue <PBEGrowthRate>();
     BaseEXPYield   = j[nameof(BaseEXPYield)].Value <ushort>();
     EggGroup1      = j[nameof(EggGroup1)].ReadEnumValue <EggGroup>();
     EggGroup2      = j[nameof(EggGroup2)].ReadEnumValue <EggGroup>();
     Ability1       = j[nameof(Ability1)].ReadEnumValue <PBEAbility>();
     Ability2       = j[nameof(Ability2)].ReadEnumValue <PBEAbility>();
     AbilityH       = j[nameof(AbilityH)].ReadEnumValue <PBEAbility>();
     FleeRate       = j[nameof(FleeRate)].Value <byte>();
     Weight         = j[nameof(Weight)].Value <double>();
 }
 public abstract IPBEReadOnlyLocalizedString GetAbilityName(PBEAbility ability);
Exemple #19
0
        // You must dump the NARC files yourself (/a/0/0/2 in each language)
        public static void Run(SqliteConnection con)
        {
            var english  = new NARC(@"../../../\DumpedData\W2EnglishTexts.narc");
            var french   = new NARC(@"../../../\DumpedData\W2FrenchTexts.narc");
            var german   = new NARC(@"../../../\DumpedData\W2GermanTexts.narc");
            var italian  = new NARC(@"../../../\DumpedData\W2ItalianTexts.narc");
            var japanese = new NARC(@"../../../\DumpedData\W2JapaneseTexts.narc");
            var korean   = new NARC(@"../../../\DumpedData\W2KoreanTexts.narc");
            var spanish  = new NARC(@"../../../\DumpedData\W2SpanishTexts.narc");

            using (SqliteTransaction transaction = con.BeginTransaction())
                using (SqliteCommand cmd = con.CreateCommand())
                {
                    cmd.Transaction = transaction;

                    void CreateTable(string tableName)
                    {
                        cmd.CommandText = $"DROP TABLE IF EXISTS {tableName}";
                        cmd.ExecuteNonQuery();
                        cmd.CommandText = $"CREATE TABLE {tableName}(Id TEXT PRIMARY KEY, English TEXT, French TEXT, German TEXT, Italian TEXT, Japanese_Kana TEXT, Japanese_Kanji TEXT, Korean TEXT, Spanish TEXT)";
                        cmd.ExecuteNonQuery();
                    }

                    void Insert(string tableName, string id, string e, string f, string g, string i, string jkana, string jkanji, string k, string s)
                    {
                        cmd.CommandText = $"INSERT INTO {tableName} VALUES(@0, @1, @2, @3, @4, @5, @6, @7, @8)";
                        cmd.Parameters.AddWithValue("@0", id);
                        cmd.Parameters.AddWithValue("@1", e);
                        cmd.Parameters.AddWithValue("@2", f);
                        cmd.Parameters.AddWithValue("@3", g);
                        cmd.Parameters.AddWithValue("@4", i);
                        cmd.Parameters.AddWithValue("@5", jkana);
                        cmd.Parameters.AddWithValue("@6", jkanji);
                        cmd.Parameters.AddWithValue("@7", k);
                        cmd.Parameters.AddWithValue("@8", s);
                        cmd.ExecuteNonQuery();
                        cmd.Parameters.Clear();
                    }

                    string[][] eng, fre, ger, ita, jap, kor, spa;
                    void LoadTexts(int fileNum)
                    {
                        eng = Utils.ReadTextFile(english, fileNum);
                        fre = Utils.ReadTextFile(french, fileNum);
                        ger = Utils.ReadTextFile(german, fileNum);
                        ita = Utils.ReadTextFile(italian, fileNum);
                        jap = Utils.ReadTextFile(japanese, fileNum);
                        kor = Utils.ReadTextFile(korean, fileNum);
                        spa = Utils.ReadTextFile(spanish, fileNum);
                    }

                    void WriteTexts(string tableName, string id, int text)
                    {
                        Insert(tableName, id, eng[0][text], fre[0][text], ger[0][text], ita[0][text], jap[0][text], jap[1][text], kor[0][text], spa[0][text]);
                    }

                    // Abilities
                    {
                        void WriteAll(string tableName)
                        {
                            CreateTable(tableName);
                            for (PBEAbility i = 0; i < PBEAbility.MAX; i++)
                            {
                                WriteTexts(tableName, i.ToString(), (int)i);
                            }
                        }

                        LoadTexts(374);
                        WriteAll("AbilityNames");
                        LoadTexts(375);
                        WriteAll("AbilityDescriptions");
                    }
                    // Forms
                    {
                        void InsertForm(string tableName, PBESpecies species, PBEForm form, string e, string f, string g, string i, string jkana, string jkanji, string k, string s)
                        {
                            cmd.CommandText = $"INSERT INTO {tableName} VALUES(@0, @1, @2, @3, @4, @5, @6, @7, @8, @9)";
                            cmd.Parameters.AddWithValue("@0", species.ToString());
                            cmd.Parameters.AddWithValue("@1", PBEDataUtils.GetNameOfForm(species, form) ?? "0");
                            cmd.Parameters.AddWithValue("@2", e);
                            cmd.Parameters.AddWithValue("@3", f);
                            cmd.Parameters.AddWithValue("@4", g);
                            cmd.Parameters.AddWithValue("@5", i);
                            cmd.Parameters.AddWithValue("@6", jkana);
                            cmd.Parameters.AddWithValue("@7", jkanji);
                            cmd.Parameters.AddWithValue("@8", k);
                            cmd.Parameters.AddWithValue("@9", s);
                            cmd.ExecuteNonQuery();
                            cmd.Parameters.Clear();
                        }

                        void WriteFormTexts(string tableName, PBESpecies species, PBEForm form, int text)
                        {
                            InsertForm(tableName, species, form, eng[0][text], fre[0][text], ger[0][text], ita[0][text], jap[0][text], jap[1][text], kor[0][text], spa[0][text]);
                        }

                        void WriteUnown(string tableName, PBEForm form, string letter)
                        {
                            InsertForm(tableName, PBESpecies.Unown, form, letter, letter, letter, letter, letter, letter, letter, letter);
                        }

                        void WriteArceusGenesect(string tableName, PBESpecies species, PBEForm form, PBEType type)
                        {
                            int text = -1;

                            for (int i = 0; i < Utils.Gen5Types.Length; i++)
                            {
                                if (Utils.Gen5Types[i] == type)
                                {
                                    text = i;
                                    break;
                                }
                            }
                            WriteFormTexts(tableName, species, form, text);
                        }

                        LoadTexts(450);
                        const string tableName = "FormNames";
                        cmd.CommandText = $"DROP TABLE IF EXISTS {tableName}";
                        cmd.ExecuteNonQuery();
                        cmd.CommandText = $"CREATE TABLE {tableName}(Species TEXT, Form TEXT, English TEXT, French TEXT, German TEXT, Italian TEXT, Japanese_Kana TEXT, Japanese_Kanji TEXT, Korean TEXT, Spanish TEXT)";
                        cmd.ExecuteNonQuery();
                        WriteFormTexts(tableName, PBESpecies.Castform, PBEForm.Castform, 351);
                        WriteFormTexts(tableName, PBESpecies.Deoxys, PBEForm.Deoxys, 386);
                        WriteFormTexts(tableName, PBESpecies.Burmy, PBEForm.Burmy_Plant, 412);
                        WriteFormTexts(tableName, PBESpecies.Wormadam, PBEForm.Wormadam_Plant, 413);
                        WriteFormTexts(tableName, PBESpecies.Cherrim, PBEForm.Cherrim, 421);
                        WriteFormTexts(tableName, PBESpecies.Shellos, PBEForm.Shellos_West, 422);
                        WriteFormTexts(tableName, PBESpecies.Gastrodon, PBEForm.Gastrodon_West, 423);
                        WriteFormTexts(tableName, PBESpecies.Rotom, PBEForm.Rotom, 479);
                        WriteFormTexts(tableName, PBESpecies.Giratina, PBEForm.Giratina, 487);
                        WriteFormTexts(tableName, PBESpecies.Shaymin, PBEForm.Shaymin, 492);
                        WriteFormTexts(tableName, PBESpecies.Basculin, PBEForm.Basculin_Red, 550);
                        WriteFormTexts(tableName, PBESpecies.Darmanitan, PBEForm.Darmanitan, 555);
                        WriteFormTexts(tableName, PBESpecies.Deerling, PBEForm.Deerling_Spring, 585);
                        WriteFormTexts(tableName, PBESpecies.Sawsbuck, PBEForm.Sawsbuck_Spring, 586);
                        WriteFormTexts(tableName, PBESpecies.Tornadus, PBEForm.Tornadus, 641);
                        WriteFormTexts(tableName, PBESpecies.Thundurus, PBEForm.Thundurus, 642);
                        WriteFormTexts(tableName, PBESpecies.Landorus, PBEForm.Landorus, 645);
                        WriteFormTexts(tableName, PBESpecies.Kyurem, PBEForm.Kyurem, 646);
                        WriteFormTexts(tableName, PBESpecies.Keldeo, PBEForm.Keldeo, 647);
                        WriteFormTexts(tableName, PBESpecies.Meloetta, PBEForm.Meloetta, 648);
                        WriteFormTexts(tableName, PBESpecies.Castform, PBEForm.Castform_Sunny, 678);
                        WriteFormTexts(tableName, PBESpecies.Castform, PBEForm.Castform_Rainy, 679);
                        WriteFormTexts(tableName, PBESpecies.Castform, PBEForm.Castform_Snowy, 680);
                        WriteFormTexts(tableName, PBESpecies.Deoxys, PBEForm.Deoxys_Attack, 681);
                        WriteFormTexts(tableName, PBESpecies.Deoxys, PBEForm.Deoxys_Defense, 682);
                        WriteFormTexts(tableName, PBESpecies.Deoxys, PBEForm.Deoxys_Speed, 683);
                        WriteFormTexts(tableName, PBESpecies.Burmy, PBEForm.Burmy_Sandy, 684);
                        WriteFormTexts(tableName, PBESpecies.Burmy, PBEForm.Burmy_Trash, 685);
                        WriteFormTexts(tableName, PBESpecies.Wormadam, PBEForm.Wormadam_Sandy, 686);
                        WriteFormTexts(tableName, PBESpecies.Wormadam, PBEForm.Wormadam_Trash, 687);
                        WriteFormTexts(tableName, PBESpecies.Cherrim, PBEForm.Cherrim_Sunshine, 688);
                        WriteFormTexts(tableName, PBESpecies.Shellos, PBEForm.Shellos_East, 689);
                        WriteFormTexts(tableName, PBESpecies.Gastrodon, PBEForm.Gastrodon_East, 690);
                        WriteFormTexts(tableName, PBESpecies.Rotom, PBEForm.Rotom_Heat, 691);
                        WriteFormTexts(tableName, PBESpecies.Rotom, PBEForm.Rotom_Wash, 692);
                        WriteFormTexts(tableName, PBESpecies.Rotom, PBEForm.Rotom_Frost, 693);
                        WriteFormTexts(tableName, PBESpecies.Rotom, PBEForm.Rotom_Fan, 694);
                        WriteFormTexts(tableName, PBESpecies.Rotom, PBEForm.Rotom_Mow, 695);
                        WriteFormTexts(tableName, PBESpecies.Giratina, PBEForm.Giratina_Origin, 696);
                        WriteFormTexts(tableName, PBESpecies.Shaymin, PBEForm.Shaymin_Sky, 697);
                        WriteFormTexts(tableName, PBESpecies.Basculin, PBEForm.Basculin_Blue, 714);
                        WriteFormTexts(tableName, PBESpecies.Darmanitan, PBEForm.Darmanitan_Zen, 715);
                        WriteFormTexts(tableName, PBESpecies.Deerling, PBEForm.Deerling_Summer, 716);
                        WriteFormTexts(tableName, PBESpecies.Deerling, PBEForm.Deerling_Autumn, 717);
                        WriteFormTexts(tableName, PBESpecies.Deerling, PBEForm.Deerling_Winter, 718);
                        WriteFormTexts(tableName, PBESpecies.Sawsbuck, PBEForm.Sawsbuck_Summer, 719);
                        WriteFormTexts(tableName, PBESpecies.Sawsbuck, PBEForm.Sawsbuck_Autumn, 720);
                        WriteFormTexts(tableName, PBESpecies.Sawsbuck, PBEForm.Sawsbuck_Winter, 721);
                        WriteFormTexts(tableName, PBESpecies.Tornadus, PBEForm.Tornadus_Therian, 722);
                        WriteFormTexts(tableName, PBESpecies.Thundurus, PBEForm.Thundurus_Therian, 723);
                        WriteFormTexts(tableName, PBESpecies.Landorus, PBEForm.Landorus_Therian, 724);
                        WriteFormTexts(tableName, PBESpecies.Kyurem, PBEForm.Kyurem_White, 725);
                        WriteFormTexts(tableName, PBESpecies.Kyurem, PBEForm.Kyurem_Black, 726);
                        WriteFormTexts(tableName, PBESpecies.Keldeo, PBEForm.Keldeo_Resolute, 727);
                        WriteFormTexts(tableName, PBESpecies.Meloetta, PBEForm.Meloetta_Pirouette, 728);
                        // All Unown forms are called "One Form", all Arceus forms are called "Arceus", and all Genesect forms are called "Genesect", so I'm changing them here
                        WriteUnown(tableName, PBEForm.Unown_A, "A");
                        WriteUnown(tableName, PBEForm.Unown_B, "B");
                        WriteUnown(tableName, PBEForm.Unown_C, "C");
                        WriteUnown(tableName, PBEForm.Unown_D, "D");
                        WriteUnown(tableName, PBEForm.Unown_E, "E");
                        WriteUnown(tableName, PBEForm.Unown_Exclamation, "!");
                        WriteUnown(tableName, PBEForm.Unown_F, "F");
                        WriteUnown(tableName, PBEForm.Unown_G, "G");
                        WriteUnown(tableName, PBEForm.Unown_H, "H");
                        WriteUnown(tableName, PBEForm.Unown_I, "I");
                        WriteUnown(tableName, PBEForm.Unown_J, "J");
                        WriteUnown(tableName, PBEForm.Unown_K, "K");
                        WriteUnown(tableName, PBEForm.Unown_L, "L");
                        WriteUnown(tableName, PBEForm.Unown_M, "M");
                        WriteUnown(tableName, PBEForm.Unown_N, "N");
                        WriteUnown(tableName, PBEForm.Unown_O, "O");
                        WriteUnown(tableName, PBEForm.Unown_P, "P");
                        WriteUnown(tableName, PBEForm.Unown_Q, "Q");
                        WriteUnown(tableName, PBEForm.Unown_Question, "?");
                        WriteUnown(tableName, PBEForm.Unown_R, "R");
                        WriteUnown(tableName, PBEForm.Unown_S, "S");
                        WriteUnown(tableName, PBEForm.Unown_T, "T");
                        WriteUnown(tableName, PBEForm.Unown_U, "U");
                        WriteUnown(tableName, PBEForm.Unown_V, "V");
                        WriteUnown(tableName, PBEForm.Unown_W, "W");
                        WriteUnown(tableName, PBEForm.Unown_X, "X");
                        WriteUnown(tableName, PBEForm.Unown_Y, "Y");
                        WriteUnown(tableName, PBEForm.Unown_Z, "Z");
                        LoadTexts(398); // Load types texts
                        WriteArceusGenesect(tableName, PBESpecies.Arceus, PBEForm.Arceus, PBEType.Normal);
                        WriteArceusGenesect(tableName, PBESpecies.Arceus, PBEForm.Arceus_Bug, PBEType.Bug);
                        WriteArceusGenesect(tableName, PBESpecies.Arceus, PBEForm.Arceus_Dark, PBEType.Dark);
                        WriteArceusGenesect(tableName, PBESpecies.Arceus, PBEForm.Arceus_Dragon, PBEType.Dragon);
                        WriteArceusGenesect(tableName, PBESpecies.Arceus, PBEForm.Arceus_Electric, PBEType.Electric);
                        WriteArceusGenesect(tableName, PBESpecies.Arceus, PBEForm.Arceus_Fighting, PBEType.Fighting);
                        WriteArceusGenesect(tableName, PBESpecies.Arceus, PBEForm.Arceus_Fire, PBEType.Fire);
                        WriteArceusGenesect(tableName, PBESpecies.Arceus, PBEForm.Arceus_Flying, PBEType.Flying);
                        WriteArceusGenesect(tableName, PBESpecies.Arceus, PBEForm.Arceus_Ghost, PBEType.Ghost);
                        WriteArceusGenesect(tableName, PBESpecies.Arceus, PBEForm.Arceus_Grass, PBEType.Grass);
                        WriteArceusGenesect(tableName, PBESpecies.Arceus, PBEForm.Arceus_Ground, PBEType.Ground);
                        WriteArceusGenesect(tableName, PBESpecies.Arceus, PBEForm.Arceus_Ice, PBEType.Ice);
                        WriteArceusGenesect(tableName, PBESpecies.Arceus, PBEForm.Arceus_Poison, PBEType.Poison);
                        WriteArceusGenesect(tableName, PBESpecies.Arceus, PBEForm.Arceus_Psychic, PBEType.Psychic);
                        WriteArceusGenesect(tableName, PBESpecies.Arceus, PBEForm.Arceus_Rock, PBEType.Rock);
                        WriteArceusGenesect(tableName, PBESpecies.Arceus, PBEForm.Arceus_Steel, PBEType.Steel);
                        WriteArceusGenesect(tableName, PBESpecies.Arceus, PBEForm.Arceus_Water, PBEType.Water);
                        WriteArceusGenesect(tableName, PBESpecies.Genesect, PBEForm.Genesect, PBEType.Normal);
                        WriteArceusGenesect(tableName, PBESpecies.Genesect, PBEForm.Genesect_Burn, PBEType.Fire);
                        WriteArceusGenesect(tableName, PBESpecies.Genesect, PBEForm.Genesect_Chill, PBEType.Ice);
                        WriteArceusGenesect(tableName, PBESpecies.Genesect, PBEForm.Genesect_Douse, PBEType.Water);
                        WriteArceusGenesect(tableName, PBESpecies.Genesect, PBEForm.Genesect_Shock, PBEType.Electric);
                    }
                    // Genders (Does not have PBEGender.Genderless)
                    {
                        LoadTexts(441);
                        const string tableName = "GenderNames";
                        CreateTable(tableName);
                        WriteTexts(tableName, PBEGender.Female.ToString(), 115);
                        Insert(tableName, PBEGender.Genderless.ToString(), "Unknown", "Inconnu", "Unbekannt", "Sconosciuto", "不明のすがた", "不明のすがた", "불명의 모습", "Desconocido");
                        WriteTexts(tableName, PBEGender.Male.ToString(), 114);
                    }
                    // Items
                    {
                        PBEItem[] allItems = Enum.GetValues <PBEItem>();
                        void WriteAll(string tableName)
                        {
                            CreateTable(tableName);
                            foreach (PBEItem item in allItems)
                            {
                                WriteTexts(tableName, item.ToString(), (int)item);
                            }
                        }

                        LoadTexts(63);
                        WriteAll("ItemDescriptions");
                        LoadTexts(64);
                        WriteAll("ItemNames");
                    }
                    // Moves
                    {
                        void WriteAll(string tableName)
                        {
                            CreateTable(tableName);
                            for (PBEMove i = 0; i < PBEMove.MAX; i++)
                            {
                                WriteTexts(tableName, i.ToString(), (int)i);
                            }
                        }

                        LoadTexts(402);
                        WriteAll("MoveDescriptions");
                        LoadTexts(403);
                        WriteAll("MoveNames");
                    }
                    // Natures
                    {
                        LoadTexts(379);
                        const string tableName = "NatureNames";
                        CreateTable(tableName);
                        for (PBENature i = 0; i < PBENature.MAX; i++)
                        {
                            WriteTexts(tableName, i.ToString(), (int)i + 35); // Nature 0 is at entry 35 in this file
                        }
                    }
                    // Species
                    {
                        void WriteAll(string tableName)
                        {
                            CreateTable(tableName);
                            for (var i = (PBESpecies)1; i < PBESpecies.MAX; i++)
                            {
                                WriteTexts(tableName, i.ToString(), (int)i);
                            }
                        }

                        LoadTexts(90);
                        WriteAll("SpeciesNames");
                        LoadTexts(442);
                        WriteAll("SpeciesEntries");
                        LoadTexts(464);
                        WriteAll("SpeciesCategories");
                    }
                    // Stats (Non-Japanese languages do not have PBEStat.Accuracy or PBEStat.Evasion)
                    {
                        LoadTexts(372);
                        const string tableName = "StatNames";
                        CreateTable(tableName);
                        WriteTexts(tableName, PBEStat.HP.ToString(), 0);
                        WriteTexts(tableName, PBEStat.Attack.ToString(), 1);
                        WriteTexts(tableName, PBEStat.Defense.ToString(), 2);
                        WriteTexts(tableName, PBEStat.SpAttack.ToString(), 4);
                        WriteTexts(tableName, PBEStat.SpDefense.ToString(), 5);
                        WriteTexts(tableName, PBEStat.Speed.ToString(), 3);
                        Insert(tableName, PBEStat.Accuracy.ToString(), "Accuracy", "Précision", "Genauigkeit", "Precisione", jap[0][6], jap[1][6], "명중률", "Precisión");
                        Insert(tableName, PBEStat.Evasion.ToString(), "Evasiveness", "Esquive", "Fluchtwert", "Elusione", jap[0][7], jap[1][7], "회피율", "Evasión");
                    }
                    // Types (Does not have PBEType.None)
                    {
                        LoadTexts(398);
                        const string tableName = "TypeNames";
                        CreateTable(tableName);
                        const string none = "-----";
                        Insert(tableName, PBEType.None.ToString(), none, none, none, none, none, none, none, none);
                        for (byte i = 0; i < Utils.Gen5Types.Length; i++)
                        {
                            WriteTexts(tableName, Utils.Gen5Types[i].ToString(), i);
                        }
                    }

                    transaction.Commit();
                }
        }
Exemple #20
0
 public virtual IPBELocalizedString GetAbilityName(PBEAbility ability)
 {
     return(PBELocalizedString.GetAbilityName(ability));
 }
Exemple #21
0
 public virtual IPBELocalizedString GetAbilityDescription(PBEAbility ability)
 {
     return(PBELocalizedString.GetAbilityDescription(ability));
 }
Exemple #22
0
 public static bool VerifyAbilityHappened(this PBEBattle battle, PBEBattlePokemon abilityOwner, PBEBattlePokemon pokemon2, PBEAbility ability, PBEAbilityAction abilityAction)
 {
     foreach (IPBEPacket packet in battle.Events)
     {
         if (packet is PBEAbilityPacket ap &&
             ap.Ability == ability &&
             ap.AbilityAction == abilityAction &&
             ap.AbilityOwnerTrainer.TryGetPokemon(ap.AbilityOwner) == abilityOwner &&
             ap.Pokemon2Trainer.TryGetPokemon(ap.Pokemon2) == pokemon2)
         {
             return(true);
         }
     }
     return(false);
 }
Exemple #23
0
        // TODO: Biking lowers the rate by 20% according to gen 3, running does not affect (according to gen 3, maybe it does after)
        public static bool CheckForWildBattle(bool ignoreAbilityOrItem)
        {
            PlayerObj player = PlayerObj.Player;

            Map.Layout.Block block = player.GetBlock(out Map map);
            EncounterType    t;

            switch (block.BlocksetBlock.Behavior)
            {
            case BlocksetBlockBehavior.AllowElevationChange_Cave_Encounter:
            case BlocksetBlockBehavior.Cave_Encounter:
            case BlocksetBlockBehavior.Grass_Encounter: t = EncounterType.Default; break;

            case BlocksetBlockBehavior.Grass_SpecialEncounter: t = EncounterType.DarkGrass; break;

            case BlocksetBlockBehavior.Surf: t = EncounterType.Surf; break;

            default: return(false);
            }
            EncounterTable tbl = map.Encounters.GetEncounterTable(t);

            if (tbl is null)
            {
                return(false);
            }
            int chance = tbl.ChanceOfPhenomenon;

            // Some abilities affect the wild encounter rate
            // This is an option because some encounters (like rock smash) do not use the ability to modify the rate
            if (!ignoreAbilityOrItem)
            {
                PartyPokemon pkmn = Game.Instance.Save.PlayerParty[0];
                PBEAbility   abilityOfFirstInParty = pkmn.Ability;
                PBEItem      itemOfFirstInParty    = pkmn.Item;
                // TODO: CompoundEyes
                // TODO: CuteCharm
                // TODO: Hustle, Pressure, VitalSpirit
                // TODO: Intimidate, KeenEye
                // TODO: MagnetPull, Static
                // TODO: SandVeil, SnowCloak
                // TODO: StickyHold, SuctionCups
                // TODO: Synchronize
                switch (abilityOfFirstInParty)
                {
                case PBEAbility.ArenaTrap:
                case PBEAbility.Illuminate:
                case PBEAbility.NoGuard: chance *= 2; break;

                case PBEAbility.QuickFeet:
                case PBEAbility.Stench:
                case PBEAbility.WhiteSmoke: chance /= 2; break;
                }
                switch (itemOfFirstInParty)
                {
                case PBEItem.CleanseTag: chance = chance * 2 / 3; break;     // Reduce by 1/3
                }
            }
            if (!PBEUtils.GlobalRandom.RandomBool(chance, byte.MaxValue))
            {
                return(false);
            }
            ushort combinedChance = tbl.GetCombinedChance();

            if (combinedChance == 0)
            {
                return(false);
            }
            EncounterTable.Encounter encounter0 = RollEncounter(tbl, combinedChance);
            Game.Instance.TempCreateWildBattle(map, block, encounter0);
            return(true);
        }