diff --git a/PKHeX/Legality/Core.cs b/PKHeX/Legality/Core.cs index 1127592d9..ca8550651 100644 --- a/PKHeX/Legality/Core.cs +++ b/PKHeX/Legality/Core.cs @@ -187,6 +187,15 @@ private static void MarkG3Slots_RSE(ref EncounterArea[] Areas) { Location = a.First().Location, Slots = a.SelectMany(m => m.Slots).ToArray() }). ToArray(); } + private static void MarkG4Slots(ref EncounterArea[] Areas) + { + // Group areas by location id, the raw data have areas with different slots but the same location id + Areas = Areas.GroupBy(a => a.Location). + Select(a => + new EncounterArea() + { Location = a.First().Location, Slots = a.SelectMany(m => m.Slots).ToArray() }). + ToArray(); + } private static void MarkG5Slots(ref EncounterArea[] Areas) { foreach (var area in Areas) @@ -338,11 +347,23 @@ private static EncounterArea[] getTables2() StaticHG = getStaticEncounters(GameVersion.HG); StaticSS = getStaticEncounters(GameVersion.SS); - SlotsD = getEncounterTables(GameVersion.D); - SlotsP = getEncounterTables(GameVersion.P); - SlotsPt = getEncounterTables(GameVersion.Pt); - SlotsHG = getEncounterTables(GameVersion.HG); - SlotsSS = getEncounterTables(GameVersion.SS); + var D_Slots = getEncounterTables(GameVersion.D); + var P_Slots = getEncounterTables(GameVersion.P); + var Pt_Slots = getEncounterTables(GameVersion.Pt); + var HG_Slots = getEncounterTables(GameVersion.HG); + var SS_Slots = getEncounterTables(GameVersion.SS); + + MarkG4Slots(ref D_Slots); + MarkG4Slots(ref P_Slots); + MarkG4Slots(ref Pt_Slots); + MarkG4Slots(ref HG_Slots); + MarkG4Slots(ref SS_Slots); + + SlotsD = addExtraTableSlots(D_Slots, SlotsDPPPtAlt); + SlotsP = addExtraTableSlots(P_Slots, SlotsDPPPtAlt); + SlotsPt = addExtraTableSlots(Pt_Slots, SlotsDPPPtAlt); + SlotsHG = addExtraTableSlots(HG_Slots, SlotsHGSSAlt); + SlotsSS = addExtraTableSlots(SS_Slots, SlotsHGSSAlt); Evolves4 = new EvolutionTree(new[] { Resources.evos_g4 }, GameVersion.DP, PersonalTable.DP, MaxSpeciesID_4); diff --git a/PKHeX/Legality/Structures/EncounterArea.cs b/PKHeX/Legality/Structures/EncounterArea.cs index 90fdf6926..5d66a15e7 100644 --- a/PKHeX/Legality/Structures/EncounterArea.cs +++ b/PKHeX/Legality/Structures/EncounterArea.cs @@ -235,13 +235,13 @@ private static IEnumerable getSlots3(byte[] data, ref int ofs, in { int levelmin = data[ofs + 2 + i * 4]; int levelmax = data[ofs + 3 + i * 4]; - int Species = BitConverter.ToUInt16(data, ofs + 4 + i * 4); + int Species = PKX.getG4Species(BitConverter.ToUInt16(data, ofs + 4 + i * 4)); if (Species > 0) slots.Add(new EncounterSlot() { - LevelMin = data[ofs + 2 + i * 4], - LevelMax = data[ofs + 3 + i * 4], - Species = BitConverter.ToUInt16(data, ofs + 4 + i * 4), + LevelMin = levelmin, + LevelMax = levelmax, + Species = Species, Type = t }); } @@ -261,13 +261,13 @@ private static IEnumerable getSlots3_F(byte[] data, ref int ofs, SlotType t = i < 2 ? SlotType.Old_Rod : i < 5 ? SlotType.Good_Rod : SlotType.Super_Rod; int levelmin = data[ofs + 2 + i * 4]; int levelmax = data[ofs + 3 + i * 4]; - int Species = BitConverter.ToUInt16(data, ofs + 4 + i * 4); + int Species = PKX.getG4Species(BitConverter.ToUInt16(data, ofs + 4 + i * 4)); if (Species > 0) slots.Add(new EncounterSlot() { - LevelMin = data[ofs + 2 + i * 4], - LevelMax = data[ofs + 3 + i * 4], - Species = BitConverter.ToUInt16(data, ofs + 4 + i * 4), + LevelMin = levelmin, + LevelMax = levelmax, + Species = Species, Type = t }); } @@ -288,7 +288,6 @@ private static EncounterSlot[] getSlots4_DPPt_G(byte[] data, ref int ofs, int nu int level = (int)BitConverter.ToUInt32(data, ofs + i * 8); int species = (int)BitConverter.ToUInt32(data, ofs + i * 8); - slots[i] = new EncounterSlot() { LevelMax = level, @@ -334,7 +333,7 @@ private static EncounterSlot[] getSlots4_HGSS_G(byte[] data, ref int ofs, int nu ofs += numslots * 7; return slots; } - private static IEnumerable getSlots4_G_Replace(byte[] data, ref int ofs, int numslots, EncounterSlot[] ReplacedSlots, int StartReplace, SlotType t) + private static IEnumerable getSlots4DPPt_G_Replace(byte[] data, ref int ofs, int numslots, EncounterSlot[] ReplacedSlots, int StartReplace, SlotType t) { //Special slots like GBA Dual Slot. Those slot only contain the info the species, the level is copy from one of the first grass slots var slots = new List(); @@ -344,7 +343,7 @@ private static IEnumerable getSlots4_G_Replace(byte[] data, ref i if(ReplacedSlots[StartReplace + i].LevelMin > 0) { var Species = (int)BitConverter.ToUInt32(data, ofs + i * 4); - if(Species > 0) + if (Species > 0) { var slot = ReplacedSlots[StartReplace + i].Clone(); slot.Type = t; @@ -357,6 +356,29 @@ private static IEnumerable getSlots4_G_Replace(byte[] data, ref i ofs += numslots * 4; return slots; } + private static IEnumerable getSlots4HGSS_G_Replace(byte[] data, ref int ofs, int numslots, EncounterSlot[] ReplacedSlots, int StartReplace, SlotType t) + { + //Special slots like GBA Dual Slot. Those slot only contain the info the species, the level is copy from one of the first grass slots + var slots = new List(); + + for (int i = 0; i < numslots; i++) + { + if (ReplacedSlots[StartReplace + i].LevelMin > 0) + { + var Species = (int)BitConverter.ToUInt16(data, ofs + i * 2); + if (Species > 0) + { + var slot = ReplacedSlots[StartReplace + i].Clone(); + slot.Type = t; + slot.Species = Species; + slots.Add(slot); + } + } + } + + ofs += numslots * 2; + return slots; + } private static IEnumerable getSlots4_G_TimeReplace(byte[] data, ref int ofs, EncounterSlot[] GrassSlots, SlotType t) { var slots = new List(); @@ -389,7 +411,7 @@ private static IEnumerable getSlots4_G_TimeReplace(byte[] data, r return GrassSlots.Where(s => s.Species > 0).Concat(slots); } - private static IEnumerable getSlots4_WFR(byte[] data, ref int ofs, int numslots, SlotType t) + private static IEnumerable getSlots4DPPt_WFR(byte[] data, ref int ofs, int numslots, SlotType t) { var slots = new List(); for (int i = 0; i < numslots; i++) @@ -411,6 +433,27 @@ private static IEnumerable getSlots4_WFR(byte[] data, ref int ofs ofs += numslots * 8; return slots; } + private static IEnumerable getSlots4HGSS_WFR(byte[] data, ref int ofs, int numslots, SlotType t) + { + var slots = new List(); + for (int i = 0; i < numslots; i++) + { + int levelmin = data[ofs + 0 + i * 4]; + int levelmax = data[ofs + 1 + i * 4]; + int Species = (int)BitConverter.ToUInt16(data, ofs + 2 + i * 4); + if (Species > 0) + slots.Add(new EncounterSlot() + { + LevelMin = levelmin, + LevelMax = levelmax, + Species = Species, + Type = t + }); + + } + ofs += numslots * 4; + return slots; + } private static EncounterArea getArea3(byte[] data) { @@ -459,7 +502,7 @@ private static EncounterArea getArea4DPPt(byte[] data) Area4.Location = BitConverter.ToUInt16(data, 0); GrassRatio = (int)BitConverter.ToUInt32(data, 2); - ofs = 4; + ofs = 6; if (GrassRatio > 0) { EncounterSlot[] GrassSlots = getSlots4_DPPt_G(data, ref ofs, 12, SlotType.Grass); @@ -467,23 +510,23 @@ private static EncounterArea getArea4DPPt(byte[] data) Slots.AddRange(getSlots4_G_TimeReplace(data, ref ofs, GrassSlots, SlotType.Grass)); //Pokéradar slots replace slots 6,7,10 and 11 //Pokeradar is marked with different slot type because it have different PID-IV generation - Slots.AddRange(getSlots4_G_Replace(data, ref ofs, 2, GrassSlots, 6, SlotType.Pokeradar)); - Slots.AddRange(getSlots4_G_Replace(data, ref ofs, 2, GrassSlots, 10, SlotType.Pokeradar)); + Slots.AddRange(getSlots4DPPt_G_Replace(data, ref ofs, 2, GrassSlots, 6, SlotType.Pokeradar)); + Slots.AddRange(getSlots4DPPt_G_Replace(data, ref ofs, 2, GrassSlots, 10, SlotType.Pokeradar)); ofs += 24; //24 bytes padding //Dual Slots replace slots 8 and 9 - Slots.AddRange(getSlots4_G_Replace(data, ref ofs, 2, GrassSlots, 8, SlotType.Grass)); //DualSlot_Ruby - Slots.AddRange(getSlots4_G_Replace(data, ref ofs, 2, GrassSlots, 8, SlotType.Grass)); //DualSlot_Sapphire - Slots.AddRange(getSlots4_G_Replace(data, ref ofs, 2, GrassSlots, 8, SlotType.Grass)); //DualSlot_Emerald - Slots.AddRange(getSlots4_G_Replace(data, ref ofs, 2, GrassSlots, 8, SlotType.Grass)); //DualSlot_FireRed - Slots.AddRange(getSlots4_G_Replace(data, ref ofs, 2, GrassSlots, 8, SlotType.Grass)); //DualSlot_LeafGreen + Slots.AddRange(getSlots4DPPt_G_Replace(data, ref ofs, 2, GrassSlots, 8, SlotType.Grass)); //DualSlot_Ruby + Slots.AddRange(getSlots4DPPt_G_Replace(data, ref ofs, 2, GrassSlots, 8, SlotType.Grass)); //DualSlot_Sapphire + Slots.AddRange(getSlots4DPPt_G_Replace(data, ref ofs, 2, GrassSlots, 8, SlotType.Grass)); //DualSlot_Emerald + Slots.AddRange(getSlots4DPPt_G_Replace(data, ref ofs, 2, GrassSlots, 8, SlotType.Grass)); //DualSlot_FireRed + Slots.AddRange(getSlots4DPPt_G_Replace(data, ref ofs, 2, GrassSlots, 8, SlotType.Grass)); //DualSlot_LeafGreen } else ofs = 206; SurfRatio = (int)BitConverter.ToUInt32(data, ofs); - ofs += 2; + ofs += 4; if (SurfRatio > 0) - Slots.AddRange(getSlots4_WFR(data, ref ofs, 5, SlotType.Surf)); + Slots.AddRange(getSlots4DPPt_WFR(data, ref ofs, 5, SlotType.Surf)); else ofs += 40; @@ -491,21 +534,21 @@ private static EncounterArea getArea4DPPt(byte[] data) OldRodRatio = (int)BitConverter.ToUInt32(data, 294); ofs += 4; if (OldRodRatio > 0) - Slots.AddRange(getSlots4_WFR(data, ref ofs, 5, SlotType.Old_Rod)); + Slots.AddRange(getSlots4DPPt_WFR(data, ref ofs, 5, SlotType.Old_Rod)); else ofs += 40; GoodRodRatio = (int)BitConverter.ToUInt32(data, 338); ofs += 4; if (GoodRodRatio > 0) - Slots.AddRange(getSlots4_WFR(data, ref ofs, 5, SlotType.Good_Rod)); + Slots.AddRange(getSlots4DPPt_WFR(data, ref ofs, 5, SlotType.Good_Rod)); else ofs += 40; SuperRodRatio = (int)BitConverter.ToUInt32(data, 382); ofs += 4; if (SuperRodRatio > 0) - Slots.AddRange(getSlots4_WFR(data, ref ofs, 5, SlotType.Super_Rod)); + Slots.AddRange(getSlots4DPPt_WFR(data, ref ofs, 5, SlotType.Super_Rod)); else ofs += 40; @@ -522,7 +565,7 @@ private static EncounterArea getArea4HGSS(byte[] data) int SuperRodRatio = 0; int RockSmashRatio = 0; EncounterArea Area4 = new EncounterArea(); - if (data.Length != 202) + if (data.Length != 198) { Area4.Location = 0; Area4.Slots = new EncounterSlot[0]; return Area4; } var Slots = new List(); @@ -537,43 +580,52 @@ private static EncounterArea getArea4HGSS(byte[] data) // 2 bytes padding int ofs = 10; + EncounterSlot[] GrassSlots = null; + 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 - EncounterSlot[] GrassSlots = getSlots4_HGSS_G(data, ref ofs, 12, SlotType.Grass); + GrassSlots = getSlots4_HGSS_G(data, ref ofs, 12, SlotType.Grass); Slots.AddRange(GrassSlots.Where(s => s.Species > 0)); // Hoeen Sound and Shinno Soundreplace slots 4 and 5 - Slots.AddRange(getSlots4_G_Replace(data, ref ofs, 2, GrassSlots, 4, SlotType.Grass)); - Slots.AddRange(getSlots4_G_Replace(data, ref ofs, 2, GrassSlots, 4, SlotType.Grass)); + Slots.AddRange(getSlots4HGSS_G_Replace(data, ref ofs, 2, GrassSlots, 4, SlotType.Grass)); + Slots.AddRange(getSlots4HGSS_G_Replace(data, ref ofs, 2, GrassSlots, 4, SlotType.Grass)); } else - ofs = -1; + ofs = 102; if (SurfRatio > 0) - Slots.AddRange(getSlots4_WFR(data, ref ofs, 5, SlotType.Surf)); + Slots.AddRange(getSlots4HGSS_WFR(data, ref ofs, 5, SlotType.Surf)); else - ofs += 40; + ofs += 20; if (RockSmashRatio > 0) - Slots.AddRange(getSlots4_WFR(data, ref ofs, 5, SlotType.Rock_Smash)); + Slots.AddRange(getSlots4HGSS_WFR(data, ref ofs, 2, SlotType.Rock_Smash)); else - ofs += 40; + ofs += 8; if (OldRodRatio > 0) - Slots.AddRange(getSlots4_WFR(data, ref ofs, 5, SlotType.Old_Rod)); + Slots.AddRange(getSlots4HGSS_WFR(data, ref ofs, 5, SlotType.Old_Rod)); else - ofs += 40; + ofs += 20; if (GoodRodRatio > 0) - Slots.AddRange(getSlots4_WFR(data, ref ofs, 5, SlotType.Good_Rod)); + Slots.AddRange(getSlots4HGSS_WFR(data, ref ofs, 5, SlotType.Good_Rod)); else - ofs += 40; + ofs += 20; if (SuperRodRatio > 0) - Slots.AddRange(getSlots4_WFR(data, ref ofs, 5, SlotType.Super_Rod)); + Slots.AddRange(getSlots4HGSS_WFR(data, ref ofs, 5, SlotType.Super_Rod)); else - ofs += 40; + ofs += 20; + + if (GrassRatio > 0) + { + // National Radio replaces slots 4 and 5 + Slots.AddRange(getSlots4HGSS_G_Replace(data, ref ofs, 2, GrassSlots, 4, SlotType.Grass)); + } + // 4 bytes padding Area4.Slots = Slots.ToArray(); return Area4; diff --git a/PKHeX/Legality/Tables4.cs b/PKHeX/Legality/Tables4.cs index 74ea6f381..caf50de1b 100644 --- a/PKHeX/Legality/Tables4.cs +++ b/PKHeX/Legality/Tables4.cs @@ -389,5 +389,87 @@ public static partial class Legal { //todo }; + + #region Alt Slots + private static readonly EncounterArea[] SlotsDPPPtAlt = + { + new EncounterArea { + Location = 50, // Mount Coronet + Slots = new[] + { + new EncounterSlot { Species = 349, LevelMin = 10, LevelMax = 20, Type = SlotType.Old_Rod }, // Feebas + new EncounterSlot { Species = 349, LevelMin = 10, LevelMax = 20, Type = SlotType.Good_Rod }, // Feebas + new EncounterSlot { Species = 349, LevelMin = 10, LevelMax = 20, Type = SlotType.Super_Rod }, // Feebas + },}, + new EncounterArea { + Location = 53, //Solaceon Ruins + Slots = new[] + { + //new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 0 }, // Unown A + new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 1 }, // Unown B + new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 2 }, // Unown C + new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 3 }, // Unown D + new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 4 }, // Unown E + new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 5 }, // Unown F + new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 6 }, // Unown G + new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 7 }, // Unown H + new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 8 }, // Unown I + new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 9 }, // Unown J + new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 10 }, // Unown K + new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 11 }, // Unown L + new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 12 }, // Unown M + new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 13 }, // Unown N + new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 14 }, // Unown O + new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 15 }, // Unown P + new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 16 }, // Unown Q + new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 17 }, // Unown R + new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 18 }, // Unown S + new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 19 }, // Unown T + new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 20 }, // Unown U + new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 21 }, // Unown V + new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 22 }, // Unown W + new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 23 }, // Unown X + new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 24 }, // Unown Y + new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 25 }, // Unown ! + new EncounterSlot { Species = 201, LevelMin = 14, LevelMax = 30, Type = SlotType.Grass, Form = 26 }, // Unown ? + },}, + }; + + private static readonly EncounterArea[] SlotsHGSSAlt = + { + new EncounterArea { + Location = 209, // Ruins of Alph + Slots = new[] + { + //new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 0 }, // Unown A + new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 1 }, // Unown B + new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 2 }, // Unown C + new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 3 }, // Unown D + new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 4 }, // Unown E + new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 5 }, // Unown F + new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 6 }, // Unown G + new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 7 }, // Unown H + new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 8 }, // Unown I + new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 9 }, // Unown J + new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 10 }, // Unown K + new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 11 }, // Unown L + new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 12 }, // Unown M + new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 13 }, // Unown N + new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 14 }, // Unown O + new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 15 }, // Unown P + new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 16 }, // Unown Q + new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 17 }, // Unown R + new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 18 }, // Unown S + new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 19 }, // Unown T + new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 20 }, // Unown U + new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 21 }, // Unown V + new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 22 }, // Unown W + new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 23 }, // Unown X + new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 24 }, // Unown Y + new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 25 }, // Unown ! + new EncounterSlot { Species = 201, LevelMin = 5, LevelMax = 5, Type = SlotType.Grass, Form = 26 }, // Unown ? + },}, + }; + #endregion } }