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])); }
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 }
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); }
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>(); }
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(); }
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); }
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()); } }
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 }
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()); } }
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()); } }
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);
// 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(); } }
public virtual IPBELocalizedString GetAbilityName(PBEAbility ability) { return(PBELocalizedString.GetAbilityName(ability)); }
public virtual IPBELocalizedString GetAbilityDescription(PBEAbility ability) { return(PBELocalizedString.GetAbilityDescription(ability)); }
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); }
// 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); }