From 6ee7a8724bed5e0e2b41cda879de6b04d33186d1 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sun, 30 Aug 2020 10:23:22 -0700 Subject: [PATCH] Offload EncounterSlot loading logic to reduce complexity (#2980) * Rework gen1 slot loading Slot templates are precomputed from ROM data and just loaded straight in, with tight coupling to the encounter area (grouped by slot types). * Revise fuzzy met check for underleveled wild evos Example: Level 23 poliwhirl in RBY as a level 50 poliwhirl, will assume the chain is 25-50 for poliwhirl (as poliwag evolves at 25). Instead of revising the origin chain, just ignore the evo min level in the comparison. Previous commit fixed it for gen1. * Rework gen2-4 slot loading Gen4 not finished, Type Encounter data and some edge encounters not recognizing yet... * Add feebas slots for old/good encounters * Begin moving properties Great news! Gen5-7 need to be de-dumbed like Gen1-4. Then I can remove the bang (!) on the Area accessor and ensure that it's never null! * Split off XD pokespot slot encounter table type * Set area in constructor * Deduplicate g3 roaming encounters * Deduplicate xd encounter locations (rebattle) Only difference is met location; no need to create 500 extra encounter objects. A simple contains check is ok (rarely in gen3 format). * Make all slots have a readonly reference to their parent area * Minor clean * Remove "Safari" slot type flag Can be determined via other means (generation-location), allows us to reduce the size of SlotType member to a byte Output of slot binaries didn't preserve the Safari flag anyway. * Update SlotType.cs * Handle type encounters correctly * Merge safari area into regular xy area * Merge dexnav accessor logic * fix some logic so that tests pass again rearrange g5 dw init to be done outside of static constructor (initializer instead) PIDGenerator: friend safari slots now generate with required flawless IV count * Add cianwood tentacool gift encounter * Remove unnecessary abstractions Fake area just returned a slot; since Slots have a non-null reference to the area, we can just return the slot and use the API to grab a list of possible slots for the chain. Increase restrictiveness of location/type get-set operations * Minor tweaks, pass parameters DexNav observed state isn't necessary to use, only need to see if it's possible to dexnav. Now that we have metadata for slots, we can. * Remove unused legality tables --- PKHeX.Core/Game/Enums/Ball.cs | 20 +- PKHeX.Core/Legality/Areas/EncounterArea.cs | 60 +- PKHeX.Core/Legality/Areas/EncounterArea1.cs | 121 +- PKHeX.Core/Legality/Areas/EncounterArea2.cs | 298 +--- PKHeX.Core/Legality/Areas/EncounterArea3.cs | 170 +-- PKHeX.Core/Legality/Areas/EncounterArea32.cs | 53 - PKHeX.Core/Legality/Areas/EncounterArea3XD.cs | 73 + PKHeX.Core/Legality/Areas/EncounterArea4.cs | 88 +- .../Legality/Areas/EncounterArea4DPPt.cs | 204 --- .../Legality/Areas/EncounterArea4HGSS.cs | 206 --- PKHeX.Core/Legality/Areas/EncounterArea5.cs | 62 +- PKHeX.Core/Legality/Areas/EncounterArea6AO.cs | 53 +- PKHeX.Core/Legality/Areas/EncounterArea6XY.cs | 52 +- .../Areas/EncounterArea6XYFriendSafari.cs | 53 - PKHeX.Core/Legality/Areas/EncounterArea7.cs | 40 +- PKHeX.Core/Legality/Areas/EncounterArea7b.cs | 37 +- PKHeX.Core/Legality/Areas/EncounterArea7g.cs | 51 +- PKHeX.Core/Legality/Areas/EncounterArea8.cs | 14 +- .../Legality/Areas/EncounterAreaFake.cs | 15 - .../Legality/Encounters/Data/EncounterUtil.cs | 181 --- .../Legality/Encounters/Data/Encounters1.cs | 54 +- .../Legality/Encounters/Data/Encounters2.cs | 118 +- .../Legality/Encounters/Data/Encounters3.cs | 241 +-- .../Legality/Encounters/Data/Encounters4.cs | 1311 ++--------------- .../Legality/Encounters/Data/Encounters5.cs | 346 +---- .../Legality/Encounters/Data/Encounters6.cs | 138 +- .../Legality/Encounters/Data/Encounters7.cs | 112 +- .../Legality/Encounters/Data/Encounters7b.cs | 84 +- .../Legality/Encounters/Data/Encounters8.cs | 26 +- .../Encounters/EncounterSlot/EncounterSlot.cs | 16 +- .../EncounterSlot/EncounterSlot1.cs | 30 +- .../EncounterSlot/EncounterSlot2.cs | 33 +- .../EncounterSlot/EncounterSlot3.cs | 20 +- .../EncounterSlot/EncounterSlot3PokeSpot.cs | 3 +- .../EncounterSlot/EncounterSlot3Swarm.cs | 3 +- .../EncounterSlot/EncounterSlot4.cs | 22 +- .../EncounterSlot/EncounterSlot5.cs | 9 + .../EncounterSlot/EncounterSlot6AO.cs | 14 +- .../EncounterSlot/EncounterSlot6XY.cs | 9 + .../EncounterSlot/EncounterSlot7.cs | 9 + .../EncounterSlot/EncounterSlot7GO.cs | 9 + .../EncounterSlot/EncounterSlot7b.cs | 8 + .../EncounterStatic/EncounterStatic3.cs | 43 +- .../EncounterStatic/EncounterStaticShadow.cs | 28 +- .../Generator/EncounterGenerator.cs | 8 +- .../Generator/EncounterMovesetGenerator.cs | 7 +- .../Generator/EncounterSlotGenerator.cs | 36 +- .../Encounters/Information/EncounterLearn.cs | 18 +- .../Information/EncounterSuggestion.cs | 6 +- .../Encounters/Verifiers/EncounterVerifier.cs | 14 +- .../Verifiers/VerifyRelearnMoves.cs | 2 +- PKHeX.Core/Legality/Enums/SlotType.cs | 102 +- PKHeX.Core/Legality/RNG/Frame/Frame.cs | 2 +- PKHeX.Core/Legality/RNG/Frame/SlotRange.cs | 24 +- PKHeX.Core/Legality/RNG/PIDGenerator.cs | 11 +- PKHeX.Core/Legality/Tables/Locations.cs | 9 +- .../Legality/Verifiers/AbilityVerifier.cs | 65 +- PKHeX.Core/Legality/Verifiers/BallVerifier.cs | 32 +- .../Legality/Verifiers/EffortValueVerifier.cs | 2 +- PKHeX.Core/Legality/Verifiers/FormVerifier.cs | 2 +- .../Verifiers/IndividualValueVerifier.cs | 2 +- PKHeX.Core/Legality/Verifiers/PIDVerifier.cs | 4 +- PKHeX.Core/PKHeX.Core.csproj | 26 +- PKHeX.Core/Resources/byte/encounter_a.pkl | Bin 37808 -> 28196 bytes PKHeX.Core/Resources/byte/encounter_b.pkl | Bin 33832 -> 14744 bytes PKHeX.Core/Resources/byte/encounter_b2.pkl | Bin 39794 -> 20808 bytes PKHeX.Core/Resources/byte/encounter_blue.pkl | Bin 1756 -> 3264 bytes .../Resources/byte/encounter_crystal.pkl | Bin 4935 -> 19632 bytes .../Resources/byte/encounter_crystal_h.pkl | Bin 391 -> 0 bytes PKHeX.Core/Resources/byte/encounter_d.pkl | Bin 66228 -> 33752 bytes PKHeX.Core/Resources/byte/encounter_e.pkl | Bin 9442 -> 17340 bytes PKHeX.Core/Resources/byte/encounter_fr.pkl | Bin 10354 -> 22736 bytes PKHeX.Core/Resources/byte/encounter_gold.pkl | Bin 5038 -> 19456 bytes .../Resources/byte/encounter_gold_h.pkl | Bin 265 -> 0 bytes PKHeX.Core/Resources/byte/encounter_gsc_f.pkl | Bin 484 -> 0 bytes PKHeX.Core/Resources/byte/encounter_hb_hg.pkl | Bin 25736 -> 0 bytes PKHeX.Core/Resources/byte/encounter_hb_ss.pkl | Bin 25736 -> 0 bytes PKHeX.Core/Resources/byte/encounter_hg.pkl | Bin 27278 -> 78792 bytes PKHeX.Core/Resources/byte/encounter_lg.pkl | Bin 10354 -> 22736 bytes PKHeX.Core/Resources/byte/encounter_mn.pkl | Bin 3804 -> 7116 bytes .../Resources/byte/encounter_mn_sos.pkl | Bin 3756 -> 0 bytes PKHeX.Core/Resources/byte/encounter_o.pkl | Bin 37808 -> 28196 bytes PKHeX.Core/Resources/byte/encounter_p.pkl | Bin 66228 -> 33652 bytes PKHeX.Core/Resources/byte/encounter_pt.pkl | Bin 66228 -> 32396 bytes PKHeX.Core/Resources/byte/encounter_r.pkl | Bin 7763 -> 15172 bytes PKHeX.Core/Resources/byte/encounter_rb_f.pkl | Bin 172 -> 0 bytes PKHeX.Core/Resources/byte/encounter_red.pkl | Bin 1756 -> 3264 bytes .../Resources/byte/encounter_rse_swarm.pkl | Bin 0 -> 188 bytes PKHeX.Core/Resources/byte/encounter_s.pkl | Bin 7763 -> 15300 bytes .../Resources/byte/encounter_silver.pkl | Bin 5038 -> 19456 bytes .../Resources/byte/encounter_silver_h.pkl | Bin 265 -> 0 bytes PKHeX.Core/Resources/byte/encounter_sn.pkl | Bin 3804 -> 7188 bytes .../Resources/byte/encounter_sn_sos.pkl | Bin 3756 -> 0 bytes PKHeX.Core/Resources/byte/encounter_ss.pkl | Bin 27278 -> 78220 bytes PKHeX.Core/Resources/byte/encounter_um.pkl | Bin 4376 -> 10400 bytes .../Resources/byte/encounter_um_sos.pkl | Bin 5708 -> 0 bytes PKHeX.Core/Resources/byte/encounter_us.pkl | Bin 4372 -> 10392 bytes .../Resources/byte/encounter_us_sos.pkl | Bin 5704 -> 0 bytes PKHeX.Core/Resources/byte/encounter_w.pkl | Bin 33832 -> 14896 bytes PKHeX.Core/Resources/byte/encounter_w2.pkl | Bin 39794 -> 20780 bytes PKHeX.Core/Resources/byte/encounter_x.pkl | Bin 20360 -> 17452 bytes PKHeX.Core/Resources/byte/encounter_y.pkl | Bin 20360 -> 17452 bytes .../Resources/byte/encounter_yellow.pkl | Bin 1880 -> 3608 bytes .../Resources/byte/encounter_yellow_f.pkl | Bin 280 -> 0 bytes 104 files changed, 1082 insertions(+), 3827 deletions(-) delete mode 100644 PKHeX.Core/Legality/Areas/EncounterArea32.cs create mode 100644 PKHeX.Core/Legality/Areas/EncounterArea3XD.cs delete mode 100644 PKHeX.Core/Legality/Areas/EncounterArea4DPPt.cs delete mode 100644 PKHeX.Core/Legality/Areas/EncounterArea4HGSS.cs delete mode 100644 PKHeX.Core/Legality/Areas/EncounterArea6XYFriendSafari.cs delete mode 100644 PKHeX.Core/Legality/Areas/EncounterAreaFake.cs delete mode 100644 PKHeX.Core/Resources/byte/encounter_crystal_h.pkl delete mode 100644 PKHeX.Core/Resources/byte/encounter_gold_h.pkl delete mode 100644 PKHeX.Core/Resources/byte/encounter_gsc_f.pkl delete mode 100644 PKHeX.Core/Resources/byte/encounter_hb_hg.pkl delete mode 100644 PKHeX.Core/Resources/byte/encounter_hb_ss.pkl delete mode 100644 PKHeX.Core/Resources/byte/encounter_mn_sos.pkl delete mode 100644 PKHeX.Core/Resources/byte/encounter_rb_f.pkl create mode 100644 PKHeX.Core/Resources/byte/encounter_rse_swarm.pkl delete mode 100644 PKHeX.Core/Resources/byte/encounter_silver_h.pkl delete mode 100644 PKHeX.Core/Resources/byte/encounter_sn_sos.pkl delete mode 100644 PKHeX.Core/Resources/byte/encounter_um_sos.pkl delete mode 100644 PKHeX.Core/Resources/byte/encounter_us_sos.pkl delete mode 100644 PKHeX.Core/Resources/byte/encounter_yellow_f.pkl diff --git a/PKHeX.Core/Game/Enums/Ball.cs b/PKHeX.Core/Game/Enums/Ball.cs index 80ca73afd..e369a55de 100644 --- a/PKHeX.Core/Game/Enums/Ball.cs +++ b/PKHeX.Core/Game/Enums/Ball.cs @@ -40,7 +40,7 @@ public enum Ball : byte Beast = 26, } - public static partial class Extensions + public static class BallExtensions { /// /// Checks if the is an Apricorn Ball (HG/SS) @@ -48,5 +48,23 @@ public static partial class Extensions /// Ball ID /// True if Apricorn, false if not. public static bool IsApricornBall(this Ball ball) => Ball.Fast <= ball && ball <= Ball.Moon; + + public static Ball GetRequiredBallValueWild(int gen, int loc) + { + return gen switch + { + // For Gen3 Safari Zones, we've already deferred partial match encounters. + 3 when Locations.IsSafariZoneLocation3(loc) => Ball.Safari, + + // For Gen4 Safari Zones and BCC, we've already deferred partial match encounters. + 4 when Locations.IsSafariZoneLocation4(loc) => Ball.Safari, + 4 when Locations.BugCatchingContest4 == loc => Ball.Sport, + + // Poké Pelago + 7 when loc == 30016 => Ball.Poke, + + _ => Ball.None, + }; + } } } \ No newline at end of file diff --git a/PKHeX.Core/Legality/Areas/EncounterArea.cs b/PKHeX.Core/Legality/Areas/EncounterArea.cs index 7289b0d5a..fbb65d7ef 100644 --- a/PKHeX.Core/Legality/Areas/EncounterArea.cs +++ b/PKHeX.Core/Legality/Areas/EncounterArea.cs @@ -6,71 +6,19 @@ namespace PKHeX.Core /// /// Represents an Area where can be encountered, which contains a Location ID and data. /// - public class EncounterArea + public abstract class EncounterArea { - public int Location; + public int Location { get; protected set; } + public SlotType Type { get; protected set; } = SlotType.Any; public EncounterSlot[] Slots = Array.Empty(); - /// - /// Gets the encounter areas for species with same level range and same slot type at same location - /// - /// List of species that exist in the Area. - /// Paired min and max levels of the encounter slots. - /// Location index of the encounter area. - /// Encounter slot type of the encounter area. - /// Encounter area with slots - public static TArea[] GetSimpleEncounterArea(int[] species, int[] lvls, int location, SlotType t) - where TArea : EncounterArea, new() - where TSlot : EncounterSlot, new() - { - if ((lvls.Length & 1) != 0) // levels data not paired; expect multiple of 2 - throw new ArgumentException(nameof(lvls)); - - var count = species.Length * (lvls.Length / 2); - var slots = new TSlot[count]; - int ctr = 0; - foreach (var s in species) - { - for (int i = 0; i < lvls.Length;) - { - slots[ctr++] = new TSlot - { - LevelMin = lvls[i++], - LevelMax = lvls[i++], - Species = s, - Type = t - }; - } - } - return new[] { new TArea { Location = location, Slots = slots } }; - } - /// /// Gets the slots contained in the area that match the provided data. /// /// Pokémon Data /// Evolution lineage /// Enumerable list of encounters - public virtual IEnumerable GetMatchingSlots(PKM pkm, IReadOnlyList chain) - { - foreach (var slot in Slots) - { - foreach (var evo in chain) - { - if (slot.Species != evo.Species) - continue; - - if (!slot.IsLevelWithinRange(pkm.Met_Level)) - break; - - if (slot.Form != evo.Form && !Legal.WildChangeFormAfter.Contains(slot.Species)) - break; - - yield return slot; - break; - } - } - } + public abstract IEnumerable GetMatchingSlots(PKM pkm, IReadOnlyList chain); /// /// Checks if the provided met location ID matches the parameters for the area. diff --git a/PKHeX.Core/Legality/Areas/EncounterArea1.cs b/PKHeX.Core/Legality/Areas/EncounterArea1.cs index f4f2024a9..d40873733 100644 --- a/PKHeX.Core/Legality/Areas/EncounterArea1.cs +++ b/PKHeX.Core/Legality/Areas/EncounterArea1.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; +using System.Collections.Generic; namespace PKHeX.Core { @@ -10,100 +8,35 @@ namespace PKHeX.Core /// public sealed class EncounterArea1 : EncounterArea { - private static EncounterSlot1[] ReadSlots1FishingYellow(byte[] data, ref int ofs, int count, SlotType t, int rate) - { - // Convert byte to actual number - byte[] levels = { 0xFF, 0x15, 0x67, 0x1D, 0x3B, 0x5C, 0x72, 0x16, 0x71, 0x18, 0x00, 0x6D, 0x80, }; - byte[] g1DexIDs = { 0x47, 0x6E, 0x18, 0x9B, 0x17, 0x4E, 0x8A, 0x5C, 0x5D, 0x9D, 0x9E, 0x1B, 0x85, 0x16, 0x58, 0x59, }; - int[] speciesIDs = { 060, 061, 072, 073, 090, 098, 099, 116, 117, 118, 119, 120, 129, 130, 147, 148, }; + public readonly int Rate; + public static EncounterArea1[] GetAreas(byte[][] input, GameVersion game) + { + var result = new EncounterArea1[input.Length]; + for (int i = 0; i < input.Length; i++) + result[i] = new EncounterArea1(input[i], game); + return result; + } + + private EncounterArea1(byte[] data, GameVersion game) + { + Location = data[0]; + // 1 byte unused + Type = (SlotType)data[2]; + Rate = data[3]; + + int count = (data.Length - 4) / 4; var slots = new EncounterSlot1[count]; - for (int slot = 0; slot < count; slot++) + for (int i = 0; i < slots.Length; i++) { - int species = speciesIDs[Array.IndexOf(g1DexIDs, data[ofs++])]; - int lvl = Array.IndexOf(levels, data[ofs++]) * 5; - slots[slot] = new EncounterSlot1(species, lvl, lvl, rate, t, slot); + int offset = 4 + (4 * i); + int species = data[offset + 0]; + int slotNum = data[offset + 1]; + int min = data[offset + 2]; + int max = data[offset + 3]; + slots[i] = new EncounterSlot1(this, species, min, max, slotNum, game); } - return slots; - } - - /// - /// Gets the encounter areas with information from Generation 1 Grass/Water data. - /// - /// Input raw data. - /// Count of areas in the binary. - /// Array of encounter areas. - public static EncounterArea1[] GetArray1GrassWater(byte[] data, int count) - { - EncounterArea1[] areas = new EncounterArea1[count]; - for (int i = 0; i < areas.Length; i++) - { - int ptr = BitConverter.ToInt16(data, i * 2); - var grass = GetSlots1GrassWater(data, ref ptr, SlotType.Grass); - var water = GetSlots1GrassWater(data, ref ptr, SlotType.Surf); - areas[i] = new EncounterArea1 - { - Location = i, - Slots = ArrayUtil.ConcatAll(grass, water), - }; - } - return areas.Where(area => area.Slots.Length != 0).ToArray(); - } - - /// - /// Gets the encounter areas with information from Pokémon Yellow (Generation 1) Fishing data. - /// - /// Input raw data. - /// Array of encounter areas. - public static EncounterArea1[] GetArray1FishingYellow(byte[] data) - { - const int size = 9; - int count = data.Length / size; - EncounterArea1[] areas = new EncounterArea1[count]; - for (int i = 0; i < count; i++) - { - int ofs = (i * size) + 1; - areas[i] = new EncounterArea1 - { - Location = data[(i * size) + 0], - Slots = ReadSlots1FishingYellow(data, ref ofs, 4, SlotType.Super_Rod, -1) - }; - } - return areas; - } - - /// - /// Gets the encounter areas with information from Generation 1 Fishing data. - /// - /// Input raw data. - /// Count of areas in the binary. - /// Array of encounter areas. - public static EncounterArea1[] GetArray1Fishing(byte[] data, int count) - { - EncounterArea1[] areas = new EncounterArea1[count]; - for (int i = 0; i < areas.Length; i++) - { - int loc = data[(i * 3) + 0]; - int ptr = BitConverter.ToInt16(data, (i * 3) + 1); - areas[i] = new EncounterArea1 - { - Location = loc, - Slots = GetSlots1Fishing(data, ptr) - }; - } - return areas; - } - - private static EncounterSlot1[] GetSlots1GrassWater(byte[] data, ref int ofs, SlotType t) - { - int rate = data[ofs++]; - return rate == 0 ? Array.Empty() : EncounterSlot1.ReadSlots(data, ref ofs, 10, t, rate); - } - - private static EncounterSlot1[] GetSlots1Fishing(byte[] data, int ofs) - { - int count = data[ofs++]; - return EncounterSlot1.ReadSlots(data, ref ofs, count, SlotType.Super_Rod, -1); + Slots = slots; } public override IEnumerable GetMatchingSlots(PKM pkm, IReadOnlyList chain) @@ -116,7 +49,7 @@ public override IEnumerable GetMatchingSlots(PKM pkm, IReadOnlyLi if (slot.Species != evo.Species) continue; - if (!slot.IsLevelWithinRange(evo.MinLevel, evo.Level)) + if (slot.LevelMin > evo.Level) break; if (slot.Form != evo.Form) break; diff --git a/PKHeX.Core/Legality/Areas/EncounterArea2.cs b/PKHeX.Core/Legality/Areas/EncounterArea2.cs index c330efe0d..e9505f252 100644 --- a/PKHeX.Core/Legality/Areas/EncounterArea2.cs +++ b/PKHeX.Core/Legality/Areas/EncounterArea2.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; namespace PKHeX.Core { @@ -10,274 +9,68 @@ namespace PKHeX.Core /// public sealed class EncounterArea2 : EncounterArea { - /// - /// Gets the encounter areas with information from Generation 2 Grass/Water data. - /// - /// Input raw data. - /// Array of encounter areas. - public static EncounterArea2[] GetArray2GrassWater(byte[] data) + private static readonly byte[] BCC_SlotRates = { 20, 20, 10, 10, 05, 05, 10, 10, 05, 05 }; + private static readonly byte[] RatesGrass = { 30, 30, 20, 10, 5, 4, 1 }; + private static readonly byte[] RatesSurf = { 60, 30, 10 }; + + internal readonly EncounterTime Time; + public readonly int Rate; + public readonly IReadOnlyList Rates; + + public static EncounterArea2[] GetAreas(byte[][] input, GameVersion game) { - int ofs = 0; - var areas = new List(); - areas.AddRange(GetAreas2(data, ref ofs, SlotType.Grass, 3, 7)); // Johto Grass - areas.AddRange(GetAreas2(data, ref ofs, SlotType.Surf, 1, 3)); // Johto Water - areas.AddRange(GetAreas2(data, ref ofs, SlotType.Grass, 3, 7)); // Kanto Grass - areas.AddRange(GetAreas2(data, ref ofs, SlotType.Surf, 1, 3)); // Kanto Water - areas.AddRange(GetAreas2(data, ref ofs, SlotType.Swarm, 3, 7)); // Swarm - areas.AddRange(GetAreas2(data, ref ofs, SlotType.Special, 1, 3)); // Union Cave - return areas.ToArray(); + var result = new EncounterArea2[input.Length]; + for (int i = 0; i < input.Length; i++) + result[i] = new EncounterArea2(input[i], game); + return result; } - // Fishing Tables are not associated to a single map; a map picks a table to use. - // For all maps that use a table, create a new EncounterArea with reference to the table's slots. - private static readonly sbyte[] convMapIDtoFishLocationID = + private EncounterArea2(byte[] data, GameVersion game) { - -1, 1, -1, 0, 3, 3, 3, -1, 10, 3, 2, -1, -1, 2, 3, 0, - -1, -1, 3, -1, -1, -1, 3, -1, -1, -1, -1, 0, -1, -1, 0, 9, - 1, 0, 2, 2, -1, 3, 7, 3, -1, 3, 4, 8, 2, -1, 2, 1, - -1, 3, -1, -1, -1, -1, -1, 0, 2, 2, -1, -1, 3, 1, -1, -1, - -1, 2, -1, 2, -1, -1, -1, -1, -1, -1, 10, 10, -1, -1, -1, -1, - -1, 7, 0, 1, -1, 1, 1, 3, -1, -1, -1, 1, 1, 2, 3, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - }; + Location = data[0]; + Time = (EncounterTime)data[1]; + var type = Type = (SlotType)data[2]; + var rate = data[3]; - /// - /// Gets the encounter areas with information from Generation 2 Grass/Water data. - /// - /// Input raw data. - /// Array of encounter areas. - public static EncounterArea2[] GetArray2Fishing(byte[] data) - { - int ofs = 0; - var f = GetAreas2Fishing(data, ref ofs); - - var areas = new List(); - for (int i = 0; i < convMapIDtoFishLocationID.Length; i++) + if (type > SlotType.Surf) // Not Grass/Surf { - var loc = convMapIDtoFishLocationID[i]; - if (loc == -1) // no table for map - continue; - areas.Add(new EncounterArea2 { Location = i, Slots = f[loc].Slots }); + const int size = 5; + int count = (data.Length - 4) / size; + + var rates = new byte[count]; + for (int i = 0; i < rates.Length; i++) + rates[i] = data[4 + i]; + + Rates = rates; + Slots = ReadSlots(data, count, 4 + count, game); } - - // Some maps have two tables. Fortunately, there's only two. Add the second table. - areas.Add(new EncounterArea2 { Location = 0x1B, Slots = f[1].Slots }); // Olivine City (0: Harbor, 1: City) - areas.Add(new EncounterArea2 { Location = 0x2E, Slots = f[3].Slots }); // Silver Cave (2: Inside, 3: Outside) - return areas.ToArray(); - } - - public static EncounterArea2[] GetArray2Headbutt(byte[] data) - { - int ofs = 0; - return GetAreas2Headbutt(data, ref ofs).ToArray(); - } - - private static EncounterSlot2[] GetSlots2GrassWater(byte[] data, ref int ofs, SlotType t, int slotSets, int slotCount) - { - byte[] rates = new byte[slotSets]; - for (int i = 0; i < rates.Length; i++) - rates[i] = data[ofs++]; - - var slots = EncounterSlot2.ReadSlots(data, ref ofs, slotSets * slotCount, t, rates[0]); - if (slotSets <= 1) - return slots; - - for (int i = 0; i < slotCount; i++) + else { - slots[i].Time = EncounterTime.Morning; - } - for (int r = 1; r < slotSets; r++) - { - for (int i = 0; i < slotCount; i++) - { - int index = i + (r * slotCount); - slots[index].Rate = rates[r]; - slots[index].SlotNumber = i; - slots[index].Time = r == 1 ? EncounterTime.Day : EncounterTime.Night; - } - } + Rate = rate; - return slots; + const int size = 4; + int count = (data.Length - 4) / size; + Rates = type == SlotType.BugContest ? BCC_SlotRates : (type == SlotType.Grass) ? RatesGrass : RatesSurf; + Slots = ReadSlots(data, count, 4, game); + } } - private static EncounterSlot2[] GetSlots2Fishing(byte[] data, ref int ofs, SlotType t) + private EncounterSlot2[] ReadSlots(byte[] data, int count, int start, GameVersion game) { - // slot set ends with final slot having 0xFF 0x** 0x** - const int size = 3; - int end = ofs; // scan for count - while (data[end] != 0xFF) - end += size; - var count = ((end - ofs) / size) + 1; var slots = new EncounterSlot2[count]; for (int i = 0; i < slots.Length; i++) { - int rate = data[ofs++]; - int species = data[ofs++]; - int level = data[ofs++]; - var type = species == 0 ? SlotType.Special : t; // day/night specific; - slots[i] = new EncounterSlot2(species, level, level, rate, type, i); + int offset = start + (4 * i); + int species = data[offset + 0]; + int slotNum = data[offset + 1]; + int min = data[offset + 2]; + int max = data[offset + 3]; + slots[i] = new EncounterSlot2(this, species, min, max, slotNum, game); } + return slots; } - private static EncounterSlot2[] GetSlots2Headbutt(byte[] data, ref int ofs, SlotType t) - { - // slot set ends in 0xFF - var slots = new List(); - int tableCount = t == SlotType.Headbutt ? 2 : 1; - SlotType slottype = t; - int slot = 0; - while (tableCount != 0) - { - if (t == SlotType.Headbutt) - slottype = tableCount == 2 ? SlotType.Headbutt_Special : SlotType.Headbutt; - int rate = data[ofs++]; - if (rate == 0xFF) // end of table - { - tableCount--; - continue; - } - - int species = data[ofs++]; - int level = data[ofs++]; - - slots.Add(new EncounterSlot2(species, level, level, rate, slottype, slot++)); - } - return slots.ToArray(); - } - - private static IEnumerable GetAreas2(byte[] data, ref int ofs, SlotType t, int slotSets, int slotCount) - { - var areas = new List(); - while (data[ofs] != 0xFF) // end - { - var location = data[ofs++] << 8 | data[ofs++]; - var slots = GetSlots2GrassWater(data, ref ofs, t, slotSets, slotCount); - var area = new EncounterArea2 - { - Location = location, - Slots = slots, - }; - foreach (var slot in slots) - slot.Area = area; - areas.Add(area); - } - ofs++; - return areas; - } - - private static List GetAreas2Fishing(byte[] data, ref int ofs) - { - var areas = new List(); - while (ofs != 0x18C) - { - var old = GetSlots2Fishing(data, ref ofs, SlotType.Old_Rod); - var good = GetSlots2Fishing(data, ref ofs, SlotType.Good_Rod); - var super = GetSlots2Fishing(data, ref ofs, SlotType.Super_Rod); - areas.Add(new EncounterArea2 - { - Slots = ArrayUtil.ConcatAll(old, good, super), - }); - } - - // Read TimeFishGroups - var dl = new List(); - while (ofs < data.Length) - dl.Add(new SlotTemplate(data[ofs++], data[ofs++])); - - // Add TimeSlots - foreach (var area in areas) - { - var slots = area.Slots; - for (int i = 0; i < slots.Length; i++) - { - var slot = slots[i]; - if (slot.Type != SlotType.Special) - continue; - Array.Resize(ref slots, slots.Length + 1); - Array.Copy(slots, i, slots, i + 1, slots.Length - i - 1); // shift slots down - slots[i + 1] = slot.Clone(); // differentiate copied slot - - int index = slot.LevelMin * 2; - for (int j = 0; j < 2; j++) // load special slot info - { - var s = (EncounterSlot2)slots[i + j]; - s.Species = dl[index + j].Species; - s.LevelMin = s.LevelMax = dl[index + j].Level; - s.Type = slots[i - 1].Type; // special slots are never first in a set, so copy previous type - s.Time = j == 0 ? EncounterTime.Morning | EncounterTime.Day : EncounterTime.Night; - } - } - area.Slots = slots; - } - return areas; - } - - private readonly struct SlotTemplate - { - public readonly byte Species; - public readonly byte Level; - - public SlotTemplate(byte species, byte level) - { - Species = species; - Level = level; - } - } - - private static IEnumerable GetAreas2Headbutt(byte[] data, ref int ofs) - { - // Read Location Table - var head = new List(); - var headID = new List(); - while (data[ofs] != 0xFF) - { - head.Add(new EncounterArea2 - { - Location = (data[ofs++] << 8) | data[ofs++], - //Slots = null, // later - }); - headID.Add(data[ofs++]); - } - ofs++; - - var rock = new List(); - var rockID = new List(); - while (data[ofs] != 0xFF) - { - rock.Add(new EncounterArea2 - { - Location = (data[ofs++] << 8) | data[ofs++], - //Slots = null, // later - }); - rockID.Add(data[ofs++]); - } - ofs++; - ofs += 0x16; // jump over GetTreeMons - - // Read ptr table - int[] ptr = new int[data.Length == 0x109 ? 6 : 9]; // GS : C - for (int i = 0; i < ptr.Length; i++) - ptr[i] = data[ofs++] | (data[ofs++] << 8); - - int baseOffset = ptr.Min() - ofs; - - // Read Tables - for (int i = 0; i < head.Count; i++) - { - int o = ptr[headID[i]] - baseOffset; - head[i].Slots = GetSlots2Headbutt(data, ref o, SlotType.Headbutt); - } - for (int i = 0; i < rock.Count; i++) - { - int o = ptr[rockID[i]] - baseOffset; - rock[i].Slots = GetSlots2Headbutt(data, ref o, SlotType.Rock_Smash); - } - - return head.Concat(rock); - } - public override IEnumerable GetMatchingSlots(PKM pkm, IReadOnlyList chain) { if (!(pkm is PK2 pk2) || pk2.CaughtData == 0) @@ -306,8 +99,7 @@ private IEnumerable GetSlotsSpecificLevelTime(IReadOnlyList GetSlotsFuzzy(IReadOnlyList chai if (slot.Species != (int) Species.Unown || evo.Form >= 26) // Don't yield !? forms break; } - if (!slot.IsLevelWithinRange(evo.MinLevel, evo.Level)) + if (slot.LevelMin > evo.Level) break; yield return slot; diff --git a/PKHeX.Core/Legality/Areas/EncounterArea3.cs b/PKHeX.Core/Legality/Areas/EncounterArea3.cs index 064fafd74..e89c0f148 100644 --- a/PKHeX.Core/Legality/Areas/EncounterArea3.cs +++ b/PKHeX.Core/Legality/Areas/EncounterArea3.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; namespace PKHeX.Core { @@ -10,119 +9,96 @@ namespace PKHeX.Core /// public sealed class EncounterArea3 : EncounterArea { - private static IEnumerable GetSlots3(byte[] data, ref int ofs, int numslots, SlotType t) + public readonly int Rate; + + internal EncounterArea3() { } + + public static EncounterArea3[] GetAreas(byte[][] input, GameVersion game) { - var slots = new List(); - int Ratio = data[ofs]; - //1 byte padding - if (Ratio > 0) - ReadInSlots(data, ofs, numslots, t, slots); - ofs += 2 + (numslots * 4); - return slots; + var result = new EncounterArea3[input.Length]; + for (int i = 0; i < input.Length; i++) + result[i] = new EncounterArea3(input[i], game); + return result; } - private static void ReadInSlots(byte[] data, int ofs, int numslots, SlotType t, List slots) + public static EncounterArea3[] GetAreasSwarm(byte[][] input, GameVersion game) { - for (int i = 0; i < numslots; i++) - { - int o = ofs + (i * 4); - int species = BitConverter.ToInt16(data, o + 4); - if (species <= 0) - continue; + var result = new EncounterArea3[input.Length]; + for (int i = 0; i < input.Length; i++) + result[i] = new EncounterArea3(input[i], game, false); + return result; + } - slots.Add(new EncounterSlot3 - { - LevelMin = data[o + 2], - LevelMax = data[o + 3], - Species = species, - SlotNumber = i, - Type = t - }); + private EncounterArea3(byte[] data, GameVersion game) + { + Location = data[0] | (data[1] << 8); + Type = (SlotType)data[2]; + Rate = data[3]; + + Slots = ReadRegularSlots(data, game); + } + + private EncounterArea3(byte[] data, GameVersion game, bool _) + { + Location = data[0] | (data[1] << 8); + Type = SlotType.Swarm | SlotType.Grass; + Rate = data[3]; + + Slots = ReadSwarmSlots(data, game); + } + + private EncounterSlot3[] ReadRegularSlots(byte[] data, GameVersion game) + { + const int size = 10; + int count = (data.Length - 4) / size; + var slots = new EncounterSlot3[count]; + for (int i = 0; i < slots.Length; i++) + { + int offset = 4 + (size * i); + + int species = BitConverter.ToUInt16(data, offset + 0); + int form = data[offset + 2]; + int slotNum = data[offset + 3]; + int min = data[offset + 4]; + int max = data[offset + 5]; + + int mpi = data[offset + 6]; + int mpc = data[offset + 7]; + int sti = data[offset + 8]; + int stc = data[offset + 9]; + slots[i] = new EncounterSlot3(this, species, form, min, max, slotNum, mpi, mpc, sti, stc, game); } - } - private static IEnumerable GetSlots3Fishing(byte[] data, ref int ofs, int numslots) - { - var slots = new List(); - int Ratio = data[ofs]; - //1 byte padding - if (Ratio > 0) - ReadFishingSlots(data, ofs, numslots, slots); - ofs += 2 + (numslots * 4); return slots; } - private static void ReadFishingSlots(byte[] data, int ofs, int numslots, List slots) + private EncounterSlot3[] ReadSwarmSlots(byte[] data, GameVersion game) { - for (int i = 0; i < numslots; i++) + const int size = 14; + int count = (data.Length - 4) / size; + var slots = new EncounterSlot3[count]; + for (int i = 0; i < slots.Length; i++) { - int Species = BitConverter.ToInt16(data, ofs + 4 + (i * 4)); - if (Species <= 0) - continue; + int offset = 4 + (size * i); - var slot = new EncounterSlot3 + int species = BitConverter.ToUInt16(data, offset + 0); + // form always 0 + int slotNum = data[offset + 3]; + int min = data[offset + 4]; + int max = data[offset + 5]; + + int[] moves = { - LevelMin = data[ofs + 2 + (i * 4)], - LevelMax = data[ofs + 3 + (i * 4)], - Species = Species, + BitConverter.ToUInt16(data, offset + 6), + BitConverter.ToUInt16(data, offset + 8), + BitConverter.ToUInt16(data, offset + 10), + BitConverter.ToUInt16(data, offset + 12), }; - if (i < 2) - { - slot.Type = SlotType.Old_Rod; - slot.SlotNumber = i; // 0,1 - } - else if (i < 5) - { - slot.Type = SlotType.Good_Rod; - slot.SlotNumber = i - 2; // 0,1,2 - } - else - { - slot.Type = SlotType.Super_Rod; - slot.SlotNumber = i - 5; // 0,1,2,3,4 - } - slots.Add(slot); + slots[i] = new EncounterSlot3Swarm(this, species, min, max, slotNum, game, moves); } - } - private static EncounterArea3 GetArea3(byte[] data) - { - var HaveGrassSlots = data[1] == 1; - var HaveSurfSlots = data[2] == 1; - var HaveRockSmashSlots = data[3] == 1; - var HaveFishingSlots = data[4] == 1; - - int offset = 5; - var slots = new List(); - if (HaveGrassSlots) - slots.AddRange(GetSlots3(data, ref offset, 12, SlotType.Grass)); - if (HaveSurfSlots) - slots.AddRange(GetSlots3(data, ref offset, 5, SlotType.Surf)); - if (HaveRockSmashSlots) - slots.AddRange(GetSlots3(data, ref offset, 5, SlotType.Rock_Smash)); - if (HaveFishingSlots) - slots.AddRange(GetSlots3Fishing(data, ref offset, 10)); - - var area = new EncounterArea3 - { - Location = data[0], - Slots = slots.ToArray() - }; - foreach (var slot in area.Slots) - slot.Area = area; - - return area; - } - - /// - /// Gets the encounter areas with information from Generation 3 data. - /// - /// Raw data, one byte array per encounter area - /// Array of encounter areas. - public static EncounterArea3[] GetArray3(byte[][] entries) - { - return entries.Select(GetArea3).Where(Area => Area.Slots.Length != 0).ToArray(); + return slots; } public override IEnumerable GetMatchingSlots(PKM pkm, IReadOnlyList chain) @@ -165,7 +141,7 @@ private IEnumerable GetSlotsFuzzy(IReadOnlyList chai if (slot.Form != evo.Form) break; - if (!slot.IsLevelWithinRange(evo.MinLevel, evo.Level)) + if (slot.LevelMin > evo.Level) break; yield return slot; diff --git a/PKHeX.Core/Legality/Areas/EncounterArea32.cs b/PKHeX.Core/Legality/Areas/EncounterArea32.cs deleted file mode 100644 index 16d4dbdc4..000000000 --- a/PKHeX.Core/Legality/Areas/EncounterArea32.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; - -namespace PKHeX.Core -{ - /// - /// - /// Base encounter class for manually repacked areas - /// - /// - /// Encounter Data is stored in the following format: (u16 Location, n*[u16 Species/Form, u8 Min, u8 Max]), hence the 32bit name - /// - public abstract class EncounterArea32 : EncounterArea - { - /// - /// Gets an array of areas from an array of raw area data - /// - /// Simplified raw format of an Area - /// Array of areas - public static A[] GetArray(byte[][] entries) - where A : EncounterArea32, new() - where S : EncounterSlot, new() - { - var data = new A[entries.Length]; - for (int i = 0; i < data.Length; i++) - { - var loc = data[i] = new A(); - loc.LoadSlots(entries[i]); - } - return data; - } - - private void LoadSlots(byte[] areaData) where S : EncounterSlot, new() - { - var count = (areaData.Length - 2) / 4; - Location = BitConverter.ToUInt16(areaData, 0); - Slots = new EncounterSlot[count]; - for (int i = 0; i < Slots.Length; i++) - { - int ofs = 2 + (i * 4); - ushort SpecForm = BitConverter.ToUInt16(areaData, ofs); - Slots[i] = new S - { - Species = SpecForm & 0x7FF, - Form = SpecForm >> 11, - LevelMin = areaData[ofs + 2], - LevelMax = areaData[ofs + 3], - }; - } - foreach (var slot in Slots) - slot.Area = this; - } - } -} \ No newline at end of file diff --git a/PKHeX.Core/Legality/Areas/EncounterArea3XD.cs b/PKHeX.Core/Legality/Areas/EncounterArea3XD.cs new file mode 100644 index 000000000..5928a76c2 --- /dev/null +++ b/PKHeX.Core/Legality/Areas/EncounterArea3XD.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; + +namespace PKHeX.Core +{ + /// + /// + /// encounter area + /// + public sealed class EncounterArea3XD : EncounterArea + { + public EncounterArea3XD(int loc, int s0, int l0, int s1, int l1, int s2, int l2) + { + Location = loc; + Type = SlotType.Grass; + Slots = new[] + { + new EncounterSlot3PokeSpot(this, s0, 10, l0, 0), + new EncounterSlot3PokeSpot(this, s1, 10, l1, 1), + new EncounterSlot3PokeSpot(this, s2, 10, l2, 2), + }; + } + + public override IEnumerable GetMatchingSlots(PKM pkm, IReadOnlyList chain) + { + if (pkm.Format != 3) // Met Location and Met Level are changed on PK3->PK4 + return GetSlotsFuzzy(chain); + if (pkm.Met_Location != Location) + return Array.Empty(); + return GetSlotsMatching(chain, pkm.Met_Level); + } + + private IEnumerable GetSlotsMatching(IReadOnlyList chain, int lvl) + { + foreach (var slot in Slots) + { + foreach (var evo in chain) + { + if (slot.Species != evo.Species) + continue; + + if (slot.Form != evo.Form) + break; + if (!slot.IsLevelWithinRange(lvl)) + break; + + yield return slot; + break; + } + } + } + + private IEnumerable GetSlotsFuzzy(IReadOnlyList chain) + { + foreach (var slot in Slots) + { + foreach (var evo in chain) + { + if (slot.Species != evo.Species) + continue; + + if (slot.Form != evo.Form) + break; + if (slot.LevelMin > evo.Level) + break; + + yield return slot; + break; + } + } + } + } +} diff --git a/PKHeX.Core/Legality/Areas/EncounterArea4.cs b/PKHeX.Core/Legality/Areas/EncounterArea4.cs index c34d993c9..40b1ce76b 100644 --- a/PKHeX.Core/Legality/Areas/EncounterArea4.cs +++ b/PKHeX.Core/Legality/Areas/EncounterArea4.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; namespace PKHeX.Core { @@ -8,57 +7,54 @@ namespace PKHeX.Core /// /// encounter area /// - public abstract class EncounterArea4 : EncounterArea + public sealed class EncounterArea4 : EncounterArea { - /// - /// Reads the GBA Pak Special slots, cloning data from the area's base encounter slots. - /// - /// - /// These special slots only contain the info of species id; the level is copied from the corresponding index. - /// - /// Encounter binary data - /// Offset to read from - /// DP/Pt slotSize = 4 bytes/entry, HG/SS slotSize = 2 bytes/entry - /// Slots from regular encounter table that end up replaced by in-game conditions - /// Slot indexes to replace with read species IDs - /// Slot type of the special encounter - protected static List GetSlots4GrassSlotReplace(byte[] data, int ofs, int slotSize, EncounterSlot[] ReplacedSlots, int[] slotnums, SlotType t = SlotType.Grass) - { - var slots = new List(); + public readonly EncounterType TypeEncounter; + public readonly int Rate; - int numslots = slotnums.Length; - for (int i = 0; i < numslots; i++) + public static EncounterArea4[] GetAreas(byte[][] input, GameVersion game) + { + var result = new EncounterArea4[input.Length]; + for (int i = 0; i < input.Length; i++) + result[i] = new EncounterArea4(input[i], game); + return result; + } + + private EncounterArea4(byte[] data, GameVersion game) + { + Location = data[0] | (data[1] << 8); + Type = (SlotType)data[2]; + Rate = data[3]; + TypeEncounter = (EncounterType) BitConverter.ToUInt16(data, 4); + + Slots = ReadRegularSlots(data, game); + } + + private EncounterSlot4[] ReadRegularSlots(byte[] data, GameVersion game) + { + const int size = 10; + int count = (data.Length - 6) / size; + var slots = new EncounterSlot4[count]; + for (int i = 0; i < slots.Length; i++) { - var baseSlot = ReplacedSlots[slotnums[i]]; - if (baseSlot.LevelMin <= 0) - continue; + int offset = 6 + (size * i); - int species = BitConverter.ToUInt16(data, ofs + (i / (4 / slotSize) * slotSize)); - if (species <= 0 || baseSlot.Species == species) // Empty or duplicate - continue; + int species = BitConverter.ToUInt16(data, offset + 0); + int form = data[offset + 2]; + int slotNum = data[offset + 3]; + int min = data[offset + 4]; + int max = data[offset + 5]; - var slot = (EncounterSlot4)baseSlot.Clone(); - slot.Species = species; - slot.Type = t; - slot.SlotNumber = i; - slots.Add(slot); + int mpi = data[offset + 6]; + int mpc = data[offset + 7]; + int sti = data[offset + 8]; + int stc = data[offset + 9]; + slots[i] = new EncounterSlot4(this, species, form, min, max, slotNum, mpi, mpc, sti, stc, game); } + return slots; } - protected static IEnumerable MarkStaticMagnetExtras(IEnumerable>> product) - { - var trackPermute = new List(); - foreach (var p in product) - MarkStaticMagnetPermute(p.SelectMany(z => z), trackPermute); - return trackPermute; - } - - protected static void MarkStaticMagnetPermute(IEnumerable grp, List trackPermute) - { - EncounterUtil.MarkEncountersStaticMagnetPullPermutation(grp, PersonalTable.HGSS, trackPermute); - } - public override IEnumerable GetMatchingSlots(PKM pkm, IReadOnlyList chain) { if (pkm.Format != 4) // Met Location and Met Level are changed on PK4->PK5 @@ -77,7 +73,7 @@ private IEnumerable GetSlotsMatching(IReadOnlyList c if (slot.Species != evo.Species) continue; - if (slot.Form != evo.Form && !Legal.WildChangeFormAfter.Contains(slot.Species)) + if (slot.Form != evo.Form && !Legal.WildChangeFormAfter.Contains(slot.Species) && slot.Species != (int)Species.Unown) break; if (!slot.IsLevelWithinRange(lvl)) break; @@ -97,9 +93,9 @@ private IEnumerable GetSlotsFuzzy(IReadOnlyList chai if (slot.Species != evo.Species) continue; - if (slot.Form != evo.Form && !Legal.WildChangeFormAfter.Contains(slot.Species)) + if (slot.Form != evo.Form && !Legal.WildChangeFormAfter.Contains(slot.Species) && slot.Species != (int)Species.Unown) break; - if (!slot.IsLevelWithinRange(evo.MinLevel, evo.Level)) + if (slot.LevelMin > evo.Level) break; yield return slot; diff --git a/PKHeX.Core/Legality/Areas/EncounterArea4DPPt.cs b/PKHeX.Core/Legality/Areas/EncounterArea4DPPt.cs deleted file mode 100644 index 145a7df28..000000000 --- a/PKHeX.Core/Legality/Areas/EncounterArea4DPPt.cs +++ /dev/null @@ -1,204 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace PKHeX.Core -{ - /// - /// - /// encounter area - /// - public sealed class EncounterArea4DPPt : EncounterArea4 - { - /// - /// Gets the encounter areas with information from Generation 4 Diamond, Pearl and Platinum data. - /// - /// Raw data, one byte array per encounter area - /// Platinum flag (for Trophy Garden slot insertion) - /// Array of encounter areas. - public static EncounterArea4DPPt[] GetArray4DPPt(byte[][] entries, bool pt = false) - { - return entries.Select(z => GetArea4DPPt(z, pt)).Where(Area => Area.Slots.Length != 0).ToArray(); - } - - private static EncounterSlot4[] GetSlots4GrassDPPt(byte[] data, int ofs, int numslots, SlotType t) - { - var slots = new EncounterSlot4[numslots]; - - for (int i = 0; i < numslots; i++) - { - int o = ofs + (i * 8); - int level = data[o]; - int species = BitConverter.ToInt32(data, o + 4); - slots[i] = new EncounterSlot4 - { - LevelMax = level, - LevelMin = level, - Species = species, - SlotNumber = i, - Type = t - }; - } - return slots; - } - - private static IEnumerable GetSlots4WaterFishingDPPt(byte[] data, int ofs, int numslots, SlotType t) - { - var slots = new List(); - for (int i = 0; i < numslots; i++) - { - // max, min, unused, unused, [32bit species] - int Species = BitConverter.ToInt32(data, ofs + 4 + (i * 8)); - if (Species <= 0) - continue; - // Fishing and Surf slots without a species ID are not added - // DPPt does not have fishing or surf swarms, and does not have any Rock Smash encounters. - slots.Add(new EncounterSlot4 - { - LevelMax = data[ofs + 0 + (i * 8)], - LevelMin = data[ofs + 1 + (i * 8)], - Species = Species, - SlotNumber = i, - Type = t - }); - } - EncounterUtil.MarkEncountersStaticMagnetPull(slots, PersonalTable.HGSS); - return slots; - } - - private static EncounterArea4DPPt GetArea4DPPt(byte[] data, bool pt = false) - { - var Slots = new List(); - - int location = BitConverter.ToUInt16(data, 0x00); - var GrassRatio = BitConverter.ToInt32(data, 0x02); - if (GrassRatio > 0) - { - var GrassSlots = GetSlots4GrassDPPt(data, 0x06, 12, SlotType.Grass); - //Swarming slots replace slots 0 and 1 - var swarm = GetSlots4GrassSlotReplace(data, 0x66, 4, GrassSlots, Legal.Slot4_Swarm, SlotType.Swarm); - //Morning and Night slots replace slots 2 and 3 - var morning = GetSlots4GrassSlotReplace(data, 0x6E, 4, GrassSlots, Legal.Slot4_Time); // Morning - var night = GetSlots4GrassSlotReplace(data, 0x76, 4, GrassSlots, Legal.Slot4_Time); // Night - //Pokéradar slots replace slots 4,5,10 and 11 - //Pokéradar is marked with different slot type because it have different PID-IV generationn - var radar = GetSlots4GrassSlotReplace(data, 0x7E, 4, GrassSlots, Legal.Slot4_Radar, SlotType.Pokeradar); - - //24 bytes padding - - //Dual Slots replace slots 8 and 9 - var ruby = GetSlots4GrassSlotReplace(data, 0xA6, 4, GrassSlots, Legal.Slot4_Dual); // Ruby - var sapphire = GetSlots4GrassSlotReplace(data, 0xAE, 4, GrassSlots, Legal.Slot4_Dual); // Sapphire - var emerald = GetSlots4GrassSlotReplace(data, 0xB6, 4, GrassSlots, Legal.Slot4_Dual); // Emerald - var firered = GetSlots4GrassSlotReplace(data, 0xBE, 4, GrassSlots, Legal.Slot4_Dual); // FireRed - var leafgreen = GetSlots4GrassSlotReplace(data, 0xC6, 4, GrassSlots, Legal.Slot4_Dual); // LeafGreen - - Slots.AddRange(GrassSlots); - Slots.AddRange(swarm); - Slots.AddRange(morning); - Slots.AddRange(night); - Slots.AddRange(radar); - Slots.AddRange(ruby); - Slots.AddRange(sapphire); - Slots.AddRange(emerald); - Slots.AddRange(firered); - Slots.AddRange(leafgreen); - - // Permute Static-Magnet Pull combinations - // [None/Swarm]-[None/Morning/Night]-[None/Radar]-[None/R/S/E/F/L] [None/TrophyGarden] - // 2 * 3 * 2 * 6 = 72 different combinations of slots (more with trophy garden) - var regular = new List> { GrassSlots.Where(z => z.SlotNumber == 6 || z.SlotNumber == 7).ToList() }; // every other slot is in the product - var pair0 = new List> { GrassSlots.Where(z => Legal.Slot4_Swarm.Contains(z.SlotNumber)).ToList() }; - var pair1 = new List> { GrassSlots.Where(z => Legal.Slot4_Time.Contains(z.SlotNumber)).ToList() }; - var pair2 = new List> { GrassSlots.Where(z => Legal.Slot4_Radar.Contains(z.SlotNumber)).ToList() }; - var pair3 = new List> { GrassSlots.Where(z => Legal.Slot4_Dual.Contains(z.SlotNumber)).ToList() }; - if (swarm.Count != 0) pair0.Add(swarm); - if (morning.Count != 0) pair1.Add(morning); if (night.Count != 0) pair1.Add(night); - if (radar.Count != 0) pair2.Add(radar); - if (ruby.Count != 0) pair3.Add(ruby); if (sapphire.Count != 0) pair3.Add(sapphire); if (emerald.Count != 0) pair3.Add(emerald); - if (firered.Count != 0) pair3.Add(firered); if (leafgreen.Count != 0) pair3.Add(leafgreen); - if (location == 68) // Trophy Garden - { - // Occupy Slots 6 & 7 - var species = pt ? Encounters4.TrophyPt : Encounters4.TrophyDP; - var slots = new List(); - foreach (var s in species) - { - var slot = (EncounterSlot4)regular[0][0].Clone(); - slot.Species = s; - slots.Add(slot); - - slot = (EncounterSlot4)regular[0][1].Clone(); - slot.Species = s; - slots.Add(slot); - } - Slots.AddRange(slots); - // get all permutations of trophy inhabitants - var trophy = regular[0].Concat(slots).ToArray(); - for (int i = 0; i < trophy.Length; i++) - { - for (int j = i + 1; j < trophy.Length; j++) - regular.Add(new List { trophy[i], trophy[j] }); - } - } - - var set = new[] { regular, pair0, pair1, pair2, pair3 }; - var product = set.CartesianProduct(); - var extra = MarkStaticMagnetExtras(product); - Slots.AddRange(extra); - } - - var SurfRatio = BitConverter.ToInt32(data, 0xCE); - if (SurfRatio > 0) - Slots.AddRange(GetSlots4WaterFishingDPPt(data, 0xD2, 5, SlotType.Surf)); - - //44 bytes padding - - var OldRodRatio = BitConverter.ToInt32(data, 0x126); - if (OldRodRatio > 0) - Slots.AddRange(GetSlots4WaterFishingDPPt(data, 0x12A, 5, SlotType.Old_Rod)); - - var GoodRodRatio = BitConverter.ToInt32(data, 0x152); - if (GoodRodRatio > 0) - Slots.AddRange(GetSlots4WaterFishingDPPt(data, 0x156, 5, SlotType.Good_Rod)); - - var SuperRodRatio = BitConverter.ToInt32(data, 0x17E); - if (SuperRodRatio > 0) - Slots.AddRange(GetSlots4WaterFishingDPPt(data, 0x182, 5, SlotType.Super_Rod)); - - var Area4 = new EncounterArea4DPPt - { - Location = location, - Slots = Slots.ToArray() - }; - foreach (var slot in Area4.Slots) - slot.Area = Area4; - - return Area4; - } - - private EncounterArea4DPPt Clone(int location) => new EncounterArea4DPPt { Slots = Slots, Location = location}; - - public EncounterArea4DPPt[] Clone(int[] locations) - { - var Areas = new EncounterArea4DPPt[locations.Length]; - for (int i = 0; i < locations.Length; i++) - Areas[i] = Clone(locations[i]); - return Areas; - } - } - - public static class DPEncounterExtensions - { - public static IEnumerable> CartesianProduct(this IEnumerable> sequences) - { - IEnumerable> emptyProduct = new[] { Enumerable.Empty() }; - return sequences.Aggregate( - emptyProduct, - (accumulator, sequence) => - from accseq in accumulator - from item in sequence - select accseq.Concat(new[] { item })); - } - } -} \ No newline at end of file diff --git a/PKHeX.Core/Legality/Areas/EncounterArea4HGSS.cs b/PKHeX.Core/Legality/Areas/EncounterArea4HGSS.cs deleted file mode 100644 index 207b59f3f..000000000 --- a/PKHeX.Core/Legality/Areas/EncounterArea4HGSS.cs +++ /dev/null @@ -1,206 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace PKHeX.Core -{ - /// - /// - /// encounter area - /// - public sealed class EncounterArea4HGSS : EncounterArea4 - { - /// - /// Gets the encounter areas with information from Generation 4 Heart Gold and Soul Silver data. - /// - /// Raw data, one byte array per encounter area - /// Array of encounter areas. - public static EncounterArea4HGSS[] GetArray4HGSS(byte[][] entries) - { - return entries.Select(GetArea4HGSS).Where(Area => Area.Slots.Length != 0).ToArray(); - } - - /// - /// Gets the encounter areas with information from Generation 4 Heart Gold and Soul Silver Headbutt tree data. - /// - /// Raw data, one byte array per encounter area - /// Array of encounter areas. - public static EncounterArea4HGSS[] GetArray4HGSS_Headbutt(byte[][] entries) - { - return entries.Select(GetArea4HeadbuttHGSS).Where(Area => Area.Slots.Length != 0).ToArray(); - } - - private static EncounterSlot4[] GetSlots4GrassHGSS(byte[] data, int ofs, int numslots, SlotType t) - { - var slots = new EncounterSlot4[numslots * 3]; - // First 36 slots are morning, day and night grass slots - // The order is 12 level values, 12 morning species, 12 day species and 12 night species - for (int i = 0; i < numslots; i++) - { - int level = data[ofs + i]; - int species = BitConverter.ToUInt16(data, ofs + numslots + (i * 2)); - slots[i] = new EncounterSlot4 - { - LevelMin = level, - LevelMax = level, - Species = species, - SlotNumber = i, - Type = t - }; - slots[numslots + i] = (EncounterSlot4)slots[i].Clone(); - slots[numslots + i].Species = BitConverter.ToUInt16(data, ofs + (numslots * 3) + (i * 2)); - slots[numslots + i].Type = t; - slots[(numslots * 2) + i] = (EncounterSlot4)slots[i].Clone(); - slots[(numslots * 2) + i].Species = BitConverter.ToUInt16(data, ofs + (numslots * 5) + (i * 2)); - slots[(numslots * 2) + i].Type = t; - } - - return slots; - } - - private static IEnumerable GetSlots4WaterFishingHGSS(byte[] data, int ofs, int numslots, SlotType t) - { - var slots = new List(); - for (int i = 0; i < numslots; i++) - { - // min, max, [16bit species] - int Species = BitConverter.ToInt16(data, ofs + 2 + (i * 4)); - if (t == SlotType.Rock_Smash && Species <= 0) - continue; - // Fishing and surf Slots without a species ID are added too; these are needed for the swarm encounters. - // These empty slots will will be deleted after we add swarm slots. - - slots.Add(new EncounterSlot4 - { - LevelMin = data[ofs + 0 + (i * 4)], - LevelMax = data[ofs + 1 + (i * 4)], - Species = Species, - SlotNumber = i, - Type = t - }); - } - EncounterUtil.MarkEncountersStaticMagnetPull(slots, PersonalTable.HGSS); - return slots; - } - - private static EncounterArea4HGSS GetArea4HGSS(byte[] data) - { - var Slots = new List(); - - var GrassRatio = data[0x02]; - var SurfRatio = data[0x03]; - var RockSmashRatio = data[0x04]; - var OldRodRatio = data[0x05]; - var GoodRodRatio = data[0x06]; - var SuperRodRatio = data[0x07]; - // 2 bytes padding - - if (GrassRatio > 0) - { - // First 36 slots are morning, day and night grass slots - // The order is 12 level values, 12 morning species, 12 day species and 12 night species - var GrassSlots = GetSlots4GrassHGSS(data, 0x0A, 12, SlotType.Grass); - //Grass slots with species = 0 are added too, it is needed for the swarm encounters, it will be deleted after swarms are added - - // Hoenn Sound and Sinnoh Sound replace slots 4 and 5 - var hoenn = GetSlots4GrassSlotReplace(data, 0x5E, 2, GrassSlots, Legal.Slot4_Sound); // Hoenn - var sinnoh = GetSlots4GrassSlotReplace(data, 0x62, 2, GrassSlots, Legal.Slot4_Sound); // Sinnoh - - Slots.AddRange(GrassSlots); - Slots.AddRange(hoenn); - Slots.AddRange(sinnoh); - - // Static / Magnet Pull - var grass1 = GrassSlots.Take(12).ToList(); - var grass2 = GrassSlots.Skip(12).Take(12).ToList(); - var grass3 = GrassSlots.Skip(24).ToList(); - // Swarm slots do not displace electric/steel types, with exception of SoulSilver Mawile (which doesn't displace) -- handle separately - - foreach (var time in new[] { grass1, grass2, grass3 }) - { - // non radio - var regular = time.Where(z => !Legal.Slot4_Sound.Contains(z.SlotNumber)).ToList(); // every other slot is in the product - var radio = new List> { time.Where(z => Legal.Slot4_Sound.Contains(z.SlotNumber)).ToList() }; - if (hoenn.Count > 0) - radio.Add(hoenn); - if (sinnoh.Count > 0) - radio.Add(sinnoh); - - var extra = new List(); - foreach (var t in radio) - MarkStaticMagnetPermute(regular.Concat(t), extra); - Slots.AddRange(extra); - } - } - - if (SurfRatio > 0) - Slots.AddRange(GetSlots4WaterFishingHGSS(data, 0x66, 5, SlotType.Surf)); - - if (RockSmashRatio > 0) - Slots.AddRange(GetSlots4WaterFishingHGSS(data, 0x7A, 2, SlotType.Rock_Smash)); - - if (OldRodRatio > 0) - Slots.AddRange(GetSlots4WaterFishingHGSS(data, 0x82, 5, SlotType.Old_Rod)); - - if (GoodRodRatio > 0) - Slots.AddRange(GetSlots4WaterFishingHGSS(data, 0x96, 5, SlotType.Good_Rod)); - - if (SuperRodRatio > 0) - Slots.AddRange(GetSlots4WaterFishingHGSS(data, 0xAA, 5, SlotType.Super_Rod)); - - // Last 6 bytes only have species ID info - if (data[0xC2] == 120) // Location = 182, 127, 130, 132, 167, 188, 210 - Slots.AddRange(SlotsHGSS_Staryu); - - var Area4 = new EncounterArea4HGSS - { - Location = BitConverter.ToUInt16(data, 0x00), - Slots = Slots.ToArray() - }; - foreach (var slot in Area4.Slots) - slot.Area = Area4; - return Area4; - } - - private static readonly EncounterSlot4[] SlotsHGSS_Staryu = - { - new EncounterSlot4 { Species = 120, LevelMin = 20, LevelMax = 20, Type = SlotType.Good_Rod }, - new EncounterSlot4 { Species = 120, LevelMin = 40, LevelMax = 40, Type = SlotType.Super_Rod }, - }; - - private static EncounterArea4HGSS GetArea4HeadbuttHGSS(byte[] data) - { - if (data.Length < 78) - return new EncounterArea4HGSS(); // bad data - - //2 byte location ID (defer to end) - //4 bytes padding - var Slots = new List(); - - // 00-11 Normal trees - // 12-17 Special trees - for (int i = 0; i < 18; i++) - { - int Species = BitConverter.ToInt16(data, 6 + (i * 4)); - if (Species <= 0) - continue; - Slots.Add(new EncounterSlot4 - { - Species = Species, - LevelMin = data[8 + (i * 4)], - LevelMax = data[9 + (i * 4)], - Type = i <= 11 ? SlotType.Headbutt : SlotType.Headbutt_Special - }); - } - - var Area = new EncounterArea4HGSS - { - Location = BitConverter.ToUInt16(data, 0), - Slots = Slots.ToArray() - }; - foreach (var slot in Area.Slots) - slot.Area = Area; - return Area; - } - } -} \ No newline at end of file diff --git a/PKHeX.Core/Legality/Areas/EncounterArea5.cs b/PKHeX.Core/Legality/Areas/EncounterArea5.cs index 6d828c5d0..6b6395ba9 100644 --- a/PKHeX.Core/Legality/Areas/EncounterArea5.cs +++ b/PKHeX.Core/Legality/Areas/EncounterArea5.cs @@ -1,10 +1,68 @@ -namespace PKHeX.Core +using System; +using System.Collections.Generic; + +namespace PKHeX.Core { /// /// /// encounter area /// - public sealed class EncounterArea5 : EncounterArea32 + public sealed class EncounterArea5 : EncounterArea { + public static EncounterArea5[] GetAreas(byte[][] input, GameVersion game) + { + var result = new EncounterArea5[input.Length]; + for (int i = 0; i < input.Length; i++) + result[i] = new EncounterArea5(input[i], game); + return result; + } + + private EncounterArea5(byte[] data, GameVersion game) + { + Location = data[0] | (data[1] << 8); + Type = (SlotType)data[2]; + + Slots = ReadSlots(data, game); + } + + private EncounterSlot5[] ReadSlots(byte[] data, GameVersion game) + { + const int size = 4; + int count = (data.Length - 4) / size; + var slots = new EncounterSlot5[count]; + for (int i = 0; i < slots.Length; i++) + { + int offset = 4 + (size * i); + ushort SpecForm = BitConverter.ToUInt16(data, offset); + int species = SpecForm & 0x3FF; + int form = SpecForm >> 11; + int min = data[offset + 2]; + int max = data[offset + 3]; + slots[i] = new EncounterSlot5(this, species, form, min, max, game); + } + + return slots; + } + + public override IEnumerable GetMatchingSlots(PKM pkm, IReadOnlyList chain) + { + foreach (var slot in Slots) + { + foreach (var evo in chain) + { + if (slot.Species != evo.Species) + continue; + + if (!slot.IsLevelWithinRange(pkm.Met_Level)) + break; + + if (slot.Form != evo.Form && !Legal.WildChangeFormAfter.Contains(slot.Species)) + break; + + yield return slot; + break; + } + } + } } } \ No newline at end of file diff --git a/PKHeX.Core/Legality/Areas/EncounterArea6AO.cs b/PKHeX.Core/Legality/Areas/EncounterArea6AO.cs index 282ea710d..5841a7c90 100644 --- a/PKHeX.Core/Legality/Areas/EncounterArea6AO.cs +++ b/PKHeX.Core/Legality/Areas/EncounterArea6AO.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace PKHeX.Core { @@ -6,8 +7,43 @@ namespace PKHeX.Core /// /// encounter area /// - public sealed class EncounterArea6AO : EncounterArea32 + public sealed class EncounterArea6AO : EncounterArea { + public static EncounterArea6AO[] GetAreas(byte[][] input, GameVersion game) + { + var result = new EncounterArea6AO[input.Length]; + for (int i = 0; i < input.Length; i++) + result[i] = new EncounterArea6AO(input[i], game); + return result; + } + + private EncounterArea6AO(byte[] data, GameVersion game) + { + Location = data[0] | (data[1] << 8); + Type = (SlotType)data[2]; + + Slots = ReadSlots(data, game); + } + + private EncounterSlot6AO[] ReadSlots(byte[] data, GameVersion game) + { + const int size = 4; + int count = (data.Length - 4) / size; + var slots = new EncounterSlot6AO[count]; + for (int i = 0; i < slots.Length; i++) + { + int offset = 4 + (size * i); + ushort SpecForm = BitConverter.ToUInt16(data, offset); + int species = SpecForm & 0x3FF; + int form = SpecForm >> 11; + int min = data[offset + 2]; + int max = data[offset + 3]; + slots[i] = new EncounterSlot6AO(this, species, form, min, max, game); + } + + return slots; + } + private const int FluteBoostMin = 4; // White Flute decreases levels. private const int FluteBoostMax = 4; // Black Flute increases levels. private const int DexNavBoost = 30; // Maximum DexNav chain @@ -23,7 +59,7 @@ public override IEnumerable GetMatchingSlots(PKM pkm, IReadOnlyLi if (slot.Species != evo.Species) continue; - var boostMax = slot.Type != SlotType.Rock_Smash ? DexNavBoost : FluteBoostMax; + var boostMax = Type != SlotType.Rock_Smash ? DexNavBoost : FluteBoostMax; const int boostMin = FluteBoostMin; if (!slot.IsLevelWithinRange(pkm.Met_Level, boostMin, boostMax)) break; @@ -41,14 +77,17 @@ public override IEnumerable GetMatchingSlots(PKM pkm, IReadOnlyLi private static void MarkSlotDetails(PKM pkm, EncounterSlot6AO slot, EvoCriteria evo) { - bool nav = slot.AllowDexNav && (pkm.RelearnMove1 != 0 || pkm.AbilityNumber == 4); - slot.DexNav = nav; - if (slot.LevelMin > evo.MinLevel) slot.WhiteFlute = true; if (slot.LevelMax + 1 <= evo.MinLevel && evo.MinLevel <= slot.LevelMax + FluteBoostMax) slot.BlackFlute = true; - if (slot.LevelMax != evo.MinLevel && slot.AllowDexNav) + + if (!slot.CanDexNav) + return; + + if (slot.LevelMax != evo.MinLevel) + slot.DexNav = true; + if (pkm.RelearnMove1 != 0 || pkm.AbilityNumber == 4) slot.DexNav = true; } } diff --git a/PKHeX.Core/Legality/Areas/EncounterArea6XY.cs b/PKHeX.Core/Legality/Areas/EncounterArea6XY.cs index 7a7b553e2..708f20470 100644 --- a/PKHeX.Core/Legality/Areas/EncounterArea6XY.cs +++ b/PKHeX.Core/Legality/Areas/EncounterArea6XY.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace PKHeX.Core { @@ -6,8 +7,55 @@ namespace PKHeX.Core /// /// encounter area /// - public sealed class EncounterArea6XY : EncounterArea32 + public sealed class EncounterArea6XY : EncounterArea { + public static EncounterArea6XY[] GetAreas(byte[][] input, GameVersion game) + { + var result = new EncounterArea6XY[input.Length]; + for (int i = 0; i < input.Length; i++) + result[i] = new EncounterArea6XY(input[i], game); + return result; + } + + public EncounterArea6XY(ICollection species) + { + Location = 148; + Type = SlotType.FriendSafari; + + var slots = new EncounterSlot6XY[species.Count]; + int ctr = 0; + foreach (var s in species) + slots[ctr++] = new EncounterSlot6XY(this, s, 0, 30, 30, GameVersion.XY); + Slots = slots; + } + + private EncounterArea6XY(byte[] data, GameVersion game) + { + Location = data[0] | (data[1] << 8); + Type = (SlotType)data[2]; + + Slots = ReadSlots(data, game); + } + + private EncounterSlot6XY[] ReadSlots(byte[] data, GameVersion game) + { + const int size = 4; + int count = (data.Length - 4) / size; + var slots = new EncounterSlot6XY[count]; + for (int i = 0; i < slots.Length; i++) + { + int offset = 4 + (size * i); + ushort SpecForm = BitConverter.ToUInt16(data, offset); + int species = SpecForm & 0x3FF; + int form = SpecForm >> 11; + int min = data[offset + 2]; + int max = data[offset + 3]; + slots[i] = new EncounterSlot6XY(this, species, form, min, max, game); + } + + return slots; + } + private const int RandomForm = 31; private const int RandomFormVivillon = RandomForm - 1; diff --git a/PKHeX.Core/Legality/Areas/EncounterArea6XYFriendSafari.cs b/PKHeX.Core/Legality/Areas/EncounterArea6XYFriendSafari.cs deleted file mode 100644 index 29bef434a..000000000 --- a/PKHeX.Core/Legality/Areas/EncounterArea6XYFriendSafari.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System.Collections.Generic; -using System.Linq; - -namespace PKHeX.Core -{ - public class EncounterArea6XYFriendSafari : EncounterArea - { - public static bool WasFriendSafari(PKM pkm) - { - if (!pkm.XY) - return false; - if (pkm.Met_Location != 148) - return false; - if (pkm.Met_Level != 30) - return false; - if (pkm.Egg_Location != 0) - return false; - return true; - } - - public static ILookup GetArea() - { - var area = new EncounterArea6XYFriendSafari { Location = 148 }; - EncounterSlot6XY FriendSafariSlot(int d) - { - return new EncounterSlot6XY - { - Area = area, - Species = d, - LevelMin = 30, - LevelMax = 30, - Form = 0, - Type = SlotType.FriendSafari, - Version = GameVersion.XY, - }; - } - area.Slots = Legal.FriendSafari.Select(FriendSafariSlot).ToArray(); - return area.Slots.Cast().ToLookup(s => s.Species); - } - - public static IEnumerable GetValidSafariEncounters(PKM pkm) - { - var chain = EvolutionChain.GetValidPreEvolutions(pkm); - return GetValidSafariEncounters(chain); - } - - public static IEnumerable GetValidSafariEncounters(IReadOnlyList chain) - { - var valid = chain.Where(d => d.Level >= 30); - return valid.SelectMany(z => Encounters6.FriendSafari[z.Species]); - } - } -} \ No newline at end of file diff --git a/PKHeX.Core/Legality/Areas/EncounterArea7.cs b/PKHeX.Core/Legality/Areas/EncounterArea7.cs index 24654e5fa..99b2a96ca 100644 --- a/PKHeX.Core/Legality/Areas/EncounterArea7.cs +++ b/PKHeX.Core/Legality/Areas/EncounterArea7.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace PKHeX.Core { @@ -6,8 +7,43 @@ namespace PKHeX.Core /// /// encounter area /// - public sealed class EncounterArea7 : EncounterArea32 + public sealed class EncounterArea7 : EncounterArea { + public static EncounterArea7[] GetAreas(byte[][] input, GameVersion game) + { + var result = new EncounterArea7[input.Length]; + for (int i = 0; i < input.Length; i++) + result[i] = new EncounterArea7(input[i], game); + return result; + } + + private EncounterArea7(byte[] data, GameVersion game) + { + Location = data[0] | (data[1] << 8); + Type = (SlotType)data[2]; + + Slots = ReadSlots(data, game); + } + + private EncounterSlot7[] ReadSlots(byte[] data, GameVersion game) + { + const int size = 4; + int count = (data.Length - 4) / size; + var slots = new EncounterSlot7[count]; + for (int i = 0; i < slots.Length; i++) + { + int offset = 4 + (size * i); + ushort SpecForm = BitConverter.ToUInt16(data, offset); + int species = SpecForm & 0x3FF; + int form = SpecForm >> 11; + int min = data[offset + 2]; + int max = data[offset + 3]; + slots[i] = new EncounterSlot7(this, species, form, min, max, game); + } + + return slots; + } + public override IEnumerable GetMatchingSlots(PKM pkm, IReadOnlyList chain) { foreach (var slot in Slots) diff --git a/PKHeX.Core/Legality/Areas/EncounterArea7b.cs b/PKHeX.Core/Legality/Areas/EncounterArea7b.cs index edfd0431d..aaabe4756 100644 --- a/PKHeX.Core/Legality/Areas/EncounterArea7b.cs +++ b/PKHeX.Core/Legality/Areas/EncounterArea7b.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace PKHeX.Core { @@ -6,8 +7,40 @@ namespace PKHeX.Core /// /// encounter area /// - public sealed class EncounterArea7b : EncounterArea32 + public sealed class EncounterArea7b : EncounterArea { + public static EncounterArea7b[] GetAreas(byte[][] input, GameVersion game) + { + var result = new EncounterArea7b[input.Length]; + for (int i = 0; i < input.Length; i++) + result[i] = new EncounterArea7b(input[i], game); + return result; + } + + private EncounterArea7b(byte[] data, GameVersion game) + { + Location = data[0] | (data[1] << 8); + Slots = ReadSlots(data, game); + } + + private EncounterSlot7b[] ReadSlots(byte[] data, GameVersion game) + { + const int size = 4; + int count = (data.Length - 2) / size; + var slots = new EncounterSlot7b[count]; + for (int i = 0; i < slots.Length; i++) + { + int offset = 2 + (size * i); + ushort SpecForm = BitConverter.ToUInt16(data, offset); + int species = SpecForm & 0x3FF; + int min = data[offset + 2]; + int max = data[offset + 3]; + slots[i] = new EncounterSlot7b(this, species, min, max, game); + } + + return slots; + } + private const int CatchComboBonus = 1; public override IEnumerable GetMatchingSlots(PKM pkm, IReadOnlyList chain) diff --git a/PKHeX.Core/Legality/Areas/EncounterArea7g.cs b/PKHeX.Core/Legality/Areas/EncounterArea7g.cs index c2787fbc2..d9b450986 100644 --- a/PKHeX.Core/Legality/Areas/EncounterArea7g.cs +++ b/PKHeX.Core/Legality/Areas/EncounterArea7g.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; namespace PKHeX.Core { @@ -6,8 +7,56 @@ namespace PKHeX.Core /// /// encounter area for /// - public sealed class EncounterArea7g : EncounterArea32 + public sealed class EncounterArea7g : EncounterArea { + internal static EncounterArea7g[] GetArea() + { + var area = new EncounterArea7g { Location = 50, Type = SlotType.GoPark }; + static EncounterSlot GetSlot(EncounterArea7g area, int species, int form) + { + return new EncounterSlot7GO(area, species, form, 1, 40, GameVersion.GO); + } + + var obtainable = Enumerable.Range(1, 150).Concat(Enumerable.Range(808, 2)); // count : 152 + var AlolanKanto = new byte[] + { + // Level 1+ + 019, // Rattata + 020, // Raticate + 027, // Sandshrew + 028, // Sandslash + 037, // Vulpix + 038, // Ninetales + 050, // Diglett + 051, // Dugtrio + 052, // Meowth + 053, // Persian + 074, // Geodude + 075, // Graveler + 076, // Golem + 088, // Grimer + 089, // Muk + 103, // Exeggutor + 105, // Marowak + + // Level 15+ + 026, // Raichu + }; + + var regular = obtainable.Select(z => GetSlot(area, z, 0)); + var alolan = AlolanKanto.Select(z => GetSlot(area, z, 1)); + var slots = regular.Concat(alolan).ToArray(); + + slots[slots.Length - 1].LevelMin = 15; // Raichu + slots[(int)Species.Mewtwo - 1].LevelMin = 15; + slots[(int)Species.Articuno - 1].LevelMin = 15; + slots[(int)Species.Zapdos - 1].LevelMin = 15; + slots[(int)Species.Moltres - 1].LevelMin = 15; + + area.Slots = slots; + return new[] { area }; + } + public override IEnumerable GetMatchingSlots(PKM pkm, IReadOnlyList chain) { foreach (var slot in Slots) diff --git a/PKHeX.Core/Legality/Areas/EncounterArea8.cs b/PKHeX.Core/Legality/Areas/EncounterArea8.cs index addd31880..1c5c5221d 100644 --- a/PKHeX.Core/Legality/Areas/EncounterArea8.cs +++ b/PKHeX.Core/Legality/Areas/EncounterArea8.cs @@ -198,19 +198,20 @@ public abstract class EncounterAreaSH : EncounterArea /// Gets an array of areas from an array of raw area data /// /// Simplified raw format of an Area + /// Game of origin /// Array of areas - public static T[] GetArray(byte[][] entries) where T : EncounterAreaSH, new() + public static T[] GetArray(byte[][] entries, GameVersion game) where T : EncounterAreaSH, new() { T[] data = new T[entries.Length]; for (int i = 0; i < data.Length; i++) { var loc = data[i] = new T(); - loc.LoadSlots(entries[i]); + loc.LoadSlots(entries[i], game); } return data; } - private void LoadSlots(byte[] areaData) + private void LoadSlots(byte[] areaData, GameVersion game) { Location = areaData[0]; Slots = new EncounterSlot[areaData[1]]; @@ -228,11 +229,9 @@ private void LoadSlots(byte[] areaData) for (int i = 0; i < count; i++, ctr++, ofs += 2) { var specForm = BitConverter.ToUInt16(areaData, ofs); - Slots[ctr] = new EncounterSlot8(specForm, min, max, flags); + Slots[ctr] = new EncounterSlot8(this, specForm, min, max, flags, game); } } while (ctr != Slots.Length); - foreach (var slot in Slots) - slot.Area = this; } } @@ -271,7 +270,7 @@ public sealed class EncounterSlot8 : EncounterSlot public override string LongName => Weather == AreaWeather8.All ? wild : $"{wild} - {Weather.ToString().Replace("_", string.Empty)}"; public override int Generation => 8; - public EncounterSlot8(int specForm, int min, int max, AreaWeather8 weather) + public EncounterSlot8(EncounterAreaSH area, int specForm, int min, int max, AreaWeather8 weather, GameVersion game) : base(area) { Species = specForm & 0x7FF; Form = specForm >> 11; @@ -279,6 +278,7 @@ public EncounterSlot8(int specForm, int min, int max, AreaWeather8 weather) LevelMax = max; Weather = weather; + Version = game; } } } diff --git a/PKHeX.Core/Legality/Areas/EncounterAreaFake.cs b/PKHeX.Core/Legality/Areas/EncounterAreaFake.cs deleted file mode 100644 index ed64b9cb2..000000000 --- a/PKHeX.Core/Legality/Areas/EncounterAreaFake.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace PKHeX.Core -{ - /// - /// - /// Fake encounter area used to mock data - /// - public sealed class EncounterAreaFake : EncounterArea - { - public override IEnumerable GetMatchingSlots(PKM pkm, IReadOnlyList chain) => - Array.Empty(); - } -} \ No newline at end of file diff --git a/PKHeX.Core/Legality/Encounters/Data/EncounterUtil.cs b/PKHeX.Core/Legality/Encounters/Data/EncounterUtil.cs index 1a2d6aab0..140fc94f7 100644 --- a/PKHeX.Core/Legality/Encounters/Data/EncounterUtil.cs +++ b/PKHeX.Core/Legality/Encounters/Data/EncounterUtil.cs @@ -19,152 +19,6 @@ internal static class EncounterUtil return source.Where(s => s.Version.Contains(game)).ToArray(); } - /// - /// Direct fetch for data; can also be used to fetch supplementary encounter streams. - /// - /// Unpacking identification ASCII characters (first two bytes of binary) - /// Resource name (will be prefixed with "encounter_" - /// Array of encounter areas - internal static A[] GetEncounterTables(string ident, string resource) - where A : EncounterArea32, new() - where S : EncounterSlot, new() - { - byte[] mini = Util.GetBinaryResource($"encounter_{resource}.pkl"); - return EncounterArea32.GetArray(BinLinker.Unpack(mini, ident)); - } - - /// - /// Direct fetch for data; can also be used to fetch supplementary encounter streams. - /// - /// Unpacking identification ASCII characters (first two bytes of binary) - /// Resource name (will be prefixed with "encounter_") - /// Array of encounter areas - internal static T[] GetEncounterTables8(string ident, string resource) where T : EncounterAreaSH, new() - { - byte[] mini = Util.GetBinaryResource($"encounter_{resource}.pkl"); - return EncounterAreaSH.GetArray(BinLinker.Unpack(mini, ident)); - } - - /// - /// Combines slot arrays with the same . - /// - /// Input encounter areas to combine - /// Combined Array of encounter areas. No duplicate location IDs will be present. - internal static T[] AddExtraTableSlots(params T[][] tables) where T : EncounterArea, new() - { - return tables.SelectMany(s => s).GroupBy(l => l.Location) - .Select(t => t.Count() == 1 - ? t.First() // only one table, just return the area - : new T { Location = t.Key, Slots = t.SelectMany(s => s.Slots).ToArray() }) - .ToArray(); - } - - /// - /// Marks Encounter Slots for party lead's ability slot influencing. - /// - /// Magnet Pull attracts Steel type slots, and Static attracts Electric - /// Encounter Area array for game - /// Personal data for use with a given species' type - internal static void MarkEncountersStaticMagnetPull(IEnumerable areas, PersonalTable t) - where T : EncounterSlot, IMagnetStatic - { - foreach (EncounterArea area in areas) - { - foreach (var grp in area.Slots.Cast().GroupBy(z => z.Type)) - MarkEncountersStaticMagnetPull(grp, t); - } - } - - internal static void MarkEncountersStaticMagnetPull(IEnumerable grp, PersonalTable t) - where T : EncounterSlot, IMagnetStatic - { - GetStaticMagnet(t, grp, out List s, out List m); - for (var i = 0; i < s.Count; i++) - { - var slot = s[i]; - slot.StaticIndex = i; - slot.StaticCount = s.Count; - } - for (var i = 0; i < m.Count; i++) - { - var slot = m[i]; - slot.MagnetPullIndex = i; - slot.MagnetPullCount = m.Count; - } - } - - internal static void MarkEncountersStaticMagnetPullPermutation(IEnumerable grp, PersonalTable t, List permuted) - where T : EncounterSlot, IMagnetStatic, INumberedSlot - { - GetStaticMagnet(t, grp, out List s, out List m); - - // Apply static/magnet values; if any permutation has a unique slot combination, add it to the slot list. - for (int i = 0; i < s.Count; i++) - { - var slot = s[i]; - if (slot.StaticIndex >= 0) // already has unique data - { - if (slot.IsMatchStatic(i, s.Count)) - continue; // same values, no permutation - if (permuted.Any(z => z.SlotNumber == slot.SlotNumber && z.IsMatchStatic(i, s.Count) && z.Species == slot.Species)) - continue; // same values, previously permuted - - s[i] = slot = (T)slot.Clone(); - permuted.Add(slot); - } - slot.StaticIndex = i; - slot.StaticCount = s.Count; - } - for (int i = 0; i < m.Count; i++) - { - var slot = m[i]; - if (slot.MagnetPullIndex >= 0) // already has unique data - { - if (slot.IsMatchStatic(i, m.Count)) - continue; // same values, no permutation - if (permuted.Any(z => z.SlotNumber == slot.SlotNumber && z.IsMatchMagnet(i, m.Count) && z.Species == slot.Species)) - continue; // same values, previously permuted - - m[i] = slot = (T)slot.Clone(); - permuted.Add(slot); - } - slot.MagnetPullIndex = i; - slot.MagnetPullCount = m.Count; - } - } - - private static void GetStaticMagnet(PersonalTable t, IEnumerable grp, out List s, out List m) - where T : EncounterSlot, IMagnetStatic - { - const int steel = (int)MoveType.Steel; - const int electric = (int)MoveType.Electric + 1; // offset by 1 in gen3/4 for the ??? type - s = new List(); - m = new List(); - foreach (T Slot in grp) - { - var p = t[Slot.Species]; - if (p.IsType(steel)) - m.Add(Slot); - if (p.IsType(electric)) - s.Add(Slot); - } - } - - /// - /// Sets the value, for use in determining split-generation origins. - /// - /// Only used for Gen 1 & 2, as data is not present. - /// In-game encounter data - /// Version ID to set - internal static void MarkEncountersVersion(IEnumerable areas, GameVersion game) - { - foreach (EncounterArea area in areas) - { - foreach (var Slot in area.Slots) - Slot.Version = game; - } - } - /// /// Sets the value. /// @@ -182,37 +36,8 @@ private static void MarkEncountersGeneration(int generation, IEnumerable - /// Groups areas by location id, raw data has areas with different slots but the same location id. - /// - /// Similar to , this method combines a single array. - /// Ingame encounter data - internal static void ReduceAreasSize(ref T[] Areas) where T : EncounterArea, new() - { - Areas = Areas.GroupBy(a => a.Location).Select(a => new T - { - Location = a.Key, - Slots = a.SelectMany(m => m.Slots).ToArray() - }).ToArray(); - } - internal static T[] ConcatAll(params IEnumerable[] arr) => arr.SelectMany(z => z).ToArray(); - internal static void MarkEncounterAreaArray(params T[][] areas) where T : EncounterArea - { - foreach (var area in areas) - MarkEncounterAreas(area); - } - - private static void MarkEncounterAreas(params T[] areas) where T : EncounterArea - { - foreach (var area in areas) - { - foreach (var slot in area.Slots) - slot.Area = area; - } - } - internal static EncounterStatic Clone(this EncounterStatic s, int location) { var result = s.Clone(); @@ -255,11 +80,5 @@ private static EncounterStatic5 DreamRadarClone(this EncounterStatic5 s, int lev } string[] getNames(int i, IEnumerable names) => names.Select(z => z.Length > i ? z[i] : string.Empty).ToArray(); } - - internal static void MarkEncounterGame(IEnumerable table, GameVersion version) where T: IVersion, IVersionSet - { - foreach (var t in table.Where(z => ((IVersion)z).Version == GameVersion.Any)) - ((IVersionSet)t).Version = version; - } } } diff --git a/PKHeX.Core/Legality/Encounters/Data/Encounters1.cs b/PKHeX.Core/Legality/Encounters/Data/Encounters1.cs index 70c121d53..f98031937 100644 --- a/PKHeX.Core/Legality/Encounters/Data/Encounters1.cs +++ b/PKHeX.Core/Legality/Encounters/Data/Encounters1.cs @@ -1,5 +1,4 @@ -using System; -using static PKHeX.Core.EncounterUtil; +using static PKHeX.Core.EncounterUtil; using static PKHeX.Core.GameVersion; namespace PKHeX.Core @@ -9,13 +8,16 @@ namespace PKHeX.Core /// internal static class Encounters1 { - internal static readonly EncounterArea1[] SlotsRBY; - internal static readonly EncounterStatic1[] StaticRBY; + private static readonly EncounterArea1[] SlotsR = Get("red", "g1", RD); + private static readonly EncounterArea1[] SlotsB = Get("blue", "g1", BU); + private static readonly EncounterArea1[] SlotsY = Get("yellow", "g1", YW); + internal static readonly EncounterArea1[] SlotsRBY = ArrayUtil.ConcatAll(SlotsR, SlotsB, SlotsY); + + private static EncounterArea1[] Get(string name, string ident, GameVersion game) => + EncounterArea1.GetAreas(BinLinker.Unpack(Util.GetBinaryResource($"encounter_{name}.pkl"), ident), game); static Encounters1() { - StaticRBY = Encounter_RBY; - SlotsRBY = GetAreas(); MarkEncountersGeneration(1, StaticRBY, TradeGift_RBY_NoTradeback, TradeGift_RBY_Tradeback); var trades = ArrayUtil.ConcatAll(TradeGift_RBY_NoTradeback, TradeGift_RBY_Tradeback); @@ -23,34 +25,7 @@ static Encounters1() t.TrainerNames = StringConverter12.G1TradeOTName; } - private static EncounterArea1[] GetAreas() - { - var red_gw = EncounterArea1.GetArray1GrassWater(Util.GetBinaryResource("encounter_red.pkl"), 248); - var blu_gw = EncounterArea1.GetArray1GrassWater(Util.GetBinaryResource("encounter_blue.pkl"), 248); - var ylw_gw = EncounterArea1.GetArray1GrassWater(Util.GetBinaryResource("encounter_yellow.pkl"), 249); - var rb_fish = EncounterArea1.GetArray1Fishing(Util.GetBinaryResource("encounter_rb_f.pkl"), 33); - var ylw_fish = EncounterArea1.GetArray1FishingYellow(Util.GetBinaryResource("encounter_yellow_f.pkl")); - - MarkEncountersVersion(red_gw, RD); - MarkEncountersVersion(blu_gw, BU); - MarkEncountersVersion(ylw_gw, YW); - MarkEncountersVersion(rb_fish, RB); - MarkEncountersVersion(ylw_fish, YW); - - var table = AddExtraTableSlots(red_gw, blu_gw, ylw_gw, rb_fish, ylw_fish); - Array.Resize(ref table, table.Length + 1); - table[table.Length - 1] = FishOldGood_RBY; - - foreach (var arr in table) - { - foreach (var slot in arr.Slots) - slot.Area = arr; - } - - return table; - } - - private static readonly EncounterStatic1[] Encounter_RBY = + internal static readonly EncounterStatic1[] StaticRBY = { // GameVersion is RBY for Pokemon with the same catch rate and initial moves in all games // If there are any differences in moves or catch rate, they will be defined as different encounters (GameVersion) @@ -187,16 +162,5 @@ private static EncounterArea1[] GetAreas() new EncounterTrade1(051, 05, RBY), // Dugtrio - Trade Lickitung (GSC 5) new EncounterTrade1(047, 05, RBY), // Parasect - Trade Tangela (GSC 5) }); - - private static readonly EncounterArea1 FishOldGood_RBY = new EncounterArea1 - { - Location = -1, - Slots = new EncounterSlot[] - { - new EncounterSlot1(129, 05, 05, -1, SlotType.Old_Rod, 0) { Version = RBY }, // Magikarp - new EncounterSlot1(118, 10, 10, -1, SlotType.Good_Rod, 1) { Version = RBY }, // Goldeen - new EncounterSlot1(060, 10, 10, -1, SlotType.Good_Rod, 2) { Version = RBY }, // Poliwag - } - }; } } diff --git a/PKHeX.Core/Legality/Encounters/Data/Encounters2.cs b/PKHeX.Core/Legality/Encounters/Data/Encounters2.cs index 4015936a9..88585262e 100644 --- a/PKHeX.Core/Legality/Encounters/Data/Encounters2.cs +++ b/PKHeX.Core/Legality/Encounters/Data/Encounters2.cs @@ -9,124 +9,28 @@ namespace PKHeX.Core /// internal static class Encounters2 { - internal static readonly EncounterArea2[] SlotsGSC, SlotsGS, SlotsC; - internal static readonly EncounterStatic2[] StaticGSC, StaticGS, StaticC; + private static readonly EncounterArea2[] SlotsG = Get("gold", "g2", GameVersion.GD); + private static readonly EncounterArea2[] SlotsS = Get("silver", "g2", GameVersion.SV); + internal static readonly EncounterArea2[] SlotsC = Get("crystal", "g2", GameVersion.C); + + internal static readonly EncounterArea2[] SlotsGS = ArrayUtil.ConcatAll(SlotsG, SlotsS); + internal static readonly EncounterArea2[] SlotsGSC = ArrayUtil.ConcatAll(SlotsGS, SlotsC); private static readonly TreesArea[] HeadbuttTreesC = TreesArea.GetArray(BinLinker.Unpack(Util.GetBinaryResource("trees_h_c.pkl"), "ch")); + private static EncounterArea2[] Get(string name, string ident, GameVersion game) => + EncounterArea2.GetAreas(BinLinker.Unpack(Util.GetBinaryResource($"encounter_{name}.pkl"), ident), game); static Encounters2() { - StaticGS = Encounter_GS; - StaticC = Encounter_C; - StaticGSC = Encounter_GSC; - SlotsGS = GetTables2(GameVersion.GS); - SlotsC = GetTables2(GameVersion.C); - SlotsGSC = GetTables2(GameVersion.GSC); - MarkEncounterAreaArray(SlotsGS, SlotsC, SlotsGSC, EncounterSafari_GSC, EncounterBCC_GSC); - ReduceAreasSize(ref SlotsGS); - ReduceAreasSize(ref SlotsC); - ReduceAreasSize(ref SlotsGSC); MarkEncountersGeneration(2, StaticGS, StaticC, StaticGSC, TradeGift_GSC); MarkEncounterTradeStrings(TradeGift_GSC, TradeGift_GSC_OTs); - SlotsGSC.SetVersion(GameVersion.GSC); - SlotsGS.SetVersion(GameVersion.GS); - SlotsC.SetVersion(GameVersion.C); StaticGSC.SetVersion(GameVersion.GSC); StaticGS.SetVersion(GameVersion.GS); StaticC.SetVersion(GameVersion.C); TradeGift_GSC.SetVersion(GameVersion.GSC); } - private static EncounterArea2[] GetTables2(GameVersion Version) - { - // Fishing - var f = EncounterArea2.GetArray2Fishing(Util.GetBinaryResource("encounter_gsc_f.pkl")); - - var Slots = Array.Empty(); - if (Version.Contains(GameVersion.GS)) - Slots = GetSlots_GS(f); - if (Version.Contains(GameVersion.C)) - Slots = AddExtraTableSlots(Slots, GetSlots_C(f)); - - return Slots; - } - - private static EncounterArea2[] GetSlots_GS(EncounterArea2[] f) - { - // Grass/Water - var g = EncounterArea2.GetArray2GrassWater(Util.GetBinaryResource("encounter_gold.pkl")); - var s = EncounterArea2.GetArray2GrassWater(Util.GetBinaryResource("encounter_silver.pkl")); - // Headbutt/Rock Smash - var h_g = EncounterArea2.GetArray2Headbutt(Util.GetBinaryResource("encounter_gold_h.pkl")); - var h_s = EncounterArea2.GetArray2Headbutt(Util.GetBinaryResource("encounter_silver_h.pkl")); - var safari_gs = EncounterSafari_GSC; - var bcc_gs = EncounterBCC_GSC; - - MarkEncountersVersion(bcc_gs, GameVersion.GS); - MarkEncountersVersion(f, GameVersion.GS); - MarkEncountersVersion(g, GameVersion.GD); - MarkEncountersVersion(s, GameVersion.SV); - MarkEncountersVersion(h_g, GameVersion.GD); - MarkEncountersVersion(h_s, GameVersion.SV); - MarkEncountersVersion(safari_gs, GameVersion.GS); - - return AddExtraTableSlots(g, s, h_g, h_s, f, bcc_gs, safari_gs); - } - - private static EncounterArea2[] GetSlots_C(EncounterArea2[] f) - { - // Grass/Water - var c = EncounterArea2.GetArray2GrassWater(Util.GetBinaryResource("encounter_crystal.pkl")); - // Headbutt/Rock Smash - var h_c = EncounterArea2.GetArray2Headbutt(Util.GetBinaryResource("encounter_crystal_h.pkl")); - var safari_c = EncounterSafari_GSC; - var bcc_c = EncounterBCC_GSC; - - MarkEncountersVersion(bcc_c, GameVersion.C); - MarkEncountersVersion(safari_c, GameVersion.C); - MarkEncountersVersion(f, GameVersion.C); - MarkEncountersVersion(c, GameVersion.C); - MarkEncountersVersion(h_c, GameVersion.C); - - var extra = AddExtraTableSlots(c, h_c, f, bcc_c, safari_c); - return extra; - } - - private static readonly EncounterArea2[] EncounterBCC_GSC = { new EncounterArea2 { - Location = 19, - Slots = new EncounterSlot[] - { - new EncounterSlot2(010, 07, 18, 20, SlotType.BugContest, 0), // Caterpie - new EncounterSlot2(013, 07, 18, 20, SlotType.BugContest, 1), // Weedle - new EncounterSlot2(011, 09, 18, 10, SlotType.BugContest, 2), // Metapod - new EncounterSlot2(014, 09, 18, 10, SlotType.BugContest, 3), // Kakuna - new EncounterSlot2(012, 12, 15, 05, SlotType.BugContest, 4), // Butterfree - new EncounterSlot2(015, 12, 15, 05, SlotType.BugContest, 5), // Beedrill - new EncounterSlot2(048, 10, 16, 10, SlotType.BugContest, 6), // Venonat - new EncounterSlot2(046, 10, 17, 10, SlotType.BugContest, 7), // Paras - new EncounterSlot2(123, 13, 14, 05, SlotType.BugContest, 8), // Scyther - new EncounterSlot2(127, 13, 14, 05, SlotType.BugContest, 9), // Pinsir - } - }}; - - private static readonly EncounterArea2[] EncounterSafari_GSC = { new EncounterArea2 { - Location = 81, - Slots = new EncounterSlot[] - { - new EncounterSlot2(129, 10, 10, 100, SlotType.Old_Rod_Safari, 0), // Magikarp - new EncounterSlot2(098, 10, 10, 100, SlotType.Old_Rod_Safari, 1), // Krabby - new EncounterSlot2(098, 20, 20, 100, SlotType.Good_Rod_Safari, 0), // Krabby - new EncounterSlot2(129, 20, 20, 100, SlotType.Good_Rod_Safari, 1), // Magikarp - new EncounterSlot2(222, 20, 20, 100, SlotType.Good_Rod_Safari, 2), // Corsola - new EncounterSlot2(120, 20, 20, 100, SlotType.Good_Rod_Safari, 3), // Staryu - new EncounterSlot2(098, 40, 40, 100, SlotType.Super_Rod_Safari, 0), // Krabby - new EncounterSlot2(222, 40, 40, 100, SlotType.Super_Rod_Safari, 1), // Corsola - new EncounterSlot2(120, 40, 40, 100, SlotType.Super_Rod_Safari, 2), // Staryu - new EncounterSlot2(121, 40, 40, 100, SlotType.Super_Rod_Safari, 3), // Kingler - } - }}; - private static readonly EncounterStatic2[] Encounter_GSC_Common = { new EncounterStatic2(152, 05) { Location = 001, Version = GameVersion.GSC }, // Chikorita @ New Bark Town @@ -267,9 +171,13 @@ internal static TreeEncounterAvailable GetGSCHeadbuttAvailability(EncounterSlot if (Area == null) // Failsafe, every area with headbutt encounters has a tree area return TreeEncounterAvailable.Impossible; - var table = Area.GetTrees(encounter.Type); + var table = Area.GetTrees(encounter.Area.Type); var trainerpivot = TID % 10; return table[trainerpivot]; } + + internal static readonly EncounterStatic2[] StaticGSC = Encounter_GSC; + internal static readonly EncounterStatic2[] StaticGS = Encounter_GS; + internal static readonly EncounterStatic2[] StaticC = Encounter_C; } } diff --git a/PKHeX.Core/Legality/Encounters/Data/Encounters3.cs b/PKHeX.Core/Legality/Encounters/Data/Encounters3.cs index bb6cb62cd..b6b8278d3 100644 --- a/PKHeX.Core/Legality/Encounters/Data/Encounters3.cs +++ b/PKHeX.Core/Legality/Encounters/Data/Encounters3.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; -using System.Linq; -using static PKHeX.Core.EncounterUtil; +using static PKHeX.Core.EncounterUtil; using static PKHeX.Core.Encounters3Teams; namespace PKHeX.Core @@ -10,112 +8,30 @@ namespace PKHeX.Core /// internal static class Encounters3 { - internal static readonly EncounterArea3[] SlotsR, SlotsS, SlotsE; - internal static readonly EncounterArea3[] SlotsFR, SlotsLG; - internal static readonly EncounterStatic3[] StaticR, StaticS, StaticE; - internal static readonly EncounterStatic3[] StaticFR, StaticLG; - - private const int SafariLocation_RSE = 57; - private const int SafariLocation_FRLG = 136; + private static readonly EncounterArea3[] SlotsSwarmRSE = Get("rse_swarm", "rs", GameVersion.RSE); + internal static readonly EncounterArea3[] SlotsR = ArrayUtil.ConcatAll(Get("r", "ru", GameVersion.R), SlotsSwarmRSE); + internal static readonly EncounterArea3[] SlotsS = ArrayUtil.ConcatAll(Get("s", "sa", GameVersion.S), SlotsSwarmRSE); + internal static readonly EncounterArea3[] SlotsE = ArrayUtil.ConcatAll(Get("e", "em", GameVersion.E), SlotsSwarmRSE); + internal static readonly EncounterArea3[] SlotsFR = Get("fr", "fr", GameVersion.FR); + internal static readonly EncounterArea3[] SlotsLG = Get("lg", "lg", GameVersion.LG); + private static EncounterArea3[] Get(string resource, string ident, GameVersion game) + => EncounterArea3.GetAreas(BinLinker.Unpack(Util.GetBinaryResource($"encounter_{resource}.pkl"), ident), game); static Encounters3() { - StaticR = GetEncounters(Encounter_RSE, GameVersion.R); - StaticS = GetEncounters(Encounter_RSE, GameVersion.S); - StaticE = GetEncounters(Encounter_RSE, GameVersion.E); - StaticFR = GetEncounters(Encounter_FRLG, GameVersion.FR); - StaticLG = GetEncounters(Encounter_FRLG, GameVersion.LG); - - static EncounterArea3[] get(string resource, string ident) - => EncounterArea3.GetArray3(BinLinker.Unpack(Util.GetBinaryResource($"encounter_{resource}.pkl"), ident)); - - var R_Slots = get("r", "ru"); - var S_Slots = get("s", "sa"); - var E_Slots = get("e", "em"); - var FR_Slots = get("fr", "fr"); - var LG_Slots = get("lg", "lg"); - - MarkEncounterAreaArray(SlotsRSEAlt, SlotsFRLGUnown, SlotsXD); - - ReduceAreasSize(ref R_Slots); - ReduceAreasSize(ref S_Slots); - ReduceAreasSize(ref E_Slots); - MarkG3Slots_FRLG(ref FR_Slots); - MarkG3Slots_FRLG(ref LG_Slots); - - MarkG3SlotsSafariZones(ref R_Slots, SafariLocation_RSE); - MarkG3SlotsSafariZones(ref S_Slots, SafariLocation_RSE); - MarkG3SlotsSafariZones(ref E_Slots, SafariLocation_RSE); - MarkG3SlotsSafariZones(ref FR_Slots, SafariLocation_FRLG); - MarkG3SlotsSafariZones(ref LG_Slots, SafariLocation_FRLG); - - MarkEncountersStaticMagnetPull(E_Slots, PersonalTable.E); - - SlotsR = AddExtraTableSlots(R_Slots, SlotsRSEAlt); - SlotsS = AddExtraTableSlots(S_Slots, SlotsRSEAlt); - SlotsE = AddExtraTableSlots(E_Slots, SlotsRSEAlt); - SlotsFR = AddExtraTableSlots(FR_Slots, SlotsFRLGUnown); - SlotsLG = AddExtraTableSlots(LG_Slots, SlotsFRLGUnown); - MarkEncountersGeneration(3, StaticR, StaticS, StaticE, StaticFR, StaticLG, Encounter_CXD, TradeGift_RSE, TradeGift_FRLG); MarkEncounterTradeStrings(TradeGift_RSE, TradeRSE); MarkEncounterTradeStrings(TradeGift_FRLG, TradeFRLG); - SlotsRSEAlt.SetVersion(GameVersion.RSE); - SlotsFRLGUnown.SetVersion(GameVersion.FRLG); - SlotsR.SetVersion(GameVersion.R); - SlotsS.SetVersion(GameVersion.S); - SlotsE.SetVersion(GameVersion.E); - SlotsFR.SetVersion(GameVersion.FR); - SlotsLG.SetVersion(GameVersion.LG); Encounter_RSE.SetVersion(GameVersion.RSE); Encounter_FRLG.SetVersion(GameVersion.FRLG); TradeGift_RSE.SetVersion(GameVersion.RSE); TradeGift_FRLG.SetVersion(GameVersion.FRLG); Encounter_Colo.SetVersion(GameVersion.COLO); Encounter_XD.SetVersion(GameVersion.XD); - SlotsXD.SetVersion(GameVersion.XD); } - private static void MarkG3Slots_FRLG(ref EncounterArea3[] Areas) - { - // Remove slots for unown, those slots does not contains alt form info, it will be added manually in SlotsRFLGAlt - // Group areas by location id, the raw data have areas with different slots but the same location id - Areas = Areas.Where(a => a.Location < 188 || a.Location > 194).GroupBy(a => a.Location).Select(a => new EncounterArea3 - { - Location = a.First().Location, - Slots = a.SelectMany(m => m.Slots).ToArray() - }).ToArray(); - } - - private static void MarkG3SlotsSafariZones(ref EncounterArea3[] Areas, int location) - { - foreach (var Area in Areas.Where(a => a.Location == location)) - { - foreach (EncounterSlot Slot in Area.Slots) - Slot.Type |= SlotType.Safari; - } - } - - private static readonly int[] Roaming_MetLocation_FRLG = - { - //Route 1-25 encounter is possible either in grass or on water - 101,102,103,104,105,106,107,108,109,110, - 111,112,113,114,115,116,117,118,119,120, - 121,122,123,124,125 - }; - - private static readonly int[] Roaming_MetLocation_RSE = - { - //Roaming encounter is possible in tall grass and on water - //Route 101-138 - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, - }; - private static readonly EncounterStatic3[] Encounter_RSE_Roam = { new EncounterStatic3 { Species = 380, Level = 40, Version = GameVersion.S, Roaming = true }, // Latias @@ -230,8 +146,8 @@ private static void MarkG3SlotsSafariZones(ref EncounterArea3[] Areas, int locat new EncounterStatic3 { Species = 386, Level = 30, Location = 187, Version = GameVersion.LG, Form = 2, Fateful = true }, // Deoxys @ Birth Island }; - private static readonly EncounterStatic3[] Encounter_RSE = Encounter_RSE_Roam.SelectMany(e => e.Clone(Roaming_MetLocation_RSE)).Concat(Encounter_RSE_Regular).ToArray(); - private static readonly EncounterStatic3[] Encounter_FRLG = Encounter_FRLG_Roam.SelectMany(e => e.Clone(Roaming_MetLocation_FRLG)).Concat(Encounter_FRLG_Stationary).ToArray(); + private static readonly EncounterStatic3[] Encounter_RSE = ArrayUtil.ConcatAll(Encounter_RSE_Roam, Encounter_RSE_Regular); + private static readonly EncounterStatic3[] Encounter_FRLG = ArrayUtil.ConcatAll(Encounter_FRLG_Roam, Encounter_FRLG_Stationary); private static readonly int[] TradeContest_Cool = { 30, 05, 05, 05, 05, 10 }; private static readonly int[] TradeContest_Beauty = { 05, 30, 05, 05, 05, 10 }; @@ -273,89 +189,6 @@ private static void MarkG3SlotsSafariZones(ref EncounterArea3[] Areas, int locat private static readonly string[][] TradeRSE = Util.GetLanguageStrings7(tradeRSE); private static readonly string[][] TradeFRLG = Util.GetLanguageStrings7(tradeFRLG); - private static readonly int[] MoveSwarmSurskit = { 145, 098 }; /* Bubble, Quick Attack */ - private static readonly int[] MoveSwarmSeedot = { 117, 106, 073 }; /* Bide, Harden, Leech Seed */ - private static readonly int[] MoveSwarmNuzleaf = { 106, 074, 267, 073 }; /* Harden, Growth, Nature Power, Leech Seed */ - private static readonly int[] MoveSwarmSeedotF = { 202, 218, 076, 073 }; /* Giga Drain, Frustration, Solar Beam, Leech Seed */ - private static readonly int[] MoveSwarmSkittyRS = { 045, 033 }; /* Growl, Tackle */ - private static readonly int[] MoveSwarmSkittyE = { 045, 033, 039, 213 }; /* Growl, Tackle, Tail Whip, Attract */ - - #region AltSlots - private static readonly EncounterArea3[] SlotsRSEAlt = - { - // Swarm can be passed from R/S<->E via mixing records - // Encounter Percent is a 50% call - new EncounterArea3 { - Location = 17, // Route 102 - Slots = new EncounterSlot[] - { - new EncounterSlot3Swarm(MoveSwarmSurskit) { Species = 283, LevelMin = 03, LevelMax = 03, Type = SlotType.Swarm }, - new EncounterSlot3Swarm(MoveSwarmSeedot) { Species = 273, LevelMin = 03, LevelMax = 03, Type = SlotType.Swarm }, - },}, - new EncounterArea3 { - Location = 29, // Route 114 - Slots = new EncounterSlot[] - { - new EncounterSlot3Swarm(MoveSwarmSurskit) { Species = 283, LevelMin = 15, LevelMax = 15, Type = SlotType.Swarm }, - new EncounterSlot3Swarm(MoveSwarmNuzleaf) { Species = 274, LevelMin = 15, LevelMax = 15, Type = SlotType.Swarm }, - },}, - new EncounterArea3 { - Location = 31, // Route 116 - Slots = new EncounterSlot[] - { - new EncounterSlot3Swarm(MoveSwarmSkittyRS) { Species = 300, LevelMin = 15, LevelMax = 15, Type = SlotType.Swarm }, - new EncounterSlot3Swarm(MoveSwarmSkittyE) { Species = 300, LevelMin = 08, LevelMax = 08, Type = SlotType.Swarm }, - },}, - new EncounterArea3 { - Location = 32, // Route 117 - Slots = new EncounterSlot[] - { - new EncounterSlot3Swarm(MoveSwarmSurskit) { Species = 283, LevelMin = 15, LevelMax = 15, Type = SlotType.Swarm }, - new EncounterSlot3Swarm(MoveSwarmNuzleaf) { Species = 273, LevelMin = 13, LevelMax = 13, Type = SlotType.Swarm }, // Has same moves as Nuzleaf - },}, - new EncounterArea3 { - Location = 35, // Route 120 - Slots = new EncounterSlot[] - { - new EncounterSlot3Swarm(MoveSwarmSurskit) { Species = 283, LevelMin = 28, LevelMax = 28, Type = SlotType.Swarm }, - new EncounterSlot3Swarm(MoveSwarmSeedotF) { Species = 273, LevelMin = 25, LevelMax = 25, Type = SlotType.Swarm }, - },}, - - // Feebas fishing spot - new EncounterArea3 { - Location = 34, // Route 119 - Slots = new[] - { - new EncounterSlot3 { Species = 349, LevelMin = 20, LevelMax = 25, Type = SlotType.Swarm } // Feebas with any Rod (50%) - },}, - }; - - private static readonly EncounterArea3[] SlotsFRLGUnown = - { - GetUnownArea(188, new[] { 00,00,00,00,00,00,00,00,00,00,00,27 }), // 188 = Monean Chamber - GetUnownArea(189, new[] { 02,02,02,03,03,03,07,07,07,20,20,14 }), // 189 = Liptoo Chamber - GetUnownArea(190, new[] { 13,13,13,13,18,18,18,18,08,08,04,04 }), // 190 = Weepth Chamber - GetUnownArea(191, new[] { 15,15,11,11,09,09,17,17,17,16,16,16 }), // 191 = Dilford Chamber - GetUnownArea(192, new[] { 24,24,19,19,06,06,06,05,05,05,10,10 }), // 192 = Scufib Chamber - GetUnownArea(193, new[] { 21,21,21,22,22,22,23,23,12,12,01,01 }), // 193 = Rixy Chamber - GetUnownArea(194, new[] { 25,25,25,25,25,25,25,25,25,25,25,26 }), // 194 = Viapois Chamber - }; - - private static EncounterArea3 GetUnownArea(int location, IReadOnlyList SlotForms) - { - return new EncounterArea3 - { - Location = location, - Slots = SlotForms.Select((_, i) => new EncounterSlot3 - { - Species = 201, LevelMin = 25, LevelMax = 25, Type = SlotType.Grass, - SlotNumber = i, - Form = SlotForms[i] - }).ToArray() - }; - } - #endregion - #region Colosseum private static readonly EncounterStatic3[] Encounter_Colo = { @@ -465,15 +298,6 @@ private static EncounterArea3 GetUnownArea(int location, IReadOnlyList Slot #region XD - private static readonly int[] MirorBXDLocations = - { - 090, // Rock - 091, // Oasis - 092, // Cave - 113, // Pyrite Town - 059, // Realgam Tower - }; - private static readonly EncounterStatic3[] Encounter_XD = new[] { new EncounterStatic3 { Fateful = true, Gift = true, Species = 133, Level = 10, Location = 000, Moves = new[] {044} }, // Eevee (Bite) @@ -597,44 +421,23 @@ private static EncounterArea3 GetUnownArea(int location, IReadOnlyList Slot new EncounterStaticShadow(Articuno) { Fateful = true, Species = 144, Level = 50, Gauge = 10000, Moves = new[] {326,215,114,058}, Location = 074, }, // Articuno: Grand Master Greevil @ Citadark Isle new EncounterStaticShadow(Zapdos) { Fateful = true, Species = 145, Level = 50, Gauge = 10000, Moves = new[] {326,226,319,085}, Location = 074, }, // Zapdos: Grand Master Greevil @ Citadark Isle new EncounterStaticShadow(Dragonite) { Fateful = true, Species = 149, Level = 55, Gauge = 09000, Moves = new[] {063,215,349,089}, Location = 162, }, // Dragonite: Wanderer Miror B. @ Gateon Port - }.SelectMany(CloneMirorB).ToArray(); + }; - internal static readonly EncounterArea3[] SlotsXD = + internal static readonly EncounterArea3XD[] SlotsXD = { - new EncounterArea3 { Location = 090, Slots = new[] // Rock - { - new EncounterSlot3PokeSpot(027, 10, 23, 0), // Sandshrew - new EncounterSlot3PokeSpot(207, 10, 20, 1), // Gligar - new EncounterSlot3PokeSpot(328, 10, 20, 2), // Trapinch - } - }, - new EncounterArea3 { Location = 091, Slots = new[] // Oasis - { - new EncounterSlot3PokeSpot(187, 10, 20, 0), // Hoppip - new EncounterSlot3PokeSpot(231, 10, 20, 1), // Phanpy - new EncounterSlot3PokeSpot(283, 10, 20, 2), // Surskit - } - }, - new EncounterArea3 { Location = 092, Slots = new[] // Cave - { - new EncounterSlot3PokeSpot(041, 10, 21, 0), // Zubat - new EncounterSlot3PokeSpot(304, 10, 21, 1), // Aron - new EncounterSlot3PokeSpot(194, 10, 21, 2), // Wooper - } - }, + new EncounterArea3XD(90, 027, 23, 207, 20, 328, 20), // Rock (Sandshrew, Gligar, Trapinch) + new EncounterArea3XD(91, 187, 20, 231, 20, 283, 20), // Oasis (Hoppip, Phanpy, Surskit) + new EncounterArea3XD(92, 041, 21, 304, 21, 194, 21), // Cave (Zubat, Aron, Wooper) }; internal static readonly EncounterStatic3[] Encounter_CXD = ArrayUtil.ConcatAll(Encounter_Colo, Encounter_XD); - private static IEnumerable CloneMirorB(EncounterStatic3 arg) - { - yield return arg; - if (!(arg is EncounterStaticShadow s)) - yield break; - foreach (int loc in MirorBXDLocations) - yield return (EncounterStatic3)s.Clone(loc); - } - #endregion + + internal static readonly EncounterStatic3[] StaticR = GetEncounters(Encounter_RSE, GameVersion.R); + internal static readonly EncounterStatic3[] StaticS = GetEncounters(Encounter_RSE, GameVersion.S); + internal static readonly EncounterStatic3[] StaticE = GetEncounters(Encounter_RSE, GameVersion.E); + internal static readonly EncounterStatic3[] StaticFR = GetEncounters(Encounter_FRLG, GameVersion.FR); + internal static readonly EncounterStatic3[] StaticLG = GetEncounters(Encounter_FRLG, GameVersion.LG); } } diff --git a/PKHeX.Core/Legality/Encounters/Data/Encounters4.cs b/PKHeX.Core/Legality/Encounters/Data/Encounters4.cs index b99dd964d..a2ff7ee2e 100644 --- a/PKHeX.Core/Legality/Encounters/Data/Encounters4.cs +++ b/PKHeX.Core/Legality/Encounters/Data/Encounters4.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; -using System.Diagnostics; using System.Linq; using static PKHeX.Core.EncounterUtil; +using static PKHeX.Core.GameVersion; namespace PKHeX.Core { @@ -10,69 +10,16 @@ namespace PKHeX.Core /// internal static class Encounters4 { - internal static readonly EncounterArea4DPPt[] SlotsD, SlotsP, SlotsPt; - internal static readonly EncounterArea4HGSS[] SlotsHG, SlotsSS; - internal static readonly EncounterStatic4[] StaticD, StaticP, StaticPt, StaticHG, StaticSS; + internal static readonly EncounterArea4[] SlotsD = EncounterArea4.GetAreas(Get("d", "da"), D); + internal static readonly EncounterArea4[] SlotsP = EncounterArea4.GetAreas(Get("p", "pe"), P); + internal static readonly EncounterArea4[] SlotsPt = EncounterArea4.GetAreas(Get("pt", "pt"), Pt); + internal static readonly EncounterArea4[] SlotsHG = EncounterArea4.GetAreas(Get("hg", "hg"), HG); + internal static readonly EncounterArea4[] SlotsSS = EncounterArea4.GetAreas(Get("ss", "ss"), SS); + private static byte[][] Get(string resource, string ident) => BinLinker.Unpack(Util.GetBinaryResource($"encounter_{resource}.pkl"), ident); static Encounters4() { MarkG4PokeWalker(Encounter_PokeWalker); - StaticD = GetEncounters(Encounter_DPPt, GameVersion.D); - StaticP = GetEncounters(Encounter_DPPt, GameVersion.P); - StaticPt = GetEncounters(Encounter_DPPt, GameVersion.Pt); - var staticHGSS = Encounter_HGSS.Concat(Encounter_PokeWalker).ToArray(); - StaticHG = GetEncounters(staticHGSS, GameVersion.HG); - StaticSS = GetEncounters(staticHGSS, GameVersion.SS); - - static byte[][] get(string resource, string ident) - => BinLinker.Unpack(Util.GetBinaryResource($"encounter_{resource}.pkl"), ident); - - var D_Slots = EncounterArea4DPPt.GetArray4DPPt(get("d", "da")); - var P_Slots = EncounterArea4DPPt.GetArray4DPPt(get("p", "pe")); - var Pt_Slots = EncounterArea4DPPt.GetArray4DPPt(get("pt", "pt"), true); - var HG_Slots = EncounterArea4HGSS.GetArray4HGSS(get("hg", "hg")); - var SS_Slots = EncounterArea4HGSS.GetArray4HGSS(get("ss", "ss")); - - var DP_Feebas = GetFeebasArea(D_Slots[10]); - var Pt_Feebas = GetFeebasArea(Pt_Slots[10]); - var HG_Headbutt_Slots = EncounterArea4HGSS.GetArray4HGSS_Headbutt(get("hb_hg", "hg")); - var SS_Headbutt_Slots = EncounterArea4HGSS.GetArray4HGSS_Headbutt(get("hb_ss", "ss")); - - var D_HoneyTrees_Slots = SlotsD_HoneyTree.Clone(HoneyTreesLocation); - var P_HoneyTrees_Slots = SlotsP_HoneyTree.Clone(HoneyTreesLocation); - var Pt_HoneyTrees_Slots = SlotsPt_HoneyTree.Clone(HoneyTreesLocation); - - MarkG4SwarmSlots(HG_Slots, SlotsHG_Swarm); - MarkG4SwarmSlots(SS_Slots, SlotsSS_Swarm); - - MarkEncounterTypeData(D_Slots, P_Slots, Pt_Slots, HG_Slots, SS_Slots); - - ReduceAreasSize(ref D_Slots); - ReduceAreasSize(ref P_Slots); - ReduceAreasSize(ref Pt_Slots); - ReduceAreasSize(ref HG_Slots); - ReduceAreasSize(ref SS_Slots); - ReduceAreasSize(ref HG_Headbutt_Slots); - ReduceAreasSize(ref SS_Headbutt_Slots); - - MarkG4SlotsGreatMarsh(D_Slots, 52); - MarkG4SlotsGreatMarsh(P_Slots, 52); - MarkG4SlotsGreatMarsh(Pt_Slots, 52); - - MarkEncounterAreaArray(D_HoneyTrees_Slots, P_HoneyTrees_Slots, Pt_HoneyTrees_Slots, DP_GreatMarshAlt, Pt_GreatMarshAlt, DPPt_Unown, DP_Feebas, Pt_Feebas); - MarkEncounterAreaArray(HG_Headbutt_Slots, SS_Headbutt_Slots, SlotsHGSSAlt); - - SlotsD = AddExtraTableSlots(D_Slots, D_HoneyTrees_Slots, DP_GreatMarshAlt, DPPt_Unown, DP_Feebas); - SlotsP = AddExtraTableSlots(P_Slots, P_HoneyTrees_Slots, DP_GreatMarshAlt, DPPt_Unown, DP_Feebas); - SlotsPt = AddExtraTableSlots(Pt_Slots, Pt_HoneyTrees_Slots, Pt_GreatMarshAlt, DPPt_Unown, Pt_Feebas); - SlotsHG = AddExtraTableSlots(HG_Slots, HG_Headbutt_Slots, SlotsHGSSAlt); - SlotsSS = AddExtraTableSlots(SS_Slots, SS_Headbutt_Slots, SlotsHGSSAlt); - - MarkDPPtEncounterTypeSlots(SlotsD); - MarkDPPtEncounterTypeSlots(SlotsP); - MarkDPPtEncounterTypeSlots(SlotsPt); - MarkHGSSEncounterTypeSlots(SlotsHG); - MarkHGSSEncounterTypeSlots(SlotsSS); MarkEncountersGeneration(4, StaticD, StaticP, StaticPt, StaticHG, StaticSS, TradeGift_DPPt, TradeGift_HGSS); @@ -82,74 +29,10 @@ static byte[][] get(string resource, string ident) foreach (var t in RanchGifts) t.TrainerNames = RanchOTNames; - DP_GreatMarshAlt.SetVersion(GameVersion.DP); - DPPt_Unown.SetVersion(GameVersion.DPPt); - DP_Feebas.SetVersion(GameVersion.DP); - SlotsHGSSAlt.SetVersion(GameVersion.HGSS); - SlotsD.SetVersion(GameVersion.D); - SlotsP.SetVersion(GameVersion.P); - SlotsPt.SetVersion(GameVersion.Pt); - SlotsHG.SetVersion(GameVersion.HG); - SlotsSS.SetVersion(GameVersion.SS); - Encounter_DPPt.SetVersion(GameVersion.DPPt); - Encounter_HGSS.SetVersion(GameVersion.HGSS); - TradeGift_DPPt.SetVersion(GameVersion.DPPt); - TradeGift_HGSS.SetVersion(GameVersion.HGSS); - } - - private static EncounterArea4DPPt[] GetFeebasArea(EncounterArea4DPPt template) - { - Debug.Assert(template.Location == 50); // Mt Coronet - Debug.Assert(template.Slots.Last().Species == (int)Species.Whiscash); - var slots = template.Slots.Where(z => z.Type.IsFishingRodType()).Select(z => z.Clone()).ToArray(); - Debug.Assert(slots[0].Species == (int)Species.Magikarp); - foreach (var s in slots) - { - s.Species = (int)Species.Feebas; - ((EncounterSlot4)s).TypeEncounter = EncounterType.Surfing_Fishing; - } - - var area = new EncounterArea4DPPt - { - Location = template.Location, - Slots = slots, - }; - return new[] {area}; - } - - private static void MarkEncounterTypeData(EncounterArea4[] D_Slots, EncounterArea4[] P_Slots, EncounterArea4[] Pt_Slots, EncounterArea4[] HG_Slots, EncounterArea4[] SS_Slots) - { - // Shellos & Gastrodon - MarkG4AltFormSlots(D_Slots, 422, 1, Shellos_EastSeaLocation_DP); - MarkG4AltFormSlots(D_Slots, 423, 1, Gastrodon_EastSeaLocation_DP); - MarkG4AltFormSlots(P_Slots, 422, 1, Shellos_EastSeaLocation_DP); - MarkG4AltFormSlots(P_Slots, 423, 1, Gastrodon_EastSeaLocation_DP); - MarkG4AltFormSlots(Pt_Slots, 422, 1, Shellos_EastSeaLocation_Pt); - MarkG4AltFormSlots(Pt_Slots, 423, 1, Gastrodon_EastSeaLocation_Pt); - - const int Route209 = 24; - MarkDPPtEncounterTypeSlots_MultipleTypes(D_Slots, Route209, EncounterType.Building_EnigmaStone, 1); - MarkDPPtEncounterTypeSlots_MultipleTypes(P_Slots, Route209, EncounterType.Building_EnigmaStone, 1); - MarkDPPtEncounterTypeSlots_MultipleTypes(Pt_Slots, Route209, EncounterType.Building_EnigmaStone, 1); - const int StarkMountain = 84; - MarkDPPtEncounterTypeSlots_MultipleTypes(D_Slots, StarkMountain, EncounterType.Cave_HallOfOrigin, 1); - MarkDPPtEncounterTypeSlots_MultipleTypes(P_Slots, StarkMountain, EncounterType.Cave_HallOfOrigin, 1); - MarkDPPtEncounterTypeSlots_MultipleTypes(Pt_Slots, StarkMountain, EncounterType.Cave_HallOfOrigin, 1); - const int MtCoronet = 50; - MarkDPPtEncounterTypeSlots_MultipleTypes(D_Slots, MtCoronet, EncounterType.Cave_HallOfOrigin, DPPt_MtCoronetExteriorEncounters); - MarkDPPtEncounterTypeSlots_MultipleTypes(P_Slots, MtCoronet, EncounterType.Cave_HallOfOrigin, DPPt_MtCoronetExteriorEncounters); - MarkDPPtEncounterTypeSlots_MultipleTypes(Pt_Slots, MtCoronet, EncounterType.Cave_HallOfOrigin, DPPt_MtCoronetExteriorEncounters); - const int RuinsOfAlph = 209; - MarkHGSSEncounterTypeSlots_MultipleTypes(HG_Slots, RuinsOfAlph, EncounterType.Cave_HallOfOrigin, 1); - MarkHGSSEncounterTypeSlots_MultipleTypes(SS_Slots, RuinsOfAlph, EncounterType.Cave_HallOfOrigin, 1); - MarkSpecific(HG_Slots, RuinsOfAlph, SlotType.Rock_Smash, EncounterType.DialgaPalkia); - MarkSpecific(SS_Slots, RuinsOfAlph, SlotType.Rock_Smash, EncounterType.DialgaPalkia); - const int MtSilver = 219; - MarkHGSSEncounterTypeSlots_MultipleTypes(HG_Slots, MtSilver, EncounterType.Cave_HallOfOrigin, HGSS_MtSilverCaveExteriorEncounters); - MarkHGSSEncounterTypeSlots_MultipleTypes(SS_Slots, MtSilver, EncounterType.Cave_HallOfOrigin, HGSS_MtSilverCaveExteriorEncounters); - const int Cianwood = 130; - MarkHGSSEncounterTypeSlots_MultipleTypes(HG_Slots, Cianwood, EncounterType.RockSmash); - MarkHGSSEncounterTypeSlots_MultipleTypes(SS_Slots, Cianwood, EncounterType.RockSmash); + Encounter_DPPt.SetVersion(DPPt); + Encounter_HGSS.SetVersion(HGSS); + TradeGift_DPPt.SetVersion(DPPt); + TradeGift_HGSS.SetVersion(HGSS); } private static void MarkG4PokeWalker(IEnumerable t) @@ -158,405 +41,10 @@ private static void MarkG4PokeWalker(IEnumerable t) { s.Location = 233; //Pokéwalker s.Gift = true; //Pokeball only - s.Version = GameVersion.HGSS; + s.Version = HGSS; } } - private static void MarkG4SlotsGreatMarsh(IEnumerable Areas, int location) - { - foreach (EncounterArea Area in Areas.Where(a => a.Location == location)) - { - foreach (EncounterSlot Slot in Area.Slots) - Slot.Type |= SlotType.Safari; - } - } - - private static void MarkG4SwarmSlots(IEnumerable Areas, T[] SwarmAreas) where T : EncounterArea - { - // Grass Swarm slots replace slots 0 and 1 from encounters data - // for surfing only replace slots 0 from encounters data - // for fishing replace one or several random slots from encounters data, but all slots have the same level, it's ok to only replace the first - // Species id are not included in encounter tables but levels can be copied from the encounter raw data - foreach (var Area in Areas) - { - var SwarmSlots = SwarmAreas.Where(a => a.Location == Area.Location).SelectMany(s => s.Slots); - var OutputSlots = new List(); - foreach (var SwarmSlot in SwarmSlots) - { - int slotsnum = SwarmSlot.Type == SlotType.Grass ? 2 : 1; - foreach (var swarmSlot in Area.Slots.Where(s => s.Type == SwarmSlot.Type).Take(slotsnum).Select(slot => (EncounterSlot4)slot.Clone())) - { - swarmSlot.Species = SwarmSlot.Species; - if (swarmSlot.Species == (int)Species.Mawile) // edge case, Mawile is only swarm subject to magnet pull (no other steel types in area) - { - swarmSlot.MagnetPullIndex = swarmSlot.SlotNumber; - swarmSlot.MagnetPullCount = 2; - } - OutputSlots.Add(swarmSlot); - } - } - Area.Slots = Area.Slots.Concat(OutputSlots).Where(a => a.Species > 0).ToArray(); - } - } - - // Gen 4 raw encounter data does not contains info for alt slots - // Shellos and Gastrodon East Sea form should be modified - private static void MarkG4AltFormSlots(IEnumerable Areas, int Species, int form, int[] Locations) - { - foreach (var Area in Areas.Where(a => Locations.Contains(a.Location))) - { - foreach (EncounterSlot Slot in Area.Slots.Where(s => s.Species == Species)) - Slot.Form = form; - } - } - - private static EncounterType GetEncounterTypeBySlotDPPt(SlotType Type, EncounterType GrassType) - { - switch (Type) - { - case SlotType.Pokeradar: - case SlotType.Pokeradar_Safari: - case SlotType.Swarm: - case SlotType.Grass: return GrassType; - case SlotType.Surf: - case SlotType.Old_Rod: - case SlotType.Good_Rod: - case SlotType.Super_Rod: - case SlotType.Surf_Safari: - case SlotType.Old_Rod_Safari: - case SlotType.Good_Rod_Safari: - case SlotType.Super_Rod_Safari: return EncounterType.Surfing_Fishing; - case SlotType.Grass_Safari: return EncounterType.MarshSafari; - case SlotType.HoneyTree: return EncounterType.None; - } - return EncounterType.None; - } - - private static EncounterType GetEncounterTypeBySlotHGSS(SlotType Type, EncounterType GrassType, EncounterType HeadbuttType) - { - switch (Type) - { - // HGSS Safari encounters have normal water/grass encounter type, not safari encounter type - case SlotType.Grass: - case SlotType.Grass_Safari: - case SlotType.BugContest: return GrassType; - - case SlotType.Surf: - case SlotType.Old_Rod: - case SlotType.Good_Rod: - case SlotType.Super_Rod: - case SlotType.Surf_Safari: - case SlotType.Old_Rod_Safari: - case SlotType.Good_Rod_Safari: - case SlotType.Super_Rod_Safari: return EncounterType.Surfing_Fishing; - - case SlotType.Rock_Smash: - if (GrassType == EncounterType.RockSmash) - return EncounterType.RockSmash | EncounterType.Building_EnigmaStone; - if (HeadbuttType == EncounterType.Building_EnigmaStone) - return HeadbuttType; - if (GrassType == EncounterType.Cave_HallOfOrigin) - return GrassType; - return EncounterType.None; - - case SlotType.Headbutt_Special: - case SlotType.Headbutt: return HeadbuttType | EncounterType.None; - // not sure on if "None" should always be allowed, but this is so uncommon it shouldn't matter (gen7 doesn't keep this value anyway). - } - return EncounterType.None; - } - - private static void MarkDPPtEncounterTypeSlots_MultipleTypes(EncounterArea4[] Areas, int Location, EncounterType NormalEncounterType, params int[] SpecialEncounterFiles) - { - var numfile = 0; - foreach (var Area in Areas.Where(x => x.Location == Location)) - { - numfile++; - var GrassType = SpecialEncounterFiles.Contains(numfile) ? EncounterType.TallGrass : NormalEncounterType; - foreach (EncounterSlot slot in Area.Slots) - { - ((EncounterSlot4)slot).TypeEncounter = GetEncounterTypeBySlotDPPt(slot.Type, GrassType); - } - } - } - - private static void MarkHGSSEncounterTypeSlots_MultipleTypes(EncounterArea4[] Areas, int Location, EncounterType NormalEncounterType, params int[] SpecialEncounterFile) - { - // Area with two different encounter type for grass encounters - // SpecialEncounterFile is taall grass encounter type, the other files have the normal encounter type for this location - var HeadbuttType = GetHeadbuttEncounterType(Location); - var numfile = 0; - foreach (var Area in Areas.Where(x => x.Location == Location)) - { - numfile++; - var GrassType = SpecialEncounterFile.Contains(numfile) ? EncounterType.TallGrass : NormalEncounterType; - foreach (EncounterSlot slot in Area.Slots) - { - ((EncounterSlot4)slot).TypeEncounter = GetEncounterTypeBySlotHGSS(slot.Type, GrassType, HeadbuttType); - } - } - } - - private static void MarkSpecific(EncounterArea4[] Areas, int Location, SlotType t, EncounterType val) - { - foreach (var Area in Areas.Where(x => x.Location == Location)) - { - foreach (var slot in Area.Slots.Where(s => s.Type == t)) - ((EncounterSlot4)slot).TypeEncounter = val; - } - } - - private static void MarkDPPtEncounterTypeSlots(EncounterArea4[] Areas) - { - foreach (var Area in Areas) - { - if (DPPt_MixInteriorExteriorLocations.Contains(Area.Location)) - continue; - var GrassType = GetGrassType(Area.Location); - - EncounterType GetGrassType(int location) - { - if (location == 70) // Old Chateau - return EncounterType.Building_EnigmaStone; - if (DPPt_CaveLocations.Contains(Area.Location)) - return EncounterType.Cave_HallOfOrigin; - return EncounterType.TallGrass; - } - foreach (EncounterSlot slot in Area.Slots) - { - if (((EncounterSlot4)slot).TypeEncounter == EncounterType.None) // not defined yet - ((EncounterSlot4)slot).TypeEncounter = GetEncounterTypeBySlotDPPt(slot.Type, GrassType); - } - } - } - - private static EncounterType GetHeadbuttEncounterType(int Location) - { - if (Location == 195 || Location == 196) // Route 47/48 - return EncounterType.DialgaPalkia | EncounterType.TallGrass; - - // Routes with trees adjacent to water tiles - var allowsurf = HGSS_SurfingHeadbutt_Locations.Contains(Location); - - // Cities - if (HGSS_CityLocations.Contains(Location)) - { - return allowsurf - ? EncounterType.Building_EnigmaStone | EncounterType.Surfing_Fishing - : EncounterType.Building_EnigmaStone; - } - - // Caves with no exterior zones - if (!HGSS_MixInteriorExteriorLocations.Contains(Location) && HGSS_CaveLocations.Contains(Location)) - { - return allowsurf - ? EncounterType.Cave_HallOfOrigin | EncounterType.Surfing_Fishing - : EncounterType.Cave_HallOfOrigin; - } - - // Routes and exterior areas - // Routes with trees adjacent to grass tiles - var allowgrass = HGSS_GrassHeadbutt_Locations.Contains(Location); - if (allowgrass) - { - return allowsurf - ? EncounterType.TallGrass | EncounterType.Surfing_Fishing - : EncounterType.TallGrass; - } - - return allowsurf - ? EncounterType.Surfing_Fishing - : EncounterType.None; - } - - private static void MarkHGSSEncounterTypeSlots(EncounterArea4[] Areas) - { - foreach (var Area in Areas) - { - if (HGSS_MixInteriorExteriorLocations.Contains(Area.Location)) - continue; - var GrassType = HGSS_CaveLocations.Contains(Area.Location) ? EncounterType.Cave_HallOfOrigin : EncounterType.TallGrass; - var HeadbuttType = GetHeadbuttEncounterType(Area.Location); - foreach (EncounterSlot slot in Area.Slots) - { - if (((EncounterSlot4)slot).TypeEncounter == EncounterType.None) // not defined yet - ((EncounterSlot4)slot).TypeEncounter = GetEncounterTypeBySlotHGSS(slot.Type, GrassType, HeadbuttType); - } - } - } - - #region Encounter Types - private static readonly HashSet DPPt_CaveLocations = new HashSet - { - 46, // Oreburgh Mine - 50, // Mt. Coronet - 53, // Solaceon Ruins - 54, // Sinnoh Victory Road - 57, // Ravaged Path - 59, // Oreburgh Gate - 62, // Turnback Cave - 64, // Snowpoint Temple - 65, // Wayward Cave - 66, // Ruin Maniac Cave - 67, // Maniac Tunnel - 66, // Ruin Maniac Cave - 69, // Iron Island - 84, // Stark Mountain - }; - - private static readonly HashSet DPPt_MixInteriorExteriorLocations = new HashSet - { - 24, // Route 209 (Lost Tower) - 50, // Mt Coronet - 84, // Stark Mountain - }; - - private static readonly int[] DPPt_MtCoronetExteriorEncounters = - { - 4, 5, 70 - }; - - /// - /// Locations with headbutt trees accessible from Cave tiles - /// - private static readonly HashSet HGSS_CaveLocations = new HashSet - { - 197, // DIGLETT's Cave - 198, // Mt. Moon - 199, // Cerulean Cave - 200, // Rock Tunnel - 201, // Power Plant - 203, // Seafoam Islands - 204, // Sprout Tower - 205, // Bell Tower - 206, // Burned Tower - 209, // Ruins of Alph - 210, // Union Cave - 211, // SLOWPOKE Well - 214, // Ilex Forest - 216, // Mt. Mortar - 217, // Ice Path - 218, // Whirl Islands - 219, // Mt. Silver Cave - 220, // Dark Cave - 221, // Kanto Victory Road - 223, // Tohjo Falls - 228, // Cliff Cave - 234, // Cliff Edge Gate - }; - - /// - /// Locations with headbutt trees accessible from city tiles - /// - private static readonly HashSet HGSS_CityLocations = new HashSet - { - 126, // New Bark Town - 127, // Cherrygrove City - 128, // Violet City - 129, // Azalea Town - 130, // Cianwood City - 131, // Goldenrod City - 132, // Olivine City - 133, // Ecruteak City - 134, // Mahogany Town - 136, // Blackthorn City - 138, // Pallet Town - 139, // Viridian City - 140, // Pewter City - 141, // Cerulean City - 142, // Lavender Town - 143, // Vermilion City - 144, // Celadon City - 145, // Fuchsia City - 146, // Cinnabar Island - 147, // Indigo Plateau - 148, // Saffron City - 227, // Safari Zone Gate - }; - - /// - /// Locations with headbutt trees accessible from water tiles - /// - private static readonly HashSet HGSS_SurfingHeadbutt_Locations = new HashSet - { - 126, // New Bark Town - 127, // Cherrygrove City - 128, // Violet City - 133, // Ecruteak City - 135, // Lake of Rage - 138, // Pallet Town - 139, // Viridian City - 160, // Route 12 - 169, // Route 21 - 170, // Route 22 - 174, // Route 26 - 175, // Route 27 - 176, // Route 28 - 178, // Route 30 - 179, // Route 31 - 180, // Route 32 - 182, // Route 34 - 183, // Route 35 - 190, // Route 42 - 191, // Route 43 - 192, // Route 44 - 214, // Ilex Forest - }; - - /// - /// Locations with headbutt trees accessible from tall grass tiles - /// - private static readonly HashSet HGSS_GrassHeadbutt_Locations = new HashSet - { - 137, // Mt. Silver - 149, // Route 1 - 150, // Route 2 - 151, // Route 3 - 152, // Route 4 - 153, // Route 5 - 154, // Route 6 - 155, // Route 7 - 159, // Route 11 - 161, // Route 13 - 163, // Route 15 - 164, // Route 16 - 169, // Route 21 - 170, // Route 22 - 174, // Route 26 - 175, // Route 27 - 176, // Route 28 - 177, // Route 29 - 178, // Route 30 - 179, // Route 31 - 180, // Route 32 - 181, // Route 33 - 182, // Route 34 - 183, // Route 35 - 184, // Route 36 - 185, // Route 37 - 186, // Route 38 - 187, // Route 39 - 191, // Route 43 - 192, // Route 44 - 194, // Route 46 - 195, // Route 47 - 196, // Route 48 - 219, // Mt. Silver Cave - 224, // Viridian Forest - }; - - private static readonly int[] HGSS_MtSilverCaveExteriorEncounters = - { - 2, 3 - }; - - private static readonly int[] HGSS_MixInteriorExteriorLocations = - { - 209, // Ruins of Alph - 219, // Mt. Silver Cave - }; - - #endregion #region Pokéwalker Encounter // all pkm are in Poke Ball and have a met location of "PokeWalker" private static readonly EncounterStatic4[] Encounter_PokeWalker = @@ -753,84 +241,84 @@ private static void MarkHGSSEncounterTypeSlots(EncounterArea4[] Areas) { new EncounterStaticTyped { Species = 481, Level = 50, Roaming = true, TypeEncounter = EncounterType.TallGrass }, // Mesprit new EncounterStaticTyped { Species = 488, Level = 50, Roaming = true, TypeEncounter = EncounterType.TallGrass }, // Cresselia - new EncounterStaticTyped { Species = 144, Level = 60, Roaming = true, TypeEncounter = EncounterType.TallGrass, Version = GameVersion.Pt }, // Articuno - new EncounterStaticTyped { Species = 145, Level = 60, Roaming = true, TypeEncounter = EncounterType.TallGrass, Version = GameVersion.Pt }, // Zapdos - new EncounterStaticTyped { Species = 146, Level = 60, Roaming = true, TypeEncounter = EncounterType.TallGrass, Version = GameVersion.Pt }, // Moltres + new EncounterStaticTyped { Species = 144, Level = 60, Roaming = true, TypeEncounter = EncounterType.TallGrass, Version = Pt }, // Articuno + new EncounterStaticTyped { Species = 145, Level = 60, Roaming = true, TypeEncounter = EncounterType.TallGrass, Version = Pt }, // Zapdos + new EncounterStaticTyped { Species = 146, Level = 60, Roaming = true, TypeEncounter = EncounterType.TallGrass, Version = Pt }, // Moltres }; private static readonly EncounterStaticTyped[] Encounter_DPPt_Roam_Surf = { new EncounterStaticTyped { Species = 481, Level = 50, Roaming = true, TypeEncounter = EncounterType.Surfing_Fishing }, // Mesprit new EncounterStaticTyped { Species = 488, Level = 50, Roaming = true, TypeEncounter = EncounterType.Surfing_Fishing }, // Cresselia - new EncounterStaticTyped { Species = 144, Level = 60, Roaming = true, TypeEncounter = EncounterType.Surfing_Fishing, Version = GameVersion.Pt }, // Articuno - new EncounterStaticTyped { Species = 145, Level = 60, Roaming = true, TypeEncounter = EncounterType.Surfing_Fishing, Version = GameVersion.Pt }, // Zapdos - new EncounterStaticTyped { Species = 146, Level = 60, Roaming = true, TypeEncounter = EncounterType.Surfing_Fishing, Version = GameVersion.Pt }, // Moltres + new EncounterStaticTyped { Species = 144, Level = 60, Roaming = true, TypeEncounter = EncounterType.Surfing_Fishing, Version = Pt }, // Articuno + new EncounterStaticTyped { Species = 145, Level = 60, Roaming = true, TypeEncounter = EncounterType.Surfing_Fishing, Version = Pt }, // Zapdos + new EncounterStaticTyped { Species = 146, Level = 60, Roaming = true, TypeEncounter = EncounterType.Surfing_Fishing, Version = Pt }, // Moltres }; private static readonly EncounterStatic4[] Encounter_DPPt_Regular = { // Starters - new EncounterStaticTyped { Gift = true, Species = 387, Level = 5, Location = 076, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, Version = GameVersion.DP }, // Turtwig @ Lake Verity - new EncounterStaticTyped { Gift = true, Species = 390, Level = 5, Location = 076, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, Version = GameVersion.DP }, // Chimchar - new EncounterStaticTyped { Gift = true, Species = 393, Level = 5, Location = 076, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, Version = GameVersion.DP }, // Piplup - new EncounterStaticTyped { Gift = true, Species = 387, Level = 5, Location = 016, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Version = GameVersion.Pt }, // Turtwig @ Route 201 - new EncounterStaticTyped { Gift = true, Species = 390, Level = 5, Location = 016, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Version = GameVersion.Pt }, // Chimchar - new EncounterStaticTyped { Gift = true, Species = 393, Level = 5, Location = 016, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Version = GameVersion.Pt }, // Piplup + new EncounterStaticTyped { Gift = true, Species = 387, Level = 5, Location = 076, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, Version = DP }, // Turtwig @ Lake Verity + new EncounterStaticTyped { Gift = true, Species = 390, Level = 5, Location = 076, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, Version = DP }, // Chimchar + new EncounterStaticTyped { Gift = true, Species = 393, Level = 5, Location = 076, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, Version = DP }, // Piplup + new EncounterStaticTyped { Gift = true, Species = 387, Level = 5, Location = 016, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Version = Pt }, // Turtwig @ Route 201 + new EncounterStaticTyped { Gift = true, Species = 390, Level = 5, Location = 016, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Version = Pt }, // Chimchar + new EncounterStaticTyped { Gift = true, Species = 393, Level = 5, Location = 016, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Version = Pt }, // Piplup // Fossil @ Mining Museum - new EncounterStaticTyped { Gift = true, Species = 138, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, Version = GameVersion.DP }, // Omanyte - new EncounterStaticTyped { Gift = true, Species = 140, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, Version = GameVersion.DP }, // Kabuto - new EncounterStaticTyped { Gift = true, Species = 142, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, Version = GameVersion.DP }, // Aerodactyl - new EncounterStaticTyped { Gift = true, Species = 345, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, Version = GameVersion.DP }, // Lileep - new EncounterStaticTyped { Gift = true, Species = 347, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, Version = GameVersion.DP}, // Anorith - new EncounterStaticTyped { Gift = true, Species = 408, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, Version = GameVersion.DP }, // Cranidos - new EncounterStaticTyped { Gift = true, Species = 410, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, Version = GameVersion.DP }, // Shieldon - new EncounterStaticTyped { Gift = true, Species = 138, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Version = GameVersion.Pt }, // Omanyte - new EncounterStaticTyped { Gift = true, Species = 140, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Version = GameVersion.Pt }, // Kabuto - new EncounterStaticTyped { Gift = true, Species = 142, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Version = GameVersion.Pt }, // Aerodactyl - new EncounterStaticTyped { Gift = true, Species = 345, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Version = GameVersion.Pt }, // Lileep - new EncounterStaticTyped { Gift = true, Species = 347, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Version = GameVersion.Pt}, // Anorith - new EncounterStaticTyped { Gift = true, Species = 408, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Version = GameVersion.Pt }, // Cranidos - new EncounterStaticTyped { Gift = true, Species = 410, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Version = GameVersion.Pt }, // Shieldon + new EncounterStaticTyped { Gift = true, Species = 138, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, Version = DP }, // Omanyte + new EncounterStaticTyped { Gift = true, Species = 140, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, Version = DP }, // Kabuto + new EncounterStaticTyped { Gift = true, Species = 142, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, Version = DP }, // Aerodactyl + new EncounterStaticTyped { Gift = true, Species = 345, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, Version = DP }, // Lileep + new EncounterStaticTyped { Gift = true, Species = 347, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, Version = DP}, // Anorith + new EncounterStaticTyped { Gift = true, Species = 408, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, Version = DP }, // Cranidos + new EncounterStaticTyped { Gift = true, Species = 410, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, Version = DP }, // Shieldon + new EncounterStaticTyped { Gift = true, Species = 138, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Version = Pt }, // Omanyte + new EncounterStaticTyped { Gift = true, Species = 140, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Version = Pt }, // Kabuto + new EncounterStaticTyped { Gift = true, Species = 142, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Version = Pt }, // Aerodactyl + new EncounterStaticTyped { Gift = true, Species = 345, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Version = Pt }, // Lileep + new EncounterStaticTyped { Gift = true, Species = 347, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Version = Pt}, // Anorith + new EncounterStaticTyped { Gift = true, Species = 408, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Version = Pt }, // Cranidos + new EncounterStaticTyped { Gift = true, Species = 410, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Version = Pt }, // Shieldon // Gift - new EncounterStaticTyped { Gift = true, Species = 133, Level = 05, Location = 010, Version = GameVersion.DP, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Eevee @ Hearthome City - new EncounterStaticTyped { Gift = true, Species = 133, Level = 20, Location = 010, Version = GameVersion.Pt, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, }, // Eevee @ Hearthome City - new EncounterStaticTyped { Gift = true, Species = 137, Level = 25, Location = 012, Version = GameVersion.Pt, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, }, // Porygon @ Veilstone City - new EncounterStatic4 { Gift = true, Species = 175, Level = 01, EggLocation = 2011, Version = GameVersion.Pt,}, // Togepi Egg from Cynthia - new EncounterStatic4 { Gift = true, Species = 440, Level = 01, EggLocation = 2009, Version = GameVersion.DP,}, // Happiny Egg from Traveling Man + new EncounterStaticTyped { Gift = true, Species = 133, Level = 05, Location = 010, Version = DP, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Eevee @ Hearthome City + new EncounterStaticTyped { Gift = true, Species = 133, Level = 20, Location = 010, Version = Pt, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, }, // Eevee @ Hearthome City + new EncounterStaticTyped { Gift = true, Species = 137, Level = 25, Location = 012, Version = Pt, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, }, // Porygon @ Veilstone City + new EncounterStatic4 { Gift = true, Species = 175, Level = 01, EggLocation = 2011, Version = Pt,}, // Togepi Egg from Cynthia + new EncounterStatic4 { Gift = true, Species = 440, Level = 01, EggLocation = 2009, Version = DP,}, // Happiny Egg from Traveling Man new EncounterStatic4 { Gift = true, Species = 447, Level = 01, EggLocation = 2010, }, // Riolu Egg from Riley // Stationary - new EncounterStatic4 { Species = 425, Level = 22, Location = 47, Version = GameVersion.DP }, // Drifloon @ Valley Windworks - new EncounterStatic4 { Species = 425, Level = 15, Location = 47, Version = GameVersion.Pt }, // Drifloon @ Valley Windworks - new EncounterStaticTyped { Species = 479, Level = 15, Location = 70, Version = GameVersion.DP, TypeEncounter = EncounterType.Building_EnigmaStone, }, // Rotom @ Old Chateau - new EncounterStaticTyped { Species = 479, Level = 20, Location = 70, Version = GameVersion.Pt, TypeEncounter = EncounterType.Building_EnigmaStone, }, // Rotom @ Old Chateau + new EncounterStatic4 { Species = 425, Level = 22, Location = 47, Version = DP }, // Drifloon @ Valley Windworks + new EncounterStatic4 { Species = 425, Level = 15, Location = 47, Version = Pt }, // Drifloon @ Valley Windworks + new EncounterStaticTyped { Species = 479, Level = 15, Location = 70, Version = DP, TypeEncounter = EncounterType.Building_EnigmaStone, }, // Rotom @ Old Chateau + new EncounterStaticTyped { Species = 479, Level = 20, Location = 70, Version = Pt, TypeEncounter = EncounterType.Building_EnigmaStone, }, // Rotom @ Old Chateau new EncounterStatic4 { Species = 442, Level = 25, Location = 24 }, // Spiritomb @ Route 209 // Stationary Legendary - new EncounterStaticTyped { Species = 377, Level = 30, Location = 125, Version = GameVersion.Pt, TypeEncounter = EncounterType.Cave_HallOfOrigin, }, // Regirock @ Rock Peak Ruins - new EncounterStaticTyped { Species = 378, Level = 30, Location = 124, Version = GameVersion.Pt, TypeEncounter = EncounterType.Cave_HallOfOrigin, }, // Regice @ Iceberg Ruins - new EncounterStaticTyped { Species = 379, Level = 30, Location = 123, Version = GameVersion.Pt, TypeEncounter = EncounterType.Cave_HallOfOrigin, }, // Registeel @ Iron Ruins + new EncounterStaticTyped { Species = 377, Level = 30, Location = 125, Version = Pt, TypeEncounter = EncounterType.Cave_HallOfOrigin, }, // Regirock @ Rock Peak Ruins + new EncounterStaticTyped { Species = 378, Level = 30, Location = 124, Version = Pt, TypeEncounter = EncounterType.Cave_HallOfOrigin, }, // Regice @ Iceberg Ruins + new EncounterStaticTyped { Species = 379, Level = 30, Location = 123, Version = Pt, TypeEncounter = EncounterType.Cave_HallOfOrigin, }, // Registeel @ Iron Ruins new EncounterStaticTyped { Species = 480, Level = 50, Location = 089, TypeEncounter = EncounterType.Cave_HallOfOrigin, }, // Uxie @ Acuity Cavern new EncounterStaticTyped { Species = 482, Level = 50, Location = 088, TypeEncounter = EncounterType.Cave_HallOfOrigin, }, // Azelf @ Valor Cavern - new EncounterStaticTyped { Species = 483, Level = 47, Location = 051, Version = GameVersion.D, TypeEncounter = EncounterType.DialgaPalkia }, // Dialga @ Spear Pillar - new EncounterStaticTyped { Species = 484, Level = 47, Location = 051, Version = GameVersion.P, TypeEncounter = EncounterType.DialgaPalkia }, // Palkia @ Spear Pillar - new EncounterStaticTyped { Species = 483, Level = 70, Location = 051, Version = GameVersion.Pt, TypeEncounter = EncounterType.DialgaPalkia }, // Dialga @ Spear Pillar - new EncounterStaticTyped { Species = 484, Level = 70, Location = 051, Version = GameVersion.Pt, TypeEncounter = EncounterType.DialgaPalkia }, // Palkia @ Spear Pillar - new EncounterStaticTyped { Species = 485, Level = 70, Location = 084, Version = GameVersion.DP, TypeEncounter = EncounterType.Cave_HallOfOrigin }, // Heatran @ Stark Mountain - new EncounterStaticTyped { Species = 485, Level = 50, Location = 084, Version = GameVersion.Pt, TypeEncounter = EncounterType.Cave_HallOfOrigin }, // Heatran @ Stark Mountain - new EncounterStaticTyped { Species = 486, Level = 70, Location = 064, Version = GameVersion.DP, TypeEncounter = EncounterType.Cave_HallOfOrigin }, // Regigigas @ Snowpoint Temple - new EncounterStaticTyped { Species = 486, Level = 01, Location = 064, Version = GameVersion.Pt, TypeEncounter = EncounterType.Cave_HallOfOrigin }, // Regigigas @ Snowpoint Temple - new EncounterStaticTyped { Species = 487, Level = 70, Location = 062, Version = GameVersion.DP, Form = 0, TypeEncounter = EncounterType.Cave_HallOfOrigin }, // Giratina @ Turnback Cave - new EncounterStaticTyped { Species = 487, Level = 47, Location = 117, Version = GameVersion.Pt, Form = 1, TypeEncounter = EncounterType.DistortionWorld_Pt, HeldItem = 112 }, // Giratina @ Distortion World - new EncounterStaticTyped { Species = 487, Level = 47, Location = 062, Version = GameVersion.Pt, Form = 0, TypeEncounter = EncounterType.Cave_HallOfOrigin }, // Giratina @ Turnback Cave + new EncounterStaticTyped { Species = 483, Level = 47, Location = 051, Version = D, TypeEncounter = EncounterType.DialgaPalkia }, // Dialga @ Spear Pillar + new EncounterStaticTyped { Species = 484, Level = 47, Location = 051, Version = P, TypeEncounter = EncounterType.DialgaPalkia }, // Palkia @ Spear Pillar + new EncounterStaticTyped { Species = 483, Level = 70, Location = 051, Version = Pt, TypeEncounter = EncounterType.DialgaPalkia }, // Dialga @ Spear Pillar + new EncounterStaticTyped { Species = 484, Level = 70, Location = 051, Version = Pt, TypeEncounter = EncounterType.DialgaPalkia }, // Palkia @ Spear Pillar + new EncounterStaticTyped { Species = 485, Level = 70, Location = 084, Version = DP, TypeEncounter = EncounterType.Cave_HallOfOrigin }, // Heatran @ Stark Mountain + new EncounterStaticTyped { Species = 485, Level = 50, Location = 084, Version = Pt, TypeEncounter = EncounterType.Cave_HallOfOrigin }, // Heatran @ Stark Mountain + new EncounterStaticTyped { Species = 486, Level = 70, Location = 064, Version = DP, TypeEncounter = EncounterType.Cave_HallOfOrigin }, // Regigigas @ Snowpoint Temple + new EncounterStaticTyped { Species = 486, Level = 01, Location = 064, Version = Pt, TypeEncounter = EncounterType.Cave_HallOfOrigin }, // Regigigas @ Snowpoint Temple + new EncounterStaticTyped { Species = 487, Level = 70, Location = 062, Version = DP, Form = 0, TypeEncounter = EncounterType.Cave_HallOfOrigin }, // Giratina @ Turnback Cave + new EncounterStaticTyped { Species = 487, Level = 47, Location = 117, Version = Pt, Form = 1, TypeEncounter = EncounterType.DistortionWorld_Pt, HeldItem = 112 }, // Giratina @ Distortion World + new EncounterStaticTyped { Species = 487, Level = 47, Location = 062, Version = Pt, Form = 0, TypeEncounter = EncounterType.Cave_HallOfOrigin }, // Giratina @ Turnback Cave // Event - new EncounterStaticTyped { Species = 491, Level = 40, Location = 079, Version = GameVersion.DP, TypeEncounter = EncounterType.TallGrass }, // Darkrai @ Newmoon Island (Unreleased in Diamond and Pearl) - new EncounterStaticTyped { Species = 491, Level = 50, Location = 079, Version = GameVersion.Pt, TypeEncounter = EncounterType.TallGrass }, // Darkrai @ Newmoon Island - new EncounterStatic4 { Species = 492, Form = 0, Level = 30, Location = 063, Version = GameVersion.Pt, Fateful = true }, // Shaymin @ Flower Paradise - new EncounterStatic4 { Species = 492, Form = 0, Level = 30, Location = 063, Version = GameVersion.DP, Fateful = false }, // Shaymin @ Flower Paradise (Unreleased in Diamond and Pearl) + new EncounterStaticTyped { Species = 491, Level = 40, Location = 079, Version = DP, TypeEncounter = EncounterType.TallGrass }, // Darkrai @ Newmoon Island (Unreleased in Diamond and Pearl) + new EncounterStaticTyped { Species = 491, Level = 50, Location = 079, Version = Pt, TypeEncounter = EncounterType.TallGrass }, // Darkrai @ Newmoon Island + new EncounterStatic4 { Species = 492, Form = 0, Level = 30, Location = 063, Version = Pt, Fateful = true }, // Shaymin @ Flower Paradise + new EncounterStatic4 { Species = 492, Form = 0, Level = 30, Location = 063, Version = DP, Fateful = false }, // Shaymin @ Flower Paradise (Unreleased in Diamond and Pearl) new EncounterStaticTyped { Species = 493, Form = 0, Level = 80, Location = 086, TypeEncounter = EncounterType.Cave_HallOfOrigin }, // Arceus @ Hall of Origin (Unreleased) }; @@ -887,14 +375,14 @@ private static void MarkHGSSEncounterTypeSlots(EncounterArea4[] Areas) private static readonly EncounterStaticTyped[] Encounter_HGSS_KantoRoam_Grass = { - new EncounterStaticTyped { Species = 380, Level = 35, Version = GameVersion.HG, Roaming = true, TypeEncounter = EncounterType.TallGrass, }, // Latias - new EncounterStaticTyped { Species = 381, Level = 35, Version = GameVersion.SS, Roaming = true, TypeEncounter = EncounterType.TallGrass, }, // Latios + new EncounterStaticTyped { Species = 380, Level = 35, Version = HG, Roaming = true, TypeEncounter = EncounterType.TallGrass, }, // Latias + new EncounterStaticTyped { Species = 381, Level = 35, Version = SS, Roaming = true, TypeEncounter = EncounterType.TallGrass, }, // Latios }; private static readonly EncounterStaticTyped[] Encounter_HGSS_KantoRoam_Surf = { - new EncounterStaticTyped { Species = 380, Level = 35, Version = GameVersion.HG, Roaming = true, TypeEncounter = EncounterType.Surfing_Fishing, }, // Latias - new EncounterStaticTyped { Species = 381, Level = 35, Version = GameVersion.SS, Roaming = true, TypeEncounter = EncounterType.Surfing_Fishing, }, // Latios + new EncounterStaticTyped { Species = 380, Level = 35, Version = HG, Roaming = true, TypeEncounter = EncounterType.Surfing_Fishing, }, // Latias + new EncounterStaticTyped { Species = 381, Level = 35, Version = SS, Roaming = true, TypeEncounter = EncounterType.Surfing_Fishing, }, // Latios }; internal static readonly EncounterStaticTyped SpikyEaredPichu = new EncounterStaticTyped // Spiky-Eared Pichu @ Ilex Forest @@ -933,6 +421,7 @@ private static void MarkHGSSEncounterTypeSlots(EncounterArea4[] Areas) new EncounterStaticTyped { Gift = true, Species = 410, Level = 20, Location = 140, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, }, // Shieldon // Gift + new EncounterStaticTyped { Gift = true, Species = 072, Level = 15, Location = 130, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio }, // Tentacool @ Cianwood City new EncounterStaticTyped { Gift = true, Species = 133, Level = 05, Location = 131, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio }, // Eevee @ Goldenrod City new EncounterStaticTyped { Gift = true, Species = 147, Level = 15, Location = 222, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Moves = new[] {245} }, // Dratini @ Dragon's Den (ExtremeSpeed) new EncounterStaticTyped { Gift = true, Species = 236, Level = 10, Location = 216, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, }, // Tyrogue @ Mt. Mortar @@ -948,8 +437,8 @@ private static void MarkHGSSEncounterTypeSlots(EncounterArea4[] Areas) // Goldenrod City Game Corner new EncounterStaticTyped { Gift = true, Species = 063, Level = 15, Location = 131, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio }, // Abra - new EncounterStaticTyped { Gift = true, Species = 023, Level = 15, Location = 131, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Version = GameVersion.HG }, // Ekans - new EncounterStaticTyped { Gift = true, Species = 027, Level = 15, Location = 131, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Version = GameVersion.SS }, // Sandshrew + new EncounterStaticTyped { Gift = true, Species = 023, Level = 15, Location = 131, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Version = HG }, // Ekans + new EncounterStaticTyped { Gift = true, Species = 027, Level = 15, Location = 131, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Version = SS }, // Sandshrew new EncounterStaticTyped { Gift = true, Species = 147, Level = 15, Location = 131, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio }, // Dratini // Team Rocket HQ Trap Floor @@ -973,14 +462,14 @@ private static void MarkHGSSEncounterTypeSlots(EncounterArea4[] Areas) new EncounterStaticTyped { Species = 150, Level = 70, Location = 199, TypeEncounter = EncounterType.Cave_HallOfOrigin }, // Mewtwo @ Cerulean Cave new EncounterStatic4 { Species = 245, Level = 40, Location = 173, }, // Suicune @ Route 25 new EncounterStaticTyped { Species = 245, Level = 40, Location = 206, TypeEncounter = EncounterType.Cave_HallOfOrigin }, // Suicune @ Burned Tower - new EncounterStaticTyped { Species = 249, Level = 45, Location = 218, Version = GameVersion.SS, TypeEncounter = EncounterType.Surfing_Fishing }, // Lugia @ Whirl Islands - new EncounterStaticTyped { Species = 249, Level = 70, Location = 218, Version = GameVersion.HG, TypeEncounter = EncounterType.Surfing_Fishing }, // Lugia @ Whirl Islands - new EncounterStaticTyped { Species = 250, Level = 45, Location = 205, Version = GameVersion.HG, TypeEncounter = EncounterType.Building_EnigmaStone }, // Ho-Oh @ Bell Tower - new EncounterStaticTyped { Species = 250, Level = 70, Location = 205, Version = GameVersion.SS, TypeEncounter = EncounterType.Building_EnigmaStone }, // Ho-Oh @ Bell Tower - new EncounterStaticTyped { Species = 380, Level = 40, Location = 140, Version = GameVersion.SS, TypeEncounter = EncounterType.Building_EnigmaStone }, // Latias @ Pewter City - new EncounterStaticTyped { Species = 381, Level = 40, Location = 140, Version = GameVersion.HG, TypeEncounter = EncounterType.Building_EnigmaStone }, // Latios @ Pewter City - new EncounterStaticTyped { Species = 382, Level = 50, Location = 232, Version = GameVersion.HG, TypeEncounter = EncounterType.Cave_HallOfOrigin }, // Kyogre @ Embedded Tower - new EncounterStaticTyped { Species = 383, Level = 50, Location = 232, Version = GameVersion.SS, TypeEncounter = EncounterType.Cave_HallOfOrigin }, // Groudon @ Embedded Tower + new EncounterStaticTyped { Species = 249, Level = 45, Location = 218, Version = SS, TypeEncounter = EncounterType.Surfing_Fishing }, // Lugia @ Whirl Islands + new EncounterStaticTyped { Species = 249, Level = 70, Location = 218, Version = HG, TypeEncounter = EncounterType.Surfing_Fishing }, // Lugia @ Whirl Islands + new EncounterStaticTyped { Species = 250, Level = 45, Location = 205, Version = HG, TypeEncounter = EncounterType.Building_EnigmaStone }, // Ho-Oh @ Bell Tower + new EncounterStaticTyped { Species = 250, Level = 70, Location = 205, Version = SS, TypeEncounter = EncounterType.Building_EnigmaStone }, // Ho-Oh @ Bell Tower + new EncounterStaticTyped { Species = 380, Level = 40, Location = 140, Version = SS, TypeEncounter = EncounterType.Building_EnigmaStone }, // Latias @ Pewter City + new EncounterStaticTyped { Species = 381, Level = 40, Location = 140, Version = HG, TypeEncounter = EncounterType.Building_EnigmaStone }, // Latios @ Pewter City + new EncounterStaticTyped { Species = 382, Level = 50, Location = 232, Version = HG, TypeEncounter = EncounterType.Cave_HallOfOrigin }, // Kyogre @ Embedded Tower + new EncounterStaticTyped { Species = 383, Level = 50, Location = 232, Version = SS, TypeEncounter = EncounterType.Cave_HallOfOrigin }, // Groudon @ Embedded Tower new EncounterStaticTyped { Species = 384, Level = 50, Location = 232, TypeEncounter = EncounterType.Cave_HallOfOrigin }, // Rayquaza @ Embedded Tower new EncounterStaticTyped { Species = 483, Level = 01, Location = 231, Gift = true, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio }, // Dialga @ Sinjoh Ruins new EncounterStaticTyped { Species = 484, Level = 01, Location = 231, Gift = true, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio }, // Palkia @ Sinjoh Ruins @@ -999,28 +488,28 @@ private static void MarkHGSSEncounterTypeSlots(EncounterArea4[] Areas) private static readonly EncounterTrade[] RanchGifts = { - new EncounterTrade4PID(323975838) { Species = 025, Level = 18, Moves = new[] {447,085,148,104}, TID = 1000, SID = 19840, OTGender = 1, Version = GameVersion.D, Location = 0068, Gender = 0, Ability = 1, CurrentLevel = 20, }, // Pikachu - new EncounterTrade4PID(323977664) { Species = 037, Level = 16, Moves = new[] {412,109,053,219}, TID = 1000, SID = 21150, OTGender = 1, Version = GameVersion.D, Location = 3000, Gender = 0, Ability = 1, CurrentLevel = 30, }, // Vulpix - new EncounterTrade4PID(323975579) { Species = 077, Level = 13, Moves = new[] {036,033,039,052}, TID = 1000, SID = 01123, OTGender = 1, Version = GameVersion.D, Location = 3000, Gender = 0, Ability = 2, CurrentLevel = 16, }, // Ponyta - new EncounterTrade4PID(323975564) { Species = 108, Level = 34, Moves = new[] {076,111,014,205}, TID = 1000, SID = 03050, OTGender = 1, Version = GameVersion.D, Location = 0077, Gender = 0, Ability = 1, CurrentLevel = 40, }, // Lickitung - new EncounterTrade4PID(323977579) { Species = 114, Level = 01, Moves = new[] {437,438,079,246}, TID = 1000, SID = 49497, OTGender = 1, Version = GameVersion.D, Location = 3000, Gender = 1, Ability = 2, }, // Tangela - new EncounterTrade4PID(323977675) { Species = 133, Level = 16, Moves = new[] {363,270,098,247}, TID = 1000, SID = 47710, OTGender = 1, Version = GameVersion.D, Location = 0068, Gender = 0, Ability = 2, CurrentLevel = 30, }, // Eevee - new EncounterTrade4PID(323977588) { Species = 142, Level = 20, Moves = new[] {363,089,444,332}, TID = 1000, SID = 43066, OTGender = 1, Version = GameVersion.D, Location = 0094, Gender = 0, Ability = 1, CurrentLevel = 50, }, // Aerodactyl - new EncounterTrade4 { Species = 151, Level = 50, Moves = new[] {235,216,095,100}, TID = 1000, SID = 59228, OTGender = 1, Version = GameVersion.D, Location = 3000, Gender = 2, Fateful = true, Ball = 0x10, }, // Mew - new EncounterTrade4PID(232975554) { Species = 193, Level = 22, Moves = new[] {318,095,246,138}, TID = 1000, SID = 42301, OTGender = 1, Version = GameVersion.D, Location = 0052, Gender = 0, Ability = 1, CurrentLevel = 45, Ball = 0x05, }, // Yanma - new EncounterTrade4PID(323975570) { Species = 241, Level = 16, Moves = new[] {208,215,360,359}, TID = 1000, SID = 02707, OTGender = 1, Version = GameVersion.D, Location = 3000, Gender = 1, Ability = 1, CurrentLevel = 48, }, // Miltank - new EncounterTrade4PID(323975563) { Species = 285, Level = 22, Moves = new[] {402,147,206,078}, TID = 1000, SID = 02788, OTGender = 1, Version = GameVersion.D, Location = 3000, Gender = 0, Ability = 2, CurrentLevel = 45, Ball = 0x05, }, // Shroomish - new EncounterTrade4PID(323975559) { Species = 320, Level = 30, Moves = new[] {156,323,133,058}, TID = 1000, SID = 27046, OTGender = 1, Version = GameVersion.D, Location = 0038, Gender = 0, Ability = 2, CurrentLevel = 45, }, // Wailmer - new EncounterTrade4PID(323977657) { Species = 360, Level = 01, Moves = new[] {204,150,227,000}, TID = 1000, SID = 01788, OTGender = 1, Version = GameVersion.D, Location = 0004, Gender = 0, Ability = 2, EggLocation = 2000, }, // Wynaut - new EncounterTrade4PID(323975563) { Species = 397, Level = 02, Moves = new[] {355,017,283,018}, TID = 1000, SID = 59298, OTGender = 1, Version = GameVersion.D, Location = 0016, Gender = 0, Ability = 2, CurrentLevel = 23, }, // Staravia - new EncounterTrade4PID(323970584) { Species = 415, Level = 05, Moves = new[] {230,016,000,000}, TID = 1000, SID = 54140, OTGender = 1, Version = GameVersion.D, Location = 0020, Gender = 1, Ability = 1, CurrentLevel = 20, }, // Combee - new EncounterTrade4PID(323977539) { Species = 417, Level = 09, Moves = new[] {447,045,351,098}, TID = 1000, SID = 18830, OTGender = 1, Version = GameVersion.D, Location = 0020, Gender = 1, Ability = 2, CurrentLevel = 10, }, // Pachirisu - new EncounterTrade4PID(323974107) { Species = 422, Level = 20, Moves = new[] {363,352,426,104}, TID = 1000, SID = 39272, OTGender = 1, Version = GameVersion.D, Location = 0028, Gender = 0, Ability = 2, CurrentLevel = 25, Form = 1 }, // Shellos - new EncounterTrade4PID(323977566) { Species = 427, Level = 10, Moves = new[] {204,193,409,098}, TID = 1000, SID = 31045, OTGender = 1, Version = GameVersion.D, Location = 3000, Gender = 1, Ability = 1, CurrentLevel = 16, }, // Buneary - new EncounterTrade4PID(323975579) { Species = 453, Level = 22, Moves = new[] {310,207,426,389}, TID = 1000, SID = 41342, OTGender = 1, Version = GameVersion.D, Location = 0052, Gender = 0, Ability = 2, CurrentLevel = 31, Ball = 0x05, }, // Croagunk - new EncounterTrade4PID(323977566) { Species = 456, Level = 15, Moves = new[] {213,352,219,392}, TID = 1000, SID = 48348, OTGender = 1, Version = GameVersion.D, Location = 0020, Gender = 1, Ability = 1, CurrentLevel = 35, }, // Finneon - new EncounterTrade4PID(323975582) { Species = 459, Level = 32, Moves = new[] {452,420,275,059}, TID = 1000, SID = 23360, OTGender = 1, Version = GameVersion.D, Location = 0031, Gender = 0, Ability = 1, CurrentLevel = 41, }, // Snover - new EncounterTrade4 { Species = 489, Level = 01, Moves = new[] {447,240,156,057}, TID = 1000, SID = 09248, OTGender = 1, Version = GameVersion.D, Location = 3000, Gender = 2, Fateful = true, CurrentLevel = 50, Ball = 0x10, EggLocation = 3000, }, // Phione + new EncounterTrade4PID(323975838) { Species = 025, Level = 18, Moves = new[] {447,085,148,104}, TID = 1000, SID = 19840, OTGender = 1, Version = D, Location = 0068, Gender = 0, Ability = 1, CurrentLevel = 20, }, // Pikachu + new EncounterTrade4PID(323977664) { Species = 037, Level = 16, Moves = new[] {412,109,053,219}, TID = 1000, SID = 21150, OTGender = 1, Version = D, Location = 3000, Gender = 0, Ability = 1, CurrentLevel = 30, }, // Vulpix + new EncounterTrade4PID(323975579) { Species = 077, Level = 13, Moves = new[] {036,033,039,052}, TID = 1000, SID = 01123, OTGender = 1, Version = D, Location = 3000, Gender = 0, Ability = 2, CurrentLevel = 16, }, // Ponyta + new EncounterTrade4PID(323975564) { Species = 108, Level = 34, Moves = new[] {076,111,014,205}, TID = 1000, SID = 03050, OTGender = 1, Version = D, Location = 0077, Gender = 0, Ability = 1, CurrentLevel = 40, }, // Lickitung + new EncounterTrade4PID(323977579) { Species = 114, Level = 01, Moves = new[] {437,438,079,246}, TID = 1000, SID = 49497, OTGender = 1, Version = D, Location = 3000, Gender = 1, Ability = 2, }, // Tangela + new EncounterTrade4PID(323977675) { Species = 133, Level = 16, Moves = new[] {363,270,098,247}, TID = 1000, SID = 47710, OTGender = 1, Version = D, Location = 0068, Gender = 0, Ability = 2, CurrentLevel = 30, }, // Eevee + new EncounterTrade4PID(323977588) { Species = 142, Level = 20, Moves = new[] {363,089,444,332}, TID = 1000, SID = 43066, OTGender = 1, Version = D, Location = 0094, Gender = 0, Ability = 1, CurrentLevel = 50, }, // Aerodactyl + new EncounterTrade4 { Species = 151, Level = 50, Moves = new[] {235,216,095,100}, TID = 1000, SID = 59228, OTGender = 1, Version = D, Location = 3000, Gender = 2, Fateful = true, Ball = 0x10, }, // Mew + new EncounterTrade4PID(232975554) { Species = 193, Level = 22, Moves = new[] {318,095,246,138}, TID = 1000, SID = 42301, OTGender = 1, Version = D, Location = 0052, Gender = 0, Ability = 1, CurrentLevel = 45, Ball = 0x05, }, // Yanma + new EncounterTrade4PID(323975570) { Species = 241, Level = 16, Moves = new[] {208,215,360,359}, TID = 1000, SID = 02707, OTGender = 1, Version = D, Location = 3000, Gender = 1, Ability = 1, CurrentLevel = 48, }, // Miltank + new EncounterTrade4PID(323975563) { Species = 285, Level = 22, Moves = new[] {402,147,206,078}, TID = 1000, SID = 02788, OTGender = 1, Version = D, Location = 3000, Gender = 0, Ability = 2, CurrentLevel = 45, Ball = 0x05, }, // Shroomish + new EncounterTrade4PID(323975559) { Species = 320, Level = 30, Moves = new[] {156,323,133,058}, TID = 1000, SID = 27046, OTGender = 1, Version = D, Location = 0038, Gender = 0, Ability = 2, CurrentLevel = 45, }, // Wailmer + new EncounterTrade4PID(323977657) { Species = 360, Level = 01, Moves = new[] {204,150,227,000}, TID = 1000, SID = 01788, OTGender = 1, Version = D, Location = 0004, Gender = 0, Ability = 2, EggLocation = 2000, }, // Wynaut + new EncounterTrade4PID(323975563) { Species = 397, Level = 02, Moves = new[] {355,017,283,018}, TID = 1000, SID = 59298, OTGender = 1, Version = D, Location = 0016, Gender = 0, Ability = 2, CurrentLevel = 23, }, // Staravia + new EncounterTrade4PID(323970584) { Species = 415, Level = 05, Moves = new[] {230,016,000,000}, TID = 1000, SID = 54140, OTGender = 1, Version = D, Location = 0020, Gender = 1, Ability = 1, CurrentLevel = 20, }, // Combee + new EncounterTrade4PID(323977539) { Species = 417, Level = 09, Moves = new[] {447,045,351,098}, TID = 1000, SID = 18830, OTGender = 1, Version = D, Location = 0020, Gender = 1, Ability = 2, CurrentLevel = 10, }, // Pachirisu + new EncounterTrade4PID(323974107) { Species = 422, Level = 20, Moves = new[] {363,352,426,104}, TID = 1000, SID = 39272, OTGender = 1, Version = D, Location = 0028, Gender = 0, Ability = 2, CurrentLevel = 25, Form = 1 }, // Shellos + new EncounterTrade4PID(323977566) { Species = 427, Level = 10, Moves = new[] {204,193,409,098}, TID = 1000, SID = 31045, OTGender = 1, Version = D, Location = 3000, Gender = 1, Ability = 1, CurrentLevel = 16, }, // Buneary + new EncounterTrade4PID(323975579) { Species = 453, Level = 22, Moves = new[] {310,207,426,389}, TID = 1000, SID = 41342, OTGender = 1, Version = D, Location = 0052, Gender = 0, Ability = 2, CurrentLevel = 31, Ball = 0x05, }, // Croagunk + new EncounterTrade4PID(323977566) { Species = 456, Level = 15, Moves = new[] {213,352,219,392}, TID = 1000, SID = 48348, OTGender = 1, Version = D, Location = 0020, Gender = 1, Ability = 1, CurrentLevel = 35, }, // Finneon + new EncounterTrade4PID(323975582) { Species = 459, Level = 32, Moves = new[] {452,420,275,059}, TID = 1000, SID = 23360, OTGender = 1, Version = D, Location = 0031, Gender = 0, Ability = 1, CurrentLevel = 41, }, // Snover + new EncounterTrade4 { Species = 489, Level = 01, Moves = new[] {447,240,156,057}, TID = 1000, SID = 09248, OTGender = 1, Version = D, Location = 3000, Gender = 2, Fateful = true, CurrentLevel = 50, Ball = 0x10, EggLocation = 3000, }, // Phione }; internal static readonly EncounterTrade[] TradeGift_DPPt = new [] @@ -1055,596 +544,10 @@ private static void MarkHGSSEncounterTypeSlots(EncounterArea4[] Areas) private static readonly string[][] TradeHGSS = Util.GetLanguageStrings8(tradeHGSS); #endregion - #region Alt Slots - - private static readonly EncounterArea4DPPt[] DPPt_Unown = - { - new EncounterArea4DPPt { - Location = 53, // Solaceon Ruins - Slots = Enumerable.Range(1, 27).Select(i => new EncounterSlot4 { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = i }).ToArray() // B->?, Unown A is loaded from encounters raw file - }, - }; - - private static readonly EncounterArea4HGSS SlotsHGSS_BCC = - - new EncounterArea4HGSS - { - // Source http://bulbapedia.bulbagarden.net/wiki/Bug-Catching_Contest#Generation_IV - Location = 207, // National Park Catching Contest - Slots = new[] - { - // Bug Contest Pre-National Pokédex - new EncounterSlot4 { Species = 010, LevelMin = 07, LevelMax = 18, Type = SlotType.BugContest, SlotNumber = 0 }, // Caterpie - new EncounterSlot4 { Species = 013, LevelMin = 07, LevelMax = 18, Type = SlotType.BugContest, SlotNumber = 1 }, // Weedle - new EncounterSlot4 { Species = 011, LevelMin = 09, LevelMax = 18, Type = SlotType.BugContest, SlotNumber = 2 }, // Metapod - new EncounterSlot4 { Species = 014, LevelMin = 09, LevelMax = 18, Type = SlotType.BugContest, SlotNumber = 3 }, // Kakuna - new EncounterSlot4 { Species = 012, LevelMin = 12, LevelMax = 15, Type = SlotType.BugContest, SlotNumber = 4 }, // Butterfree - new EncounterSlot4 { Species = 015, LevelMin = 12, LevelMax = 15, Type = SlotType.BugContest, SlotNumber = 5 }, // Beedrill - new EncounterSlot4 { Species = 048, LevelMin = 10, LevelMax = 16, Type = SlotType.BugContest, SlotNumber = 6 }, // Venonat - new EncounterSlot4 { Species = 046, LevelMin = 10, LevelMax = 17, Type = SlotType.BugContest, SlotNumber = 7 }, // Paras - new EncounterSlot4 { Species = 123, LevelMin = 13, LevelMax = 14, Type = SlotType.BugContest, SlotNumber = 8 }, // Scyther - new EncounterSlot4 { Species = 127, LevelMin = 13, LevelMax = 14, Type = SlotType.BugContest, SlotNumber = 9 }, // Pinsir - // Bug Contest Tuesday Post-National Pokédex - new EncounterSlot4 { Species = 010, LevelMin = 24, LevelMax = 36, Type = SlotType.BugContest, SlotNumber = 0 }, // Caterpie - new EncounterSlot4 { Species = 013, LevelMin = 24, LevelMax = 36, Type = SlotType.BugContest, SlotNumber = 1 }, // Weedle - new EncounterSlot4 { Species = 011, LevelMin = 26, LevelMax = 36, Type = SlotType.BugContest, SlotNumber = 2 }, // Metapod - new EncounterSlot4 { Species = 014, LevelMin = 26, LevelMax = 36, Type = SlotType.BugContest, SlotNumber = 3 }, // Kakuna - new EncounterSlot4 { Species = 012, LevelMin = 27, LevelMax = 30, Type = SlotType.BugContest, SlotNumber = 4 }, // Butterfree - new EncounterSlot4 { Species = 015, LevelMin = 27, LevelMax = 30, Type = SlotType.BugContest, SlotNumber = 5 }, // Beedrill - new EncounterSlot4 { Species = 048, LevelMin = 25, LevelMax = 32, Type = SlotType.BugContest, SlotNumber = 6 }, // Venonat - new EncounterSlot4 { Species = 046, LevelMin = 27, LevelMax = 34, Type = SlotType.BugContest, SlotNumber = 7 }, // Paras - new EncounterSlot4 { Species = 123, LevelMin = 27, LevelMax = 28, Type = SlotType.BugContest, SlotNumber = 8 }, // Scyther - new EncounterSlot4 { Species = 127, LevelMin = 27, LevelMax = 28, Type = SlotType.BugContest, SlotNumber = 9 }, // Pinsir - - // Bug Contest Thursday and Saturday Post-National Pokédex - new EncounterSlot4 { Species = 265, LevelMin = 24, LevelMax = 36, Type = SlotType.BugContest, SlotNumber = 0 }, // Wurmple - new EncounterSlot4 { Species = 266, LevelMin = 24, LevelMax = 36, Type = SlotType.BugContest, SlotNumber = 1 }, // Silcoon (Thursday) - new EncounterSlot4 { Species = 268, LevelMin = 24, LevelMax = 36, Type = SlotType.BugContest, SlotNumber = 1 }, // Cascoon (Saturday) - new EncounterSlot4 { Species = 290, LevelMin = 26, LevelMax = 36, Type = SlotType.BugContest, SlotNumber = 2 }, // Nincada - new EncounterSlot4 { Species = 313, LevelMin = 26, LevelMax = 36, Type = SlotType.BugContest, SlotNumber = 3 }, // Volbeat (Thursday) - new EncounterSlot4 { Species = 314, LevelMin = 26, LevelMax = 36, Type = SlotType.BugContest, SlotNumber = 3 }, // Illumise (Saturday) - new EncounterSlot4 { Species = 401, LevelMin = 27, LevelMax = 30, Type = SlotType.BugContest, SlotNumber = 4 }, // Kricketot - new EncounterSlot4 { Species = 402, LevelMin = 27, LevelMax = 30, Type = SlotType.BugContest, SlotNumber = 5 }, // Kricketune - new EncounterSlot4 { Species = 269, LevelMin = 25, LevelMax = 32, Type = SlotType.BugContest, SlotNumber = 6 }, // Dustox (Thursday) - new EncounterSlot4 { Species = 267, LevelMin = 25, LevelMax = 32, Type = SlotType.BugContest, SlotNumber = 6 }, // Beautifly (Saturday) - new EncounterSlot4 { Species = 415, LevelMin = 27, LevelMax = 34, Type = SlotType.BugContest, SlotNumber = 7 }, // Combee - new EncounterSlot4 { Species = 123, LevelMin = 27, LevelMax = 28, Type = SlotType.BugContest, SlotNumber = 8 }, // Scyther - new EncounterSlot4 { Species = 127, LevelMin = 27, LevelMax = 28, Type = SlotType.BugContest, SlotNumber = 9 }, // Pinsir - } - }; - - private static readonly EncounterSlot[] SAFARIZONE_PEAK = - { - new EncounterSlot4 { Species = 022, LevelMin = 44, LevelMax = 44, Type = SlotType.Grass_Safari }, // Fearow - new EncounterSlot4 { Species = 046, LevelMin = 42, LevelMax = 42, Type = SlotType.Grass_Safari }, // Paras - new EncounterSlot4 { Species = 074, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Geodude - new EncounterSlot4 { Species = 075, LevelMin = 16, LevelMax = 17, Type = SlotType.Grass_Safari }, // Graveler - new EncounterSlot4 { Species = 080, LevelMin = 45, LevelMax = 45, Type = SlotType.Grass_Safari }, // Slowbro - new EncounterSlot4 { Species = 081, LevelMin = 15, LevelMax = 16, Type = SlotType.Grass_Safari }, // Magnemite - new EncounterSlot4 { Species = 082, LevelMin = 17, LevelMax = 17, Type = SlotType.Grass_Safari }, // Magneton - new EncounterSlot4 { Species = 126, LevelMin = 17, LevelMax = 17, Type = SlotType.Grass_Safari }, // Magmar - new EncounterSlot4 { Species = 126, LevelMin = 41, LevelMax = 41, Type = SlotType.Grass_Safari }, // Magmar - new EncounterSlot4 { Species = 202, LevelMin = 16, LevelMax = 17, Type = SlotType.Grass_Safari }, // Wobbuffet - new EncounterSlot4 { Species = 202, LevelMin = 41, LevelMax = 41, Type = SlotType.Grass_Safari }, // Wobbuffet - new EncounterSlot4 { Species = 264, LevelMin = 46, LevelMax = 46, Type = SlotType.Grass_Safari }, // Linoone - new EncounterSlot4 { Species = 288, LevelMin = 47, LevelMax = 47, Type = SlotType.Grass_Safari }, // Vigoroth - new EncounterSlot4 { Species = 305, LevelMin = 45, LevelMax = 45, Type = SlotType.Grass_Safari }, // Lairon - new EncounterSlot4 { Species = 335, LevelMin = 43, LevelMax = 45, Type = SlotType.Grass_Safari }, // Zangoose - new EncounterSlot4 { Species = 363, LevelMin = 44, LevelMax = 45, Type = SlotType.Grass_Safari }, // Spheal - new EncounterSlot4 { Species = 436, LevelMin = 45, LevelMax = 46, Type = SlotType.Grass_Safari }, // Bronzor - }; - - private static readonly EncounterSlot[] SAFARIZONE_DESERT = - { - new EncounterSlot4 { Species = 022, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Fearow - new EncounterSlot4 { Species = 022, LevelMin = 38, LevelMax = 38, Type = SlotType.Grass_Safari }, // Fearow - new EncounterSlot4 { Species = 022, LevelMin = 41, LevelMax = 41, Type = SlotType.Grass_Safari }, // Fearow - new EncounterSlot4 { Species = 027, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Sandshrew - new EncounterSlot4 { Species = 028, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Sandslash - new EncounterSlot4 { Species = 104, LevelMin = 16, LevelMax = 17, Type = SlotType.Grass_Safari }, // Cubone - new EncounterSlot4 { Species = 105, LevelMin = 17, LevelMax = 17, Type = SlotType.Grass_Safari }, // Marowak - new EncounterSlot4 { Species = 105, LevelMin = 41, LevelMax = 41, Type = SlotType.Grass_Safari }, // Marowak - new EncounterSlot4 { Species = 270, LevelMin = 38, LevelMax = 38, Type = SlotType.Grass_Safari }, // Lotad - new EncounterSlot4 { Species = 327, LevelMin = 45, LevelMax = 45, Type = SlotType.Grass_Safari }, // Spinda - new EncounterSlot4 { Species = 328, LevelMin = 46, LevelMax = 47, Type = SlotType.Grass_Safari }, // Trapinch - new EncounterSlot4 { Species = 329, LevelMin = 44, LevelMax = 45, Type = SlotType.Grass_Safari }, // Vibrava - new EncounterSlot4 { Species = 331, LevelMin = 35, LevelMax = 35, Type = SlotType.Grass_Safari }, // Cacnea - new EncounterSlot4 { Species = 332, LevelMin = 48, LevelMax = 48, Type = SlotType.Grass_Safari }, // Cacturne - new EncounterSlot4 { Species = 449, LevelMin = 43, LevelMax = 43, Type = SlotType.Grass_Safari }, // Hippopotas - new EncounterSlot4 { Species = 455, LevelMin = 48, LevelMax = 48, Type = SlotType.Grass_Safari }, // Carnivine - }; - - private static readonly EncounterSlot[] SAFARIZONE_PLAINS = - { - new EncounterSlot4 { Species = 019, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Rattata - new EncounterSlot4 { Species = 020, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Raticate - new EncounterSlot4 { Species = 063, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Abra - new EncounterSlot4 { Species = 077, LevelMin = 42, LevelMax = 42, Type = SlotType.Grass_Safari }, // Ponyta - new EncounterSlot4 { Species = 203, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Girafarig - new EncounterSlot4 { Species = 203, LevelMin = 40, LevelMax = 40, Type = SlotType.Grass_Safari }, // Girafarig - new EncounterSlot4 { Species = 229, LevelMin = 43, LevelMax = 44, Type = SlotType.Grass_Safari }, // Houndoom - new EncounterSlot4 { Species = 234, LevelMin = 17, LevelMax = 17, Type = SlotType.Grass_Safari }, // Stantler - new EncounterSlot4 { Species = 234, LevelMin = 40, LevelMax = 41, Type = SlotType.Grass_Safari }, // Stantler - new EncounterSlot4 { Species = 235, LevelMin = 17, LevelMax = 17, Type = SlotType.Grass_Safari }, // Smeargle - new EncounterSlot4 { Species = 235, LevelMin = 41, LevelMax = 41, Type = SlotType.Grass_Safari }, // Smeargle - new EncounterSlot4 { Species = 263, LevelMin = 44, LevelMax = 44, Type = SlotType.Grass_Safari }, // Zigzagoon - new EncounterSlot4 { Species = 270, LevelMin = 42, LevelMax = 42, Type = SlotType.Grass_Safari }, // Lotad - new EncounterSlot4 { Species = 283, LevelMin = 46, LevelMax = 46, Type = SlotType.Grass_Safari }, // Surskit - new EncounterSlot4 { Species = 310, LevelMin = 45, LevelMax = 45, Type = SlotType.Grass_Safari }, // Manectric - new EncounterSlot4 { Species = 335, LevelMin = 43, LevelMax = 45, Type = SlotType.Grass_Safari }, // Zangoose - new EncounterSlot4 { Species = 403, LevelMin = 43, LevelMax = 44, Type = SlotType.Grass_Safari }, // Shinx - }; - - private static readonly EncounterSlot[] SAFARIZONE_MEADOW = - { - new EncounterSlot4 { Species = 020, LevelMin = 40, LevelMax = 40, Type = SlotType.Grass_Safari }, // Raticate - new EncounterSlot4 { Species = 035, LevelMin = 17, LevelMax = 17, Type = SlotType.Grass_Safari }, // Clefairy - new EncounterSlot4 { Species = 035, LevelMin = 42, LevelMax = 42, Type = SlotType.Grass_Safari }, // Clefairy - new EncounterSlot4 { Species = 039, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Jigglypuff - new EncounterSlot4 { Species = 060, LevelMin = 12, LevelMax = 15, Type = SlotType.Old_Rod_Safari }, // Poliwag - new EncounterSlot4 { Species = 060, LevelMin = 22, LevelMax = 24, Type = SlotType.Good_Rod_Safari }, // Poliwag - new EncounterSlot4 { Species = 060, LevelMin = 35, LevelMax = 36, Type = SlotType.Super_Rod_Safari }, // Poliwag - new EncounterSlot4 { Species = 061, LevelMin = 15, LevelMax = 16, Type = SlotType.Old_Rod_Safari }, // Poliwhirl - new EncounterSlot4 { Species = 061, LevelMin = 24, LevelMax = 25, Type = SlotType.Good_Rod_Safari }, // Poliwhirl - new EncounterSlot4 { Species = 061, LevelMin = 27, LevelMax = 27, Type = SlotType.Good_Rod_Safari }, // Poliwhirl - new EncounterSlot4 { Species = 061, LevelMin = 35, LevelMax = 38, Type = SlotType.Super_Rod_Safari }, // Poliwhirl - new EncounterSlot4 { Species = 074, LevelMin = 45, LevelMax = 45, Type = SlotType.Grass_Safari }, // Geodude - new EncounterSlot4 { Species = 113, LevelMin = 42, LevelMax = 42, Type = SlotType.Grass_Safari }, // Chansey - new EncounterSlot4 { Species = 129, LevelMin = 15, LevelMax = 17, Type = SlotType.Surf_Safari }, // Magikarp - new EncounterSlot4 { Species = 129, LevelMin = 12, LevelMax = 15, Type = SlotType.Old_Rod_Safari }, // Magikarp - new EncounterSlot4 { Species = 129, LevelMin = 22, LevelMax = 24, Type = SlotType.Good_Rod_Safari }, // Magikarp - new EncounterSlot4 { Species = 130, LevelMin = 28, LevelMax = 28, Type = SlotType.Good_Rod_Safari }, // Gyarados - new EncounterSlot4 { Species = 130, LevelMin = 42, LevelMax = 42, Type = SlotType.Super_Rod_Safari }, // Gyarados - new EncounterSlot4 { Species = 130, LevelMin = 45, LevelMax = 45, Type = SlotType.Super_Rod_Safari }, // Gyarados - new EncounterSlot4 { Species = 183, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Marill - new EncounterSlot4 { Species = 183, LevelMin = 16, LevelMax = 17, Type = SlotType.Surf_Safari }, // Marill - new EncounterSlot4 { Species = 187, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Hoppip - new EncounterSlot4 { Species = 188, LevelMin = 17, LevelMax = 17, Type = SlotType.Grass_Safari }, // Skiploom - new EncounterSlot4 { Species = 188, LevelMin = 40, LevelMax = 40, Type = SlotType.Grass_Safari }, // Skiploom - new EncounterSlot4 { Species = 188, LevelMin = 47, LevelMax = 47, Type = SlotType.Surf_Safari }, // Skiploom - new EncounterSlot4 { Species = 191, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Sunkern - new EncounterSlot4 { Species = 194, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Wooper - new EncounterSlot4 { Species = 194, LevelMin = 40, LevelMax = 40, Type = SlotType.Grass_Safari }, // Wooper - new EncounterSlot4 { Species = 194, LevelMin = 15, LevelMax = 17, Type = SlotType.Surf_Safari }, // Wooper - new EncounterSlot4 { Species = 273, LevelMin = 45, LevelMax = 45, Type = SlotType.Grass_Safari }, // Seedot - new EncounterSlot4 { Species = 274, LevelMin = 38, LevelMax = 38, Type = SlotType.Grass_Safari }, // Nuzleaf - new EncounterSlot4 { Species = 274, LevelMin = 47, LevelMax = 48, Type = SlotType.Grass_Safari }, // Nuzleaf - new EncounterSlot4 { Species = 284, LevelMin = 42, LevelMax = 42, Type = SlotType.Surf_Safari }, // Masquerain - new EncounterSlot4 { Species = 284, LevelMin = 46, LevelMax = 46, Type = SlotType.Surf_Safari }, // Masquerain - new EncounterSlot4 { Species = 299, LevelMin = 45, LevelMax = 45, Type = SlotType.Grass_Safari }, // Nosepass - new EncounterSlot4 { Species = 447, LevelMin = 45, LevelMax = 46, Type = SlotType.Grass_Safari }, // Riolu - }; - - private static readonly EncounterSlot[] SAFARIZONE_FOREST = - { - new EncounterSlot4 { Species = 016, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Pidgey - new EncounterSlot4 { Species = 069, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Bellsprout - new EncounterSlot4 { Species = 092, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Gastly - new EncounterSlot4 { Species = 093, LevelMin = 16, LevelMax = 17, Type = SlotType.Grass_Safari }, // Haunter - new EncounterSlot4 { Species = 108, LevelMin = 40, LevelMax = 40, Type = SlotType.Grass_Safari }, // Lickitung - new EncounterSlot4 { Species = 122, LevelMin = 16, LevelMax = 17, Type = SlotType.Grass_Safari }, // Mr. Mime - new EncounterSlot4 { Species = 122, LevelMin = 45, LevelMax = 45, Type = SlotType.Grass_Safari }, // Mr. Mime - new EncounterSlot4 { Species = 125, LevelMin = 41, LevelMax = 41, Type = SlotType.Grass_Safari }, // Electabuzz - new EncounterSlot4 { Species = 200, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Misdreavus - new EncounterSlot4 { Species = 200, LevelMin = 42, LevelMax = 42, Type = SlotType.Grass_Safari }, // Misdreavus - new EncounterSlot4 { Species = 283, LevelMin = 42, LevelMax = 42, Type = SlotType.Grass_Safari }, // Surskit - new EncounterSlot4 { Species = 353, LevelMin = 46, LevelMax = 47, Type = SlotType.Grass_Safari }, // Shuppet - new EncounterSlot4 { Species = 374, LevelMin = 44, LevelMax = 44, Type = SlotType.Grass_Safari }, // Beldum - new EncounterSlot4 { Species = 399, LevelMin = 40, LevelMax = 40, Type = SlotType.Grass_Safari }, // Bidoof - new EncounterSlot4 { Species = 406, LevelMin = 47, LevelMax = 47, Type = SlotType.Grass_Safari }, // Budew - new EncounterSlot4 { Species = 437, LevelMin = 44, LevelMax = 45, Type = SlotType.Grass_Safari }, // Bronzong - }; - - private static readonly EncounterSlot[] SAFARIZONE_SWAMP = - { - new EncounterSlot4 { Species = 039, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Jigglypuff - new EncounterSlot4 { Species = 046, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Paras - new EncounterSlot4 { Species = 047, LevelMin = 41, LevelMax = 41, Type = SlotType.Grass_Safari }, // Parasect - new EncounterSlot4 { Species = 070, LevelMin = 46, LevelMax = 46, Type = SlotType.Grass_Safari }, // Weepinbell - new EncounterSlot4 { Species = 096, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Drowzee - new EncounterSlot4 { Species = 097, LevelMin = 16, LevelMax = 17, Type = SlotType.Grass_Safari }, // Hypno - new EncounterSlot4 { Species = 097, LevelMin = 37, LevelMax = 37, Type = SlotType.Grass_Safari }, // Hypno - new EncounterSlot4 { Species = 100, LevelMin = 42, LevelMax = 42, Type = SlotType.Grass_Safari }, // Voltorb - new EncounterSlot4 { Species = 118, LevelMin = 15, LevelMax = 17, Type = SlotType.Surf_Safari }, // Goldeen - new EncounterSlot4 { Species = 118, LevelMin = 17, LevelMax = 17, Type = SlotType.Old_Rod_Safari }, // Goldeen - new EncounterSlot4 { Species = 118, LevelMin = 22, LevelMax = 24, Type = SlotType.Good_Rod_Safari }, // Goldeen - new EncounterSlot4 { Species = 118, LevelMin = 35, LevelMax = 37, Type = SlotType.Super_Rod_Safari }, // Goldeen - new EncounterSlot4 { Species = 119, LevelMin = 17, LevelMax = 17, Type = SlotType.Old_Rod_Safari }, // Seaking - new EncounterSlot4 { Species = 119, LevelMin = 24, LevelMax = 25, Type = SlotType.Good_Rod_Safari }, // Seaking - new EncounterSlot4 { Species = 119, LevelMin = 27, LevelMax = 27, Type = SlotType.Good_Rod_Safari }, // Seaking - new EncounterSlot4 { Species = 119, LevelMin = 35, LevelMax = 37, Type = SlotType.Super_Rod_Safari }, // Seaking - new EncounterSlot4 { Species = 119, LevelMin = 42, LevelMax = 42, Type = SlotType.Surf_Safari }, // Seaking - new EncounterSlot4 { Species = 129, LevelMin = 12, LevelMax = 15, Type = SlotType.Old_Rod_Safari }, // Magikarp - new EncounterSlot4 { Species = 129, LevelMin = 22, LevelMax = 24, Type = SlotType.Good_Rod_Safari }, // Magikarp - new EncounterSlot4 { Species = 129, LevelMin = 15, LevelMax = 17, Type = SlotType.Surf_Safari }, // Magikarp - new EncounterSlot4 { Species = 147, LevelMin = 36, LevelMax = 37, Type = SlotType.Super_Rod_Safari }, // Dratini - new EncounterSlot4 { Species = 147, LevelMin = 29, LevelMax = 29, Type = SlotType.Good_Rod_Safari }, // Dratini - new EncounterSlot4 { Species = 148, LevelMin = 42, LevelMax = 42, Type = SlotType.Super_Rod_Safari }, // Dragonair - new EncounterSlot4 { Species = 148, LevelMin = 45, LevelMax = 45, Type = SlotType.Super_Rod_Safari }, // Dragonair - new EncounterSlot4 { Species = 161, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Sentret - new EncounterSlot4 { Species = 162, LevelMin = 42, LevelMax = 42, Type = SlotType.Grass_Safari }, // Furret - new EncounterSlot4 { Species = 198, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Murkrow - new EncounterSlot4 { Species = 198, LevelMin = 37, LevelMax = 37, Type = SlotType.Grass_Safari }, // Murkrow - new EncounterSlot4 { Species = 198, LevelMin = 47, LevelMax = 47, Type = SlotType.Surf_Safari }, // Murkrow - new EncounterSlot4 { Species = 355, LevelMin = 38, LevelMax = 38, Type = SlotType.Grass_Safari }, // Duskull - new EncounterSlot4 { Species = 355, LevelMin = 48, LevelMax = 48, Type = SlotType.Surf_Safari }, // Duskull - new EncounterSlot4 { Species = 358, LevelMin = 46, LevelMax = 47, Type = SlotType.Grass_Safari }, // Chimecho - new EncounterSlot4 { Species = 371, LevelMin = 44, LevelMax = 45, Type = SlotType.Grass_Safari }, // Bagon - new EncounterSlot4 { Species = 417, LevelMin = 47, LevelMax = 47, Type = SlotType.Grass_Safari }, // Pachirisu - new EncounterSlot4 { Species = 419, LevelMin = 44, LevelMax = 44, Type = SlotType.Grass_Safari }, // Floatzel - }; - - private static readonly EncounterSlot[] SAFARIZONE_MARSHLAND = - { - new EncounterSlot4 { Species = 023, LevelMin = 15, LevelMax = 16, Type = SlotType.Grass_Safari }, // Ekans - new EncounterSlot4 { Species = 024, LevelMin = 17, LevelMax = 17, Type = SlotType.Grass_Safari }, // Arbok - new EncounterSlot4 { Species = 043, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Oddish - new EncounterSlot4 { Species = 044, LevelMin = 16, LevelMax = 17, Type = SlotType.Grass_Safari }, // Gloom - new EncounterSlot4 { Species = 044, LevelMin = 42, LevelMax = 42, Type = SlotType.Grass_Safari }, // Gloom - new EncounterSlot4 { Species = 050, LevelMin = 43, LevelMax = 43, Type = SlotType.Grass_Safari }, // Diglett - new EncounterSlot4 { Species = 060, LevelMin = 12, LevelMax = 15, Type = SlotType.Old_Rod_Safari }, // Poliwag - new EncounterSlot4 { Species = 060, LevelMin = 15, LevelMax = 17, Type = SlotType.Surf_Safari }, // Poliwag - new EncounterSlot4 { Species = 060, LevelMin = 16, LevelMax = 16, Type = SlotType.Old_Rod_Safari }, // Poliwag - new EncounterSlot4 { Species = 060, LevelMin = 18, LevelMax = 18, Type = SlotType.Old_Rod_Safari }, // Poliwag - new EncounterSlot4 { Species = 061, LevelMin = 22, LevelMax = 25, Type = SlotType.Good_Rod_Safari }, // Poliwhirl - new EncounterSlot4 { Species = 061, LevelMin = 35, LevelMax = 38, Type = SlotType.Super_Rod_Safari }, // Poliwhirl - new EncounterSlot4 { Species = 088, LevelMin = 17, LevelMax = 17, Type = SlotType.Grass_Safari }, // Grimer - new EncounterSlot4 { Species = 088, LevelMin = 15, LevelMax = 17, Type = SlotType.Surf_Safari }, // Grimer - new EncounterSlot4 { Species = 089, LevelMin = 38, LevelMax = 38, Type = SlotType.Grass_Safari }, // Muk - new EncounterSlot4 { Species = 089, LevelMin = 48, LevelMax = 48, Type = SlotType.Surf_Safari }, // Muk - new EncounterSlot4 { Species = 109, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Koffing - new EncounterSlot4 { Species = 110, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Weezing - new EncounterSlot4 { Species = 129, LevelMin = 12, LevelMax = 15, Type = SlotType.Old_Rod_Safari }, // Magikarp - new EncounterSlot4 { Species = 129, LevelMin = 22, LevelMax = 24, Type = SlotType.Good_Rod_Safari }, // Magikarp - new EncounterSlot4 { Species = 130, LevelMin = 36, LevelMax = 37, Type = SlotType.Super_Rod_Safari }, // Gyarados - new EncounterSlot4 { Species = 130, LevelMin = 26, LevelMax = 26, Type = SlotType.Good_Rod_Safari }, // Gyarados - new EncounterSlot4 { Species = 130, LevelMin = 29, LevelMax = 29, Type = SlotType.Good_Rod_Safari }, // Gyarados - new EncounterSlot4 { Species = 189, LevelMin = 38, LevelMax = 38, Type = SlotType.Grass_Safari }, // Jumpluff - new EncounterSlot4 { Species = 189, LevelMin = 47, LevelMax = 47, Type = SlotType.Surf_Safari }, // Jumpluff - new EncounterSlot4 { Species = 194, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Wooper - new EncounterSlot4 { Species = 194, LevelMin = 15, LevelMax = 17, Type = SlotType.Surf_Safari }, // Wooper - new EncounterSlot4 { Species = 195, LevelMin = 43, LevelMax = 43, Type = SlotType.Surf_Safari }, // Quagsire - new EncounterSlot4 { Species = 213, LevelMin = 44, LevelMax = 44, Type = SlotType.Grass_Safari }, // Shuckle - new EncounterSlot4 { Species = 315, LevelMin = 46, LevelMax = 46, Type = SlotType.Grass_Safari }, // Roselia - new EncounterSlot4 { Species = 336, LevelMin = 47, LevelMax = 48, Type = SlotType.Grass_Safari }, // Seviper - new EncounterSlot4 { Species = 339, LevelMin = 42, LevelMax = 42, Type = SlotType.Super_Rod_Safari }, // Barboach - new EncounterSlot4 { Species = 339, LevelMin = 45, LevelMax = 45, Type = SlotType.Super_Rod_Safari }, // Barboach - new EncounterSlot4 { Species = 354, LevelMin = 44, LevelMax = 45, Type = SlotType.Grass_Safari }, // Banette - new EncounterSlot4 { Species = 453, LevelMin = 44, LevelMax = 44, Type = SlotType.Grass_Safari }, // Croagunk - new EncounterSlot4 { Species = 455, LevelMin = 41, LevelMax = 41, Type = SlotType.Grass_Safari }, // Carnivine - }; - - private static readonly EncounterSlot[] SAFARIZONE_MOUNTAIN = - { - new EncounterSlot4 { Species = 019, LevelMin = 15, LevelMax = 16, Type = SlotType.Grass_Safari }, // Rattata - new EncounterSlot4 { Species = 020, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Raticate - new EncounterSlot4 { Species = 041, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Zubat - new EncounterSlot4 { Species = 042, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Golbat - new EncounterSlot4 { Species = 082, LevelMin = 17, LevelMax = 17, Type = SlotType.Grass_Safari }, // Magneton - new EncounterSlot4 { Species = 082, LevelMin = 42, LevelMax = 42, Type = SlotType.Grass_Safari }, // Magneton - new EncounterSlot4 { Species = 098, LevelMin = 43, LevelMax = 43, Type = SlotType.Grass_Safari }, // Krabby - new EncounterSlot4 { Species = 108, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Lickitung - new EncounterSlot4 { Species = 246, LevelMin = 17, LevelMax = 17, Type = SlotType.Grass_Safari }, // Larvitar - new EncounterSlot4 { Species = 246, LevelMin = 42, LevelMax = 42, Type = SlotType.Grass_Safari }, // Larvitar - new EncounterSlot4 { Species = 307, LevelMin = 43, LevelMax = 44, Type = SlotType.Grass_Safari }, // Meditite - new EncounterSlot4 { Species = 313, LevelMin = 46, LevelMax = 46, Type = SlotType.Grass_Safari }, // Volbeat - new EncounterSlot4 { Species = 337, LevelMin = 46, LevelMax = 46, Type = SlotType.Grass_Safari }, // Lunatone - new EncounterSlot4 { Species = 356, LevelMin = 45, LevelMax = 46, Type = SlotType.Grass_Safari }, // Dusclops - new EncounterSlot4 { Species = 364, LevelMin = 45, LevelMax = 45, Type = SlotType.Grass_Safari }, // Sealeo - new EncounterSlot4 { Species = 375, LevelMin = 44, LevelMax = 44, Type = SlotType.Grass_Safari }, // Metang - new EncounterSlot4 { Species = 433, LevelMin = 38, LevelMax = 38, Type = SlotType.Grass_Safari }, // Chingling - }; - - private static readonly EncounterSlot[] SAFARIZONE_ROCKYBEACH = - { - new EncounterSlot4 { Species = 041, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Zubat - new EncounterSlot4 { Species = 060, LevelMin = 15, LevelMax = 16, Type = SlotType.Surf_Safari }, // Poliwag - new EncounterSlot4 { Species = 061, LevelMin = 16, LevelMax = 17, Type = SlotType.Surf_Safari }, // Poliwhirl - new EncounterSlot4 { Species = 079, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Slowpoke - new EncounterSlot4 { Species = 080, LevelMin = 17, LevelMax = 17, Type = SlotType.Grass_Safari }, // Slowbro - new EncounterSlot4 { Species = 080, LevelMin = 37, LevelMax = 37, Type = SlotType.Grass_Safari }, // Slowbro - new EncounterSlot4 { Species = 080, LevelMin = 42, LevelMax = 42, Type = SlotType.Grass_Safari }, // Slowbro - new EncounterSlot4 { Species = 084, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Doduo - new EncounterSlot4 { Species = 085, LevelMin = 42, LevelMax = 42, Type = SlotType.Grass_Safari }, // Dodrio - new EncounterSlot4 { Species = 098, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Krabby - new EncounterSlot4 { Species = 098, LevelMin = 13, LevelMax = 15, Type = SlotType.Old_Rod_Safari }, // Krabby - new EncounterSlot4 { Species = 098, LevelMin = 22, LevelMax = 25, Type = SlotType.Good_Rod_Safari }, // Krabby - new EncounterSlot4 { Species = 098, LevelMin = 17, LevelMax = 17, Type = SlotType.Old_Rod_Safari }, // Krabby - new EncounterSlot4 { Species = 098, LevelMin = 18, LevelMax = 18, Type = SlotType.Old_Rod_Safari }, // Krabby - new EncounterSlot4 { Species = 099, LevelMin = 26, LevelMax = 27, Type = SlotType.Good_Rod_Safari }, // Kingler - new EncounterSlot4 { Species = 099, LevelMin = 40, LevelMax = 40, Type = SlotType.Grass_Safari }, // Kingler - new EncounterSlot4 { Species = 099, LevelMin = 38, LevelMax = 39, Type = SlotType.Super_Rod_Safari }, // Kingler - new EncounterSlot4 { Species = 118, LevelMin = 13, LevelMax = 15, Type = SlotType.Old_Rod_Safari }, // Goldeen - new EncounterSlot4 { Species = 118, LevelMin = 22, LevelMax = 23, Type = SlotType.Good_Rod_Safari }, // Goldeen - new EncounterSlot4 { Species = 118, LevelMin = 35, LevelMax = 38, Type = SlotType.Super_Rod_Safari }, // Goldeen - new EncounterSlot4 { Species = 119, LevelMin = 35, LevelMax = 38, Type = SlotType.Super_Rod_Safari }, // Seaking - new EncounterSlot4 { Species = 129, LevelMin = 12, LevelMax = 14, Type = SlotType.Old_Rod_Safari }, // Magikarp - new EncounterSlot4 { Species = 129, LevelMin = 22, LevelMax = 23, Type = SlotType.Good_Rod_Safari }, // Magikarp - new EncounterSlot4 { Species = 129, LevelMin = 15, LevelMax = 16, Type = SlotType.Surf_Safari }, // Magikarp - new EncounterSlot4 { Species = 131, LevelMin = 15, LevelMax = 16, Type = SlotType.Surf_Safari }, // Lapras - new EncounterSlot4 { Species = 131, LevelMin = 36, LevelMax = 37, Type = SlotType.Surf_Safari }, // Lapras - new EncounterSlot4 { Species = 131, LevelMin = 41, LevelMax = 42, Type = SlotType.Surf_Safari }, // Lapras - new EncounterSlot4 { Species = 131, LevelMin = 46, LevelMax = 47, Type = SlotType.Surf_Safari }, // Lapras - new EncounterSlot4 { Species = 179, LevelMin = 43, LevelMax = 43, Type = SlotType.Grass_Safari }, // Mareep - new EncounterSlot4 { Species = 304, LevelMin = 44, LevelMax = 45, Type = SlotType.Grass_Safari }, // Aron - new EncounterSlot4 { Species = 309, LevelMin = 42, LevelMax = 42, Type = SlotType.Grass_Safari }, // Electrike - new EncounterSlot4 { Species = 310, LevelMin = 37, LevelMax = 37, Type = SlotType.Grass_Safari }, // Manectric - new EncounterSlot4 { Species = 341, LevelMin = 46, LevelMax = 46, Type = SlotType.Super_Rod_Safari }, // Corphish - new EncounterSlot4 { Species = 341, LevelMin = 48, LevelMax = 48, Type = SlotType.Super_Rod_Safari }, // Corphish - new EncounterSlot4 { Species = 406, LevelMin = 40, LevelMax = 40, Type = SlotType.Grass_Safari }, // Budew - new EncounterSlot4 { Species = 443, LevelMin = 44, LevelMax = 44, Type = SlotType.Grass_Safari }, // Gible - }; - - private static readonly EncounterSlot[] SAFARIZONE_WASTELAND = - { - new EncounterSlot4 { Species = 022, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Fearow - new EncounterSlot4 { Species = 055, LevelMin = 45, LevelMax = 45, Type = SlotType.Grass_Safari }, // Golduck - new EncounterSlot4 { Species = 066, LevelMin = 16, LevelMax = 17, Type = SlotType.Grass_Safari }, // Machop - new EncounterSlot4 { Species = 067, LevelMin = 17, LevelMax = 17, Type = SlotType.Grass_Safari }, // Machoke - new EncounterSlot4 { Species = 067, LevelMin = 40, LevelMax = 40, Type = SlotType.Grass_Safari }, // Machoke - new EncounterSlot4 { Species = 069, LevelMin = 41, LevelMax = 41, Type = SlotType.Grass_Safari }, // Bellsprout - new EncounterSlot4 { Species = 081, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Magnemite - new EncounterSlot4 { Species = 095, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Onix - new EncounterSlot4 { Species = 099, LevelMin = 48, LevelMax = 48, Type = SlotType.Grass_Safari }, // Kingler - new EncounterSlot4 { Species = 115, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Kangaskhan - new EncounterSlot4 { Species = 286, LevelMin = 46, LevelMax = 46, Type = SlotType.Grass_Safari }, // Breloom - new EncounterSlot4 { Species = 308, LevelMin = 44, LevelMax = 44, Type = SlotType.Grass_Safari }, // Medicham - new EncounterSlot4 { Species = 310, LevelMin = 41, LevelMax = 41, Type = SlotType.Grass_Safari }, // Manectric - new EncounterSlot4 { Species = 314, LevelMin = 46, LevelMax = 46, Type = SlotType.Grass_Safari }, // Illumise - new EncounterSlot4 { Species = 338, LevelMin = 45, LevelMax = 46, Type = SlotType.Grass_Safari }, // Solrock - new EncounterSlot4 { Species = 451, LevelMin = 44, LevelMax = 45, Type = SlotType.Grass_Safari }, // Skorupi - }; - - private static readonly EncounterSlot[] SAFARIZONE_SAVANNAH = - { - new EncounterSlot4 { Species = 029, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Nidoran♀ - new EncounterSlot4 { Species = 030, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Nidorina - new EncounterSlot4 { Species = 032, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Nidoran♂ - new EncounterSlot4 { Species = 033, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Nidorino - new EncounterSlot4 { Species = 041, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Zubat - new EncounterSlot4 { Species = 042, LevelMin = 17, LevelMax = 17, Type = SlotType.Grass_Safari }, // Golbat - new EncounterSlot4 { Species = 111, LevelMin = 17, LevelMax = 17, Type = SlotType.Grass_Safari }, // Rhyhorn - new EncounterSlot4 { Species = 111, LevelMin = 41, LevelMax = 41, Type = SlotType.Grass_Safari }, // Rhyhorn - new EncounterSlot4 { Species = 112, LevelMin = 44, LevelMax = 44, Type = SlotType.Grass_Safari }, // Rhydon - new EncounterSlot4 { Species = 128, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Tauros - new EncounterSlot4 { Species = 128, LevelMin = 41, LevelMax = 41, Type = SlotType.Grass_Safari }, // Tauros - new EncounterSlot4 { Species = 228, LevelMin = 42, LevelMax = 42, Type = SlotType.Grass_Safari }, // Houndour - new EncounterSlot4 { Species = 263, LevelMin = 38, LevelMax = 38, Type = SlotType.Grass_Safari }, // Zigzagoon - new EncounterSlot4 { Species = 285, LevelMin = 45, LevelMax = 45, Type = SlotType.Grass_Safari }, // Shroomish - new EncounterSlot4 { Species = 298, LevelMin = 42, LevelMax = 42, Type = SlotType.Grass_Safari }, // Azurill - new EncounterSlot4 { Species = 324, LevelMin = 46, LevelMax = 47, Type = SlotType.Grass_Safari }, // Torkoal - new EncounterSlot4 { Species = 332, LevelMin = 42, LevelMax = 42, Type = SlotType.Grass_Safari }, // Cacturne - new EncounterSlot4 { Species = 404, LevelMin = 45, LevelMax = 46, Type = SlotType.Grass_Safari }, // Luxio - }; - - private static readonly EncounterSlot[] SAFARIZONE_WETLAND = - { - new EncounterSlot4 { Species = 021, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Spearow - new EncounterSlot4 { Species = 054, LevelMin = 15, LevelMax = 16, Type = SlotType.Grass_Safari }, // Psyduck - new EncounterSlot4 { Species = 054, LevelMin = 16, LevelMax = 17, Type = SlotType.Surf_Safari }, // Psyduck - new EncounterSlot4 { Species = 055, LevelMin = 17, LevelMax = 17, Type = SlotType.Grass_Safari }, // Golduck - new EncounterSlot4 { Species = 055, LevelMin = 40, LevelMax = 40, Type = SlotType.Grass_Safari }, // Golduck - new EncounterSlot4 { Species = 055, LevelMin = 37, LevelMax = 37, Type = SlotType.Surf_Safari }, // Golduck - new EncounterSlot4 { Species = 055, LevelMin = 45, LevelMax = 45, Type = SlotType.Surf_Safari }, // Golduck - new EncounterSlot4 { Species = 060, LevelMin = 12, LevelMax = 15, Type = SlotType.Old_Rod_Safari }, // Poliwag - new EncounterSlot4 { Species = 060, LevelMin = 22, LevelMax = 24, Type = SlotType.Good_Rod_Safari }, // Poliwag - new EncounterSlot4 { Species = 060, LevelMin = 35, LevelMax = 37, Type = SlotType.Super_Rod_Safari }, // Poliwag - new EncounterSlot4 { Species = 060, LevelMin = 15, LevelMax = 16, Type = SlotType.Surf_Safari }, // Poliwag - new EncounterSlot4 { Species = 061, LevelMin = 17, LevelMax = 18, Type = SlotType.Old_Rod_Safari }, // Poliwhirl - new EncounterSlot4 { Species = 061, LevelMin = 23, LevelMax = 25, Type = SlotType.Good_Rod_Safari }, // Poliwhirl - new EncounterSlot4 { Species = 061, LevelMin = 35, LevelMax = 37, Type = SlotType.Super_Rod_Safari }, // Poliwhirl - new EncounterSlot4 { Species = 083, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Farfetch'd - new EncounterSlot4 { Species = 083, LevelMin = 41, LevelMax = 41, Type = SlotType.Grass_Safari }, // Farfetch'd - new EncounterSlot4 { Species = 084, LevelMin = 45, LevelMax = 45, Type = SlotType.Grass_Safari }, // Doduo - new EncounterSlot4 { Species = 129, LevelMin = 12, LevelMax = 15, Type = SlotType.Old_Rod_Safari }, // Magikarp - new EncounterSlot4 { Species = 130, LevelMin = 44, LevelMax = 45, Type = SlotType.Super_Rod_Safari }, // Gyarados - new EncounterSlot4 { Species = 130, LevelMin = 47, LevelMax = 48, Type = SlotType.Super_Rod_Safari }, // Gyarados - new EncounterSlot4 { Species = 132, LevelMin = 17, LevelMax = 17, Type = SlotType.Grass_Safari }, // Ditto - new EncounterSlot4 { Species = 132, LevelMin = 41, LevelMax = 41, Type = SlotType.Grass_Safari }, // Ditto - new EncounterSlot4 { Species = 161, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Sentret - new EncounterSlot4 { Species = 162, LevelMin = 37, LevelMax = 37, Type = SlotType.Grass_Safari }, // Furret - new EncounterSlot4 { Species = 194, LevelMin = 15, LevelMax = 17, Type = SlotType.Grass_Safari }, // Wooper - new EncounterSlot4 { Species = 194, LevelMin = 15, LevelMax = 16, Type = SlotType.Surf_Safari }, // Wooper - new EncounterSlot4 { Species = 195, LevelMin = 16, LevelMax = 17, Type = SlotType.Grass_Safari }, // Quagsire - new EncounterSlot4 { Species = 195, LevelMin = 16, LevelMax = 17, Type = SlotType.Surf_Safari }, // Quagsire - new EncounterSlot4 { Species = 195, LevelMin = 37, LevelMax = 37, Type = SlotType.Surf_Safari }, // Quagsire - new EncounterSlot4 { Species = 271, LevelMin = 47, LevelMax = 47, Type = SlotType.Grass_Safari }, // Lombre - new EncounterSlot4 { Species = 283, LevelMin = 40, LevelMax = 40, Type = SlotType.Grass_Safari }, // Surskit - new EncounterSlot4 { Species = 341, LevelMin = 26, LevelMax = 26, Type = SlotType.Good_Rod_Safari }, // Corphish - new EncounterSlot4 { Species = 341, LevelMin = 28, LevelMax = 28, Type = SlotType.Good_Rod_Safari }, // Corphish - new EncounterSlot4 { Species = 372, LevelMin = 46, LevelMax = 46, Type = SlotType.Grass_Safari }, // Shelgon - new EncounterSlot4 { Species = 417, LevelMin = 43, LevelMax = 43, Type = SlotType.Grass_Safari }, // Pachirisu - new EncounterSlot4 { Species = 418, LevelMin = 44, LevelMax = 45, Type = SlotType.Grass_Safari }, // Buizel - }; - - private static readonly EncounterArea4HGSS SlotsHGSS_SafariZone = new EncounterArea4HGSS - { - // Source http://bulbapedia.bulbagarden.net/wiki/Johto_Safari_Zone#Pok.C3.A9mon - // Supplement http://www.psypokes.com/hgss/safari_areas.php - Location = 202, // Johto Safari Zone - Slots = ArrayUtil.ConcatAll( - SAFARIZONE_PEAK, - SAFARIZONE_DESERT, - SAFARIZONE_PLAINS, - SAFARIZONE_MEADOW, - SAFARIZONE_FOREST, - SAFARIZONE_SWAMP, - SAFARIZONE_MARSHLAND, - SAFARIZONE_MOUNTAIN, - SAFARIZONE_ROCKYBEACH, - SAFARIZONE_WASTELAND, - SAFARIZONE_SAVANNAH, - SAFARIZONE_WETLAND) - }; - - private static readonly EncounterArea4HGSS[] SlotsHGSSAlt = - { - SlotsHGSS_BCC, - new EncounterArea4HGSS { - Location = 209, // Ruins of Alph - Slots = Enumerable.Range(1, 25).Select((_, i) => new EncounterSlot4 { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = i }).ToArray() // B->?, Unown A is loaded from encounters raw file - }, - SlotsHGSS_SafariZone, - //Some edge cases - new EncounterArea4HGSS - { - Location = 219, // Mt. Silver Cave 1F - Slots = new[]{new EncounterSlot4 { Species = 130, LevelMin = 20, LevelMax = 20, Type = SlotType.Good_Rod },}, // Gyarados at night - }, - }; - - private static readonly EncounterArea4DPPt SlotsPt_HoneyTree = new EncounterArea4DPPt - { - Slots = new[] - { - new EncounterSlot4 {Species = 190, LevelMin = 5, LevelMax = 15, Type = SlotType.HoneyTree}, // Aipom - new EncounterSlot4 {Species = 214, LevelMin = 5, LevelMax = 15, Type = SlotType.HoneyTree}, // Heracross - new EncounterSlot4 {Species = 265, LevelMin = 5, LevelMax = 15, Type = SlotType.HoneyTree}, // Wurmple - new EncounterSlot4 {Species = 412, LevelMin = 5, LevelMax = 15, Type = SlotType.HoneyTree, Form = 0}, // Burmy Plant Cloak - new EncounterSlot4 {Species = 415, LevelMin = 5, LevelMax = 15, Type = SlotType.HoneyTree}, // Combee - new EncounterSlot4 {Species = 420, LevelMin = 5, LevelMax = 15, Type = SlotType.HoneyTree}, // Cheruby - new EncounterSlot4 {Species = 446, LevelMin = 5, LevelMax = 15, Type = SlotType.HoneyTree}, // Munchlax - }, - }; - - private static readonly EncounterArea4DPPt SlotsD_HoneyTree = new EncounterArea4DPPt - { - Slots = SlotsPt_HoneyTree.Slots.Concat(new[] - { - new EncounterSlot4 {Species = 266, LevelMin = 5, LevelMax = 15, Type = SlotType.HoneyTree}, // Silcoon - }).ToArray() - }; - - private static readonly EncounterArea4DPPt SlotsP_HoneyTree = new EncounterArea4DPPt - { - Slots = SlotsPt_HoneyTree.Slots.Concat(new[] - { - new EncounterSlot4 {Species = 268, LevelMin = 5, LevelMax = 15, Type = SlotType.HoneyTree}, // Cascoon - }).ToArray() - }; - - internal static readonly int[] TrophyDP = { 035, 039, 052, 113, 133, 137, 173, 174, 183, 298, 311, 312, 351, 438, 439, 440 }; // Porygon - internal static readonly int[] TrophyPt = { 035, 039, 052, 113, 133, 132, 173, 174, 183, 298, 311, 312, 351, 438, 439, 440 }; // Ditto - - private static readonly int[] DP_GreatMarshAlt_Species = - { - // Daily changing Pokemon are not in the raw data http://bulbapedia.bulbagarden.net/wiki/Great_Marsh - 055, 315, 397, 451, 453, 455, - 183, 194, 195, 298, 399, 400, // Pre-National Pokédex - 046, 102, 115, 193, 285, 316, 452, 454 // Post-National Pokédex - }; - - private static readonly EncounterArea4DPPt[] DP_GreatMarshAlt = EncounterArea.GetSimpleEncounterArea(DP_GreatMarshAlt_Species, new[] { 22, 22, 24, 24, 26, 26 }, 52, SlotType.Grass_Safari); - - private static readonly int[] Pt_GreatMarshAlt_Species = - { - 114,193,195,357,451,453,455, - 194, // Pre-National Pokédex - 046,102,115,285,316,352,452,454 // Post-National Pokédex - }; - - private static readonly EncounterArea4DPPt[] Pt_GreatMarshAlt = EncounterArea.GetSimpleEncounterArea(Pt_GreatMarshAlt_Species, new[] { 27, 30 }, 52, SlotType.Grass_Safari); - - private static readonly int[] Shellos_EastSeaLocation_DP = - { - 28, // Route 213 - 39, // Route 224 - }; - - private static readonly int[] Shellos_EastSeaLocation_Pt = - { - 11, // Pastoria City - 27, // Route 212 - 28, // Route 213 - }; - - private static readonly int[] Gastrodon_EastSeaLocation_DP = - { - 37, // Route 222 - 39, // Route 224 - 45, // Route 230 - }; - - private static readonly int[] Gastrodon_EastSeaLocation_Pt = - { - 11, // Pastoria City - 27, // Route 212 - 28, // Route 213 - 39, // Route 224 - 45, // Route 230 - }; - - private static readonly int[] HoneyTreesLocation = - { - 20, // Route 205 - 21, // Route 206 - 22, // Route 207 - 23, // Route 208 - 24, // Route 209 - 25, // Route 210 - 26, // Route 211 - 27, // Route 212 - 28, // Route 213 - 29, // Route 214 - 30, // Route 215 - 33, // Route 218 - 36, // Route 221 - 37, // Route 222 - 47, // Valley Windworks - 48, // Eterna Forest - 49, // Fuego Ironworks - 58, // Floaroma Meadow - }; - - private static readonly EncounterArea4HGSS[] SlotsHGSS_Swarm = - { - new EncounterArea4HGSS {Location = 143, Slots = new[]{new EncounterSlot4 {Species = 278, Type = SlotType.Surf },},}, // Wingull @ Vermillion City - new EncounterArea4HGSS {Location = 149, Slots = new[]{new EncounterSlot4 {Species = 261, Type = SlotType.Grass },},}, // Poochyena @ Route 1 - new EncounterArea4HGSS {Location = 161, Slots = new[]{new EncounterSlot4 {Species = 113, Type = SlotType.Grass },},}, // Chansey @ Route 13 - new EncounterArea4HGSS {Location = 167, Slots = new[]{new EncounterSlot4 {Species = 366, Type = SlotType.Surf },},}, // Clamperl @ Route 19 - new EncounterArea4HGSS {Location = 173, Slots = new[]{new EncounterSlot4 {Species = 427, Type = SlotType.Grass },},}, // Buneary @ Route 25 - new EncounterArea4HGSS {Location = 175, Slots = new[]{new EncounterSlot4 {Species = 370, Type = SlotType.Surf },},}, // Luvdisc @ Route 27 - new EncounterArea4HGSS {Location = 182, Slots = new[]{new EncounterSlot4 {Species = 280, Type = SlotType.Grass },},}, // Ralts @ Route 34 - new EncounterArea4HGSS {Location = 183, Slots = new[]{new EncounterSlot4 {Species = 193, Type = SlotType.Grass },},}, // Yanma @ Route 35 - new EncounterArea4HGSS {Location = 186, Slots = new[]{new EncounterSlot4 {Species = 209, Type = SlotType.Grass },},}, // Snubbull @ Route 38 - new EncounterArea4HGSS {Location = 193, Slots = new[]{new EncounterSlot4 {Species = 333, Type = SlotType.Grass },},}, // Swablu @ Route 45 - new EncounterArea4HGSS {Location = 195, Slots = new[]{new EncounterSlot4 {Species = 132, Type = SlotType.Grass },},}, // Ditto @ Route 47 - new EncounterArea4HGSS {Location = 216, Slots = new[]{new EncounterSlot4 {Species = 183, Type = SlotType.Grass },},}, // Marill @ Mt. Mortar - new EncounterArea4HGSS {Location = 220, Slots = new[]{new EncounterSlot4 {Species = 206, Type = SlotType.Grass },},}, // Dunsparce @ Dark Cave - new EncounterArea4HGSS {Location = 224, Slots = new[]{new EncounterSlot4 {Species = 401, Type = SlotType.Grass },},}, // Kricketot @ Viridian Forest - - new EncounterArea4HGSS {Location = 128, Slots = new[]{ // Whiscash @ Violet City - new EncounterSlot4 {Species = 340, Type = SlotType.Old_Rod }, - new EncounterSlot4 {Species = 340, Type = SlotType.Good_Rod }, - new EncounterSlot4 {Species = 340, Type = SlotType.Super_Rod }, - },}, - new EncounterArea4HGSS {Location = 160, Slots = new[]{ // Relicanth @ Route 12 - new EncounterSlot4 {Species = 369, Type = SlotType.Old_Rod }, - new EncounterSlot4 {Species = 369, Type = SlotType.Good_Rod }, - new EncounterSlot4 {Species = 369, Type = SlotType.Super_Rod }, - },}, - new EncounterArea4HGSS {Location = 180, Slots = new[]{ // Qwilfish @ Route 32 - new EncounterSlot4 {Species = 211, Type = SlotType.Old_Rod }, - new EncounterSlot4 {Species = 211, Type = SlotType.Good_Rod }, - new EncounterSlot4 {Species = 211, Type = SlotType.Super_Rod }, - },}, - new EncounterArea4HGSS {Location = 192, Slots = new[]{ // Remoraid @ Route 44 - new EncounterSlot4 {Species = 223, Type = SlotType.Old_Rod }, - new EncounterSlot4 {Species = 223, Type = SlotType.Good_Rod }, - new EncounterSlot4 {Species = 223, Type = SlotType.Super_Rod }, - },}, - }; - - private static readonly EncounterArea4HGSS[] SlotsHG_Swarm = SlotsHGSS_Swarm.Concat(new[] { - new EncounterArea4HGSS {Location = 151, Slots = new[]{new EncounterSlot4 {Species = 343, Type = SlotType.Grass },},}, // Baltoy @ Route 3 - new EncounterArea4HGSS {Location = 157, Slots = new[]{new EncounterSlot4 {Species = 302, Type = SlotType.Grass },},}, // Sableye @ Route 9 - }).ToArray(); - - private static readonly EncounterArea4HGSS[] SlotsSS_Swarm = SlotsHGSS_Swarm.Concat(new[] { - new EncounterArea4HGSS {Location = 151, Slots = new[]{new EncounterSlot4 {Species = 316, Type = SlotType.Grass },},}, // Gulpin @ Route 3 - new EncounterArea4HGSS {Location = 157, Slots = new[]{new EncounterSlot4 {Species = 303, Type = SlotType.Grass },},}, // Mawile @ Route 9 - }).ToArray(); - - #endregion + internal static readonly EncounterStatic4[] StaticD = GetEncounters(Encounter_DPPt, D); + internal static readonly EncounterStatic4[] StaticP = GetEncounters(Encounter_DPPt, P); + internal static readonly EncounterStatic4[] StaticPt = GetEncounters(Encounter_DPPt, Pt); + internal static readonly EncounterStatic4[] StaticHG = GetEncounters(ArrayUtil.ConcatAll(Encounter_HGSS, Encounter_PokeWalker), HG); + internal static readonly EncounterStatic4[] StaticSS = GetEncounters(ArrayUtil.ConcatAll(Encounter_HGSS, Encounter_PokeWalker), SS); } } diff --git a/PKHeX.Core/Legality/Encounters/Data/Encounters5.cs b/PKHeX.Core/Legality/Encounters/Data/Encounters5.cs index 906be5367..385b4e676 100644 --- a/PKHeX.Core/Legality/Encounters/Data/Encounters5.cs +++ b/PKHeX.Core/Legality/Encounters/Data/Encounters5.cs @@ -9,41 +9,14 @@ namespace PKHeX.Core /// public static class Encounters5 { - internal static readonly EncounterArea5[] SlotsB, SlotsW, SlotsB2, SlotsW2; - internal static readonly EncounterStatic5[] StaticB, StaticW, StaticB2, StaticW2; + internal static readonly EncounterArea5[] SlotsB = EncounterArea5.GetAreas(Get("b", "51"), GameVersion.B); + internal static readonly EncounterArea5[] SlotsW = EncounterArea5.GetAreas(Get("w", "51"), GameVersion.W); + internal static readonly EncounterArea5[] SlotsB2 = EncounterArea5.GetAreas(Get("b2", "52"), GameVersion.B2); + internal static readonly EncounterArea5[] SlotsW2 = EncounterArea5.GetAreas(Get("w2", "52"), GameVersion.W2); + private static byte[][] Get(string resource, string ident) => BinLinker.Unpack(Util.GetBinaryResource($"encounter_{resource}.pkl"), ident); static Encounters5() { - MarkG5DreamWorld(ref BW_DreamWorld); - MarkG5DreamWorld(ref B2W2_DreamWorld); - var staticbw = Encounter_BW.Concat(BW_DreamWorld).ToArray(); - var staticb2w2 = Encounter_B2W2.Concat(B2W2_DreamWorld).ToArray(); - StaticB = GetEncounters(staticbw, GameVersion.B); - StaticW = GetEncounters(staticbw, GameVersion.W); - StaticB2 = GetEncounters(staticb2w2, GameVersion.B2); - StaticW2 = GetEncounters(staticb2w2, GameVersion.W2); - - var BSlots = GetEncounterTables("51", "b"); - var WSlots = GetEncounterTables("51", "w"); - var B2Slots = GetEncounterTables("52", "b2"); - var W2Slots = GetEncounterTables("52", "w2"); - MarkG5Slots(ref BSlots); - MarkG5Slots(ref WSlots); - MarkG5Slots(ref B2Slots); - MarkG5Slots(ref W2Slots); - MarkBWSwarmSlots(SlotsB_Swarm); - MarkBWSwarmSlots(SlotsW_Swarm); - MarkB2W2SwarmSlots(SlotsB2_Swarm); - MarkB2W2SwarmSlots(SlotsW2_Swarm); - MarkG5HiddenGrottoSlots(SlotsB2_HiddenGrotto); - MarkG5HiddenGrottoSlots(SlotsW2_HiddenGrotto); - MarkEncounterAreaArray(SlotsB_Swarm, SlotsW_Swarm, SlotsB2_Swarm, SlotsW2_Swarm, SlotsB2_HiddenGrotto, SlotsW2_HiddenGrotto, WhiteForestSlot); - - SlotsB = AddExtraTableSlots(BSlots, SlotsB_Swarm); - SlotsW = AddExtraTableSlots(WSlots, SlotsW_Swarm, WhiteForestSlot); - SlotsB2 = AddExtraTableSlots(B2Slots, SlotsB2_Swarm, SlotsB2_HiddenGrotto); - SlotsW2 = AddExtraTableSlots(W2Slots, SlotsW2_Swarm, SlotsW2_HiddenGrotto); - MarkEncountersGeneration(5, StaticB, StaticW, StaticB2, StaticW2, TradeGift_BW, TradeGift_B2W2); MarkEncounterTradeStrings(TradeGift_BW, TradeBW); @@ -53,52 +26,23 @@ static Encounters5() BW_DreamWorld.SetVersion(GameVersion.BW); B2W2_DreamWorld.SetVersion(GameVersion.B2W2); - SlotsB.SetVersion(GameVersion.B); - SlotsW.SetVersion(GameVersion.W); - SlotsB2.SetVersion(GameVersion.B2); - SlotsW2.SetVersion(GameVersion.W2); Encounter_BW.SetVersion(GameVersion.BW); Encounter_B2W2.SetVersion(GameVersion.B2W2); TradeGift_BW.SetVersion(GameVersion.BW); TradeGift_B2W2.SetVersion(GameVersion.B2W2); } - private static void MarkBWSwarmSlots(EncounterArea5[] Areas) - { - foreach (EncounterSlot s in Areas.SelectMany(area => area.Slots)) - { - s.LevelMin = 15; s.LevelMax = 55; s.Type = SlotType.Swarm; - } - } - - private static void MarkB2W2SwarmSlots(EncounterArea5[] Areas) - { - foreach (EncounterSlot s in Areas.SelectMany(area => area.Slots)) - { - s.LevelMin = 40; s.LevelMax = 55; s.Type = SlotType.Swarm; - } - } - - private static void MarkG5HiddenGrottoSlots(EncounterArea5[] Areas) - { - foreach (EncounterSlot s in Areas[0].Slots) //Only 1 area - s.Type = SlotType.HiddenGrotto; - } - - private static void MarkG5DreamWorld(ref EncounterStatic5[] t) + private static EncounterStatic5[] MarkG5DreamWorld(EncounterStatic5[] t) { + // Split encounters with multiple permitted special moves -- a pkm can only be obtained with 1 of the special moves! + var list = new List(); foreach (EncounterStatic5 s in t) { s.Location = 075; // Entree Forest var p = (PersonalInfoBW)PersonalTable.B2W2[s.Species]; s.Ability = p.HasHiddenAbility ? 4 : 1; s.Shiny = Shiny.Never; - } - // Split encounters with multiple permitted special moves -- a pkm can only be obtained with 1 of the special moves! - var list = new List(); - foreach (EncounterStatic5 s in t) - { if (s.Moves.Count <= 1) // no special moves { list.Add(s); @@ -113,40 +57,7 @@ private static void MarkG5DreamWorld(ref EncounterStatic5[] t) list.Add(clone); } } - t = list.ToArray(); - } - - private static void MarkG5Slots(ref EncounterArea5[] Areas) - { - foreach (var area in Areas) - { - int ctr = 0; - do - { - for (int i = 0; i < 12; i++) - area.Slots[ctr++].Type = SlotType.Grass; // Single - - for (int i = 0; i < 12; i++) - area.Slots[ctr++].Type = SlotType.Grass; // Double - - for (int i = 0; i < 12; i++) - area.Slots[ctr++].Type = SlotType.Grass; // Shaking - - for (int i = 0; i < 5; i++) // 5 - area.Slots[ctr++].Type = SlotType.Surf; // Surf - - for (int i = 0; i < 5; i++) // 5 - area.Slots[ctr++].Type = SlotType.Surf; // Surf Spot - - for (int i = 0; i < 5; i++) // 5 - area.Slots[ctr++].Type = SlotType.Super_Rod; // Fish - - for (int i = 0; i < 5; i++) // 5 - area.Slots[ctr++].Type = SlotType.Super_Rod; // Fish Spot - } while (ctr != area.Slots.Length); - area.Slots = area.Slots.Where(slot => slot.Species != 0).ToArray(); - } - ReduceAreasSize(ref Areas); + return list.ToArray(); } #region Dream Radar Tables @@ -360,7 +271,7 @@ private static void MarkG5Slots(ref EncounterArea5[] Areas) new EncounterStatic5 { Species = 376, Level = 45, Moves = new[]{038}, Gender = 2, }, // Metagross }; - public static readonly EncounterStatic5[] BW_DreamWorld = DreamWorld_Common.Concat(new[] + public static readonly EncounterStatic5[] BW_DreamWorld = MarkG5DreamWorld(DreamWorld_Common.Concat(new[] { // Pleasant Forest new EncounterStatic5 { Species = 029, Level = 10, Moves = new[]{010, 389, 162}, }, // Nidoran♀ @@ -459,9 +370,9 @@ private static void MarkG5Slots(ref EncounterArea5[] Areas) new EncounterStatic5 { Species = 242, Level = 10 }, // Blissey new EncounterStatic5 { Species = 448, Level = 10, Moves = new[]{418}, Gender = 0, }, // Lucario new EncounterStatic5 { Species = 189, Level = 27, Moves = new[]{206}, Gender = 0, }, // Jumpluff - }).ToArray(); + }).ToArray()); - public static readonly EncounterStatic5[] B2W2_DreamWorld = DreamWorld_Common.Concat(new[] + public static readonly EncounterStatic5[] B2W2_DreamWorld = MarkG5DreamWorld(DreamWorld_Common.Concat(new[] { // Pleasant Forest new EncounterStatic5 { Species = 535, Level = 10, Moves = new[]{496, 414, 352}, }, // Tympole @@ -523,7 +434,7 @@ private static void MarkG5Slots(ref EncounterArea5[] Areas) new EncounterStatic5 { Species = 390, Level = 10, Moves = new[]{252}, Gender = 0, }, // Chimchar new EncounterStatic5 { Species = 393, Level = 10, Moves = new[]{297}, Gender = 0, }, // Piplup new EncounterStatic5 { Species = 575, Level = 32, Moves = new[]{286}, Gender = 0, }, // Gothorita - }).ToArray(); + }).ToArray()); #endregion #region Static Encounter/Gift Tables @@ -750,233 +661,10 @@ private static void MarkG5Slots(ref EncounterArea5[] Areas) internal static readonly EncounterTrade[] TradeGift_B2W2 = TradeGift_B2W2_Regular.Concat(TradeGift_B2W2_YancyCurtis).ToArray(); #endregion - #region Alt Slots - // White forest white version only - - private static readonly int[] WhiteForest_GrassSpecies = - { - 016, 029, 032, 043, 063, 066, 069, 081, 092, 111, - 137, 175, 179, 187, 239, 240, 265, 270, 273, 280, - 287, 293, 298, 304, 328, 371, 396, 403, 406, 440, - }; - - private static readonly int[] WhiteForest_SurfSpecies = - { - 194, 270, 283, 341, - }; - - private static readonly EncounterArea5[] WhiteForestSlot = EncounterArea.GetSimpleEncounterArea(WhiteForest_GrassSpecies, new[] { 5, 5 }, 51, SlotType.Grass).Concat( - EncounterArea.GetSimpleEncounterArea(WhiteForest_SurfSpecies, new[] { 5, 5 }, 51, SlotType.Surf)).ToArray(); - - private static readonly EncounterArea5[] SlotsBW_Swarm = - { - // Level Range and Slot Type will be marked later - new EncounterArea5 { Location = 014, Slots = new[]{new EncounterSlot5 { Species = 083 }, }, }, // Farfetch'd @ Route 1 - new EncounterArea5 { Location = 015, Slots = new[]{new EncounterSlot5 { Species = 360 }, }, }, // Wynaut @ Route 2 - new EncounterArea5 { Location = 017, Slots = new[]{new EncounterSlot5 { Species = 449 }, }, }, // Hippopotas @ Route 4 - new EncounterArea5 { Location = 018, Slots = new[]{new EncounterSlot5 { Species = 235 }, }, }, // Smeargle @ Route 5 - new EncounterArea5 { Location = 020, Slots = new[]{new EncounterSlot5 { Species = 161 }, }, }, // Sentret @ Route 7 - new EncounterArea5 { Location = 021, Slots = new[]{new EncounterSlot5 { Species = 453 }, }, }, // Croagunk @ Route 8 - new EncounterArea5 { Location = 023, Slots = new[]{new EncounterSlot5 { Species = 236 }, }, }, // Tyrogue @ Route 10 - new EncounterArea5 { Location = 025, Slots = new[]{new EncounterSlot5 { Species = 084 }, }, }, // Doduo @ Route 12 - new EncounterArea5 { Location = 026, Slots = new[]{new EncounterSlot5 { Species = 353 }, }, }, // Shuppet @ Route 13 - new EncounterArea5 { Location = 027, Slots = new[]{new EncounterSlot5 { Species = 193 }, }, }, // Yanma @ Route 14 - new EncounterArea5 { Location = 028, Slots = new[]{new EncounterSlot5 { Species = 056 }, }, }, // Mankey @ Route 15 - new EncounterArea5 { Location = 029, Slots = new[]{new EncounterSlot5 { Species = 204 }, }, }, // Pineco @ Route 16 - new EncounterArea5 { Location = 031, Slots = new[]{new EncounterSlot5 { Species = 102 }, }, }, // Exeggcute @ Route 18 - }; - - private static readonly EncounterArea5[] SlotsB_Swarm = SlotsBW_Swarm.Concat(new[] { - new EncounterArea5 { Location = 016, Slots = new[]{new EncounterSlot5 { Species = 313 }, }, }, // Volbeat @ Route 3 - new EncounterArea5 { Location = 019, Slots = new[]{new EncounterSlot5 { Species = 311 }, }, }, // Plusle @ Route 6 - new EncounterArea5 { Location = 022, Slots = new[]{new EncounterSlot5 { Species = 228 }, }, }, // Houndour @ Route 9 - new EncounterArea5 { Location = 024, Slots = new[]{new EncounterSlot5 { Species = 285 }, }, }, // Shroomish @ Route 11 - }).ToArray(); - - private static readonly EncounterArea5[] SlotsW_Swarm = SlotsBW_Swarm.Concat(new[] { - new EncounterArea5 { Location = 016, Slots = new[]{new EncounterSlot5 { Species = 314 }, }, }, // Illumise @ Route 3 - new EncounterArea5 { Location = 019, Slots = new[]{new EncounterSlot5 { Species = 312 }, }, }, // Minun @ Route 6 - new EncounterArea5 { Location = 022, Slots = new[]{new EncounterSlot5 { Species = 261 }, }, }, // Poochyena @ Route 9 - new EncounterArea5 { Location = 024, Slots = new[]{new EncounterSlot5 { Species = 046 }, }, }, // Paras @ Route 11 - }).ToArray(); - - private static readonly EncounterArea5[] SlotsB2W2_Swarm = - { - // Level Range and Slot Type will be marked later - new EncounterArea5 { Location = 014, Slots = new[]{new EncounterSlot5 { Species = 083 }, }, }, // Farfetch'd @ Route 1 - new EncounterArea5 { Location = 018, Slots = new[]{new EncounterSlot5 { Species = 177 }, }, }, // Natu @ Route 5 - new EncounterArea5 { Location = 020, Slots = new[]{new EncounterSlot5 { Species = 162 }, }, }, // Furret @ Route 7 - new EncounterArea5 { Location = 021, Slots = new[]{new EncounterSlot5 { Species = 195 }, }, }, // Quagsire @ Route 8 - new EncounterArea5 { Location = 022, Slots = new[]{new EncounterSlot5 { Species = 317 }, }, }, // Swalot @ Route 9 - new EncounterArea5 { Location = 024, Slots = new[]{new EncounterSlot5 { Species = 284 }, }, }, // Masquerain @ Route 11 - new EncounterArea5 { Location = 025, Slots = new[]{new EncounterSlot5 { Species = 084 }, }, }, // Doduo @ Route 12 - new EncounterArea5 { Location = 026, Slots = new[]{new EncounterSlot5 { Species = 277 }, }, }, // Swellow @ Route 13 - new EncounterArea5 { Location = 028, Slots = new[]{new EncounterSlot5 { Species = 022 }, }, }, // Fearow @ Route 15 - new EncounterArea5 { Location = 029, Slots = new[]{new EncounterSlot5 { Species = 204 }, }, }, // Pineco @ Route 16 - new EncounterArea5 { Location = 031, Slots = new[]{new EncounterSlot5 { Species = 187 }, }, }, // Hoppip @ Route 18 - new EncounterArea5 { Location = 032, Slots = new[]{new EncounterSlot5 { Species = 097 }, }, }, // Hypno @ Dreamyard - new EncounterArea5 { Location = 034, Slots = new[]{new EncounterSlot5 { Species = 450 }, }, }, // Hippowdon @ Desert Resort - new EncounterArea5 { Location = 070, Slots = new[]{new EncounterSlot5 { Species = 079 }, }, }, // Slowpoke @ Abundant shrine - new EncounterArea5 { Location = 132, Slots = new[]{new EncounterSlot5 { Species = 332 }, }, }, // Cacturne @ Reaversal Mountian - }; - - private static readonly EncounterArea5[] SlotsB2_Swarm = SlotsB2W2_Swarm.Concat(new[] { - new EncounterArea5 { Location = 016, Slots = new[]{new EncounterSlot5 { Species = 313 }, }, }, // Volbeat @ Route 3 - new EncounterArea5 { Location = 019, Slots = new[]{new EncounterSlot5 { Species = 311 }, }, }, // Plusle @ Route 6 - new EncounterArea5 { Location = 125, Slots = new[]{new EncounterSlot5 { Species = 185 }, }, }, // Sudowoodo @ Route 20 - new EncounterArea5 { Location = 127, Slots = new[]{new EncounterSlot5 { Species = 168 }, }, }, // Ariados @ Route 22 - }).ToArray(); - - private static readonly EncounterArea5[] SlotsW2_Swarm = SlotsB2W2_Swarm.Concat(new[] { - new EncounterArea5 { Location = 016, Slots = new[]{new EncounterSlot5 { Species = 314 }, }, }, // Illumise @ Route 3 - new EncounterArea5 { Location = 019, Slots = new[]{new EncounterSlot5 { Species = 312 }, }, }, // Minun @ Route 6 - new EncounterArea5 { Location = 125, Slots = new[]{new EncounterSlot5 { Species = 122 }, }, }, // Mr. Mime @ Route 20 - new EncounterArea5 { Location = 127, Slots = new[]{new EncounterSlot5 { Species = 166 }, }, }, // Ledian @ Route 22 - }).ToArray(); - - private static readonly EncounterSlot[] SlotsB2W2_HiddenGrottoEncounterSlots = - { - // reference http://bulbapedia.bulbagarden.net/wiki/Hidden_Grotto - // Route 2 - new EncounterSlot5 { Species = 029, LevelMin = 55, LevelMax = 60, }, // Nidoran♀ - new EncounterSlot5 { Species = 032, LevelMin = 55, LevelMax = 60, }, // Nidoran♂ - new EncounterSlot5 { Species = 210, LevelMin = 55, LevelMax = 60, }, // Granbull - new EncounterSlot5 { Species = 505, LevelMin = 55, LevelMax = 60, }, // Watchog - - // Route 3 - new EncounterSlot5 { Species = 310, LevelMin = 55, LevelMax = 60, }, // Manectric @ Dark Grass - new EncounterSlot5 { Species = 417, LevelMin = 55, LevelMax = 60, }, // Pachirisu @ Dark Grass - new EncounterSlot5 { Species = 523, LevelMin = 55, LevelMax = 60, }, // Zebstrika @ Dark Grass - new EncounterSlot5 { Species = 048, LevelMin = 55, LevelMax = 60, }, // Venonat @ Pond - new EncounterSlot5 { Species = 271, LevelMin = 55, LevelMax = 60, }, // Lombre @ Pond - new EncounterSlot5 { Species = 400, LevelMin = 55, LevelMax = 60, }, // Bibarel @ Pond - - // Route 5 - new EncounterSlot5 { Species = 510, LevelMin = 20, LevelMax = 25, }, // Liepard - new EncounterSlot5 { Species = 572, LevelMin = 20, LevelMax = 25, }, // Minccino - new EncounterSlot5 { Species = 590, LevelMin = 20, LevelMax = 25, }, // Foongus - - // Route 6 - new EncounterSlot5 { Species = 206, LevelMin = 25, LevelMax = 30, }, // Dunsparce @ Near PKM Breeder - new EncounterSlot5 { Species = 299, LevelMin = 25, LevelMax = 30, }, // Nosepass @ Mistralton Cave - new EncounterSlot5 { Species = 527, LevelMin = 25, LevelMax = 30, }, // Woobat @ Both - new EncounterSlot5 { Species = 590, LevelMin = 25, LevelMax = 30, }, // Foongus @ Both - - // Route 7 - new EncounterSlot5 { Species = 335, LevelMin = 30, LevelMax = 35, }, // Zangoose - new EncounterSlot5 { Species = 336, LevelMin = 30, LevelMax = 35, }, // Seviper - new EncounterSlot5 { Species = 505, LevelMin = 30, LevelMax = 35, }, // Watchog - new EncounterSlot5 { Species = 613, LevelMin = 30, LevelMax = 35, }, // Cubchoo - - // Route 9 - new EncounterSlot5 { Species = 089, LevelMin = 35, LevelMax = 40, }, // Muk - new EncounterSlot5 { Species = 510, LevelMin = 35, LevelMax = 40, }, // Liepard - new EncounterSlot5 { Species = 569, LevelMin = 35, LevelMax = 40, }, // Garbodor - new EncounterSlot5 { Species = 626, LevelMin = 35, LevelMax = 40, }, // Bouffalant - - // Route 13 - new EncounterSlot5 { Species = 114, LevelMin = 35, LevelMax = 40, }, // Tangela @ Gaint Chasm - new EncounterSlot5 { Species = 363, LevelMin = 35, LevelMax = 40, }, // Spheal @ Stairs - new EncounterSlot5 { Species = 425, LevelMin = 35, LevelMax = 40, }, // Drifloon @ Stairs - new EncounterSlot5 { Species = 451, LevelMin = 35, LevelMax = 40, }, // Skorupi @ Gaint Chasm - new EncounterSlot5 { Species = 590, LevelMin = 35, LevelMax = 40, }, // Foongus @ Both - - // Route 18 - new EncounterSlot5 { Species = 099, LevelMin = 55, LevelMax = 60, }, // Kingler - new EncounterSlot5 { Species = 149, LevelMin = 55, LevelMax = 60, }, // Dragonite - new EncounterSlot5 { Species = 222, LevelMin = 55, LevelMax = 60, }, // Corsola - new EncounterSlot5 { Species = 441, LevelMin = 55, LevelMax = 60, }, // Chatot - - // Pinwheel Forest - new EncounterSlot5 { Species = 061, LevelMin = 55, LevelMax = 60, }, // Poliwhirl @ Outer - new EncounterSlot5 { Species = 198, LevelMin = 55, LevelMax = 60, }, // Murkrow @ Inner - new EncounterSlot5 { Species = 286, LevelMin = 55, LevelMax = 60, }, // Breloom @ Inner - new EncounterSlot5 { Species = 297, LevelMin = 55, LevelMax = 60, }, // Hariyama @ Outer - new EncounterSlot5 { Species = 308, LevelMin = 55, LevelMax = 60, }, // Medicham @ Outer - new EncounterSlot5 { Species = 371, LevelMin = 55, LevelMax = 60, }, // Bagon @ Outer - new EncounterSlot5 { Species = 591, LevelMin = 55, LevelMax = 60, }, // Amoonguss @ Inner - - // Giant Chasm - new EncounterSlot5 { Species = 035, LevelMin = 45, LevelMax = 50, }, // Clefairy - new EncounterSlot5 { Species = 132, LevelMin = 45, LevelMax = 50, }, // Ditto - new EncounterSlot5 { Species = 215, LevelMin = 45, LevelMax = 50, }, // Sneasel - new EncounterSlot5 { Species = 375, LevelMin = 45, LevelMax = 50, }, // Metang - - // Abundant Shrine - new EncounterSlot5 { Species = 037, LevelMin = 35, LevelMax = 40, }, // Vulpix @ Near Youngster - new EncounterSlot5 { Species = 055, LevelMin = 35, LevelMax = 40, }, // Golduck @ Shrine - new EncounterSlot5 { Species = 333, LevelMin = 35, LevelMax = 40, }, // Swablu @ Shrine - new EncounterSlot5 { Species = 436, LevelMin = 35, LevelMax = 40, }, // Bronzor @ Near Youngster - new EncounterSlot5 { Species = 591, LevelMin = 35, LevelMax = 40, }, // Amoonguss @ Both - - // Lostlorn Forest - new EncounterSlot5 { Species = 127, LevelMin = 20, LevelMax = 25, }, // Pinsir - new EncounterSlot5 { Species = 214, LevelMin = 20, LevelMax = 25, }, // Heracross - new EncounterSlot5 { Species = 415, LevelMin = 20, LevelMax = 25, }, // Combee - new EncounterSlot5 { Species = 542, LevelMin = 20, LevelMax = 25, }, // Leavanny - - // Route 22 - new EncounterSlot5 { Species = 279, LevelMin = 40, LevelMax = 45, }, // Pelipper - new EncounterSlot5 { Species = 591, LevelMin = 40, LevelMax = 45, }, // Amoonguss - new EncounterSlot5 { Species = 619, LevelMin = 40, LevelMax = 45, }, // Mienfoo - - // Route 23 - new EncounterSlot5 { Species = 055, LevelMin = 50, LevelMax = 55, }, // Golduck - new EncounterSlot5 { Species = 207, LevelMin = 50, LevelMax = 55, }, // Gligar - new EncounterSlot5 { Species = 335, LevelMin = 50, LevelMax = 55, }, // Zangoose - new EncounterSlot5 { Species = 336, LevelMin = 50, LevelMax = 55, }, // Seviper - new EncounterSlot5 { Species = 359, LevelMin = 50, LevelMax = 55, }, // Absol - - // Floccesy Ranch - new EncounterSlot5 { Species = 183, LevelMin = 10, LevelMax = 15, }, // Marill - new EncounterSlot5 { Species = 206, LevelMin = 10, LevelMax = 15, }, // Dunsparce - new EncounterSlot5 { Species = 507, LevelMin = 10, LevelMax = 15, }, // Herdier - - // Funfest Missions - // todo : check the level - new EncounterSlot5 { Species = 133, LevelMin = 15, LevelMax = 60, }, // Eevee - new EncounterSlot5 { Species = 134, LevelMin = 15, LevelMax = 60, }, // Vaporeon - new EncounterSlot5 { Species = 135, LevelMin = 15, LevelMax = 60, }, // Jolteon - new EncounterSlot5 { Species = 136, LevelMin = 15, LevelMax = 60, }, // Flareon - new EncounterSlot5 { Species = 196, LevelMin = 15, LevelMax = 60, }, // Espeon - new EncounterSlot5 { Species = 197, LevelMin = 15, LevelMax = 60, }, // Umbreon - new EncounterSlot5 { Species = 470, LevelMin = 15, LevelMax = 60, }, // Leafeon - new EncounterSlot5 { Species = 471, LevelMin = 15, LevelMax = 60, }, // Glaceon - - // Funfest Week 3 - // new EncounterSlot5 { Species = 060, LevelMin = 15, LevelMax = 60, }, // Poliwag - new EncounterSlot5 { Species = 113, LevelMin = 15, LevelMax = 60, }, // Chansey - new EncounterSlot5 { Species = 176, LevelMin = 15, LevelMax = 60, }, // Togetic - new EncounterSlot5 { Species = 082, LevelMin = 15, LevelMax = 60, }, // Magneton - new EncounterSlot5 { Species = 148, LevelMin = 15, LevelMax = 60, }, // Dragonair - new EncounterSlot5 { Species = 372, LevelMin = 15, LevelMax = 60, }, // Shelgon - }; - - private static readonly EncounterArea5[] SlotsB2_HiddenGrotto = - { - new EncounterArea5 - { - Location = 143, // Hidden Grotto - Slots = SlotsB2W2_HiddenGrottoEncounterSlots.Concat(new[]{ - new EncounterSlot5 { Species = 015, LevelMin = 55, LevelMax = 60 }, // Beedrill @ Pinwheel Forest - new EncounterSlot5 { Species = 434, LevelMin = 15, LevelMax = 60 }, // Stunky from Funfest Missions - }).ToArray(), - } - }; - - private static readonly EncounterArea5[] SlotsW2_HiddenGrotto = - { - new EncounterArea5 - { - Location = 143, // Hidden Grotto - Slots = SlotsB2W2_HiddenGrottoEncounterSlots.Concat(new[]{ - new EncounterSlot5 { Species = 012, LevelMin = 55, LevelMax = 60 }, // Butterfree @ Pinwheel Forest - new EncounterSlot5 { Species = 431, LevelMin = 15, LevelMax = 60 }, // Glameow from Funfest Missions - }).ToArray(), - } - }; - - #endregion + internal static readonly EncounterStatic5[] StaticB = GetEncounters(ArrayUtil.ConcatAll(Encounter_BW, BW_DreamWorld), GameVersion.B); + internal static readonly EncounterStatic5[] StaticW = GetEncounters(ArrayUtil.ConcatAll(Encounter_BW, BW_DreamWorld), GameVersion.W); + internal static readonly EncounterStatic5[] StaticB2 = GetEncounters(ArrayUtil.ConcatAll(Encounter_B2W2, B2W2_DreamWorld), GameVersion.B2); + internal static readonly EncounterStatic5[] StaticW2 = GetEncounters(ArrayUtil.ConcatAll(Encounter_B2W2, B2W2_DreamWorld), GameVersion.W2); } } diff --git a/PKHeX.Core/Legality/Encounters/Data/Encounters6.cs b/PKHeX.Core/Legality/Encounters/Data/Encounters6.cs index 7853c1b50..ed9abc0a3 100644 --- a/PKHeX.Core/Legality/Encounters/Data/Encounters6.cs +++ b/PKHeX.Core/Legality/Encounters/Data/Encounters6.cs @@ -9,151 +9,32 @@ namespace PKHeX.Core /// internal static class Encounters6 { - internal static readonly EncounterArea6XY[] SlotsX, SlotsY; - internal static readonly EncounterArea6AO[] SlotsA, SlotsO; - internal static readonly EncounterStatic[] StaticX, StaticY, StaticA, StaticO; - internal static readonly ILookup FriendSafari; + private static readonly EncounterArea6XY FriendSafari = new EncounterArea6XY(Legal.FriendSafari); + internal static readonly EncounterArea6XY[] SlotsX = ArrayUtil.ConcatAll(EncounterArea6XY.GetAreas(Get("x", "xy"), GameVersion.X), new[] { FriendSafari }); + internal static readonly EncounterArea6XY[] SlotsY = ArrayUtil.ConcatAll(EncounterArea6XY.GetAreas(Get("y", "xy"), GameVersion.Y), new[] { FriendSafari }); + internal static readonly EncounterArea6AO[] SlotsA = EncounterArea6AO.GetAreas(Get("a", "ao"), GameVersion.AS); + internal static readonly EncounterArea6AO[] SlotsO = EncounterArea6AO.GetAreas(Get("o", "ao"), GameVersion.OR); + private static byte[][] Get(string resource, string ident) => BinLinker.Unpack(Util.GetBinaryResource($"encounter_{resource}.pkl"), ident); + static Encounters6() { - StaticX = GetEncounters(Encounter_XY, GameVersion.X); - StaticY = GetEncounters(Encounter_XY, GameVersion.Y); - StaticA = GetEncounters(Encounter_AO, GameVersion.AS); - StaticO = GetEncounters(Encounter_AO, GameVersion.OR); - - var XSlots = GetEncounterTables("xy", "x"); - var YSlots = GetEncounterTables("xy", "y"); - MarkG6XYSlots(ref XSlots); - MarkG6XYSlots(ref YSlots); - MarkEncounterAreaArray(SlotsXYAlt); - SlotsX = AddExtraTableSlots(XSlots, SlotsXYAlt); - SlotsY = AddExtraTableSlots(YSlots, SlotsXYAlt); - - SlotsA = GetEncounterTables("ao", "a"); - SlotsO = GetEncounterTables("ao", "o"); - MarkG6AOSlots(ref SlotsA); - MarkG6AOSlots(ref SlotsO); - MarkEncountersGeneration(6, StaticX, StaticY, StaticA, StaticO, TradeGift_XY, TradeGift_AO); - FriendSafari = EncounterArea6XYFriendSafari.GetArea(); MarkEncounterTradeStrings(TradeGift_XY, TradeXY); MarkEncounterTradeStrings(TradeGift_AO, TradeAO); - SlotsXYAlt.SetVersion(GameVersion.XY); - SlotsX.SetVersion(GameVersion.X); - SlotsY.SetVersion(GameVersion.Y); - SlotsA.SetVersion(GameVersion.AS); - SlotsO.SetVersion(GameVersion.OR); Encounter_XY.SetVersion(GameVersion.XY); Encounter_AO.SetVersion(GameVersion.ORAS); TradeGift_XY.SetVersion(GameVersion.XY); TradeGift_AO.SetVersion(GameVersion.ORAS); } - private static void MarkG6XYSlots(ref EncounterArea6XY[] Areas) - { - foreach (var area in Areas) - { - int slotct = area.Slots.Length; - for (int i = slotct - 15; i < slotct; i++) - area.Slots[i].Type = SlotType.Horde; - } - ReduceAreasSize(ref Areas); - } - - private static void MarkG6AOSlots(ref EncounterArea6AO[] Areas) - { - foreach (var area in Areas) - { - for (int i = 32; i < 37; i++) - area.Slots[i].Type = SlotType.Rock_Smash; - int slotct = area.Slots.Length; - for (int i = slotct - 15; i < slotct; i++) - area.Slots[i].Type = SlotType.Horde; - - for (int i = 0; i < slotct; i++) - ((EncounterSlot6AO)area.Slots[i]).AllowDexNav = area.Slots[i].Type != SlotType.Rock_Smash; - } - ReduceAreasSize(ref Areas); - } - private const string tradeXY = "tradexy"; private const string tradeAO = "tradeao"; private static readonly string[][] TradeXY = Util.GetLanguageStrings8(tradeXY); private static readonly string[][] TradeAO = Util.GetLanguageStrings8(tradeAO); - #region XY Alt Slots - private static readonly EncounterArea6XY[] SlotsXYAlt = - { - new EncounterArea6XY { - Location = 104, // Victory Road - Slots = new[] - { - // Drops - new EncounterSlot6XY { Species = 075, LevelMin = 57, LevelMax = 57, Form = 0 }, // Graveler - new EncounterSlot6XY { Species = 168, LevelMin = 58, LevelMax = 59, Form = 0 }, // Ariados - new EncounterSlot6XY { Species = 714, LevelMin = 57, LevelMax = 59, Form = 0 }, // Noibat - - // Swoops - new EncounterSlot6XY { Species = 022, LevelMin = 57, LevelMax = 59, Form = 0 }, // Fearow - new EncounterSlot6XY { Species = 227, LevelMin = 57, LevelMax = 59, Form = 0 }, // Skarmory - new EncounterSlot6XY { Species = 635, LevelMin = 59, LevelMax = 59, Form = 0 }, // Hydreigon - },}, - new EncounterArea6XY { - Location = 34, // Route 6 - Slots = new[] - { - // Rustling Bush - new EncounterSlot6XY { Species = 543, LevelMin = 10, LevelMax = 12, Form = 0 }, // Venipede - new EncounterSlot6XY { Species = 531, LevelMin = 10, LevelMax = 12, Form = 0 }, // Audino - },}, - - new EncounterArea6XY { Location = 38, // Route 7 - Slots = new[] - { - // Berry Field - new EncounterSlot6XY { Species = 165, LevelMin = 14, LevelMax = 15, Form = 0 }, // Ledyba - new EncounterSlot6XY { Species = 313, LevelMin = 14, LevelMax = 15, Form = 0 }, // Volbeat - new EncounterSlot6XY { Species = 314, LevelMin = 14, LevelMax = 15, Form = 0 }, // Illumise - new EncounterSlot6XY { Species = 412, LevelMin = 14, LevelMax = 15, Form = 0 }, // Burmy - new EncounterSlot6XY { Species = 415, LevelMin = 14, LevelMax = 15, Form = 0 }, // Combee - new EncounterSlot6XY { Species = 665, LevelMin = 14, LevelMax = 15, Form = 30 }, // Spewpa - },}, - - new EncounterArea6XY { Location = 88, // Route 18 - Slots = new[] - { - // Rustling Bush - new EncounterSlot6XY { Species = 632, LevelMin = 44, LevelMax = 46, Form = 0 }, // Durant - new EncounterSlot6XY { Species = 631, LevelMin = 45, LevelMax = 45, Form = 0 }, // Heatmor - },}, - - new EncounterArea6XY { Location = 132, // Glittering Cave - Slots = new[] - { - // Drops - new EncounterSlot6XY { Species = 527, LevelMin = 15, LevelMax = 17, Form = 0 }, // Woobat - new EncounterSlot6XY { Species = 597, LevelMin = 15, LevelMax = 17, Form = 0 }, // Ferroseed - },}, - - new EncounterArea6XY { Location = 56, // Reflection Cave - Slots = new[] - { - // Drops - new EncounterSlot6XY { Species = 527, LevelMin = 21, LevelMax = 23, Form = 0 }, // Woobat - new EncounterSlot6XY { Species = 597, LevelMin = 21, LevelMax = 23, Form = 0 }, // Ferroseed - },}, - - new EncounterArea6XY { Location = 140, // Terminus Cave - Slots = new[] - { - // Drops - new EncounterSlot6XY { Species = 168, LevelMin = 44, LevelMax = 46, Form = 0 }, // Ariados - new EncounterSlot6XY { Species = 714, LevelMin = 44, LevelMax = 46, Form = 0 }, // Noibat - },}, - }; - #endregion #region Static Encounter/Gift Tables private static readonly EncounterStatic[] Encounter_XY = { @@ -362,5 +243,10 @@ private static IEnumerable PermuteCosplayPikachu() new EncounterTrade6(07,4,10,319) { Species = 222, Level = 50, Ability = 4, TID = 00325, IVs = new[] {31,-1,-1,-1,-1,31}, Gender = 1, Nature = Nature.Calm, }, // Corsola }; #endregion + + internal static readonly EncounterStatic[] StaticX = GetEncounters(Encounter_XY, GameVersion.X); + internal static readonly EncounterStatic[] StaticY = GetEncounters(Encounter_XY, GameVersion.Y); + internal static readonly EncounterStatic[] StaticA = GetEncounters(Encounter_AO, GameVersion.AS); + internal static readonly EncounterStatic[] StaticO = GetEncounters(Encounter_AO, GameVersion.OR); } } diff --git a/PKHeX.Core/Legality/Encounters/Data/Encounters7.cs b/PKHeX.Core/Legality/Encounters/Data/Encounters7.cs index ce3506e2b..7a3b5b8c1 100644 --- a/PKHeX.Core/Legality/Encounters/Data/Encounters7.cs +++ b/PKHeX.Core/Legality/Encounters/Data/Encounters7.cs @@ -1,5 +1,4 @@ -using System.Linq; -using static PKHeX.Core.EncounterUtil; +using static PKHeX.Core.EncounterUtil; namespace PKHeX.Core { @@ -8,72 +7,25 @@ namespace PKHeX.Core /// internal static class Encounters7 { - internal static readonly EncounterArea7[] SlotsSN, SlotsMN, SlotsUS, SlotsUM; - internal static readonly EncounterStatic7[] StaticSN, StaticMN, StaticUS, StaticUM; + internal static readonly EncounterArea7[] SlotsSN = EncounterArea7.GetAreas(Get("sn", "sm"), GameVersion.SN); + internal static readonly EncounterArea7[] SlotsMN = EncounterArea7.GetAreas(Get("mn", "sm"), GameVersion.MN); + internal static readonly EncounterArea7[] SlotsUS = EncounterArea7.GetAreas(Get("us", "uu"), GameVersion.US); + internal static readonly EncounterArea7[] SlotsUM = EncounterArea7.GetAreas(Get("um", "uu"), GameVersion.UM); + private static byte[][] Get(string resource, string ident) => BinLinker.Unpack(Util.GetBinaryResource($"encounter_{resource}.pkl"), ident); static Encounters7() { - StaticSN = GetEncounters(Encounter_SM, GameVersion.SN); - StaticMN = GetEncounters(Encounter_SM, GameVersion.MN); - StaticUS = GetEncounters(Encounter_USUM, GameVersion.US); - StaticUM = GetEncounters(Encounter_USUM, GameVersion.UM); - - var REG_SN = GetEncounterTables("sm", "sn"); - var REG_MN = GetEncounterTables("sm", "mn"); - var SOS_SN = GetEncounterTables("sm", "sn_sos"); - var SOS_MN = GetEncounterTables("sm", "mn_sos"); - MarkG7REGSlots(ref REG_SN); - MarkG7REGSlots(ref REG_MN); - MarkG7SMSlots(ref SOS_SN); - MarkG7SMSlots(ref SOS_MN); - int[] pelagoMin = { 1, 11, 21, 37, 49 }; - InitializePelagoSM(pelagoMin, out var p_sn, out var p_mn); - InitializePelagoUltra(pelagoMin, out var p_us, out var p_um); - SlotsSN = AddExtraTableSlots(REG_SN, SOS_SN, p_sn); - SlotsMN = AddExtraTableSlots(REG_MN, SOS_MN, p_mn); - - var REG_US = GetEncounterTables("uu", "us"); - var REG_UM = GetEncounterTables("uu", "um"); - var SOS_US = GetEncounterTables("uu", "us_sos"); - var SOS_UM = GetEncounterTables ("uu", "um_sos"); - MarkG7REGSlots(ref REG_US); - MarkG7REGSlots(ref REG_UM); - MarkG7SMSlots(ref SOS_US); - MarkG7SMSlots(ref SOS_UM); - SlotsUS = AddExtraTableSlots(REG_US, SOS_US, p_us); - SlotsUM = AddExtraTableSlots(REG_UM, SOS_UM, p_um); - - MarkEncounterAreaArray(SOS_SN, SOS_MN, SOS_US, SOS_UM, - p_sn, p_mn, - p_us, p_um); - MarkEncountersGeneration(7, StaticSN, StaticMN, StaticUS, StaticUM, TradeGift_SM, TradeGift_USUM); MarkEncounterTradeStrings(TradeGift_SM, TradeSM); MarkEncounterTradeStrings(TradeGift_USUM, TradeUSUM); - SlotsSN.SetVersion(GameVersion.SN); - SlotsMN.SetVersion(GameVersion.MN); - SlotsUS.SetVersion(GameVersion.US); - SlotsUM.SetVersion(GameVersion.UM); Encounter_SM.SetVersion(GameVersion.SM); Encounter_USUM.SetVersion(GameVersion.USUM); TradeGift_SM.SetVersion(GameVersion.SM); TradeGift_USUM.SetVersion(GameVersion.USUM); } - private static void MarkG7REGSlots(ref EncounterArea7[] Areas) - { - ReduceAreasSize(ref Areas); - } - - private static void MarkG7SMSlots(ref EncounterArea7[] Areas) - { - foreach (EncounterSlot s in Areas.SelectMany(area => area.Slots)) - s.Type = SlotType.SOS; - ReduceAreasSize(ref Areas); - } - private static readonly EncounterStatic7[] Encounter_SM = // @ a\1\5\5 { // Gifts - 0.bin @@ -408,53 +360,9 @@ private static void MarkG7SMSlots(ref EncounterArea7[] Areas) private static readonly string[][] TradeSM = Util.GetLanguageStrings10(tradeSM); private static readonly string[][] TradeUSUM = Util.GetLanguageStrings10(tradeUSUM); - private static void InitializePelagoSM(int[] minLevels, out EncounterArea7[] sn, out EncounterArea7[] mn) - { - int[][] speciesSM = - { - new[] {627/*SN*/, 021, 041, 090, 278, 731}, // 1-7 - new[] {064, 081, 092, 198, 426, 703}, // 11-17 - new[] {060, 120, 127, 661, 709, 771}, // 21-27 - new[] {227, 375, 707}, // 37-43 - new[] {123, 131, 429, 587}, // 49-55 - }; - sn = GetPelagoArea(speciesSM, minLevels); - speciesSM[0][0] = 629; // Rufflet -> Vullaby - mn = GetPelagoArea(speciesSM, minLevels); - } - - private static void InitializePelagoUltra(int[] minLevels, out EncounterArea7[] us, out EncounterArea7[] um) - { - int[][] speciesUU = - { - new[] {731, 278, 041, 742, 086}, // 1-7 - new[] {079, 120, 222, 122, 180, 124}, // 11-17 - new[] {127, 177, 764, 163, 771, 701}, // 21-27 - new[] {131, 354, 200, /* US */ 228}, // 37-43 - new[] {209, 667, 357, 430}, // 49-55 - }; - us = GetPelagoArea(speciesUU, minLevels); - speciesUU[3][3] = 309; // Houndour -> Electrike - um = GetPelagoArea(speciesUU, minLevels); - } - - private static EncounterArea7[] GetPelagoArea(int[][] species, int[] min) - { - // Species that appear at a lower level than the current table show up too. - var area = new EncounterArea7 - { - Location = 30016, - Slots = species.SelectMany((_, i) => - species.Take(1 + i).SelectMany(z => // grab current row & above - z.Select(s => new EncounterSlot7 // get slot data for each species - { - Species = s, - LevelMin = min[i], - LevelMax = min[i] + 6 - } - ))).ToArray(), - }; - return new[] {area}; - } + internal static readonly EncounterStatic7[] StaticSN = GetEncounters(Encounter_SM, GameVersion.SN); + internal static readonly EncounterStatic7[] StaticMN = GetEncounters(Encounter_SM, GameVersion.MN); + internal static readonly EncounterStatic7[] StaticUS = GetEncounters(Encounter_USUM, GameVersion.US); + internal static readonly EncounterStatic7[] StaticUM = GetEncounters(Encounter_USUM, GameVersion.UM); } } diff --git a/PKHeX.Core/Legality/Encounters/Data/Encounters7b.cs b/PKHeX.Core/Legality/Encounters/Data/Encounters7b.cs index 79dff44ca..59387b82c 100644 --- a/PKHeX.Core/Legality/Encounters/Data/Encounters7b.cs +++ b/PKHeX.Core/Legality/Encounters/Data/Encounters7b.cs @@ -7,20 +7,15 @@ namespace PKHeX.Core { internal static class Encounters7b { - internal static readonly EncounterArea7b[] SlotsGP = GetEncounterTables("gg", "gp"); - internal static readonly EncounterArea7b[] SlotsGE = GetEncounterTables("gg", "ge"); - internal static readonly EncounterStatic[] StaticGP, StaticGE; - internal static readonly EncounterArea7g[] SlotsGO_GG = GetGoParkArea(); + internal static readonly EncounterArea7b[] SlotsGP = EncounterArea7b.GetAreas(Get("gp", "gg"), GameVersion.GP); + internal static readonly EncounterArea7b[] SlotsGE = EncounterArea7b.GetAreas(Get("ge", "gg"), GameVersion.GE); + internal static readonly EncounterArea7g[] SlotsGO_GG = EncounterArea7g.GetArea(); + private static byte[][] Get(string resource, string ident) => BinLinker.Unpack(Util.GetBinaryResource($"encounter_{resource}.pkl"), ident); static Encounters7b() { - StaticGP = GetEncounters(Encounter_GG, GameVersion.GP); - StaticGE = GetEncounters(Encounter_GG, GameVersion.GE); - ManuallyAddRareSpawns(SlotsGP); ManuallyAddRareSpawns(SlotsGE); - SlotsGP.SetVersion(GameVersion.GP); - SlotsGE.SetVersion(GameVersion.GE); Encounter_GG.SetVersion(GameVersion.GG); TradeGift_GG.SetVersion(GameVersion.GG); MarkEncountersGeneration(7, StaticGP, StaticGE, TradeGift_GG); @@ -83,63 +78,7 @@ static Encounters7b() new EncounterTrade7b { Species = 074, Level = 16, Form = 1, TrainerNames = T8, TID7 = 551873, OTGender = 0, Shiny = Shiny.Random, IVs = new[] {31,31,-1,-1,-1,-1}, IsNicknamed = false }, // Geodude @ Vermilion City, AV rand [0-5) }; - private static EncounterArea7g[] GetGoParkArea() - { - var area = new EncounterArea7g { Location = 50 }; - EncounterSlot GetSlot(int species, int form) - { - return new EncounterSlot7GO - { - Area = area, - Species = species, - LevelMin = 1, - LevelMax = 40, - Form = form, - Type = SlotType.GoPark, - Version = GameVersion.GO, - }; - } - - var obtainable = Enumerable.Range(1, 150).Concat(Enumerable.Range(808, 2)); // count : 152 - var AlolanKanto = new byte[] - { - // Level 1+ - 019, // Rattata - 020, // Raticate - 027, // Sandshrew - 028, // Sandslash - 037, // Vulpix - 038, // Ninetales - 050, // Diglett - 051, // Dugtrio - 052, // Meowth - 053, // Persian - 074, // Geodude - 075, // Graveler - 076, // Golem - 088, // Grimer - 089, // Muk - 103, // Exeggutor - 105, // Marowak - - // Level 15+ - 026, // Raichu - }; - - var regular = obtainable.Select(z => GetSlot(z, 0)); - var alolan = AlolanKanto.Select(z => GetSlot(z, 1)); - var slots = regular.Concat(alolan).ToArray(); - - slots[slots.Length - 1].LevelMin = 15; // Raichu - slots[(int)Species.Mewtwo - 1].LevelMin = 15; - slots[(int)Species.Articuno - 1].LevelMin = 15; - slots[(int)Species.Zapdos - 1].LevelMin = 15; - slots[(int)Species.Moltres - 1].LevelMin = 15; - - area.Slots = slots; - return new[] {area}; - } - + private class RareSpawn { public readonly int Species; @@ -177,7 +116,7 @@ protected internal RareSpawn(int species, params byte[] locations) new RareSpawn(149, Sky), }; - private static void ManuallyAddRareSpawns(IEnumerable areas) + private static void ManuallyAddRareSpawns(IEnumerable areas) { foreach (var table in areas) { @@ -188,13 +127,7 @@ private static void ManuallyAddRareSpawns(IEnumerable areas) var slots = table.Slots; var first = slots[0]; var extra = species - .Select(z => new EncounterSlot7b - { - Area = table, - Species = z, - LevelMin = (z == 006 || z >= 144) ? 03 : first.LevelMin, - LevelMax = (z == 006 || z >= 144) ? 56 : first.LevelMax, - }).ToArray(); + .Select(z => new EncounterSlot7b(table, z, (z == 006 || z >= 144) ? 03 : first.LevelMin, (z == 006 || z >= 144) ? 56 : first.LevelMax, GameVersion.GG)).ToArray(); int count = slots.Length; Array.Resize(ref slots, count + extra.Length); @@ -202,5 +135,8 @@ private static void ManuallyAddRareSpawns(IEnumerable areas) table.Slots = slots; } } + + internal static readonly EncounterStatic[] StaticGP = GetEncounters(Encounter_GG, GameVersion.GP); + internal static readonly EncounterStatic[] StaticGE = GetEncounters(Encounter_GG, GameVersion.GE); } } diff --git a/PKHeX.Core/Legality/Encounters/Data/Encounters8.cs b/PKHeX.Core/Legality/Encounters/Data/Encounters8.cs index daaa79706..b17842a84 100644 --- a/PKHeX.Core/Legality/Encounters/Data/Encounters8.cs +++ b/PKHeX.Core/Legality/Encounters/Data/Encounters8.cs @@ -15,19 +15,17 @@ namespace PKHeX.Core /// internal static class Encounters8 { - internal static readonly EncounterArea8[] SlotsSW_Symbol = GetEncounterTables8("sw", "sw_symbol"); - internal static readonly EncounterArea8[] SlotsSH_Symbol = GetEncounterTables8("sh", "sh_symbol"); - internal static readonly EncounterArea8[] SlotsSW_Hidden = GetEncounterTables8("sw", "sw_hidden"); - internal static readonly EncounterArea8[] SlotsSH_Hidden = GetEncounterTables8("sh", "sh_hidden"); - internal static readonly EncounterArea8[] SlotsSW, SlotsSH; - internal static readonly EncounterStatic[] StaticSW, StaticSH; + private static readonly EncounterArea8[] SlotsSW_Symbol = EncounterAreaSH.GetArray(Get("sw_symbol", "sw"), SW); + private static readonly EncounterArea8[] SlotsSH_Symbol = EncounterAreaSH.GetArray(Get("sh_symbol", "sh"), SH); + private static readonly EncounterArea8[] SlotsSW_Hidden = EncounterAreaSH.GetArray(Get("sw_hidden", "sw"), SW); + private static readonly EncounterArea8[] SlotsSH_Hidden = EncounterAreaSH.GetArray(Get("sh_hidden", "sh"), SH); + private static byte[][] Get(string resource, string ident) => BinLinker.Unpack(Util.GetBinaryResource($"encounter_{resource}.pkl"), ident); + + internal static readonly EncounterArea8[] SlotsSW = ArrayUtil.ConcatAll(SlotsSW_Symbol, SlotsSW_Hidden); + internal static readonly EncounterArea8[] SlotsSH = ArrayUtil.ConcatAll(SlotsSH_Symbol, SlotsSH_Hidden); static Encounters8() { - SlotsSW = ArrayUtil.ConcatAll(SlotsSW_Symbol, SlotsSW_Hidden); - SlotsSH = ArrayUtil.ConcatAll(SlotsSH_Symbol, SlotsSH_Hidden); - SlotsSW.SetVersion(SW); - SlotsSH.SetVersion(SH); foreach (var area in SlotsSW_Symbol) area.PermitCrossover = true; foreach (var area in SlotsSH_Symbol) @@ -46,12 +44,7 @@ static Encounters8() Crystal_SWSH.SetVersion(SWSH); MarkEncounterTradeStrings(TradeGift_SWSH, TradeSWSH); - StaticSW = GetEncounters(Encounter_SWSH, SW); - StaticSH = GetEncounters(Encounter_SWSH, SH); - // Include Nest Tables for both versions -- online play can share them across versions! In the IsMatch method we check if it's a valid share. - StaticSW = ArrayUtil.ConcatAll(Nest_Common, Nest_SW, Nest_SH, Dist_Common, Dist_SW, Dist_SH, GetEncounters(Crystal_SWSH, SW), StaticSW); - StaticSH = ArrayUtil.ConcatAll(Nest_Common, Nest_SW, Nest_SH, Dist_Common, Dist_SW, Dist_SH, GetEncounters(Crystal_SWSH, SH), StaticSH); MarkEncountersGeneration(8, StaticSW, StaticSH, TradeGift_SWSH); @@ -610,5 +603,8 @@ private static void CopyBerryTreeFromBridgeFieldToStony(IReadOnlyList 0; set { } } public override string ToString() => $"{(Species) Species} @ {LevelMin}-{LevelMax}"; - internal EncounterArea? Area { get; set; } - public int Location { get => Area?.Location ?? 0; set { } } + internal readonly EncounterArea Area; + public int Location { get => Area.Location; set { } } - public SlotType Type { get; set; } = SlotType.Any; + protected EncounterSlot(EncounterArea area) => Area = area; public EncounterSlot Clone() => (EncounterSlot)MemberwiseClone(); @@ -67,9 +67,9 @@ public virtual string LongName { get { - if (Type == SlotType.Any) + if (Area!.Type == SlotType.Any) return wild; - return $"{wild} {Type.ToString().Replace('_', ' ')}"; + return $"{wild} {Area!.Type.ToString().Replace('_', ' ')}"; } } @@ -93,7 +93,9 @@ protected virtual void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria pk.CurrentLevel = level; pk.Version = (int)version; pk.Nickname = SpeciesName.GetSpeciesNameGeneration(Species, lang, Generation); - pk.Ball = (int)Type.GetBall(); + + var ball = BallExtensions.GetRequiredBallValueWild(Generation, Location); + pk.Ball = (int)(ball == Ball.None ? Ball.Poke : ball); pk.Language = lang; pk.OT_Friendship = pk.PersonalInfo.BaseFriendship; pk.AltForm = GetWildAltForm(pk, Form, sav); @@ -126,7 +128,7 @@ protected virtual void SetPINGA(PKM pk, EncounterCriteria criteria) int nature = (int)criteria.GetNature(Nature.Random); var ability = Util.Rand.Next(2); - if (Type == SlotType.HiddenGrotto) // don't force hidden for DexNav + if (Area!.Type == SlotType.HiddenGrotto) // don't force hidden for DexNav ability = 2; PIDGenerator.SetRandomWildPID(pk, pk.Format, nature, ability, gender); diff --git a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot1.cs b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot1.cs index d31e2d8fc..4489dd00a 100644 --- a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot1.cs +++ b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot1.cs @@ -8,39 +8,13 @@ public sealed class EncounterSlot1 : EncounterSlot, INumberedSlot public override int Generation => 1; public int SlotNumber { get; set; } - public readonly int Rate; - - public EncounterSlot1(int species, int min, int max, int rate, SlotType type, int slot) + public EncounterSlot1(EncounterArea1 area, int species, int min, int max, int slot, GameVersion game) : base(area) { Species = species; LevelMin = min; LevelMax = max; - Rate = rate; - Type = type; SlotNumber = slot; - } - - /// - /// Deserializes Gen1 Encounter Slots from data. - /// - /// Byte array containing complete slot data table. - /// Offset to start reading from. - /// Amount of slots to read. - /// Type of encounter slot table. - /// Slot type encounter rate. - /// Array of encounter slots. - public static EncounterSlot1[] ReadSlots(byte[] data, ref int ofs, int count, SlotType type, int rate) - { - var bump = type == SlotType.Surf ? 4 : 0; - var slots = new EncounterSlot1[count]; - for (int slot = 0; slot < count; slot++) - { - int min = data[ofs++]; - int species = data[ofs++]; - int max = min + bump; - slots[slot] = new EncounterSlot1(species, min, max, rate, type, slot); - } - return slots; + Version = game; } protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk) diff --git a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot2.cs b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot2.cs index dce36e182..ab529436a 100644 --- a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot2.cs +++ b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot2.cs @@ -11,40 +11,13 @@ public sealed class EncounterSlot2 : EncounterSlot, INumberedSlot public override int Generation => 2; public int SlotNumber { get; set; } - public int Rate; - internal EncounterTime Time; - - public EncounterSlot2(int species, int min, int max, int rate, SlotType type, int slot) + public EncounterSlot2(EncounterArea2 area, int species, int min, int max, int slot, GameVersion game) : base(area) { Species = species; LevelMin = min; LevelMax = max; - Rate = rate; - Type = type; SlotNumber = slot; - } - - /// - /// Deserializes Gen2 Encounter Slots from data. - /// - /// Byte array containing complete slot data table. - /// Offset to start reading from. - /// Amount of slots to read. - /// Type of encounter slot table. - /// Slot type encounter rate. - /// Array of encounter slots. - public static EncounterSlot2[] ReadSlots(byte[] data, ref int ofs, int count, SlotType type, int rate) - { - var bump = type == SlotType.Surf ? 4 : 0; - var slots = new EncounterSlot2[count]; - for (int slot = 0; slot < count; slot++) - { - int min = data[ofs++]; - int species = data[ofs++]; - int max = min + bump; - slots[slot] = new EncounterSlot2(species, min, max, rate, type, slot); - } - return slots; + Version = game; } protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk) @@ -53,7 +26,7 @@ protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteri var pk2 = (PK2)pk; if (Version == GameVersion.C) - pk2.Met_TimeOfDay = Time.RandomValidTime(); + pk2.Met_TimeOfDay = ((EncounterArea2)Area!).Time.RandomValidTime(); } } } diff --git a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot3.cs b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot3.cs index 5d58dded2..760746f2f 100644 --- a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot3.cs +++ b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot3.cs @@ -4,11 +4,27 @@ public class EncounterSlot3 : EncounterSlot, IMagnetStatic, INumberedSlot { public override int Generation => 3; - public int StaticIndex { get; set; } = -1; - public int MagnetPullIndex { get; set; } = -1; + public int StaticIndex { get; set; } + public int MagnetPullIndex { get; set; } public int StaticCount { get; set; } public int MagnetPullCount { get; set; } public int SlotNumber { get; set; } + + public EncounterSlot3(EncounterArea3 area, int species, int form, int min, int max, int slot, int mpi, int mpc, int sti, int stc, GameVersion game) : base(area) + { + Species = species; + Form = form; + LevelMin = min; + LevelMax = max; + SlotNumber = slot; + Version = game; + + MagnetPullIndex = mpi; + MagnetPullCount = mpc; + + StaticIndex = sti; + StaticCount = stc; + } } } diff --git a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot3PokeSpot.cs b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot3PokeSpot.cs index ae453c1fe..2169325c2 100644 --- a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot3PokeSpot.cs +++ b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot3PokeSpot.cs @@ -6,12 +6,13 @@ public sealed class EncounterSlot3PokeSpot : EncounterSlot, INumberedSlot public int SlotNumber { get; set; } - public EncounterSlot3PokeSpot(int species, int min, int max, int slot) + public EncounterSlot3PokeSpot(EncounterArea3XD area, int species, int min, int max, int slot) : base(area) { Species = species; LevelMin = min; LevelMax = max; SlotNumber = slot; + Version = GameVersion.XD; } // PokeSpot encounters always have Fateful Encounter set. diff --git a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot3Swarm.cs b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot3Swarm.cs index a3a9d23b8..77e672448 100644 --- a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot3Swarm.cs +++ b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot3Swarm.cs @@ -7,7 +7,8 @@ internal sealed class EncounterSlot3Swarm : EncounterSlot3, IMoveset public override int Generation => 3; public IReadOnlyList Moves { get; } - public EncounterSlot3Swarm(IReadOnlyList moves) => Moves = moves; + public EncounterSlot3Swarm(EncounterArea3 area, int species, int min, int max, int slot, GameVersion game, + IReadOnlyList moves) : base(area, species, 0, min, max, slot, 0, 0, 0, 0, game) => Moves = moves; protected override void SetEncounterMoves(PKM pk, GameVersion version, int level) { diff --git a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot4.cs b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot4.cs index 1cb41923e..faf7c9069 100644 --- a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot4.cs +++ b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot4.cs @@ -3,15 +3,31 @@ namespace PKHeX.Core public sealed class EncounterSlot4 : EncounterSlot, IMagnetStatic, INumberedSlot { public override int Generation => 4; - public EncounterType TypeEncounter { get; set; } = EncounterType.None; + public EncounterType TypeEncounter => ((EncounterArea4)Area).TypeEncounter; - public int StaticIndex { get; set; } = -1; - public int MagnetPullIndex { get; set; } = -1; + public int StaticIndex { get; set; } + public int MagnetPullIndex { get; set; } public int StaticCount { get; set; } public int MagnetPullCount { get; set; } public int SlotNumber { get; set; } + public EncounterSlot4(EncounterArea4 area, int species, int form, int min, int max, int slot, int mpi, int mpc, int sti, int stc, GameVersion game) : base(area) + { + Species = species; + Form = form; + LevelMin = min; + LevelMax = max; + SlotNumber = slot; + Version = game; + + MagnetPullIndex = mpi; + MagnetPullCount = mpc; + + StaticIndex = sti; + StaticCount = stc; + } + protected override void SetFormatSpecificData(PKM pk) => ((PK4)pk).EncounterType = TypeEncounter.GetIndex(); } } diff --git a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot5.cs b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot5.cs index c4e4b46ae..cbba78388 100644 --- a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot5.cs +++ b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot5.cs @@ -3,5 +3,14 @@ namespace PKHeX.Core public sealed class EncounterSlot5 : EncounterSlot { public override int Generation => 5; + + public EncounterSlot5(EncounterArea5 area, int species, int form, int min, int max, GameVersion game) : base(area) + { + Species = species; + Form = form; + LevelMin = min; + LevelMax = max; + Version = game; + } } } diff --git a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot6AO.cs b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot6AO.cs index 23c164b92..d91ae73ca 100644 --- a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot6AO.cs +++ b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot6AO.cs @@ -4,18 +4,26 @@ public sealed class EncounterSlot6AO : EncounterSlot { public override int Generation => 6; + public EncounterSlot6AO(EncounterArea6AO area, int species, int form, int min, int max, GameVersion game) : base(area) + { + Species = species; + Form = form; + LevelMin = min; + LevelMax = max; + Version = game; + } + public bool Pressure { get; set; } - public bool AllowDexNav { get; set; } public bool DexNav { get; set; } public bool WhiteFlute { get; set; } public bool BlackFlute { get; set; } - private bool IsDexNav => AllowDexNav && DexNav; + public bool CanDexNav => Area.Type != SlotType.Rock_Smash; protected override void SetFormatSpecificData(PKM pk) { var pk6 = (PK6)pk; - if (IsDexNav) + if (CanDexNav) { var eggMoves = MoveEgg.GetEggMoves(pk, Species, Form, Version); if (eggMoves.Length > 0) diff --git a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot6XY.cs b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot6XY.cs index fa10c9069..bb0ed56b6 100644 --- a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot6XY.cs +++ b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot6XY.cs @@ -5,6 +5,15 @@ public sealed class EncounterSlot6XY : EncounterSlot public override int Generation => 6; public bool Pressure { get; set; } + public EncounterSlot6XY(EncounterArea6XY area, int species, int form, int min, int max, GameVersion game) : base(area) + { + Species = species; + Form = form; + LevelMin = min; + LevelMax = max; + Version = game; + } + protected override void SetFormatSpecificData(PKM pk) { var pk6 = (PK6)pk; diff --git a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot7.cs b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot7.cs index 34695ddfe..bd93427b2 100644 --- a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot7.cs +++ b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot7.cs @@ -2,6 +2,15 @@ namespace PKHeX.Core { public sealed class EncounterSlot7 : EncounterSlot { + public EncounterSlot7(EncounterArea7 area, int species, int form, int min, int max, GameVersion game) : base(area) + { + Species = species; + Form = form; + LevelMin = min; + LevelMax = max; + Version = game; + } + public override int Generation => 7; public bool Pressure { get; set; } } diff --git a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot7GO.cs b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot7GO.cs index 77ac65989..2a5c21213 100644 --- a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot7GO.cs +++ b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot7GO.cs @@ -3,5 +3,14 @@ namespace PKHeX.Core public sealed class EncounterSlot7GO : EncounterSlot { public override int Generation => 7; + + public EncounterSlot7GO(EncounterArea7g area, int species, int form, int min, int max, GameVersion game) : base(area) + { + Species = species; + Form = form; + LevelMin = min; + LevelMax = max; + Version = game; + } } } \ No newline at end of file diff --git a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot7b.cs b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot7b.cs index 2f0540a51..2958f6a13 100644 --- a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot7b.cs +++ b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot7b.cs @@ -3,5 +3,13 @@ namespace PKHeX.Core public sealed class EncounterSlot7b : EncounterSlot { public override int Generation => 7; + + public EncounterSlot7b(EncounterArea7b area, int species, int min, int max, GameVersion game) : base(area) + { + Species = species; + LevelMin = min; + LevelMax = max; + Version = game; + } } } \ No newline at end of file diff --git a/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStatic3.cs b/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStatic3.cs index 8248092e7..d2073af55 100644 --- a/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStatic3.cs +++ b/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStatic3.cs @@ -1,4 +1,7 @@ -namespace PKHeX.Core +using System; +using System.Linq; + +namespace PKHeX.Core { public class EncounterStatic3 : EncounterStatic { @@ -26,11 +29,39 @@ protected override bool IsMatchLocation(PKM pkm) { if (EggEncounter) return true; - if (Location == 0) - return true; - if (pkm.Format == 3) - return Location == pkm.Met_Location; - return true; // transfer location verified later + if (pkm.Format != 3) + return true; // transfer location verified later + + var met = pkm.Met_Location; + if (!Roaming) + return Location == met; + + var table = Version <= GameVersion.E ? Roaming_MetLocation_RSE : Roaming_MetLocation_FRLG; + return table.Contains(met); } + + protected override void SetMetData(PKM pk, int level, DateTime today) + { + pk.Met_Level = level; + pk.Met_Location = !Roaming ? Location : (Version <= GameVersion.E ? Roaming_MetLocation_RSE : Roaming_MetLocation_FRLG)[0]; + } + + private static readonly int[] Roaming_MetLocation_FRLG = + { + // Route 1-25 encounter is possible either in grass or on water + 101,102,103,104,105,106,107,108,109,110, + 111,112,113,114,115,116,117,118,119,120, + 121,122,123,124,125 + }; + + private static readonly int[] Roaming_MetLocation_RSE = + { + // Roaming encounter is possible in tall grass and on water + // Route 101-138 + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, + }; } } diff --git a/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStaticShadow.cs b/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStaticShadow.cs index 350e7db1c..71421700d 100644 --- a/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStaticShadow.cs +++ b/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStaticShadow.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; namespace PKHeX.Core { @@ -24,5 +25,30 @@ public sealed class EncounterStaticShadow : EncounterStatic3 public EncounterStaticShadow(TeamLock[] locks) => Locks = locks; public EncounterStaticShadow() => Locks = Array.Empty(); + + private static readonly int[] MirorBXDLocations = + { + 090, // Rock + 091, // Oasis + 092, // Cave + 113, // Pyrite Town + 059, // Realgam Tower + }; + + protected override bool IsMatchLocation(PKM pkm) + { + if (pkm.Format != 3) + return true; // transfer location verified later + + var met = pkm.Met_Location; + if (Version == GameVersion.XD) + { + if (met == Location) + return true; + return MirorBXDLocations.Contains(met); + } + + return met == Location; + } } -} \ No newline at end of file +} diff --git a/PKHeX.Core/Legality/Encounters/Generator/EncounterGenerator.cs b/PKHeX.Core/Legality/Encounters/Generator/EncounterGenerator.cs index f5b2291d9..7f5faf8ec 100644 --- a/PKHeX.Core/Legality/Encounters/Generator/EncounterGenerator.cs +++ b/PKHeX.Core/Legality/Encounters/Generator/EncounterGenerator.cs @@ -306,16 +306,10 @@ private static IEnumerable GenerateRawEncounters(PKM pkm) { yield return z; ++ctr; } if (ctr != 0) yield break; - if (EncounterArea6XYFriendSafari.WasFriendSafari(pkm)) - { - foreach (var z in EncounterArea6XYFriendSafari.GetValidSafariEncounters(pkm)) - { yield return z; ++ctr; } - if (ctr != 0) yield break; - } - foreach (var z in GetValidWildEncounters(pkm, chain)) { yield return z; ++ctr; } if (ctr != 0) yield break; + foreach (var z in GetValidEncounterTrades(pkm, chain)) { yield return z; ++ctr; } } diff --git a/PKHeX.Core/Legality/Encounters/Generator/EncounterMovesetGenerator.cs b/PKHeX.Core/Legality/Encounters/Generator/EncounterMovesetGenerator.cs index 0f0200c5b..6d4de1686 100644 --- a/PKHeX.Core/Legality/Encounters/Generator/EncounterMovesetGenerator.cs +++ b/PKHeX.Core/Legality/Encounters/Generator/EncounterMovesetGenerator.cs @@ -310,14 +310,11 @@ private static bool IsUnobtainable(this EncounterSlot slot, ITrainerID pk) switch (slot.Generation) { case 2: - if ((slot.Type & SlotType.Safari) != 0) // Safari Zone is unavailable in Gen 2. - return true; - - if ((slot.Type & SlotType.Headbutt) != 0) // Unreachable Headbutt Trees. + if (slot.Area.Type == SlotType.Headbutt) // Unreachable Headbutt Trees. return Encounters2.GetGSCHeadbuttAvailability(slot, pk.TID) != TreeEncounterAvailable.ValidTree; break; case 4: - if (slot.Location == 193 && slot.Type == SlotType.Surf) // Johto Route 45 surfing encounter. Unreachable Water tiles. + if (slot.Location == 193 && slot.Area.Type == SlotType.Surf) // Johto Route 45 surfing encounter. Unreachable Water tiles. return true; break; } diff --git a/PKHeX.Core/Legality/Encounters/Generator/EncounterSlotGenerator.cs b/PKHeX.Core/Legality/Encounters/Generator/EncounterSlotGenerator.cs index 048edba32..0472b191d 100644 --- a/PKHeX.Core/Legality/Encounters/Generator/EncounterSlotGenerator.cs +++ b/PKHeX.Core/Legality/Encounters/Generator/EncounterSlotGenerator.cs @@ -24,7 +24,7 @@ public static IEnumerable GetPossible(PKM pkm, IReadOnlyList GetRawEncounterSlots(PKM pkm, IReadOnlyList chain, GameVersion gameSource) { - if (pkm.Egg_Location != 0) + if (pkm.Egg_Location != 0 || pkm.IsEgg) yield break; var possibleAreas = GetEncounterAreas(pkm, gameSource); @@ -61,39 +61,36 @@ public static IEnumerable GetValidWildEncounters(PKM pkm, IReadOn var s = GetRawEncounterSlots(pkm, chain, gameSource); - bool IsSafariBall = pkm.Ball == (int)Ball.Safari; - bool IsSportBall = pkm.Ball == (int)Ball.Sport; bool IsHidden = pkm.AbilityNumber == 4; // hidden Ability int species = pkm.Species; - return s.DeferByBoolean(slot => slot.IsDeferred(species, pkm, IsSafariBall, IsSportBall, IsHidden)); // non-deferred first + return s.DeferByBoolean(slot => slot.IsDeferred(species, pkm, IsHidden)); // non-deferred first } public static bool IsDeferred3(this EncounterSlot slot, int currentSpecies, PKM pkm, bool IsSafariBall) { return slot.IsDeferredWurmple(currentSpecies, pkm) - || slot.IsDeferredSafari(IsSafariBall); + || slot.IsDeferredSafari3(IsSafariBall); } public static bool IsDeferred4(this EncounterSlot slot, int currentSpecies, PKM pkm, bool IsSafariBall, bool IsSportBall) { return slot.IsDeferredWurmple(currentSpecies, pkm) - || slot.IsDeferredSafari(IsSafariBall) + || slot.IsDeferredSafari4(IsSafariBall) || slot.IsDeferredSport(IsSportBall); } - private static bool IsDeferred(this EncounterSlot slot, int currentSpecies, PKM pkm, bool IsSafariBall, bool IsSportBall, bool IsHidden) + private static bool IsDeferred(this EncounterSlot slot, int currentSpecies, PKM pkm, bool IsHidden) { return slot.IsDeferredWurmple(currentSpecies, pkm) - || slot.IsDeferredHiddenAbility(IsHidden) - || slot.IsDeferredSafari(IsSafariBall) - || slot.IsDeferredSport(IsSportBall); + || slot.IsDeferredHiddenAbility(IsHidden); } private static bool IsDeferredWurmple(this IEncounterable slot, int currentSpecies, PKM pkm) => slot.Species == (int)Species.Wurmple && currentSpecies != (int)Species.Wurmple && !WurmpleUtil.IsWurmpleEvoValid(pkm); - private static bool IsDeferredSafari(this EncounterSlot slot, bool IsSafariBall) => IsSafariBall != ((slot.Type & SlotType.Safari) != 0); - private static bool IsDeferredSport(this EncounterSlot slot, bool IsSportBall) => IsSportBall != ((slot.Type & SlotType.BugContest) != 0); - private static bool IsDeferredHiddenAbility(this EncounterSlot slot, bool IsHidden) => IsHidden != slot.IsHiddenAbilitySlot(); + private static bool IsDeferredSafari3(this ILocation slot, bool IsSafariBall) => IsSafariBall != Locations.IsSafariZoneLocation3(slot.Location); + private static bool IsDeferredSafari4(this ILocation slot, bool IsSafariBall) => IsSafariBall != Locations.IsSafariZoneLocation4(slot.Location); + private static bool IsDeferredSport(this ILocation slot, bool IsSportBall) => IsSportBall != (slot.Location == Locations.BugCatchingContest4); + private static bool IsDeferredHiddenAbility(this EncounterSlot slot, bool IsHidden) => IsHidden && !slot.IsHiddenAbilitySlot(); private static IEnumerable GetValidEncounterSlots(PKM pkm, EncounterArea loc, IReadOnlyList chain) { @@ -125,20 +122,13 @@ private static IEnumerable GetEncounterAreas(PKM pkm, GameVersion private static bool IsHiddenAbilitySlot(this EncounterSlot slot) { - return (slot is EncounterSlot6AO ao && ao.DexNav) || slot.Type == SlotType.FriendSafari || slot.Type == SlotType.Horde || slot.Type == SlotType.SOS; + return (slot is EncounterSlot6AO ao && ao.CanDexNav) || slot.Area.Type == SlotType.FriendSafari || slot.Area.Type == SlotType.Horde || slot.Area.Type == SlotType.SOS; } - internal static EncounterArea? GetCaptureLocation(PKM pkm) + internal static EncounterSlot? GetCaptureLocation(PKM pkm) { var chain = EvolutionChain.GetValidPreEvolutions(pkm, maxLevel: 100, skipChecks: true); - return (from area in GetEncounterSlots(pkm) - let slots = GetValidEncounterSlots(pkm, area, chain).ToArray() - where slots.Length != 0 - select new EncounterAreaFake - { - Location = area.Location, - Slots = slots, - }).OrderBy(area => area.Slots.Min(x => x.LevelMin)).FirstOrDefault(); + return GetPossible(pkm, chain).OrderBy(z => z.LevelMin).FirstOrDefault(); } private static IEnumerable GetEncounterTable(PKM pkm, GameVersion gameSource = GameVersion.Any) diff --git a/PKHeX.Core/Legality/Encounters/Information/EncounterLearn.cs b/PKHeX.Core/Legality/Encounters/Information/EncounterLearn.cs index 87d3c116f..82e827ed7 100644 --- a/PKHeX.Core/Legality/Encounters/Information/EncounterLearn.cs +++ b/PKHeX.Core/Legality/Encounters/Information/EncounterLearn.cs @@ -138,21 +138,11 @@ private static IEnumerable GetSummaries(IEncounterable item) { switch (item) { - case EncounterSlot s: - var type = s.Type; - if (type == 0) - { - yield return new EncounterSummary(item); - break; - } - for (int i = 0; i < sizeof(SlotType) * 8; i++) - { - var flag = (SlotType)(1 << i); - if ((type & flag) != 0) - yield return new EncounterSummary(item, flag.ToString()); - } - + case EncounterSlot s when s.Area.Type != 0: + { + yield return new EncounterSummary(item, s.Area.Type.ToString()); break; + } default: yield return new EncounterSummary(item); diff --git a/PKHeX.Core/Legality/Encounters/Information/EncounterSuggestion.cs b/PKHeX.Core/Legality/Encounters/Information/EncounterSuggestion.cs index f9abc76c6..d7d0d84d9 100644 --- a/PKHeX.Core/Legality/Encounters/Information/EncounterSuggestion.cs +++ b/PKHeX.Core/Legality/Encounters/Information/EncounterSuggestion.cs @@ -63,11 +63,9 @@ public static int GetSuggestedEncounterEggLocationEgg(PKM pkm, bool traded = fal } } - private static EncounterSuggestionData GetSuggestedEncounterWild(PKM pkm, EncounterArea area, int loc = -1) + private static EncounterSuggestionData GetSuggestedEncounterWild(PKM pkm, EncounterSlot first, int loc = -1) { - var slots = area.Slots.OrderBy(s => s.LevelMin); - var first = slots.First(); - var met = loc != -1 ? loc : area.Location; + var met = loc != -1 ? loc : first.Location; return new EncounterSuggestionData(pkm, first, met); } diff --git a/PKHeX.Core/Legality/Encounters/Verifiers/EncounterVerifier.cs b/PKHeX.Core/Legality/Encounters/Verifiers/EncounterVerifier.cs index 0bc738e49..3880402f1 100644 --- a/PKHeX.Core/Legality/Encounters/Verifiers/EncounterVerifier.cs +++ b/PKHeX.Core/Legality/Encounters/Verifiers/EncounterVerifier.cs @@ -56,15 +56,6 @@ private static CheckResult VerifyEncounterG12(PKM pkm, LegalInfo info) // Gen2 Wild Encounters private static CheckResult VerifyWildEncounterGen2(PKM pkm, EncounterSlot2 encounter) { - switch (encounter.Type) - { - // Fishing in the beta gen 2 Safari Zone - case SlotType.Old_Rod_Safari: - case SlotType.Good_Rod_Safari: - case SlotType.Super_Rod_Safari: - return new CheckResult(Severity.Invalid, LG2InvalidTileSafari, CheckIdentifier.Encounter); - } - if (encounter.Version == GameVersion.C) return VerifyWildEncounterCrystal(pkm, encounter); @@ -73,10 +64,9 @@ private static CheckResult VerifyWildEncounterGen2(PKM pkm, EncounterSlot2 encou private static CheckResult VerifyWildEncounterCrystal(PKM pkm, EncounterSlot encounter) { - switch (encounter.Type) + switch (encounter.Area.Type) { case SlotType.Headbutt: - case SlotType.Headbutt_Special: return VerifyWildEncounterCrystalHeadbutt(pkm, encounter); case SlotType.Old_Rod: @@ -261,7 +251,7 @@ private static CheckResult VerifyEncounterWild(EncounterSlot slot) switch (slot.Generation) { case 4: - if (slot.Location == 193 && slot.Type == SlotType.Surf) // surfing in Johto Route 45 + if (slot.Location == 193 && slot.Area.Type == SlotType.Surf) // surfing in Johto Route 45 return new CheckResult(Severity.Invalid, LG4InvalidTileR45Surf, CheckIdentifier.Encounter); break; } diff --git a/PKHeX.Core/Legality/Encounters/Verifiers/VerifyRelearnMoves.cs b/PKHeX.Core/Legality/Encounters/Verifiers/VerifyRelearnMoves.cs index a3a376b9a..10fa087dd 100644 --- a/PKHeX.Core/Legality/Encounters/Verifiers/VerifyRelearnMoves.cs +++ b/PKHeX.Core/Legality/Encounters/Verifiers/VerifyRelearnMoves.cs @@ -22,7 +22,7 @@ public static CheckResult[] VerifyRelearn(PKM pkm, LegalInfo info) { IRelearn s when s.Relearn.Count > 0 => VerifyRelearnSpecifiedMoveset(pkm, info, s.Relearn), EncounterEgg e => VerifyRelearnEggBase(pkm, info, e), - EncounterSlot6AO z when pkm.RelearnMove1 != 0 && z.DexNav => VerifyRelearnDexNav(pkm, info), + EncounterSlot6AO z when pkm.RelearnMove1 != 0 && z.CanDexNav => VerifyRelearnDexNav(pkm, info), _ => VerifyRelearnNone(pkm, info) }; } diff --git a/PKHeX.Core/Legality/Enums/SlotType.cs b/PKHeX.Core/Legality/Enums/SlotType.cs index 91f8c9d81..00eaf9ec2 100644 --- a/PKHeX.Core/Legality/Enums/SlotType.cs +++ b/PKHeX.Core/Legality/Enums/SlotType.cs @@ -8,7 +8,7 @@ namespace PKHeX.Core /// /// Different from , this corresponds to the method that the may be encountered. [Flags] - public enum SlotType + public enum SlotType : byte { /// /// Default (un-assigned) encounter slot type. @@ -18,125 +18,77 @@ public enum SlotType /// /// Slot is encountered via Grass. /// - Grass = 1 << 00, + Grass = 1, /// /// Slot is encountered via Surfing. /// - Surf = 1 << 01, + Surf = 2, /// /// Slot is encountered via Old Rod (Fishing). /// - Old_Rod = 1 << 02, + Old_Rod = 3, /// /// Slot is encountered via Good Rod (Fishing). /// - Good_Rod = 1 << 03, + Good_Rod = 4, /// /// Slot is encountered via Super Rod (Fishing). /// - Super_Rod = 1 << 04, + Super_Rod = 5, /// /// Slot is encountered via Rock Smash. /// - Rock_Smash = 1 << 05, - - /// - /// Slot is encountered via a Horde. - /// - Horde = 1 << 06, - - /// - /// Slot is encountered via the Friend Safari. - /// - FriendSafari = 1 << 07, - - /// - /// Slot is encountered through special means. Used to signify special slots for Gen2, sometimes for later follow-up). - /// - Special = 1 << 08, - - /// - /// Slot is encountered via SOS signal. - /// - SOS = 1 << 09, - - /// - /// Slot is encountered in a Swarm. - /// - Swarm = 1 << 10, + Rock_Smash = 6, /// /// Slot is encountered via Headbutt. /// - Headbutt = 1 << 11, - - Headbutt_Special = Headbutt | Special, - - /// - /// Slot is encountered via the Poké Radar. - /// - Pokeradar = 1 << 12, + Headbutt = 7, /// /// Slot is encountered via a Honey Tree. /// - HoneyTree = 1 << 13, - - /// - /// Slot is encountered via a Hidden Grotto. - /// - HiddenGrotto = 1 << 14, + HoneyTree = 8, /// /// Slot is encountered via the Bug Catching Contest. /// - BugContest = 1 << 15, + BugContest = 9, - /// - /// Slot is encountered via the Go Park. - /// - GoPark = 1 << 16, + HiddenGrotto = 10, + GoPark = 11, + FriendSafari = 12, + Horde = 13, + // Pokeradar = 14, + SOS = 15, + // always used as a modifier to another slot type - /// - /// Slot is encountered in the Safari Zone. - /// - Safari = 1 << 30, // always used as a modifier to another slot type - - Grass_Safari = Grass | Safari, - Surf_Safari = Surf | Safari, - Old_Rod_Safari = Old_Rod | Safari, - Good_Rod_Safari = Good_Rod | Safari, - Super_Rod_Safari = Super_Rod | Safari, - Rock_Smash_Safari = Rock_Smash | Safari, - Pokeradar_Safari = Pokeradar | Safari, + Swarm = 1 << 7, } public static partial class Extensions { - internal static bool IsSafariType(this SlotType t) => (t & SlotType.Safari) != 0; - internal static bool IsFishingRodType(this SlotType t) { - return (t & SlotType.Old_Rod) != 0 || (t & SlotType.Good_Rod) != 0 || (t & SlotType.Super_Rod) != 0; + t &= (SlotType)0xF; + return t == SlotType.Old_Rod || t == SlotType.Good_Rod || t == SlotType.Super_Rod; } internal static bool IsSweetScentType(this SlotType t) { - return !(t.IsFishingRodType() || (t & SlotType.Rock_Smash) != 0); - } + return t switch + { + SlotType.Grass => true, + SlotType.Surf => true, + SlotType.BugContest => true, - public static Ball GetBall(this SlotType t) - { - if (t == SlotType.BugContest) - return Ball.Sport; - if (t.IsSafariType()) - return Ball.Safari; - return Ball.Poke; + _ => false, + }; } } } diff --git a/PKHeX.Core/Legality/RNG/Frame/Frame.cs b/PKHeX.Core/Legality/RNG/Frame/Frame.cs index e8450e71b..fcb4ffb32 100644 --- a/PKHeX.Core/Legality/RNG/Frame/Frame.cs +++ b/PKHeX.Core/Legality/RNG/Frame/Frame.cs @@ -78,7 +78,7 @@ public Frame(uint seed, FrameType type, LeadRequired lead) { // Static and Magnet Pull do a slot search rather than slot mapping 0-99. return Lead != LeadRequired.StaticMagnet - ? SlotRange.GetSlot(slot.Type, RandESV, FrameType) + ? SlotRange.GetSlot(slot.Area.Type, RandESV, FrameType) : SlotRange.GetSlotStaticMagnet(slot, RandESV); } diff --git a/PKHeX.Core/Legality/RNG/Frame/SlotRange.cs b/PKHeX.Core/Legality/RNG/Frame/SlotRange.cs index 3840ffb17..2d4fc11f8 100644 --- a/PKHeX.Core/Legality/RNG/Frame/SlotRange.cs +++ b/PKHeX.Core/Legality/RNG/Frame/SlotRange.cs @@ -32,15 +32,10 @@ private static int HSlot(SlotType type, uint rand) return type switch { SlotType.Old_Rod => CalcSlot(ESV, H_OldRod), - SlotType.Old_Rod_Safari => CalcSlot(ESV, H_OldRod), SlotType.Good_Rod => CalcSlot(ESV, H_GoodRod), - SlotType.Good_Rod_Safari => CalcSlot(ESV, H_GoodRod), SlotType.Super_Rod => CalcSlot(ESV, H_SuperRod), - SlotType.Super_Rod_Safari => CalcSlot(ESV, H_SuperRod), SlotType.Rock_Smash => CalcSlot(ESV, H_Surf), - SlotType.Rock_Smash_Safari => CalcSlot(ESV, H_Surf), SlotType.Surf => CalcSlot(ESV, H_Surf), - SlotType.Surf_Safari => CalcSlot(ESV, H_Surf), SlotType.Swarm => (ESV < 50 ? 0 : -1), _ => CalcSlot(ESV, H_Regular) }; @@ -60,15 +55,7 @@ private static int KSlot(SlotType type, uint rand) return CalcSlot(ESV, K_SuperRod); case SlotType.BugContest: return CalcSlot(ESV, K_BCC); - case SlotType.Grass_Safari: - case SlotType.Surf_Safari: - case SlotType.Old_Rod_Safari: - case SlotType.Good_Rod_Safari: - case SlotType.Super_Rod_Safari: - case SlotType.Rock_Smash_Safari: - return 0; // (int)(rand % 10); /* Block Slot Priority not implemented */ case SlotType.Headbutt: - case SlotType.Headbutt_Special: return CalcSlot(ESV, K_Headbutt); default: return CalcSlot(ESV, H_Regular); @@ -143,7 +130,7 @@ public static int GetLevel(EncounterSlot slot, LeadRequired lead, uint lvlrand) public static bool GetIsEncounterable(EncounterSlot slot, FrameType frameType, int rand, LeadRequired lead) #pragma warning restore IDE0060, RCS1163 // Unused parameter. { - if (slot.Type.IsSweetScentType()) + if (slot.Area.Type.IsSweetScentType()) return true; return true; // todo //return GetCanEncounter(slot, frameType, rand, lead); @@ -153,27 +140,28 @@ public static bool GetIsEncounterable(EncounterSlot slot, FrameType frameType, i public static bool GetCanEncounter(EncounterSlot slot, FrameType frameType, int rand, LeadRequired lead) { int proc = frameType == FrameType.MethodJ ? rand / 656 : rand % 100; - if ((slot.Type & SlotType.Rock_Smash) != 0) + var stype = slot.Area.Type; + if (stype == SlotType.Rock_Smash) return proc < 60; if (frameType == FrameType.MethodH) return true; // fishing encounters are disjointed by the hooked message. // fishing - if ((slot.Type & SlotType.Old_Rod) != 0) + if (stype == SlotType.Old_Rod) { if (proc < 25) return true; if (proc < 50) return lead == LeadRequired.None; } - else if ((slot.Type & SlotType.Good_Rod) != 0) + else if (stype == SlotType.Good_Rod) { if (proc < 50) return true; if (proc < 75 && lead == LeadRequired.None) return lead == LeadRequired.None; } - else if ((slot.Type & SlotType.Super_Rod) != 0) + else if (stype == SlotType.Super_Rod) { if (proc < 75) return true; diff --git a/PKHeX.Core/Legality/RNG/PIDGenerator.cs b/PKHeX.Core/Legality/RNG/PIDGenerator.cs index 8c90dd6dd..3a6e1e156 100644 --- a/PKHeX.Core/Legality/RNG/PIDGenerator.cs +++ b/PKHeX.Core/Legality/RNG/PIDGenerator.cs @@ -401,16 +401,7 @@ private static void SetRandomWildPID(PKM pk, int nature, int ability, int gender private static void SetRandomIVs(PKM pk) { - var rng = Util.Rand; - pk.IVs = new[] - { - rng.Next(32), - rng.Next(32), - rng.Next(32), - rng.Next(32), - rng.Next(32), - rng.Next(32), - }; + pk.IVs = pk.SetRandomIVs(); } } } diff --git a/PKHeX.Core/Legality/Tables/Locations.cs b/PKHeX.Core/Legality/Tables/Locations.cs index 49d4aae9d..51a306b69 100644 --- a/PKHeX.Core/Legality/Tables/Locations.cs +++ b/PKHeX.Core/Legality/Tables/Locations.cs @@ -71,6 +71,8 @@ public static class Locations /// Generation 4 -> Generation 5 Transfer Location (Crown Beast - Event activated in Gen 5) public const int Transfer4_CrownUsed = 30013; + public const int BugCatchingContest4 = 207; + public static int TradedEggLocationNPC(int gen) { return gen switch @@ -98,6 +100,11 @@ public static int TradedEggLocation(int gen) public static bool IsPtHGSSLocationEgg(int location) => 2010 < location && location < 3000; public static bool IsEventLocation5(int location) => 40000 < location && location < 50000; - public static bool IsSafariZoneLocation4(int loc) => loc == 52 || loc == 202; + private const int SafariLocation_RSE = 57; + private const int SafariLocation_FRLG = 136; + private const int SafariLocation_HGSS = 202; + private const int MarshLocation_DPPt = 52; + public static bool IsSafariZoneLocation3(int loc) => loc == SafariLocation_RSE || loc == SafariLocation_FRLG; + public static bool IsSafariZoneLocation4(int loc) => loc == MarshLocation_DPPt || loc == SafariLocation_HGSS; } } diff --git a/PKHeX.Core/Legality/Verifiers/AbilityVerifier.cs b/PKHeX.Core/Legality/Verifiers/AbilityVerifier.cs index 0aedef349..56156b4f5 100644 --- a/PKHeX.Core/Legality/Verifiers/AbilityVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/AbilityVerifier.cs @@ -37,11 +37,12 @@ private CheckResult VerifyAbility(LegalityAnalysis data) if (abilval < 0) return GetInvalid(LAbilityUnexpected); - if (data.EncounterMatch is MysteryGift g && g.Format >= 4) - return VerifyAbilityMG(data, abilities, g.AbilityType); + var enc = data.EncounterMatch; + if (enc is MysteryGift g && g.Format >= 4) + return VerifyAbilityMG(data, g, abilities); if (pkm.Format < 6) - return VerifyAbility345(data, abilities, abilval); + return VerifyAbility345(data, enc, abilities, abilval); // Check AbilityNumber is a single set bit var num = pkm.AbilityNumber; @@ -58,8 +59,8 @@ private CheckResult VerifyAbility(LegalityAnalysis data) private CheckResult VerifyAbility(LegalityAnalysis data, IReadOnlyList abilities, int abilnum) { - var EncounterMatch = data.EncounterMatch; - var eabil = GetEncounterFixedAbilityNumber(EncounterMatch); + var enc = data.EncounterMatch; + var eabil = GetEncounterFixedAbilityNumber(enc); if (eabil >= 0) { if ((data.pkm.AbilityNumber == 4) != (eabil == 4)) @@ -71,15 +72,15 @@ private CheckResult VerifyAbility(LegalityAnalysis data, IReadOnlyList abil var gen = data.Info.Generation; return gen switch { - 5 => VerifyAbility5(data, abilities), - 6 => VerifyAbility6(data), - 7 => VerifyAbility7(data), - 8 => VerifyAbility8(data), + 5 => VerifyAbility5(data, enc, abilities), + 6 => VerifyAbility6(data, enc), + 7 => VerifyAbility7(data, enc), + 8 => VerifyAbility8(data, enc), _ => CheckMatch(data.pkm, abilities, gen, AbilityState.CanMismatch) }; } - private CheckResult VerifyAbility345(LegalityAnalysis data, IReadOnlyList abilities, int abilnum) + private CheckResult VerifyAbility345(LegalityAnalysis data, IEncounterable enc, IReadOnlyList abilities, int abilnum) { var pkm = data.pkm; var state = AbilityState.MustMatch; @@ -98,7 +99,7 @@ private CheckResult VerifyAbility345(LegalityAnalysis data, IReadOnlyList a int gen = data.Info.Generation; if (gen == 5) - return VerifyAbility5(data, abilities); + return VerifyAbility5(data, enc, abilities); return CheckMatch(pkm, abilities, gen, state); } @@ -188,29 +189,30 @@ private AbilityState VerifyAbilityGen3Transfer(LegalityAnalysis data, IReadOnlyL return AbilityState.CanMismatch; } - private CheckResult VerifyAbilityMG(LegalityAnalysis data, IReadOnlyList abilities, int cardtype) + private CheckResult VerifyAbilityMG(LegalityAnalysis data, MysteryGift g, IReadOnlyList abilities) { - if (data.EncounterMatch is PCD d) + if (g is PCD d) return VerifyAbilityPCD(data, abilities, d); var pkm = data.pkm; - if (data.EncounterMatch is PGT) // Ranger Manaphy + if (g is PGT) // Ranger Manaphy return (pkm.Format >= 6 ? (pkm.AbilityNumber == 1) : (pkm.AbilityNumber < 4)) ? VALID : GetInvalid(LAbilityMismatchGift); - int abilNumber = pkm.AbilityNumber; - if (cardtype == 4) // 1/2/H + var cardType = g.AbilityType; + if (cardType == 4) // 1/2/H return VALID; - if (cardtype == 3) // 1/2 + int abilNumber = pkm.AbilityNumber; + if (cardType == 3) // 1/2 return abilNumber == 4 ? GetInvalid(LAbilityMismatchGift) : VALID; // Only remaining matches are fixed index abilities - int cardAbilIndex = 1 << cardtype; + int cardAbilIndex = 1 << cardType; if (abilNumber == cardAbilIndex) return VALID; // Can still match if the ability was changed via ability capsule... // However, it can't change to/from Hidden Abilities. - if (abilNumber == 4 || cardtype == 2) + if (abilNumber == 4 || cardType == 2) return GetInvalid(LAbilityHiddenFail); // Ability can be flipped 0/1 if Ability Capsule is available, is not Hidden Ability, and Abilities are different. @@ -243,14 +245,14 @@ private CheckResult VerifyAbilityPCD(LegalityAnalysis data, IReadOnlyList a return pkm.Ability == pcd.Gift.PK.Ability ? VALID : INVALID; } - private CheckResult VerifyAbility5(LegalityAnalysis data, IReadOnlyList abilities) + private CheckResult VerifyAbility5(LegalityAnalysis data, IEncounterable enc, IReadOnlyList abilities) { var pkm = data.pkm; - switch (data.EncounterMatch) + switch (enc) { case EncounterSlot w: // Hidden Abilities for Wild Encounters are only available at a Hidden Grotto - bool grotto = w.Type == SlotType.HiddenGrotto; + bool grotto = w.Area.Type == SlotType.HiddenGrotto; if (pkm.AbilityNumber == 4 ^ grotto) return GetInvalid(grotto ? LAbilityMismatchGrotto : LAbilityHiddenFail); break; @@ -265,17 +267,16 @@ private CheckResult VerifyAbility5(LegalityAnalysis data, IReadOnlyList abi return CheckMatch(data.pkm, abilities, 5, state); } - private CheckResult VerifyAbility6(LegalityAnalysis data) + private CheckResult VerifyAbility6(LegalityAnalysis data, IEncounterable enc) { var pkm = data.pkm; if (pkm.AbilityNumber != 4) return VALID; // hidden abilities - var EncounterMatch = data.EncounterMatch; - if (EncounterMatch is EncounterSlot slot) + if (enc is EncounterSlot slot) { - bool valid = (slot is EncounterSlot6AO ao && ao.DexNav) || slot.Type == SlotType.FriendSafari || slot.Type == SlotType.Horde; + bool valid = (slot is EncounterSlot6AO ao && ao.CanDexNav) || slot.Area.Type == SlotType.FriendSafari || slot.Area.Type == SlotType.Horde; if (!valid) return GetInvalid(LAbilityMismatchHordeSafari); } @@ -285,13 +286,12 @@ private CheckResult VerifyAbility6(LegalityAnalysis data) return VALID; } - private CheckResult VerifyAbility7(LegalityAnalysis data) + private CheckResult VerifyAbility7(LegalityAnalysis data, IEncounterable enc) { var pkm = data.pkm; - var EncounterMatch = data.EncounterMatch; - if (EncounterMatch is EncounterSlot slot && pkm.AbilityNumber == 4) + if (enc is EncounterSlot slot && pkm.AbilityNumber == 4) { - bool valid = slot.Type == SlotType.SOS; + bool valid = slot.Area.Type == SlotType.SOS; if (!valid) return GetInvalid(LAbilityMismatchSOS); } @@ -301,11 +301,10 @@ private CheckResult VerifyAbility7(LegalityAnalysis data) return VALID; } - private CheckResult VerifyAbility8(LegalityAnalysis data) + private CheckResult VerifyAbility8(LegalityAnalysis data, IEncounterable enc) { var pkm = data.pkm; - var EncounterMatch = data.EncounterMatch; - if (EncounterMatch is EncounterSlot && pkm.AbilityNumber == 4) + if (enc is EncounterSlot && pkm.AbilityNumber == 4) return GetInvalid(LAbilityHiddenUnavailable); if (Legal.Ban_NoHidden8.Contains(pkm.SpecForm) && pkm.AbilityNumber == 4) return GetInvalid(LAbilityHiddenUnavailable); diff --git a/PKHeX.Core/Legality/Verifiers/BallVerifier.cs b/PKHeX.Core/Legality/Verifiers/BallVerifier.cs index 88dc89038..f31a87dec 100644 --- a/PKHeX.Core/Legality/Verifiers/BallVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/BallVerifier.cs @@ -74,20 +74,30 @@ private CheckResult VerifyBallStatic(LegalityAnalysis data, EncounterStatic s) return VerifyBallEquals(data, Legal.GetWildBalls(data.Info.Generation, data.Info.Game)); } + private static Ball GetRequiredBallValue(int gen, int loc) + { + return gen switch + { + // For Gen3 Safari Zones, we've already deferred partial match encounters. + 3 when Locations.IsSafariZoneLocation3(loc) => Safari, + + // For Gen4 Safari Zones and BCC, we've already deferred partial match encounters. + 4 when Locations.IsSafariZoneLocation4(loc) => Safari, + 4 when Locations.BugCatchingContest4 == loc => Sport, + + // Poké Pelago + 7 when loc == 30016 => Poke, + + _ => None, + }; + } + private CheckResult VerifyBallWild(LegalityAnalysis data, EncounterSlot w) { - if (w.Location == 30016 && w.Generation == 7) // Poké Pelago - return VerifyBallEquals(data, (int)Poke); // Pokeball + var req = BallExtensions.GetRequiredBallValueWild(w.Generation, w.Location); + if (req != None) + return VerifyBallEquals(data, (int) req); - var Info = data.Info; - - // For gen3/4 Safari Zones and BCC getValidWildEncounters already filter to not return - // mixed possible encounters between safari, BCC and other encounters - // That means is the first encounter is not safari then there is no safari encounter in the array - if (3 <= Info.Generation && Info.Generation <= 4 && w.Type.IsSafariType()) - return VerifyBallEquals(data, (int)Safari); // Safari Ball - if (Info.Generation == 4 && w.Type == SlotType.BugContest) - return VerifyBallEquals(data, (int)Sport); // Sport Ball return VerifyBallEquals(data, Legal.GetWildBalls(data.Info.Generation, data.Info.Game)); } diff --git a/PKHeX.Core/Legality/Verifiers/EffortValueVerifier.cs b/PKHeX.Core/Legality/Verifiers/EffortValueVerifier.cs index fd3b28689..2fab2f4ab 100644 --- a/PKHeX.Core/Legality/Verifiers/EffortValueVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/EffortValueVerifier.cs @@ -71,7 +71,7 @@ private void VerifyAwakenedValues(LegalityAnalysis data, IAwakened awakened) var EncounterMatch = data.EncounterMatch; if (!awakened.AwakeningAllValid()) data.AddLine(GetInvalid(LAwakenedCap)); - if (EncounterMatch is EncounterSlot s && s.Type == SlotType.GoPark && Enumerable.Range(0, 6).Select(awakened.GetAV).Any(z => z < 2)) + if (EncounterMatch is EncounterSlot s && s.Area.Type == SlotType.GoPark && Enumerable.Range(0, 6).Select(awakened.GetAV).Any(z => z < 2)) data.AddLine(GetInvalid(string.Format(LAwakenedShouldBeValue, 2))); // go park transfers have 2 AVs for all stats. else if (awakened.AwakeningSum() == 0 && !EncounterMatch.IsWithinRange(pkm)) data.AddLine(Get(LAwakenedEXPIncreased, Severity.Fishy)); diff --git a/PKHeX.Core/Legality/Verifiers/FormVerifier.cs b/PKHeX.Core/Legality/Verifiers/FormVerifier.cs index 003fd23c2..7908a2cf8 100644 --- a/PKHeX.Core/Legality/Verifiers/FormVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/FormVerifier.cs @@ -42,7 +42,7 @@ private CheckResult VerifyForm(LegalityAnalysis data) if (!PersonalInfo.IsFormeWithinRange(form) && !FormConverter.IsValidOutOfBoundsForme(species, form, Info.Generation)) return GetInvalid(string.Format(LFormInvalidRange, count - 1, form)); - if (EncounterMatch is EncounterSlot w && w.Type == SlotType.FriendSafari) + if (EncounterMatch is EncounterSlot w && w.Area.Type == SlotType.FriendSafari) { VerifyFormFriendSafari(data); } diff --git a/PKHeX.Core/Legality/Verifiers/IndividualValueVerifier.cs b/PKHeX.Core/Legality/Verifiers/IndividualValueVerifier.cs index 7721e5baf..aa3283c10 100644 --- a/PKHeX.Core/Legality/Verifiers/IndividualValueVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/IndividualValueVerifier.cs @@ -94,7 +94,7 @@ private void VerifyIVsGen6(LegalityAnalysis data, EncounterSlot w) var pkm = data.pkm; if (pkm.XY && PersonalTable.XY[data.EncounterMatch.Species].IsEggGroup(15)) // Undiscovered VerifyIVsFlawless(data, 3); - else if (w.Type == SlotType.FriendSafari) + else if (w.Area.Type == SlotType.FriendSafari) VerifyIVsFlawless(data, 2); } diff --git a/PKHeX.Core/Legality/Verifiers/PIDVerifier.cs b/PKHeX.Core/Legality/Verifiers/PIDVerifier.cs index 2e076c651..d9e3cd963 100644 --- a/PKHeX.Core/Legality/Verifiers/PIDVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/PIDVerifier.cs @@ -57,9 +57,9 @@ private void VerifyShiny(LegalityAnalysis data) break; case EncounterSlot w: - if (pkm.IsShiny && w.Type == SlotType.HiddenGrotto) + if (pkm.IsShiny && w.Area.Type == SlotType.HiddenGrotto) data.AddLine(GetInvalid(LG5PIDShinyGrotto, CheckIdentifier.Shiny)); - if (Info.Generation == 5 && w.Type != SlotType.HiddenGrotto) + if (Info.Generation == 5 && w.Area.Type != SlotType.HiddenGrotto) VerifyG5PID_IDCorrelation(data); break; diff --git a/PKHeX.Core/PKHeX.Core.csproj b/PKHeX.Core/PKHeX.Core.csproj index 61d793743..133d8b82a 100644 --- a/PKHeX.Core/PKHeX.Core.csproj +++ b/PKHeX.Core/PKHeX.Core.csproj @@ -31,47 +31,36 @@ - - - - - + - - - - - - - @@ -856,47 +845,36 @@ - - - - - + - - - - - - - diff --git a/PKHeX.Core/Resources/byte/encounter_a.pkl b/PKHeX.Core/Resources/byte/encounter_a.pkl index f7b359e185a3f0d0a062227e9ca4ccf41b0f68e6..45ac6db12ce785428c6540efd73c715720848992 100644 GIT binary patch delta 4042 zcmZvdeN0=|8OD#fmoH-sX6D-%<6NjQjFE;B$GIUNrIZ-TmX5Y7p|lWp?Gi#h#y-lt zU^1^;kwx1aRA~`^Y|>@ZswnCzRAmT7T7;q~vQQLRQ4}FmA%r4?q7I=cLnzvF?s*~B zv_F2F_j%9zzW2HJ;(NaQYnriW8SOvkuym@7ZGx$E##%ENTL+VwjOkg7t$=toV@+1Z z7C|hBv3eV0Nf60pOtUkV0K<8Vx$+sC2ZIjAoCS={f$(=2vpE@?0lkHcsYQ%k1Kq`p zZ5OjqW|T12SqcMSstg9oVE|0JV4wm9K->)jl`sHe9vG;C0TA)Rz#bR?!x{`!!vGkp zfq@rb0EB%oPzwW~*AD}AFaWyiVW57LG2^>1&;SEq>U%KI2m@epFATg010cQ+2AW_1 z#J&#$%`gBW`(Ype17P?73+<2*BiJv7zS~W04qRy69z#9OoAkE{undB zAc%o^un1glVFnlmagYEjZ{huGJs1KaU=k$3I;cO1Cjnw$3M_(6(A0~k1>(Q}D_|Sw zZ{v}INpKCU1GNt`KrfgAGhh?g-oXqIen-521an{;IN!w(FbJ-Jd7$>gJ?I6)Uno1kg*JvaezV1N~{4fLO2D3}CEuny|q z#}E($Q(zHnf~F5(48%bKtN`t&Fa{!E4kUr|G-iN75CikzP4x`!4)lUyFar|6Hi#i0 z3?g6-B*8kUKMNzE7fgW}kN~zJ^nmM(@&2?i{zTD~uMt;SWqbqi33ZIyD?OR7TYSFR zl)76KUmDVsdFoln)RfzZ_hyapo7tLjhw|=|p3EiY^Ch55bEcIAtPb1rx%Z&6bLBPf zBevMb_(Yzji14!M@!v|O&GpZv)5;3;AIqkdRji+t%bLfCKX%C(Ylz1xrj>Q9AG*c;Xv!1B7b?ei zhDTGrMciLC#-AbHKzw2k`n=C$am`KSk89J)zp);zmUEw)ef#)eO_w=y3wrMha!i&{udET-U@4N<~9d)(b+YnLIlsXZM(HWHMYtqbE9wlB6As#^r74;!jS1OrD5)hmLYqZ9;RrojJ-p=dDHpLT)w4CQn2|5{_}v;3pu zPJaEkrb08m)@8_Gt24?cUe#2e$j){fs$T@-JyGsHsVNYcb(XL8I?em47n`U14Al%m z15xoSlH%AYLv0Y-!LXq;ntkW^pWZ7le`h=T)AyxrmLBtKnbXw|^0p*{i>#?3G_pF#e%@fo9XhND03> z5|_0jzc$o%G4oRxN>aR)PAbo@MEa_RP%Wts^ z*1=q^4pvdo!QAc+R#_>yMfLMkKTrBL>D#35kiJ7YA+?%dxr{I6xcHMC55DB4DRn_4 z@7i?b9wqLH#A=R@ujM-N9hX)2Me?Ry<4g7u)f8gRLY_xS$_lLVW*?A#K>8u+hom2o zenfha^djjcsnsQM#gQT%pLuEF8a6cB{xLUs_8gTWYwlf zq*d!US@Nkf`Ym~RrdVs!abU?;rqMmu zkgk#11&!Z!RaFP`dOO&jJsnKb1lVVMAr#20Wd#L3x`Zz^>8GS$Bttzq&NKO%>S?21 zZ20?h7ZSLJ_-1%K&#&e6ng!MY9cLUWw@&Fw1GP4Y#70inRI}3Kx!Od zXuNqw*tXk)v>BvgU1}U=D7t!1$6+QPP74*ZQbDUI7{8z^ZB)=E3-&?(->21X=H=7N tO{=c%V1k;Ob{dR*^9vl>UCrAmhsHeF_hm|7C)IVz{u1cjx`vdx{{lHPoZkQd delta 3600 zcmcJRYfO_@7{{Nt0#>L{@Kss_?4;r=-ijh1R;+iVC>0%`fL1PAywTm+mDk;5o71jO zviM=y_@J8~mW@xFS(dC>mdy{#(k#nj7PAqvEM_rFvn(4i#_WII(-z9jY|B2JaNhs( zKhOD{^PF?ar5nodd!~USeQ%QAMASNq$d^V`mrmr#AgZ2C;XU{0DJ)03xFm7>;u4l06YkQW&pGRpcMcI0B{fh zZ2)Koz(5B84gugW0Q>+r0)S2cbOE3n06hRW3V>q(2mqiL0LKAv0sv^SlK?mcfYSiz z13(Y}4*}p|06YSKM*;8{03HXx69DK3z>@%Y3II*z_S2&4glB=66W%*L-2lW%grLp=S3iqHnk= zQ?62whniKs+pIy4@=tMHtlrZiyx;QKEa@G#IC-eW!NVs7mSJtuO-8vxfN4PInF5Pobe#^pT z^7*_>)(@i4cDYG6`LjIfj2X_Gd~DwM@1HqGmEXQL2m9O19BdP-{e?ePj3lT%Nb znf0WipPnw7k$R|2OnZwD&rhO-+bh`GZif6T&t4GE*)D9i`NIX$=E`^S6+`=tTk;b_ zRlc2X4R;7@43#ctm(6EvvTk#-zoUYK9U|>avEPkxy4}a!1>%&e?6zBZ*vL5{hK-T> zAN-fyzziQ%x$uxUDu1E^2`agNqekNXg)%Yt$IN$lU~#JX4krqH7qMQxQe;axEcYgj zxR)4VB8BzE`gps^G$zH*ypW>V8V@_3!NG4brHwh_H(N-d;>+TcnKF{maEY-Rp(KLl zNx{rXie-|LEtJz-S!z5SiL_RQgQanHZ0|^C1;;wgX?Uy@wk?$bkLF}YR|UJe?iYxp zjL=x`Qjsc8;ee*&6lQ13Q)$I-L2j;S*fi9%%MF)JVe7I>#-lLQjjDEQQuLSEIJ)dy zJfLx~TjYe>UnX*j6P}f|ToHdQmgS1YV&oj^7C8$PHZPYsM-8D^;o-R8>k$rz!mTT$ zBZj;8X^)t7u@YWsXyK#6^AA7Sw@TyaN>OH&J@E_>6dqhBMZH&Gxx@)O z&2Lwx{6Are%R8$6i(H8(r%D$GI$SLeZZ#gkYC}o<%$deXzV%Ly9yzE+PcrikuBmCG?MwY zN?)DAqg!?SKUY%XC8u+)X~_~ViB?*QvUZvfAKEr^JXB|6|8|)f_Sp7h=8HRK9_iVc zv?58kE-)iUs7|`;6|UYjuIuEq`gR^VC2m2d3DLp&l<0o1+$coECd9mf@n*dtY1Vcp xyU}>JL19Ouli%7SQy8Dp6p!3)Oh$sfWW=^N*^P{K15G+xPfJV;x9&@R{te3V<|P0C diff --git a/PKHeX.Core/Resources/byte/encounter_b.pkl b/PKHeX.Core/Resources/byte/encounter_b.pkl index 439993865b63e9f9f4dee4f39296870e496963ba..736deac19c07aa9e7f5f3fe054b8d38b5e13b2ef 100644 GIT binary patch literal 14744 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 z%0DFk_6hlC$-`+YG55>6-C%x6&Q04+nHS{u|C)TJ&bf&dKR&+eM@oM~9!=9pU)IVE zIQ})cfe3B-OY)5$qkEF))`Rw+kauilZ{t^J{xST5a}RCOR>c&HAESGc9HR&AKOyhf z%K5L*{A2iq?O(MLW@^us0iIebWeTw)%7h<tE+VyrvR8lxY+!53p5ETj7y{Mt&4n|9G01zEF}s7u>88fzVKG}by2)KPDaOU2Ze z?ji4$vYcmQYCYb-yPkXkyoa{PuDqb#+0e!tS-_T>BP@z?67t{VL${U-ie z{nSb)J!SZYeb{N!H|)p$6dS<)5B?DLudwadf5IQe-r_ofeHzQZ%Nc)+pMQ%pe#$lf k0%vT;^6zfObu9nFW*oz|VT;@s#13OSuwUZu#3s1@U#D?{vj6}9 literal 33832 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 A_y7O^ diff --git a/PKHeX.Core/Resources/byte/encounter_b2.pkl b/PKHeX.Core/Resources/byte/encounter_b2.pkl index bb9e1eeae9c2de2612ee6e5ea397a2f9483f3b24..68dfca7a44ef341f3538a1c703852a8c5a0f7f52 100644 GIT binary patch literal 20808 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 diff --git a/PKHeX.Core/Resources/byte/encounter_blue.pkl b/PKHeX.Core/Resources/byte/encounter_blue.pkl index 1ba7b481a6eda9a7585b8ebdaa153cfe8ae5614d..7950f31f68facb2f50f4de97298aa48aefc781ab 100644 GIT binary patch literal 3264 zcmb7`OK)4p702hk=aQ6o#mjri%Qr3YsaiHAnsNXaR&2;1qQfXO{Tfbz- zGMy;4ixQ~OJP@E+9)`4|YU3WF+ zb;Ah3x~8hS7Gu~D?E6BAJHj+Q#V{PzvOJBkZdr~YrDsZ6u{5nB4WnXP)+VegLLpBH zgz={Sz% zI88Y^+O!?#55I_go!38N=LpxGS6sKLj*ZQ0zVGP1-!x*el8LN%yeavc9gp7}vawiG ziN(^eC5;$#{%*wMY14H}7IQKhE!nZyEm&7Lj;A<|tB#JQwQ$(eM@G`b?wVs`9&B3j zZI6xJhF#xd*AKAk|HHnngFD!z#ptNVnWxoAWKFZ}!5V7@e$8lfu*RAUhu7?A^bWaw zSxa}Zn-|HXqXdDYCKAWBWOAN8A2(8|c{7!AtaSRE%w*2lx!hgs+QKmQ*V-0m`r1C7 zK4{;!g5ah7)*<%yUag->^$%J9oR!OsvHlqA-``{V3ULitVjRYr$qZuM&wfA+dmGXp`_ON}3y|3fv4f}N3x3k&pL+l?4)z~4gJKT#MYI{dxtTU!QcFcHuhaBw4@$ntI zT78K9!Mol21@^r|>>my9yXQFy`A~B?S4$)u-Sfr_a&Hz2_pD6jp3LR$*@eO*)*946 zn^@b#+9uXEv9^h|O{{HVZ4+yoSRWm-)`!EjG%Y*qL%N=&x4877tf8tNeaNG?6r`pV zY+e5l`|Z8n_>oXTX+e!B#iFOCQodF$_w{nwH_GLVS*!J}$w^<kd0+ji8E zk=M5P!1lBi3XMw38nLDP_<-$Wp~#TX^)UT0MBfdOudvRyVVa|+u8+_k1NIxxOP{dE z8tc>)%c`liy`VAHO|wRf3uY)ZW%11&9%r5X>;ipvm$mIF*cxojf|K~LZF`qxO#C$! zU-ZtJ9u5!KDf;d>@z*53?ETN&=V=j(P16IX>1)&6n`zx~ra9kf)AOdeH#0Juow4)z zK6yDq?^xhI)>PkL)g~rZ^-5*csMpVPCUvV;J1gt;8=MJj=#23F1tpoRaen*RvqQF8 zy&6(BS$W1xm-!-*C-Tj znaokUS7fPl+pbgwY-z|IIkLRRF6%IFu$9VfyHwiso6nc1w`FyF{DM{}JjU-8qguUX z@@tjL7v#jmZM$CIW#JU~J$6~o=LhTs*jv{4_+wcv57=iy$z{peA~~BPXB%1&3wW-@t^Tf_%c3I!QGh`EqT{f57Fw*HFduv#Q!j?>>p1xw~Ik3m6`3-v5 zuHRIuUN(?ku%IKP$M;ZYmK+&3~$XU@7XGE&CjuCc+Xb%*ahCnPdJ~e zBA4rOmOZsl=#ul6p2;lHhg$4+iL-o1$a3fqP4!Pew=s*^9)`1!$Af+QQ})o|jp`_#*WnyG^r?>Sx*hV^ zp%ymze`8bn{t9o@&#^0dV>L zzJ2NxY;af1&fZXFXRoWXvs>ES+%bJ_E@jNkWz4tU>RWHW-Iu3N_wBQ1VMBE>HT8RC zYU;8&HTAC6Xf*UjBZJ>Lv(Y$aHJd4U;zZv*apE)bc(AvBj{Q3OeTO^-YCImW-*@yx VVx2p6nfL25_b(-j#gsiU@n3X!dtLwl literal 1756 zcmb7?OKjsr9LA@9B+lgFaqO|<*TiY+Bu?41Nxcb3D_UBmio8UyRkoX=R4LhR)gpCw z+m%obQMU&l5huifBjSWOa73ICLVHA29N}Kp&t`7$8~i?h!jH92 zChKLcSFr+3g_EvNBA@+7=P&v1_@DV7xnH?Ixo@87^IBvzqMm0v?5o~(HuLl;06L3U znUxutL3D>WdHf|QmFb>7@rZ?t%*!0);e^`MVN_JQC+pY?9S^ z9VijR<0y*YC>D@_*&<(z76BBzs2B5uAmTv}20|t73Hd3F20{??U`vHv`kR;7NjpAIP9r5$$9JM3O`$TW4Nq0FM%G!~7f ziL7<94#YG{`;v)V1u4F4O0MXpT_DOxZc4t|RH>SF6<78ZAB-=k^l(q@X+61@?qzz) zzPhh(KTq}TG0pU@pyD)7vvh{BO`ZGJHh6|w=ZtIvW!%~Pr?VbTJ7<~((!z_AkabHU z5)dg3HDu89S@eA8R9CQy)3VZ0|yb)dxui`lpExR zHdV8Ad$ZVZ$^bfD(w%LS_N?o)$)VMDw~F^Eb!WS?UD77qDJ^cflxDj*H&4mzNoi~L zu&_1PE>oK8X1jTs&UPtn=MM`fl_lx0k9*EB-_Oz`ytUQN7d%Z-hW^JZu~^?yVfHEUXxB zSZ{^P;aUhF-o>{RJ)>*4v|VQ-zmYTM3;+!?7aF*r7Q%w+S@WT%&Z_{btC_&?=K95c zx$mu&%B6$(oAl3FH3HQu_e<4l{rQ_-xx995?Sh_rCv^S*DCwG9lWIy0)x;XEsWp2k Hy9E9Q!akI| diff --git a/PKHeX.Core/Resources/byte/encounter_crystal.pkl b/PKHeX.Core/Resources/byte/encounter_crystal.pkl index 6de85c4d27845080acf87c0f3eea4e35f43ff0f0..e1289b5b1bc2208e62033ae456de67f1c1b0a903 100644 GIT binary patch literal 19632 zcma)^TWl0pnt-dTtJ+P|H@n;I_66fh!0xs&#+d82!!4O{Y!XZY#F?1OFepnTvdd&x zg0h}n81cXZ4@lvG2Oh|{GeNUFkX@u8fp#)68j%sol38|>jI0sav3Af54~&GeJRoJi zbGo{Hs@$hwq%VojU;nA||L6bDtxnJ14jeJRT3{IW;4!2lhS3Yp!2}$KBHVykuofCd zH*AFoI1H!Y0$hdL@DQ?5!&nRBa12htdAI_%U=|)jTa0(X0XPXoxB@rfE6}47#xAKa0Twb zBWP(s4jW+{4#O$905{+sgcs3YFboIb6kLRxa1X+*$YB@`!fCh+x8VUK7vnP+hl6ko zPQwMb3b)}N7;VHC^usXhgOhL(uEH&tg~yO?r`=G1eQ*+ra06z+>cDsK92|g?P=p&W z3sxs}z%wui!>|vI!5O#+SK$`S!edB3!#iONj=)Jc2bbX{+=WLFUcz%Q28ZDcT!v5J z4%`Q8DZYn67>7wX57%J^9z#nP_Q3>9!g;t3Gw>Lq-8=)muo1@LFr0!5a0Bi^I7k1$ zFpR??I0@(B3fzJRkj~=|SPNrt5RSt+xDI#0=%JfnBaFcTn1r)%32wkWi1yMh*b0Z> zG+csPa37+}ki%9u1gGIVT!x!)7al>f4xDVDU-UWlO6%NB$D8f~^4fnuUP42*27>8qU z3eLk7xCOKD7+TigE0};uI1krh1|CDpTI4VRlW-c&!)3S$ci|Bv*O99*28ZD|oP|qp z17_eMq}S7a*Z~LN7@UEN@Ckeck0ARuv>(Rd7@UKPa2@WzeXt6&4|<^hV{j0T!#TJN zx8VUKhiD&+!C^Q9m*F-%faJ5tVI%B-LvRw#!xgv#4_XRyYKw;SyYj+i(wz&G-ZQVGIt#8Mq9$;Q=JKAcrwH z3}@gn+=d5`e2!d&LD&ihU=q$k5w5~*xCh4bybrpe06X9ioP_gm2|j_Z-~oicN8PXy z_Q7#D14XzFci=u)-zV1LIXD1E;1pbdt8g3cL3o&V!!R6#Q*aTk!Y!DE$B=%3zK1b5 z0%ze0+<{qm1j!NVf{ic^lW+k(fxBRg@(er!1=sES>+{Yx{Q z{y{LE4um!3A^W>Gc>b40clQqh-Q6#k-QE8Z?CuVPHRVRlcLRw;#J1~sZ9T88=e7SH z1Pg4MKszhXgd&muu7NPJ1rULS;u+HnG$#4y`vKETn!(`v!C)|DndUV+7`zq=22JY; z@^GMW3jGxNQ|PB0{VDXPgnp$BQ?&C#+W7(Pe1mqrK|9}&?NpwjowsP`E!z18?R zp+6<`4bv_Vp9SJ`i1@VJzA6Y`S&FX;_^N=f3i!lQeB~;4d{w|F1$=S>Uls6`<@jn| zdBqRz+IBK%+c8YMX503)5dVlt%IX`G~M0rN*tB}W*P!(H38e2jdTS6LJLK<5_6iK_;Kx&yZT zyjfFoEf@+VE&gposHP@NT=~k0t4|gE9Qsq}PoO^`^yPS!NKFUQSusb1-F+eFh_KQZ zVvZOl2ZzbQu+kTue{P1A_p57d#C1&z2UiMv~jh-3`9O+ z9{VVe$$Vti)qNDqX8&TP(|@runZJZGnFZDpmkdqgm8l}FNHWR4@?!J)Y;R2;E)NyZt(ig6BOlvWIT#7yQXHZ9SZFYg+dW*^p#_ykf+f9w3@!GKOD}<`orP9!EiVwMV}bR8JSF;7|5BKOgdO!KSB)bwHq4th8h~E-(OA)l=Y{p>3jMp zVwjO(r_V(GFuSX3tfOKMizt0|l>9kL{v0KLB1)gR%AGztO8y*m^5-4$C*t&(w|pUE zL<*nRa3PD5i;_m?nl|niz^1 zq3?bW*>5Bg{}o6i3?oh+MeuQqv2G#rPCQssBj%kx#(_S@fjD{OD<_Y7(Cj|zYayCb<*cPa>wUW=&!D(&$zyt zy~%3!CTqyaI=9bdeAX#GSL3iw@wuy96Q6aO_^hk=O20Qzp3(YT_^OTgS`>&ze@%S- zIv9^9t$4f~pTbwZa(v~LPbvB-rT!00>JG+Y5i%%7{KsfjiuxDv{x;tKt7>xUUyXb! z5Q}|?d@7ho^rPQzN2C4pWy)BVBJ!`ZiYqTWeR+4cmOHidq9AC`WKK2e_0 z_DQ{LXDqg!_)D6J#QI<|S!*Q{zpx>cNYu-A&X*^VCxu+LGZygoBQcpWlF4)+ncPnO zwZznMD;E2!4WU@9k(l(A6O)6Aei8ja3uxaU?Q5*`qkcS7p3%l+lk7)#JO7HGkK^a# z__;~;qmP_^oZrs6x?!TLr{3_4k zVs39%@~d1f=63aY^-NcN-c_zy3p8ui0?p3z-ZS9x^Yh9p{?zAh^V~Dq{B8C4ueFN* zS~b3E)%dDaV|%N{_Eyh2xpl7HtN^Q@Z!6DeZCgxk?`PjC_8hwyTlRByk+&KfcQH2Y zVr*JWZu`o~?XrBoqMt`UFZ5;o>}LYhXErqK4>mUDt)`}3Htz^EHkRu5k<0o^^8Jc_ z9{s$~m-T0}xd8Q<+3fycQ&Zk*Zr)|{j!;umseT{1tiL4RujuE|&kKE7e`8}VKz(Lo z`W)>UWZM#h>bTl6Frnw?Bn#$}?KqI+#ZrSO?TQ>wq-#V3zqQ!#tQ_9_(Nq^_4S^ zigiE^{WR-{Jo+D_pGQA0^oh-*>`jgmtM3p89d6&rGp7#4ck0X>^*>#I)kTC7QOto=8$_Rq6-7-4Ub#?~~pb~wjELpZZ7e zWeQ(z#+PZ*-`ohtt{!wG`;w^!;wh?pj;&iaJbu;5q z-fnHphgw@j{l0SQ7xIw+x+Xg4e=POe+VY{cHsPNfr!u)fZEfDHt=&v4jIgFkvsOv7 zRuT34%Bf$Kf9%zlv6M)C%$Oo#sgpH}h^>#=vb|$AE-L-4%3b50jI~ZptaWN)ty2?g zotjvCW-gAjbFA`=HrAGqm+#}tTGqF(u)h5{>*uspTl;exLbbI^$V*>2dD)MC5&bm! z{lVH=p}zwC6+$21@f|&Tf{;AHx!w|YUdl6rC5o@qvw zi>utRqs@_S_Es~7IJ@Q>3ci{NHZ)~R{cku%OZcaru`vJNh_-$yR%pOb&% z=zod+mqK6GUs|W;Sx3&W&Yk2N;Uw$qNn)W?zmHtjKPUeN{V&n~68$gH&oLgC^X`Oc zFUVDirJN>~a++AmX<{j-iKX0A#FFxiHkR^=E$=ZN=H0f)F(j|pQXVVbV+_eFwz$fb zG2}gG3^~gfl2^tMwY-PiA0c-~*;oAs@oE` ztnw|kx6&7$a;Go6>)&1{-sY8i_7r8Ge$E}Job;(_evZ#R_xMyRcYLaoFO%_Yn)R~J zO846SMExlnLZ-P)#ncu2@lO|Eg8_(5hAC_U8lGV-5_I-@n}Eze9tA<@Rgk z)PK{!AF};b^yL~TmwPdg&u8)fOTpgW9ab*4)9&fn8S3ewe%3fXa=8Y|<%ZDDqd$ax z-eTOf`FE(dw~yR=$LQ=@6X@(ZYIb&szlZpHDA3(okblqLH}tvlQ?8TxH2K-5$xrop zb^WA1?<&{ibDt)k`<&;!>+JIL^UCLPL7OjqbI)k=Ww|^b>FgQ~w069J|CYObCC_@6 zE51_Cbe1c=a+N!_c+Yf}JGOhv`-vHG=T_XAeV?%*$(`Asb5|$H*p*~H=qF};<-|<+ z&TR_)DfH9mm+ybBAVvyCBwh&E3x-%9tZ>^X<6(tjquP%v6dPUTn*Lhh*y!!A0c?yg z=Y7EVoaDYzlzR%l;GRMwHa24805%GFQjyoHa%p2Q_#yHs^o!_UL|#O{i2fk;*K-d- z+}~^9zEYZbJj=JuX1p={So?|F8ye^(a&a!W#)%2q--~{)(D&H5)*bh9 zow8Q3QC+93Rcv&XJ2raPBWpF|+B#`tB$A|!wX|`e$A)#%Mjtsg_F&@_`u+Hz=;#-* zv51Z9JT|VYV&giEjq5ZvuG84KPGjSGY)o?Y_XTH*wVd6Fe(K_EaRY7KKpWR%qputr zr_dinzgR`TK>gyJR@A?pv&S^&N#fqm?^qN3jx|kz`hDfpKZyQ5M}M`WU;bWPV0>K7 z__&(fSVL|U+&+}!V?ptuIt~^TAG*pl<6}WHJ`T}_VdnAjJjCC8!&Luv<)@sNhLkp` z^UsjdCRe%BChz<+Myc?5&FA5`kQ3?xdXyYK5=H9A+9o!jOhqJ*=?zoiW*Cr(f)NyK)5(BPsO>S?}#7Mc1MEyS{#(qkSZK02<%j@cXN*`{akHlGY zS-;#z6@5=1ZK={nTQq&NMbk%HG<~#1(?{QD>=@@fe4O*}*NBrBu=yI_deU;d;~bv6 zOcD3ju=yG`zktoYa%|p*z8H_U6W8K?NgDkhqW?qmN95SlxM-Sh7cX!Q%UOha7h8@^ zBZ|#p3@ZPYVMMXnRqojA{msINW3#t>6dT()Z))X?qn0y{Yn*XhU(S)tzzS-#>P>NjiVYHM>RHXl{Pjtwel^#)@*6H z7Hny`&NzIpvP)Y7t5+UO&fHa0a)qhCaS1^Ux`^P09>T7>?KPw?T3Pw?T3Pw?SO z)IV-CHDv?gF*my3PC%T61-`+%37HhA{|uXx(#U#JHP_^rQbD`enayrIi;R;yy~`5uH|1< zY*g3muPQdW${icMXBw|MHhRm)>Bmu{qvP+ntFYH>Z_fuiI$EsG&cil@Iy=YdM_)Pp zm`8s!(9yBiY-<}0KJ(0|wRGvI-Q7JJ>h69WAMW7)v85#-#_+Z_aTj6-{hTEZvc$pb z_|R954~yuh(Jwms)96p5KP~iSoV0cf%lW;v<8`+WWj?;H_)yKe*A*YS$~AHFx+YFu zubkb9@9WintEfD~2~YL!>l2Qzve+u_eeA$jFER)0#MYhII^pu-dbovnf`;y!Y@R_3=@&K;QDZePj$%x=Y3>b_;S;wx9V<16oZ z%x=e5-ts-f!`ntz*Nc49e2II2S-x+m=kt4r2VXhyAmp64cjwU`65m8E&gyLl<@0;w x_`_K|=kr5mckdpzjdJ|iqu8j9GkX*pUFDkbXOCw5*;9!J{T&768SUBl{{z}CRjvR4 literal 4935 zcmeI0O>Y~=8ONvO4woM7?hLuZeIY4|GLuLXQx(5ZD9^CkGeG#j&A_ngR*ZlP~U3eP*fk%ThJs_EeyH z0CIl&|IahCFPwQ+NW~aOO~u4!)QrKW{CPU-*Xh5yG7cd`H;qrJX?WD6obs0uaww$+*x9Gl)8Lc+=4FIT*LAhL)@!Wm zOb$eJtyjw%Up}R>-Y_<3gA_FgbO1d3mUSz6%elq>VL|Lq)*Y*Dwb22X4F2k;1|ndO zRbv_KDW>YhmLS4p;yZ!n+vC-k7x&^zF*7cso9+Y}f~gbBvxMcPIIr4E_R>Do4m700 z^Nzik2NS8m2(@_aW#rpap6!`ls%8tjX4hUu$biXUf_1e=HB=TGjg5wA2p82MwX8Oz zh6?^&)jeZY7es7;~vj(Rg6;$j)9G<65srmN4`TWtoYK~`Tb0R0g zB$b@VZstY4W2auiO9(d0s!5)NG4`R&j)n%|I;OVewYIk%0oPxIXvf!fI+|~{wr$TA z&bBLTVOif{LuL(!|&)e-~$FuA1a$2}`x4sW8`}w+3u|r?at!I|AB2&-EQNpzBYa%1iC|viU`Qe9RY2=S1frtW*g++CxrL>^q^Ry9d zC>5m<^^}IvKp5=Gx zYC~OA7f}z`V`eM`n?OsorM-(h&^*WNafvVFc75=rGjyhlriB=u9u&h6yXXL>cX*q&5$SFa zI>+1mIBe~-#%rXu*Wm9W1Jg1o(@9hybd7KFi>QG4n!D-B#@>-W!sqDkpnD&IuTDdL z@!z9ST)0@6EUcknOs|rw`0BHUAo2+L3(8>VJ_p?u%qz6QrxBFjokpDQO^nh#Pm=I5 zE%Ql~3y$QW0b~6Q9VC1WW^@s~j`>xY8x3H$!YeM^3I7O;{ z(i>E!qklr4KWE4T=QTYzU8wA$pA*cZrC3QTIVIa53(mc?riE~i;K=^j;V{DRZnZ896+Ke$^%osBvYUmTR z8EB{??WVqEoT6MCpx@AMLNuYD2dxYmyw#u?uqVt!D!BzEdAr@9hLS};@7@? zg72s)4NGy0wL)|ruFNU9Y_gBoM`#}GcE6o-6K*R5 z;a&()(Qdm8$qWfR#}?u*>{EKQM+>0c?Y%1r)xe&!dKdZ@@>c&s|JnYtK#zKX@{fF4@U?}GhTi>Y z*`br4y$-*o+^TC9Ryoi8Aqx=@v}6R@Y8C>$582_@lENwFbnJv`sa6+Nu&GpHof6?q zu*ad^(t5NRa?H>SEl#vAf%k|M$&fbW)37m&-U2(gnU>IcI`$9^5&2@=1g&W_(Fb79 zp3Y|TC*Wo2bk4~+A!=rMz6n}e23qXc9chLxXL4u2{yf1wmF9d?2Ko@}1FM5422Tp7 zv$J&(>}rFsyUD*@bPg7NUW0{y8W-krbA{umOvoBuBNtHxlQJ%oN%S^sUu2D5L`Q>0 zmAZ5A%pFJbLE~3+ulsvJqaHNg$E1QQWE#C0WPU4Xd_Z$^?p*FTS`7A$5Ak57P#K&? zV?p=vp!;OdYdVmAiTMIupl8vkVAndcC++SP%+dR@WRBcdAYlLhx74Zg;6EJNZR57V QWLYTx-?0xhq_(^JFNQ5$O8@`> diff --git a/PKHeX.Core/Resources/byte/encounter_crystal_h.pkl b/PKHeX.Core/Resources/byte/encounter_crystal_h.pkl deleted file mode 100644 index d1b42d9223181bd252b9070ea1aaf16cb2dd0d20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 391 zcma)#KTE?<6h}{T^O|zo^cAs{D3nIj`k&IpJrDd4Dhdvr1iy=4p-M+rC-;J@j?R9D z3_hDUr8o#@I-K9VTt-|)Ttg^Cf)Sb#tq?1$3F|^nNQF&d07KXg*)@y;jsi{s0uX3G zJ0ycHY(XD(V9#&>r_gD5vY0{4aZD2X@8-BW-%oD(WM6rj9!~Gi7SD?!FY=)~cX#f= zy|_AWg`X_dTS;9lZ_QTJAJzC@)$j08 ZOZ7VnRA*{hYC7sKZmqss{{!6{P@Vt) diff --git a/PKHeX.Core/Resources/byte/encounter_d.pkl b/PKHeX.Core/Resources/byte/encounter_d.pkl index 89099af4ed2ecd61158714d4d14349295751feec..b26ab102bbf9818b7f2c96d481b7ecea72a71ca7 100644 GIT binary patch literal 33752 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 ZxX>x(`#b!hlkU4iC!x?Owaahm|1T+8e=Pt2 literal 66228 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 diff --git a/PKHeX.Core/Resources/byte/encounter_e.pkl b/PKHeX.Core/Resources/byte/encounter_e.pkl index b74e425c94c9890fe9d96120609c33b76391234d..120b61ddd8e156b0668778d7c8612db04b6f87de 100644 GIT binary patch literal 17340 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 W4RdXnYr|X{=GrjVhPgJ(wf`4QwL+5s literal 9442 zcmeI2U2I%O6@bq;dw0DX+v_;%weQ~bP3*Ouz3ZPiK}q_Xq^{e#HmMpXCV2xl33U~< zg|uqc&kl+D{@7&qz zb<$1oIxZ0iOP|in+&%L@XU@#{)Wc87-;K!529f8XYm>-#;E!;BOynKNI3km<1nIcQ z*WjNpnh^OS{1n~?zfoiwz6r0uyHH4qd=6d!KgD0b*N3?uB20(xCoze`8|x~M7|6!L*R-00R9Z6JoSg4 z!9QSsm&jM(`>+U2KIOtU-~#O3#&`Gyd;rDmBA3%s}VX>8XA(Op}~Qq*|bS`7K;IF)_*bbCSx;iC>r#CpAa>3GoS?g(oECp9PiE#s$AH zZ8Gk(DHNwoacJ7K*s8JOBsz#X*WaNU;aaR$FY;O2=`GU7x0&YVJ#Z5Yh?TdIo~^Kt z^nKS|Y|ikPl1#>fans)JNqhUa*}C-@;bTZowr(9ananYmG})}B_5{gDDm}pjnUHj* zN;H0}r_B+@?FfBvgg!XJ_#I*Vju_8Q@^pICSmvaqWz<;aq_uU_w6;c4!M$NQkiBoYTCk?0|uA)GOdjVc|agB(N-n(cPhG&eipENN+RXtK_hIZ$~E z>9>$(X>Pum`1P;vZd+_;XTo%L?lHMs0#r7_UgPTOg}P)LH#_QGXtj*Qt+uDFaY$kSy69mw6e(yToP;jIYAm*ey&sQnGqB9O+$B0nwivp|wbl?No1Dw36^Pw;($>?im(Ar-Y`GTUY`R7zE?+UCtg;=>`yy1@hJUn zt5z(Qq*x40vA7HRO>b`?y}d=#-(Qmc{($%h^sUI7Rm~OG9T3kOK)!~24fzrrg+b!4 zBHd7Wo-18lugWJFMbTCCh{^ar#+p9DV1GX3_UZuZP7vW2?#0O3&1dy4FfJ~;fzL1X z7p~8*+9L>jvz%^R2Va!zRCa=CbD?(+F~*xG!4K=S!Ps*t7FEZ^$geym%0wTsqQ z@4TwD{q*0My5C{vRlPgI$E)UfCm5g;%!?E3Q76{AeQms2)GfLpc6If!Zu;1&`k1&H zwzEiQlg^|{m+1bgKUY=VXMNx9wYtyd^Cw6T->xd_vG28(|M0cy-cd*0cdkE^$5(oBWFs=!wGo+Yh}So! z1`hwp4`kc6K(=oW@V)}}fq<19NKa3IC#KSRWa^pq_Lk&-TMeh6{w}do+@Z7l5bKbp zYWUx^x5+VGSvR8C^-X~43|@be$JaOcYN+}Cu-U$S*!1)a8=b#8Z?B%S{}pO=IN zd$UfS+Gk47yY`tf$#HUTh+o*tytNc6bGCBx z4+B_?_dy-lmym;4ltHA1UncD>;x7|^3yswmUKw|S%qGYzY=h@LTFLBDeyo`tMMjxv zc$&1Q$!wbN({gni_K92ECu?s5r+7X0UU`b&wQ_ndl}b`71*TNew4Ez5BYtrbCg_aG z74FtHM41g&t^{_Wq?rtx!NHOY4i1NzluA2^?}DAW?Dg>KV`MqbMy&k+TRAtkwg$3g zOCW7+0Y~kCBXz*hd&;!6O>xAY;#xA`U>k5XX{DMhYp&LQZeD%yc-3*;9^0o_fK%ad zU61e|$8r4z6?>;W3*>SEN2Jqur@Bp^##^Ne{nMBq-9A;8u8`|i3ujWjrB!z!mpX+M zPBSAvd<#^27rN6<;Qw^7O{~FdTmpP_-Ch3+tQYIxHmo<3)ej1d8<9zKy_wYVdE*T>IpZ&`ivSF7Wk%D;k~EuN1W(w|0}sHSRC}%@WDw9x}SJeC%UBuVK9!e8^1O z1=-!L`@Z#0b^q_}J&yT#0Bij~C48K)rdioyTjTH?rB768o}~17N{Lz%orCNz^x;Y= z6rYj8&@kW%g&u;85t?du3cr>z1y-*wcl%LiSS{jsY&0%tYfDSH5yl^FCMR^N8c-I ziNtx{zRvTKf1Y=p^E{2(cysf4{=cD`9(}K3l~J?te7=lYH9h)%z)r5{4Q#DW^}hgdkZ)oD diff --git a/PKHeX.Core/Resources/byte/encounter_fr.pkl b/PKHeX.Core/Resources/byte/encounter_fr.pkl index 0dcf716f731f3c2ecc995966eccb3d554ca9f559..b1c35379a3dc96b61241cf85ad91c7ef185cdb3a 100644 GIT binary patch literal 22736 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 L!La*0xBGtqHv++C literal 10354 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 diff --git a/PKHeX.Core/Resources/byte/encounter_gold.pkl b/PKHeX.Core/Resources/byte/encounter_gold.pkl index c92b618ee39e5cf201500c82e5101c1aea4bb42b..db98048c04e36935c9b6f5a2a5b879ddfc16de7c 100644 GIT binary patch literal 19456 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 wdT;k$vpb*0UZ1v^&lz>% diff --git a/PKHeX.Core/Resources/byte/encounter_gsc_f.pkl b/PKHeX.Core/Resources/byte/encounter_gsc_f.pkl deleted file mode 100644 index 3254575a1ce22109c09e2323ad68da0539c373ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 484 zcmZ|Ly>S9D5C!1#&-q9Gx7R(qB2<7}f(efqRRCvF(E?O~v!fJ6Bq-Z9@D#s`Ai5v&Q?U1)P`$0ws`BrrY_+-XFPbwer} zl4v5h_le*^6LPBH4acG! ze-Q8Z!~1yR_~d^*B%;1E9 F!w)1a!ax83 diff --git a/PKHeX.Core/Resources/byte/encounter_hb_hg.pkl b/PKHeX.Core/Resources/byte/encounter_hb_hg.pkl deleted file mode 100644 index 339ecbdc2a561c387a66949ad6296ce4af4eaf18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25736 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 G>3;$DxASKJ diff --git a/PKHeX.Core/Resources/byte/encounter_hg.pkl b/PKHeX.Core/Resources/byte/encounter_hg.pkl index c45893dcb58e63fbe5f1ed95c5d7db19edb790b7..13614463f555a2a98a43aac82b0db857d6c90b2a 100644 GIT binary patch literal 78792 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 yoI8Dcf;nkB<=X45Z@1;D6~i|NGx literal 27278 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%0D-_7h`^lJ2$9LP3#}&A6U3B)jyCJ@Xn## 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 diff --git a/PKHeX.Core/Resources/byte/encounter_mn.pkl b/PKHeX.Core/Resources/byte/encounter_mn.pkl index 4e872809ce62a87465992c6c735f17994939ed9d..7e12f1fc5844876f69774f7b839dffe5afeb2e83 100644 GIT binary patch literal 7116 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 rVl)wS|o^eBLox0 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 delta 3600 zcmcJRYfO_@7{{Nt0#>L{@Kss_?4;r=-ijh1R;+iVC>0%`fL1PAywTm+mDk;5o71jO zviM=y_@J8~mW@xFS(dC>mdy{#(k#nj7PAqvEM_rFvn(4i#_WII(-z9jY|B2JaNhs( zKhOD{^PF?ar5nodd!~USeQ%QAMASNq$d^V`mrmr#AgZ2C;XU{0DJ)03xFm7>;u4l06YkQW&pGRpcMcI0B{fh zZ2)Koz(5B84gugW0Q>+r0)S2cbOE3n06hRW3V>q(2mqiL0LKAv0sv^SlK?mcfYSiz z13(Y}4*}p|06YSKM*;8{03HXx69DK3z>@%Y3II*z_S2&4glB=66W%*L-2lW%grLp=S3iqHnk= zQ?62whniKs+pIy4@=tMHtlrZiyx;QKEa@G#IC-eW!NVs7mSJtuO-8vxfN4PInF5Pobe#^pT z^7*_>)(@i4cDYG6`LjIfj2X_Gd~DwM@1HqGmEXQL2m9O19BdP-{e?ePj3lT%Nb znf0WipPnw7k$R|2OnZwD&rhO-+bh`GZif6T&t4GE*)D9i`NIX$=E`^S6+`=tTk;b_ zRlc2X4R;7@43#ctm(6EvvTk#-zoUYK9U|>avEPkxy4}a!1>%&e?6zBZ*vL5{hK-T> zAN-fyzziQ%x$uxUDu1E^2`agNqekNXg)%Yt$IN$lU~#JX4krqH7qMQxQe;axEcYgj zxR)4VB8BzE`gps^G$zH*ypW>V8V@_3!NG4brHwh_H(N-d;>+TcnKF{maEY-Rp(KLl zNx{rXie-|LEtJz-S!z5SiL_RQgQanHZ0|^C1;;wgX?Uy@wk?$bkLF}YR|UJe?iYxp zjL=x`Qjsc8;ee*&6lQ13Q)$I-L2j;S*fi9%%MF)JVe7I>#-lLQjjDEQQuLSEIJ)dy zJfLx~TjYe>UnX*j6P}f|ToHdQmgS1YV&oj^7C8$PHZPYsM-8D^;o-R8>k$rz!mTT$ zBZj;8X^)t7u@YWsXyK#6^AA7Sw@TyaN>OH&J@E_>6dqhBMZH&Gxx@)O z&2Lwx{6Are%R8$6i(H8(r%D$GI$SLeZZ#gkYC}o<%$deXzV%Ly9yzE+PcrikuBmCG?MwY zN?)DAqg!?SKUY%XC8u+)X~_~ViB?*QvUZvfAKEr^JXB|6|8|)f_Sp7h=8HRK9_iVc zv?58kE-)iUs7|`;6|UYjuIuEq`gR^VC2m2d3DLp&l<0o1+$coECd9mf@n*dtY1Vcp xyU}>JL19Ouli%7SQy8Dp6p!3)Oh$sfWW=^N*^P{K15G+xPfJV;x9&@R{te3V<|P0C diff --git a/PKHeX.Core/Resources/byte/encounter_p.pkl b/PKHeX.Core/Resources/byte/encounter_p.pkl index eb0d7a4c87c1deb75ebbb52fd63313b0d4ce78c4..bdccd4628e0b7ee0e39ee32d6f8ca63cb1c7d1a7 100644 GIT binary patch literal 33652 zcmdU&Yp`C|eb(20?-$8Ol4V_N$(F3!(ao}DS(bcBWXTSWEjt&vZ3dDiq-mN`lO|1? z1Ta)_-I*|BCZ_RZ^1(B88c&*O3vC9`BvVgm69Y=)fiM{ALWY{53^U-NW+or_kPrO+ z`+45~Iod}KuQomeJhSBIJnQnmt+n>rYp=cEkNotW>X}|CFOk;tOSzZy80iA(RnqQ3 zDeopdO?r{k8Eoo|CjB{S+o+UBNKcYpApL-JY+TBtq~}QABW;|Na+dT2>G??0 zQZBA3<+Zh?EM8U0`$%6PeV4RmT`4=(m+~&sQ>2TevVp%zZ@-$njbPGKq>H3-O(`cx zA0d5(R5p<|Q-*Zc7IY^)xfR_=KOh~u7TriMke>q}?~-7t+(DS4q$BLdI^|Aw9bXJNLqozE3)|uapmvo*}(NTC>RC zq{aQ%P5J`qyQI+p{wBTaAhwY%lFA`$BRxfW>@fK^5u+otMSApR{7d>CY2z*Um-Gbb zdD8buhmInL^bF}G(wbZOo3!H?GDuI6E|SV^{7riM@lrlR`a{zHB;9;_DIX#|OM02K z?gZ_U4xOYO(lex&NYCAY4y28Dq66s((j#}_57G;yACQjSO?neLlb$1ekF@d4=yVEu zNRN>&kX|LNISog8jC6tYD(Nd{N_mB}^TtccS|_%95UV1YeTAPdfBt*i3qc z^b%>!kJAq6RnpTxK|gyJu_xX8S7@7bf%GbA_q(x|wEI2$pS1fY`9JBwWl$ zboQ?zkMun0`=mqfM;__VN!xx3ok&lTULbAz0D6$N{WLu3Nzx0XACSKOLBhVVsbjCO!L0$R@2jPkcz{ zNnaW9RxA>L%(bw<_JO=L?OM z-XKbYs_xLJ)1Mf16ZM3u(mSep3mc;hCRakV(3xyC*G<$Ds!IRC^97}gG{Hrc5L{;w zWlMqUZe$GBs3+8KX zja%9`ZrC?({KgIYh}w$&31|C2wr|=pe$$rrO&j+8*=5EboZ|;_{H6{2Ub)QpgR^}g z+qbs1kG@!T9p;}xU#x`wn0~Du4)Xj0>M3_^OZ(Qgv~TU}+PBm{v1)~V3$=Y%Rd&^L zC6-n~aGk~4X1H#mp3p)|`xaW-xA405{Q`Pw#<-k)>*&V4@+9_kIuXCm5xnXjnY;THvqDp9cRH!utb%oGsN#_-aMU`cM zR^+a)?f+cL4ExiDPOnGh^7rY#$=QBt^p%VBfe>|v$<1Z|Fy(@lk7E3(1&PV?SYo$8to@nb+@3Y%7LonI%;Jru@YKOIpu;}?yBTK=3dN} zLFQ8X@Kmiq?K4?aZD@JT+R$=N*wC00=3P^5Xv_)ouBonW^aEn#D14rNAm7KB5Q1|* zz*imh#El~DLDk-6}lxbU4&YFhgw@hJ(K9y5@@Npe%6-=}re09A=PncEfm3(6&`gi>w?RLiXb zNta%7y;n*B1&|iH1U9_nI}XI~EGNlbZ^? zjUuW6suFcFw<{E5BT*%ka%;PzZpB((*JuROlf6Q0;-1D3@KjsCrfa;xFjO|@T7)4J9Y;a4HJ71vU7 zeJus~S_<;D6y$3ubw|3Y!i|OCCdo~O{!7XQEy-PRef_VL)0GzFTu?`?fVx8A%|w+@ zy~VyNzS~^;F6Iu!GUiaBTQkyF?MTD*)~}~kxp*3VMCOI8w*ixlH642 zUr<8QK$aUlQ5?wJt8i)=R3+-D6}Ya@+vu^0DxtS02QnA_Y`5RJx#gU>xiM$XJNIpF z%zg9DVO#LnYK*llb$?+^=@=1T$LRO6zku9d$aR1Dd(2_kO9qMz+)(JFj5Woax?>?Y z&tY($!~RwF4Upy1$_icHo#mGL(ErFj1acob&-jxxkagaZbwQTFa}AajrE|G<;X1Mm zSzRGG+YM*C;cPdY?S}I>f%7t_O?lThfC+&H<3 z&;k6Ux}j5|N@%%GVrbWSp;NZo&31dq^^+T16U&0yPeP%S5b~Gll-yJ(bW$tfC!ys! zr7Y)#PO6EXT_Lz$a{c56o8ppMkUvarl-yW|x|8Iln>R;|&`C8yC!x@(-JH0k<(#;s zF(-ZkU7G7bIIjmm-hLqaQ^D!riqlU*J$YYI`&Bba?a%29Jw3z>d&S(Dzx&O!gy=rWr zu4KHJGCm(WqQN#D< zv@+J+44m)H;ilr4IepJfFY(MpvMwO&0#n0fd5}CIGwDc2W*^Zmrq`j8qUt#Lr(L|!Msd7VTJ zuYllu$MD~C$C-Lymmo?*Hh$rJr%lZ#-tUm z@u=ao3!K+@aGuBEtb1szSsCQ{`CX|C$hv^MW&v6E1?oy}Jg<<>aiJFnG8ZKWvET?yy4?w9DpS}&426oT`*63**NIIk<= zrYiR{DHmk9k4hF`{@1I*U)XQeb8+!``WffU;8sc)9f>FE6ze} zYxJ2{sHc(eW_+!)I&dq_3h+dFRbs!rjy+eBqE&vZL*>!9Mu~e6eT2Tj7!~>s*Iccn zn0W?5)EEj;ZX`tAadMO7rb71-U9|_Y+?dnE#hfPepHn}O*NY&p7eQUM7yDp|Ty9Tt zAakW`Z#k!JZ`ohAH~P!GbJO-lf0=iVi3547F;`rl{Y9fP`itg;=r8IyaJ~n9bIj@W zeL1o8Tycu^yEu^VL8;-n0?u;Yvb;k~}%b$=V#2T!#b7yd@+PXq;y&G>d*B7GhK)KW%3Na!^ ziN-1iH%V?P?myC$q=71-SktLotm%Y)wkkz6Kvg2^2iFz%r&$-|a!5!URVr*03LAIr zqEc<6&@pUGuD^SCz3s{09CP_dEDbTwFJWC^xviK08afp*YHo zk{b)bO_G}meSp^0GRShDfKw}=Dp5x@;JS^vomt&@*0QtZHFRgoIdNxWPMr6d;LgUJ z_-*{IYv|);b`6E|H5BCYgg3GXK3}eUjc{X2`)+J$-;J+p--qc}T1#KfzFjTt+tt#( zT`ld~)v)h3>8lG{>AGF4@_oT?@z=(~WOPBjK%MSximb*s-rX3-j75*9xQEjyin9a?YErTpKt|MxN_RL+Nb#b67QAe%7brY#vZ&t1fRF~@ns>{Xsmpv`} z%bwCb+~%E)J*D@Sbj>ifWZ=zn@s1LSu$_GQ1l?KX^zzE=rFzdars>vg|9b}SI{S1(atxrbPP ztHxVcuL;HZCEaOFS+5Ck4?aoG&w##4o2mh_+~~JzIdqY<55Og=l>1ZYr}jX;pZqtp zCl2I$y;AnoeROk-k@}4sqFD*Sbq?Pimcexs^@R4djN!hPG2GXP;Vaoke*ryporYU+ zFTYsFa1&PCdMp2MhO1OZYfIreiMsM2xyxdx8r*dZgoyA^h)0dyGvwi{pZ&o39tzI) zP>c9gH9(g8emKbmIff_EOd5bH)i{BEx;Fy(&WR}1@rtl0N_S_x;2bZI;{|fO7F)(^ zu@SGkkk{OMf%D!A$j<;58}SM~o9jk6k2#RX-2RMLM#MgfcxgOMHbpq$r&uoT5rN_pjZtFm`4iO3TwepJJ5V{$P?2E*_BHUqyavKe z^lTVzD)b3FtoA^biw2%6Ll?FD)+`5d%JgcD;3XeU#8#6t02eqB=eH4S*)=8Lcf%8y@Ttbxclnxn-ZII{fLyh=9 zPQB)J7S8J;koRW}XZ+>M@VOAvxZ}ST`*f8fhJKbx4E-#XwW!xcaZjdla3e(yG|oQZ zwQa;-qwhat3_+IrJ8*h33i9(%kk_#wuVYI&-13@wxMge(H)1pIeaGQOZ05c1xQVlj zJL2@Y&m)7DPAmI7@_ziGv&ZE267_}NOI5vL0vZZYZlt$AK;uM{Jd-^YDrHH2w(E1w zNcHt1myR|Kz@I)lp|Qa8hcMi>OTMLjA_~RMdkn@ zINKF_PqN{&jAnSGNjDRcF~{4??UYD``H_#X&^4fl~Ak|@;RHIy}_;6vwsIx zsRqb$d6Ur`$b0tBGyc>b$b0rFx1RB$m8v(>xzn3zTF-~lubyw}a@{N!oO0{Aug)FJ zwCV(^wdxLLHF|?t%l%n7?kQ9*?k=*udakP5>t}m`)LuW^>ql(kT-cS*8Mm~YGj3@) zXWTO9oT0D&#GD~?wC-cyp^xp|OK{7J^fB$)AES@$+ZP;rJY6BUo^oT~M~G9K1LcB- z;{GvxOx!LmplTUzqFlJCau3kD&~tcSXfL{`9LTzWI>}j=cT!F@K$T>?BRP;c%O(EO zDtdxBN{eIo@*lon{dXFqcluZx`K`TwKp)o$T9D7f-ij|&jy0LzLkwSt3ttG)p5Ni2 zuFvMe`5hiOpUp*@-$SH5pRc_fH`5c%9kT~1uM+`8rL$*G*n*FJULay74sZ8`LeE4) z`R)QSQ!5cO<-++qL&Qww!tW{|mQLMu* z$vlHyiuEq+5_b%{#D!f#VOOGMeNi>2J60|-CPHviNejEuLife6OI+BMbwj_ddeOdp zVHfR<_U@h8MK0DzM)Wr9TG&xr{C{GX>VEK&G4}t8U3x+n@sgHjh?kz^;a@*rjChHQ zcnM+6Akk2*gfG{rhL}T3npPi(JQx z-0X)~v#cK~_Ghpwbz9aC#a-GD6`QYK60fZLzv+i67j{YRrFLaMj6N*Q@z`u$gTo6N zOUzN_h8to&h}a0>L0_-Yx4UCUN*q|#s?Tu7}R>mp^H%V?Pv|PU4 zP1%=^Pv~f4UGWI@n)_UE-sb}4y5iFB5q=JT zO5Wo!hU#Y)Pvg%8I#Ma1-oj!aY4#o__k3z4^i*!>DK7L(WSv4!l?y$U zyIOjNKP3zFM(K%*C-dXNx7iS$|dq! zlndIbT+p@3CEnL57qm^epzX?~UtF(T&<)B3?NBcLai?-YH!2sjOSw0(991r8k8(kK zmHR<%9Fz-MR4!=0az9qe0p)@YDi?G}xqrkqxN<=^DHn7^x!bF9vvNVVC>L~8xp!6N zR^@_@DHn8`a$l&*api(;S1#y;a{pOXPAV64hjKx8DmTVKXW@MPj+UN+5+Oei#ozuG z41L+(IR*Lpb*$y}>)0IEp~qu>=OAB+@6z^!j@8!_t`p_@+au>q%qz|70-WoCT<^B} z-t61d(7RwD&jBF6vj*~+e2~900P4$cpn=|Z0}VBog8Ypbkmq-h*ApN=59MhnYVIg7 zKRWpvf5h^){)pvY|D%+DypI1F;(z!s|J3Vgp<`SRg<^du#M77FAs+4VO?CR;O-wyZ zD)hfZL*>%mNF1$ z5*K<1!A+DKdR)><>apYxb`Yy9y}}>luBtymk9-p9=h|r95f}c*Tt80_f9Q#6#3hlR zr$=1Gg+GKME_$*W{t$92m-s`HA}&Ig(<9|0(fqb3_)Ya2< zP*3Q1ef{8XKX(WDx%)3?J&>QfgL+5rqA>lj-FME9H?AL_MxL$%Am5LGRy=n<-nbv( z%Ch2qB(6KUD~Rik(8>Dxu^)}~^-GYylKBAg@>y(Gh}>Qxf14Ff92xgEK6eW8ImQ?lI+q6WIk(tD)C>*sIX7DI{7qfY z-*6L^gPRI*w{E#{->x%qv9GAy*nbm>{kKHsO1Zm^4Vrk)1o;d%=!cvMzB^;nt@nPI z=c@QkoBCHGe#mb_+}()HC#ct)GvPdEg1m=wcOy2Rq+WAO!+FjGdCq)Oz2-T9Ub?cg z3+uJUd&0hY9Yn6z8gMC=J27vjPf$@PT77s?G^oI2$iL!t16Q20VM z!WYR+#f2}#g)hW~FT{l}#91r*;+}hEzBqMi=8My(XTCUfYUYd6r)R#P75jp^_62qA z3+mRsIF(~WtGz#AY~>2j=lQ}Hnmx$%dk(As`&nak*<&!ceepP`3xLyy$W^JwTH&NVu^-?{C! zcowl-Cyjv6Nhowuj}4uKLMNfnDQkGlgoMoXmXYl+<3t5Jb6%A&6EK z!+UDq(bq2b{MFx|%vPa_^cg7zDz>u)#0`MGag@lz1JJMC+9s;xL$JJ(}DAzD9C%vAn)D& z5%Wma@E$Xq&%(yHT4(1ywHriD@5O_B{uSi&uORQmgS;0H8mKPqE|Z^}-!r3}&*FxB z?cT*xx0!q~l=7Z1$j>Z5eii`oo-l1JvtM;Xep=yY0dU^aqOSLZL%yDOlyYyq_F^^U zFG8``?Ed%L*>^zhJLGy#?N^bnSZ~FCogJp!P(2II-|mESzlZZTso>o2L#}FoESHwe zfz0hn86eBxSc>I>%pFS(WbUKMfz16%av*bmH#v|wo()KOHd zt7AC`u8!p}IN3IUt7TM!S=~->b=_`ob=_WYb=`h&syl?MHK+pB8gz!UR=UB}t@MJc zTj>W^w=xJ$t@LL#s{X7-C%C#sH@Lb+uRrsBHA*x9N&Dbz$1EPzDA54qa*5LN5?a-{ zC8P<3uY{tU=HNiJl}o-VJ-FJ+syEZQ6I`uxw>Q(Y3=@SNYB@N|ooUMTaTfjlOw*ck zxojnUP|^n_eZV_mvsTgvv7Wpy=PI29i2W@+|L1D3>^yr!4xw+&YVP29>ph`O3lpM&M%dz@V zIjw`_yCvQ6gnjq_lkT!VbXOEZcX1$}BMHANK9uXrPpq{3eIU?KU&0B$s}+#H5A*kLMJp@8kb9v3UL8dw2_Dx76S0)=8Lmqh}(YYlQQ;Mv%|q zfP5AQmeEPiE^7;04snhJ5R=W9C1*Yr1OmP>jXo zyk3U$*^yYANp7sogm$JbAg|qd;On(J$ZPkQ)oa~pLnAis1%+-!_gyUQ>QiW4p=0Qt z+#B!>F0N6nzqj==b#>kql;7JrTie44n9`~5bw7(wgy81>-9POzQ+L_#-X%8{qCM|R zQ_lO+*QH#L<&vx4q$_`n#`?WIkbesg(zA`Z^^V6O& zQf~&ikHnZ12l82L{NR2Ka=-p6V^Vz`G*nNEF)5C^V8Nh9gw+F9&Q=yhg-(_;g+#}xMi%*)%Gz9UEy<_b7|j|t^dxowC`L?`yQ$L@)_c- zUDb~eTcJ(#744SBxbdGKP_h~EAZR;6q z)m}2W-gEvi<5pbUr%Fpa<~`>JSnF!n?B6kNh2SRoYCPOj=r!aj7v%HDr7Y=m@+1XH w=p+<6NoweHM?6H2+@4VABosQi96E^$ol?HPksmtgzB_ah3Y}8B{LcOV0%1#u8~^|S literal 66228 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 F{|}=vr@jCH diff --git a/PKHeX.Core/Resources/byte/encounter_pt.pkl b/PKHeX.Core/Resources/byte/encounter_pt.pkl index dc4542abbe9b2aaf4fddd8061ff7d9e7c761c17c..e37dc9e20547036d0cab32c8e55132a5a50b188a 100644 GIT binary patch literal 32396 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 literal 66228 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 literal 7763 zcmds+TW=fJ5yxj_(MwX4C`v1m%OzKr6{X!3RZ@2;mSu%eVp*~CdX@Ll$69sM( z)K2a8rGfk$v=0T^z7$CFn4&@BKIjt^1)Qf8MS4L|pl}VNAE0O+`=32rQHrTXbXYj8 zfFI_Zvu9?`oo9}2eP@T>Wui|&vW@6v@E&*syfZ{U2kCaAAA++XqVwQw@C)!6D4r#H z75ohR9&~6#W$-=lEASXtVWKVYF8Bn5BSaU#9q>!=ckptQ=yxE}L9`6+f)BwXkc|;- zfcHSEljsK^)J3!iZi5fN-#|J}^iA+S_!H>vCb|f|5B>?hl^}WuoF1Y#z%({O5AaHo=nvp(is(0BF-^1&J_F|sqI=-CAeJFo2R{a#CQ$|a1pEaI zW{G|Z9)WMF9Z*z1Aj>|WP*f2`Y9HL8sI?D7Zm|I@dy92r zi*09%o$)OWi;;E;*{i6MZeS`l;C2I3v4H{Dz*KB-&F$czN4D*ek`*2ttZ+VGVJRCOt?rBAlu>6^Etg+%ie_BO}O3sinz6`+vuV6^0wbw!??}=jovQe^uu~Odp6ISmS>Sc zTJoV#p2OiM<(yK}G?&6*2dWOLxfF?ryg<>Y12a;-hVN@IzlLvXR8xyYTvRD>BvRsz zjuJz7IvnJSK9NWf--`@2MkA$~sxE3S#bTl=YN}c+rqlwdQ#8JY17(au(KU+e zic>eegszm(1trf(k97)#Gz>}v><=I8pECB$ zi=d3X@*?Yc8T+OT>8E|Urp7lOFLONp2DX{VGPd0cGUqAQoEc?*7HI6S5nP1cUUlt9duxaPua-UtC{AMKbpDR zls}TDnWtPXPlk~v(@dg~NsM$7b&^3NW$t`&~svg1sE5gs0P zX?WQ2uN)&IF7hRiKa^0D->Ktj(}&eP&m+%s+4Ck)HgzanR|Gj&;0o1HE4?5s!g^Ma(eL6zs{t2{Ti4Y|z= z3s+Hgl@}MUa6r?$2Tx3y^?!e`D1S`C$MYYX992xW?dY%`rywFtMjYe1?dAQOkx z+S^0Or-7)M*xjFxk#);#7*jQlk$aR|X=%_xaecI9%2g8IlPFKZHE0-B2Zzeh;*;6&mIRD}fc*FX>A$sUwnL)o>OJn6jnvR${-^ruo+5K`)h(5@i7 z6e;u}J>wQT$jXkygQxf!DZZPLW2_->-&F!fy3WG338lXxfk;Zfly3h+RjS2B|?7 zAPYR8THD#FVG*9gC~M#x(g#?mvRI!(`Z<&-Iy)DTKWXS1t&he>?Vxg-PHPy18H9Wq z5E%xu7$`hX0*M?2i6RZ-l_myhsdm&Z;ni#j&sR%$zFOiTaT~|@YcLmvS&?H1RK=~x zG0e*tzTZIp2EN~D+O1)U>*H>1)!Vw;u-h{)- ztr}d3wZpivN{p>~o6U~lCRIQa)BsC}-rOKJekIN~dx$prQ5<J9w_j`AcDXGDC*Bvgz4-J--o~9x{R5`d3L_J(FtQ+1Vc^7k%Re=9 zxwr6+CP&#OWC3q%1xQJ6q3j*xw~&5^BDkW@`dIcXuB3BhICEql|F?%B_lr9Sm+qj3 za2Eq`7x}xi0Iwu&AJ^PIhFNj@5oF+2()UsJDcs&i`cr7gV|Q?!(Tz12TZ1vb59${{ zPW_Le^fBZ|U=tLOe*h^C9{>Z!9z4+p>BnqyeIT@`S+{K`PuuBV63#Yjq|ttugb}=@ W>eidATOXkJZ{ip4+dfk#fBH9+3`uDK diff --git a/PKHeX.Core/Resources/byte/encounter_rb_f.pkl b/PKHeX.Core/Resources/byte/encounter_rb_f.pkl deleted file mode 100644 index 01ffcb391fd8a8a857def609d59b00789635c245..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmXBJDGtIw7(n4iTNd{R0fS(NGgK9U!+}O1N)2Wd(~_D7S3AMg0jFY7z&)S|>V3&0 zq7vb1s)kxh{Yt|knx>(Z(l)4^PEI$cm(#ZlEJMp^$GBjknQG>mjp1y$SZ*2jj7P>Z z<5lo3_!N8{SxDeWEP*S2nb46?){dIV(vwqZzeIIWB9@~k2ieP7Vo$A9qPEI-D*3M; DmtHAB diff --git a/PKHeX.Core/Resources/byte/encounter_red.pkl b/PKHeX.Core/Resources/byte/encounter_red.pkl index bf235971dd940bda9d5d44bb439862eaeb098c12..75313dd20ae8588c46e3ae8c06f89a91939f3de7 100644 GIT binary patch literal 3264 zcmb7`OLJ7m703I&`;O*uHFxg4bLTxs%o7A72{cxbLKd4T5tT3{%b<)Rg$P+B2oMM% zj7UgjszSw&a#g(W2Vjv8;Dr}ic;OGg!pkhY@FL4Bvh*Uqkpu`uag`VUn!c^yIeq%{ z>C^hKbyZwZgy^Dmw1ax+bMyjzjebCmD#Qh}j&{%s^b-9ONll1xw1PfCU!rf(OY|dh zbZpTTw2S_ZzC*$gB88^VJbH${K;NM6kT8Wfg{IJLw1Zxtuh9?aKd590aTayabMzJZ z9z~@PZM2F$NB=I}+K3u?FkHI#oMU zZWu9G*Hl&4VhkID{ZJ?=N0_Fk7>1)-mZve+Ez2>a^h_zMmZnvuVN`9)T8DK-B;qNN zh^tB&?6LeBe4EjzXGNodk7y56vuJZcs$Ss20T3$3y9q{2M0aaK=N%5 z4&H%XJz!Ulu&e*WzNv$|*aadU_c-%FjYd~A+wQNiV&KHQt$bo?sJCV3cZeP{X zJ?xqyopzKkbkra?tEJOT_I%dJWSV9s<5=13DVfWivI~WK*mZtS|_8ummg$TMmP)yt&pc;2Z!%~3eo6*G$_~SahuD-FhV$egrDwDA)ZMK_A&O4glg=P*In+#F15X@G1eJVAG>BMwM!0m<*$JjsKyYHUoDC9#e6kII`9NqH<4RUXmO82c??!GJ(?%So(W7g`|K!;d6 z#M&X&4zYHKwL`2OV(k!XhgcsUv(`s@YiU|(uMg>ZiQeMUhf0R3dh{WW-jbJ^mbZ2N zBkZ>idgBwJL;^vLDCM%JW-`83sr2+p#WyOIv{|qBtY*`f^}262n@_O2LQj0eett`x zJY+w+tQ!-S6<4HmxF1aoaX&87dzxlE?pTcJJs0UcoW)zc=P7j;6H>+%+ji7g?2Rox zu)SzSA_LO0BDR!IkJ$b}C^9B=Jx+g&(RX9yE3WfxnC5_~>k;~6$bLh5=^xo+optJp zWz|*Np3xZVrdcP(88Z?YvH0c=53$Z+c80#Y&)W6~Y#p|4!AX4Bw!P0XCjPpLFM4NP z9~kJfBlO)N;;&17+54Zl&!Zxl9Hj@2($_}0H>0}ajB>uCrss`vZ^mRkKV}z;J@PV5 z@0j5})>YqM)`o|d^=ft5Xf!T!CJn1zza$%tTbv1OWLo(CjFL{*Ilsf~r9HM*yCrM2 z%lqsRzl}yquho`~)2A<+&E_k=m+aH0|AOBQQ7UaHg~F_Q;>4_0C`{`78l}=TlR0Yl zjy!qtx?QdI*~vZj#EFdqc0-4Gi>+3#+b2)%`z;nHskaSvXlPa|m1gmK$Eek=nfzLn z%B&n7zHT=f`z)LSf52|&#bTeGg}r7C4c#FRefGIf3MFzjPtHcj*_sxHWxZTpGlC#* zrqgHWmk;PQPwZT7pY{E_du$NwvxUN%k@`czfjvvjuhGNy{bn+G zGYnf+vG@%3!E3hfHw@42#n5Mq#Wf=g3udu+hCBR(-neN8!E@^QZ`{Ft&p*$7pW}at zzjE$%-l)1VI55n3-kN3Jvt{0zpJJzZ&z29^8Q#f{IiDR-C~R?- zi)yK~Mb78+TyB9rG{=4yILi-YrSg#T>9Y&4bFd4rbFf>mJFr`@i?9uP)|CTxP85p^ zoX?zEE-z^1@|K>@FB-+-7W-YKzdw}K>IVnx7VIMI7VIMI9P9$@9P9$@71##7kQfrL zVpybaZc%&v80v=SHOzeeJTWZtc1_ro%E#pKXy5*XJ#=}ax{Bv@IfpKNs;j$hmppc< zg?0YlSeL%P#2fWf>=NhuitXCzG;E?P@X6cPr53u>LYKF%Yq;(b@8mjncwMH`OVq;u zW0#CvZk=~>-GXBeOT53I;`eozbVJGRD+Y+I;7op7rj#J$dnB&%SgCHqsCyBfn8b zMy{$OBkyaiR!eWS()gV+TdgzJ_;^O1JJ++%o%@tL9_{U)VZX|L-y@Hqno5Q2_dPub VR=HDGdB3i5|DMWn`KdiT{9ihWdm8`% literal 1756 zcmb7?Pi)&%9LHb%Cvjfl_&N6Tvt8%KZrUV{yR=EWHAE9F=_SgDx>Z?MqEsoUt6HRV zYnP!(%TNzKB2I_{N5lzn;D|UOgmy%nIB`UrI8~ew(s*fF*q?R?TY7r_e81nHzfbnb z#L0#C9}|#!oBM+Mi%aoe@t^X)aqsg5{+M4Bn!>j5f$)*=xqw6@{w})QLF8NRC+^}o zV|wi+^*!zp_wh^Y^8B0pX5@19V&&`qop^Q5_xun1Q~nqJgqH*=ysDo}To>2HJ@G?v zq+)FhX-C-Se&N}RzcQ6AB5oFFAfjw^r zlgOE+vp`9qR8=LYrX#(o5w)h&QZ=AxNDI`e5g1HO)%2QH)vI81LA{H+MwfK8ZmMf` z^*v+H+Io>%TO(?AFQLjf&$4WWy~Uh+&K7u%I%kY-0e#eY@}JIDIPPo)HX`BqN$9Mj zQWYqSh6LH{d=5L`8MSn5;FPAfbuHC4+J;7SO9!Xa(#`gyZnvFwTDOcz<6mkSV>)T1 z4L}Xox@XLryBW{g%}_c=9+N{rP1kN4C2QC7$gY{T=Bx+K zg@dWh+`)9K$f(!P^s_9T=`-5OZWa$1wXjAI)rp1?RbACNqDStLC^le2X^dCBK^xgd zp#e+9(z~Vg^6heY(JZel&Rw;yhCo@ky-;3QS-iivzj(KLc&)G$UJrq_bbo1o>F&zm z%G`?mhWS>w9Il1{;vIZTw@i!NB0KJScHMh2{RBXpc%hARMlQ@5z8Qo*`SojS zr+fKcvFEQAiiQ2)2K#gBcGK{Sy+Zj)FSy|si>p^w&*_=>lm`1iPgS&vTG1=0qEv9j KsH7J%3*c|gj+Au( diff --git a/PKHeX.Core/Resources/byte/encounter_rse_swarm.pkl b/PKHeX.Core/Resources/byte/encounter_rse_swarm.pkl new file mode 100644 index 0000000000000000000000000000000000000000..c161b4fff8c2f1c3cd3c00eb8eabceff880437d2 GIT binary patch literal 188 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 literal 7763 zcmds+TW=fJ5yxj_QA<)3Dak96%OzKr)n#`@(bQe4Wm!>_Sf*>kj3ihf{(!?kc|!Z(xbpgT+KD{lMyJ+f_&lq_?9f0>7d$}DvwBV`^Q_Q-KO z3S=u>dOoLjYuW2?yAHSOUlF&KwT}_XDEIx*8pb~VH%7aF=!gB();7eNHpC)>vOI@E zLmUo2EoYUQrnwXjJ5Y7d%%w;~PpyYWOu}-0ohDnKl97ZVRD2SmP0XdX)(2KGTdim>0t*2+1E8rVhW?g>?EK^U< zOPowD6M*!~zAUNvO(d2%k=Vp%CUO~{-3sKN@a)&&6I|iW&J}!qw^6=LFDNzB+~RC@ zi!+%mHjFLK<+eDT-r`hh3)ZX8LH$=!%`|sdFpM1xV24lH$>yt>=A=KHx!j~blcqUD zx!e#L#t@li5}iz9rjuxs3_2;3FOw?^A&X#HY9VA1ve_Nf?VxT4<=1^ys$n{anL!YH zGS=7s=~|J+NA$B?>g{!@ug^uybSay4(Os7Y23*8Zk=1xQIOx&;w;Ccx<5Qvz5npB{ zo|D^W+5oH1wr^^vSyqAj`U*TSP{7Z$+Hy~BxBm&XmsK2^S3KmH*oQ%B7`&m+%s+4IIxH+dv=vYacRgcH}5BVJ}$3yc*ieVBrh z7%6Z*?@>Nq@Qrxh6rRVyltfk50gOsb<|z2$a?YO%MRUA%b!YJMM|k7L%WLf zQl!v>@(6yQM(|^mL|G+A25#dTi6XU@zgJD2q}}SCV!*$%(6j+R-PSZ68M}@;4N`;5 zL*}_p^|qr!!zMhBS=PXLln=2{WwXwsJdZj>N5|LjTyN@X?T^}_wqLnTr!`E%G*Uhd zhzx@nOcbssfn<(?WRZsPS_6}`SP8X@xHVhE_0=M-uNHYg+$J#p8q9@ZR^%uWRdFkF z6zejI_c!r;6Yp;}?AEZv^+~t38g12W*mr9fhd5Lyx2Aarw{O7Z8@@}!Xk?OWe}sd| zt(siPwZk~EN{+2Yo6U~mB$Y=O)C5b4-qF#vQ5=3geIIE?-<@U{ahqYp zYle~0(;KOOO`fl3_IPY;53zj@XWczq zd+y>{0_4=M_pzr6N-N?H*v#Ec;6q{jWyctI3Who3q%(wlhnajP6do&4U z>yUZevE?D9yn(v+@VtTYdlbPDea6SKXOI-llHtsfee&NPhMX_%AYHnH7Q$Ujz+F7w zrFnQIar?O9_A$(g+fN_^w^F{3y3gVEKFXg%LoU06UV5|gV{utCRfJFUIq4X)_ zCy?uqdB_Kl;_v}5VC=zDV~}yoG&Tl8k7~I!jQVa{>Mz^rZxY%XHB#$)n1B)7rRvsO TtXm&p^l#x8@7q3;^Gh< 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 diff --git a/PKHeX.Core/Resources/byte/encounter_sn.pkl b/PKHeX.Core/Resources/byte/encounter_sn.pkl index 67c2861c6ab6e13b9650c49e6fc91b64be01696e..56ec38d8727e80cb6cc932121482c1f30f86a620 100644 GIT binary patch literal 7188 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 HuciM#p!1s3 delta 1323 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 literal 27278 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 CI}x1# diff --git a/PKHeX.Core/Resources/byte/encounter_um.pkl b/PKHeX.Core/Resources/byte/encounter_um.pkl index 4b758a12531ac972f7a5296db61985f70fe930c0..735957b2d8ffec1fda72739fac0fa27a20e528a3 100644 GIT binary patch literal 10400 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 O@vp?+l7BPlPWTrF15%;@ delta 1301 zcmZwHe@NVQ9LMq3eK)=DdFSc5Tkh(vot~@Ry5(}0I+d{4n$@aVE2Oy;DzLSMgo_c8 zqavh6jNZ~D#*jERTe2N7Vuar^AM5#P_h)}Re0}cw`F?(U zKkx6?$=->^(IZC=su+-lJ!#t-X%dmO(wpe2kj8KcC9L2ER`EBIl~Nu(7(xL>%wqux zN_%k>7ZLZRZVciWCVh>nKw}EiSVe6}+Ke1VP(TSQ$XBr#_TU&MF^zd_2y+c3Y=|%( z-55gwQhN?%ULo|kQ2{Ty0H7p?>Wl@Y{74aGdVFX1iU~jFo4}IvzFplE{ z#xa3u6fuL#_!d|3eV#w_Sim(b;b;7U5>{{ntMFqy87ggH&DWI4FK3ngwDzzon>|_a zG8rxZt}XZ1*>9DPa6N8q!L8(NF4r*^6}lZs+=)gz8*FHnn)Hyu(cOV?wB&`O5zIom zOZ}=0eHN$;Wyvd`QubFc#hhEL-rvDt>WSLeR;d!KTfvV zO@9;FZg+=vkRA3y=m6Peb0K%%1NKMA&D&khoz`5HV*ZDjs|Sx_kL|D8#XV2hh2;9+ zqUX_m%4Vz9v*tefpS8vR`ui*scF+BsJsp0KzJB_icVq96UQ~-8ujg#)v-lGfnEr$I zPxwB@9J1z!TlZC-E0vaRpzk#sjkxtkthxFn^7V2awUgCb?~&fnV}2_AJL7f+ zQt4LkS!uJE&TRM7nVvv8BROxmdD?h;b=_-dYQky!iZg0xnu7E;dwN&xULx7&Cz4%c zuM$b=J$ohk3~P_sT-5F9eY+lQ;2DnV)_J%y`H-hVvxx)3UYUM3;Z>wZObsdd)zryeED*QgOR~7ub PDQPeei%YTiP0!`Oejegr diff --git a/PKHeX.Core/Resources/byte/encounter_um_sos.pkl b/PKHeX.Core/Resources/byte/encounter_um_sos.pkl deleted file mode 100644 index c707614f7fec8b3a248d3253bffed99b5997d898..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5708 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 CDOkS% delta 1283 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 L;w82do`wGfMede# literal 33832 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 E|No5I%K!iX diff --git a/PKHeX.Core/Resources/byte/encounter_w2.pkl b/PKHeX.Core/Resources/byte/encounter_w2.pkl index d1dff5da45bb998f36fad82952f5da542789d1de..20174474603236eb2e467e7e8a6f0aa9f92dd325 100644 GIT binary patch literal 20780 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 Ktnryu0sapXmx_1* diff --git a/PKHeX.Core/Resources/byte/encounter_x.pkl b/PKHeX.Core/Resources/byte/encounter_x.pkl index 514be6e1d4273ab0b355cf0dcd59ae925ba6bf9f..92e1b7b0f0d00b801dff3716a95250db0904c9b4 100644 GIT binary patch delta 1352 zcmY+BOK1~O6o&82oobDFG@78Uif9q((uHWnVnL*c z6hUVth~h#J(Spoowp}W?5OgO#aOXm(t67Nn-I<~2;%ENvKj%y`=iGT>yu4#9EnJ@! z3x*J$DTFVDup5L}*aUBe8{rtd6^_FRI0ZMsX?Po)ft%qLxE0A0C8<;9>X>JObNr2}X7qMjrB!U4fB@d}J#a zdB{ihD2zPhk1i365g-rw$UY1s5BbO*hmnVTWKY1zLq4*Pz{o>BvX8>ZLm$vr^cyu! z3Xwq_s28zN;k^D*F=SE*_l!AeNcQS}lo*!kPB&oMFz+^Dx@aCquQ{6Be2=@OgK%o2yY4*h%E=QHjJ*_U6s8*n+|^v% zkf%1f`kf#7YQXE=>rU1Pyu04b#ObIhUs#lNUh}O$c=n&k+CWv#Mz4(x^4jxs%?!~s zhj~AYxfrxxa8`?- zG83=InYfMVI}(~`?UT;xq%D^z>^nwb1@m+&GWV;PdnAb(CN2`pjB@+%*%Uo9;nQjp z3E{*V6^9QSa#10#3peA6V+RGRM+a9^iX(@eg{Uy73qQ6itEkPTW@XvhoZF$eX*fHk zgIZQ`%P^SK!BnT>j$v>@2V*&9)gr^K!U|8}6nYeQ3WK^1vi*u1g~6;2T85N$UYiHQ z%9_(ASya|VZSIaJjuQ6H>)=*dS%LXeQQRP`T-KGJ6N-I@!LknKrj)g!&FABatp=4V z^TH4(MXB^$lq+w|Ql&+dD&Nr!vr_4z)^5h)+fg3>Oe9k!Bbh3rN9YN9_$!&JQ(G{5 g3)jrPzT5benM%(fJMhh|GiGz^3jVq1Exe`gFHtueZU6uP delta 969 zcma))Jxml)6otPTeuBDzg)9O26LgUg7FcnCmHlA_B&Y-lp&*7BVu+#G!oor`lW0K< z1u?|2uprUG!h*u&T9_;ag@uKMg@px$r3J;7B)f(0%>$!URBz5b_uO;td$Y4)ZM?Of zJ$X9JKCooNj|!Ntf^XF@Qv+YlK<*suh9FrBpXwl94?7LuMBsfRbT+|uGc>or>sAQ2 z!)6E6bi#U<8hi=7C>(af;~pqFkne@xeX!ckeSQtVavXkMg~e;|Jpr>L@O2cXuEX9K zq|@*@1Br3?n1k2^e3*pjO?WpAZ8PxZ7DVpA)+~hPVB@Yj#kDfltBR~uD+Swpg{4%H zvHYT)wIiq_F8QiZ(9jPsk5rpOX*fe zw-)_;Xg1(_r4UkFIpAW3JE#pfd%#RB*XgO&kho!Om`nCk2wa)aq%cjR}f}NN?l4cKN<1EIY-g=j6*DHu58&v z*omqLUQXMrNTFLN%<1?K3?1uHbUCQ3>dK10?d<#M8@m6YxK~uaez!F#^lE8PUz1Xw z0_7u+>Nh|QT{98#gJwyk8vLtzB&E0l-h>{#E~%m5x3brfqFrhE&l5@gv@fKP(Bp!x dO(_j45Y9!^nvRm4rjQyvAvsZaDQ+^b{sTrG2W56Iv2>bCQ=@jV@zOM@>Ex~P%*?N;nSl)hMZy#kCJ`=OL>Wm!ghWVC zXBC9fB8Vs<&gN`gCbS4@7hP!QBCyq2MD+aU93oo0ocDR(?;r8|?yqUD?rTd6x2DB{ zCWNaC;Tb|$H9{=xfOo>Ra0K23N8uQpfOo@5cn_R{>){5t5#A3UfDgh=a2jrgTi{ms zFr0ypz*(^*tagG9f=+^C40OXe_&D4H_rd+}0DJ--ge|xLBdZ7_7kS7k!N^4(vLuXL zCuQ!sMT2lN&FLbc;U zq)-d$LM&9+Z@!c?BQAt#^5kWrLMEg*Zjme+Bz>dXp3^*Ll4MlgD(VFs#;TZNwD+d9&P9 zHdu|5JVe3&=>L^U^P<83;ncMdPW+v&+N*6DW0FEUOi`gYSJUgPXQG;M{_j+ey_GHd zyxrd6tR7AIrL*16lMCTgHn(V0`JHb$!b|@=t@M_S>F{?Wef;hWQ&as+&0^jUV6OV( zSM2rtC*vC7+d;xP!j0m#oiCP^cQ%Sah^f)+v}XAeYRzhcFNggp|3!ABY|QiG%?K~< zVYc zgMmy~WL0q|D!H;>n4K!Pk&s+Bn9PMmpDMQYN;9v_wR&k<%3R(jIco5BSOt}|#gY}IeB&k0SO6@|hJ zQ7mohg;Ikkl)j_eda2Y#*Q`gPdr=nuT*MOvEuJW%r)Uj5`58}C=@#^^+)cf^`yM`_ YCz4ah@_l{dlwRMsf`1{pa+}Qk0W3Ng(f|Me delta 969 zcma))Jxmi}7{`Bid<3xYgM;QS(SaBS zVu~fe|LAyZ`fl{vYqXx3ghvyfvOZ zc{Nschk@|18;6Y><(qT;dpK4ur1dI_+u%-PTWRqp4Am6!d$N@$eof>lXlN(YWnbKTdm>IZj0NZbpbi2bxApBjT}uD!jyyd zFl9k99ctSf*F_h^z3?A6#vB2axOiBmD=4!hr7k6!pN#oY$5QmYFd-2S63peW!cJUO z@EjepB86_<(9!iDgmj`u(dA&WswXS{wzcouH}w8Paj&R-eQ#@0=+)9-z9ywU1U;6wOM*f1XO~t9>Dbl(q}DHl;MI ZK-7t;V_Hgfnn7mtgyh8FrMT%J`Y#h$2I~L- diff --git a/PKHeX.Core/Resources/byte/encounter_yellow.pkl b/PKHeX.Core/Resources/byte/encounter_yellow.pkl index 16718e6323942919027b3aaeeb23659a3dcc5060..25051356c0258d31dcf0f8e5f6d8fcef3dbc2ca2 100644 GIT binary patch literal 3608 zcmb7{&vO&!8OPuKy(`JqO1qNvYu77Fw!E^jLGjqe5rIHqgghBT;u@LCHDglZq%;^X zwg{wz)-z#B(#cFX)r2?*zkn_H93H_FFm)kjpat7-559y)@B{*b=WqeG;S2Z@{tizd zFnJCa;3N1ed&cqdQe1bHv8K?pCSy%GnQSVt*smDd z5&8U%FZwp1SB~^7~S#}hDtFmls{M9whF;vwyb=|fM z;}TjY(khB0t7@RAs;BZ?)3iX>b!-$>A(HoK-;s9gJjh&IHSK-}#v{_-(Y7>)KK_>&UKql=(+h z$4P0q+)=$ys2Pq^Gjq9`mCIdzj<%+wGjh3Ort2QFipAfd4TNob68n_X=|D-RJvE)q zu-~$tPWwhW?V`dk^DnRmhxr$x+@{kh=3g)!$F)+aE6jhkUbmP(L0zBZyllBt zN-3q%gjy_~)QZJP-SbWvp7(}XD7;|}4{r%sSz`Sq)>wE;iOb39F%jp z6nAMtEtO7crP8GC`=<=wKWG+?pQ`-v&&J<3=J(Sxtycsa?4tw zkkN;RvebcV=JT#qDBM81EDD9JR4gvbz_wGFYv@2w-g~#;0t;Kn@@TZo_Z_cZw<5}dOWmYOJtFPU! zjb4;P-#<;hdM_})7tMFw)6DO&{%O{~$@}l$`+)&l1|=T1sZEFVUFs!eaQ~^zl$A{0 ze1WxY{>;0+$6A4qWlxgjc^Uu1Cj-3C(^PdHpUfDtoH123W9j;P%zxV7k5I?AgcK`_ zF!ZG`oR_QBvNAd8tCN#iZG3!Q55uf+;J{%s3=dmVQ@5h|`FxXJaD=@cVXwDYe?lY@ zC#6K9zt;(6aPXu$IB2uigZjY0K?A=t*)R9-HuInL$oHcf{Qu^^&-@K~)&{k5k#p_) z!0%Z2n6X%eKC!Rmxx_Pa5OUsOq)jA3a!@fW zt3pqySOWupq^C4QI^B>Qry-|O4eo4%p3op)4Ly@-7}@Mgrsutc@9dGAHutD44G*_D zn^39MLe8eGh2gqBF|p3sEOIuB*7P*mSX-czs@1j}h9T!zS8KIJZE|v5KX72(n4Ugi z)@moLdVN1`wOW^mg?3#zbf~RPO)V1lgkGQcE2@2s%ckvdX<%{YlF+ ziDxp;xc81aG2vG+N@HMM7^ z(|er7Jt6sl$Yeap^DfER><3CF6i-@ivq|M)%hDRuUMJNfij{~PI3#{NVtg!G^`y)~q6Ld9{~^wzfK zx*>IQ98WopryRF3nSHJ6wk5{sjUhP*)oiw{p~L^yjlscn^0jVdv-hJrQ7mrIFG6Z; z1Fx>r2bVO@3+dSx@#+=cbp>Dlx3*a9YwJp}coAP;;k#i2U#}b0>XJD;e1_WXYwH3X zIoObi6={8cg?_Q24-c>4!RO3U>6{e=`&#Nd()#{IB?wlcxIs`SUm^8)&O~pGjG!eC z>GTHub%Wm0j~lA2%b6`vk0E!hPJgRg)$0AoTl4uAe%0c9dw6?GtyFsSp_V>A-s2s5 z#O=`w??>K}&-eSlMHvk>_7QvN(#yM?d6!!1DnmnEdR~`W>XMtTkBqc7UChkXrNf68}*|n`Q=4@=9NORiB^VGhTi5vN<<**=jVK07;Y%+Bti-Lsm_k0X!I=Xa$_Wf$!(+Wj&9ci^t?@?N`2v-xLYo)x}- f7TxP|x%{RA_)14Bmpl6C=M`KW4S>)vZ?} z?e(oRbB}q!{KsJSH})s?Pv#kWhy9lQoco&lj{AZ8nfsl)#~<^j!W8qD@RIq38J%ZH ztJl28%wy*HHFk4+oBdU|**n@(N{r?oL;q&~VgF?X&gKHH$&HG9&cEPa@_+EL4}Nry zanxfP3od)DC$tarJR__MyF!|u;;a1YEB$;g{3v|$w)&Uss6MZJ?JP%@f1f^m8{}oj5HugZ~`UPAcQE6 zWea>EQ5a2GY5AH}a7BVpLJE`)Wh5UeGM3SyjA=Z9p-d1_LL90@uA{nI2NEW7sMJ-W z5jDj1iJsEadO(6Zw5uJwBYU!=?O+V+3e_4#qhUi^wu)B6DLEVF{mgw<+PY@jcw53y zgBVF`Xib+TV_o()cVx8tPBP+7w+^0^YA2?Kdc@EizA3ld!G#mPYE89i8;g;MDYr$Ov(vW)Z zQ$tg=_9W8VIx^dns;(K>#K17ymS(l>w!P_YI-1?~Hl5GFXstWp?7le^c1*`rw+B*q1Je6 zJp_Q~n_^RH4)3_>HgnC{=4dJ@#OPani{y#D!4MTEy&A(zkqPOCk1=)-gLV zwJ5cG`$+FN{k)&q%4}2W=ZQlzxJPCu(|0@ep0~#vv?{IqRgSJ%x?&UaRO$A;BfH~u zEPsx;ds8zSw*`2D*)PNZ8%&ya&MYGuJ=DNB4nSCI>+Z9m}&vdEn z6H0URZ5q#FvR}mdpp2D4dH@VMp=cbYpiC!5!ZIBgNgnyN#K5okbFE6Lvaw_@FD}nl z2CD-gE%_^c(5l+O+3KKHs%@;E*Uo{l?0@1{T1#hl&Q}N3i%$oY2f+g%x;wd@>~8jW z`Z(L2?#}FH_or!JBum_UwUjNnvl^++X=J6m0>n(14@p=e1;5mq>&^EH>;5{B@?ps* x;bN~Gl9s0DW>NQe z^X7dPUO>D7S_Ts&V351aS&No*4+sRpW|d8rjG5Mh8Dv0<4;}&Qr#@zy