From bcf1e6331013deb64826aed3f6f7cdc4d1dd4e16 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sat, 22 Apr 2017 13:04:12 -0700 Subject: [PATCH] Refactoring Simplify EncounterStatic type check as it is gen4 specific -> gen4 specific child class Checks.cs: Move transfer legality check back to end as Gen4Result needs to be defined (not null) Rename EncounterType of Analysis class to avoid conflict with the EncounterType enum --- PKHeX/Legality/Analysis.cs | 24 +- PKHeX/Legality/Checks.cs | 143 +++++----- PKHeX/Legality/Core.cs | 19 +- PKHeX/Legality/Structures/EncounterStatic.cs | 46 +++- PKHeX/Legality/Tables4.cs | 260 ++++++++++--------- 5 files changed, 264 insertions(+), 228 deletions(-) diff --git a/PKHeX/Legality/Analysis.cs b/PKHeX/Legality/Analysis.cs index 4e96c138d..7b1f91cf0 100644 --- a/PKHeX/Legality/Analysis.cs +++ b/PKHeX/Legality/Analysis.cs @@ -14,9 +14,9 @@ public partial class LegalityAnalysis private List EncountersGBMatch; private object EncounterOriginalGB => EncountersGBMatch?.FirstOrDefault()?.Encounter; private object EncounterMatch; - private Type EncounterType; + private Type Type; // Encounter private bool MatchIsMysteryGift => EncounterMatch.GetType().IsSubclassOf(typeof(MysteryGift)); - private bool EncounterIsMysteryGift => EncounterType.IsSubclassOf(typeof (MysteryGift)); + private bool EncounterIsMysteryGift => Type.IsSubclassOf(typeof (MysteryGift)); private string EncounterName => Legal.getEncounterTypeName(pkm, EncounterOriginalGB ?? EncounterMatch); private List EventGiftMatch; private List EncounterStaticMatch; @@ -110,7 +110,7 @@ private void parsePK1(PKM pk) updateEncounterChain(); updateMoveLegality(); - updateEncounterInfo(); + updateTypeInfo(); verifyNickname(); verifyDVs(); verifyG1OT(); @@ -123,7 +123,7 @@ private void parsePK3(PKM pk) updateEncounterChain(); updateMoveLegality(); - updateEncounterInfo(); + updateTypeInfo(); updateChecks(); } private void parsePK4(PKM pk) @@ -135,7 +135,7 @@ private void parsePK4(PKM pk) verifyPreRelearn(); updateEncounterChain(); updateMoveLegality(); - updateEncounterInfo(); + updateTypeInfo(); updateChecks(); } private void parsePK5(PKM pk) @@ -147,7 +147,7 @@ private void parsePK5(PKM pk) verifyPreRelearn(); updateEncounterChain(); updateMoveLegality(); - updateEncounterInfo(); + updateTypeInfo(); updateChecks(); } private void parsePK6(PKM pk) @@ -159,7 +159,7 @@ private void parsePK6(PKM pk) updateRelearnLegality(); updateEncounterChain(); updateMoveLegality(); - updateEncounterInfo(); + updateTypeInfo(); updateChecks(); } private void parsePK7(PKM pk) @@ -171,7 +171,7 @@ private void parsePK7(PKM pk) updateRelearnLegality(); updateEncounterChain(); updateMoveLegality(); - updateEncounterInfo(); + updateTypeInfo(); updateChecks(); } @@ -197,14 +197,14 @@ private void updateEncounterChain() Parse.Add(Encounter); EvoChainsAllGens = Legal.getEvolutionChainsAllGens(pkm, EncounterOriginalGB ?? EncounterMatch); } - private void updateEncounterInfo() + private void updateTypeInfo() { if (pkm.VC && pkm.Format == 7) EncounterMatch = Legal.getRBYStaticTransfer(pkm.Species); - EncounterType = (EncounterOriginalGB ?? EncounterMatch ?? pkm.Species)?.GetType(); - if (EncounterType == typeof (MysteryGift)) - EncounterType = EncounterType?.BaseType; + Type = (EncounterOriginalGB ?? EncounterMatch ?? pkm.Species)?.GetType(); + if (Type == typeof (MysteryGift)) + Type = Type?.BaseType; } private void updateChecks() { diff --git a/PKHeX/Legality/Checks.cs b/PKHeX/Legality/Checks.cs index 37246d5a4..ea434d9b4 100644 --- a/PKHeX/Legality/Checks.cs +++ b/PKHeX/Legality/Checks.cs @@ -134,13 +134,13 @@ private void verifyECPID() if (pkm.GenNumber >= 6 && pkm.PID == pkm.EncryptionConstant) AddLine(Severity.Invalid, V208, CheckIdentifier.PID); // better to flag than 1:2^32 odds since RNG is not feasible to yield match - if (EncounterType == typeof (EncounterStatic)) + if (Type == typeof (EncounterStatic)) { var enc = (EncounterStatic)EncounterMatch; if (enc.Shiny != null && (bool) enc.Shiny ^ pkm.IsShiny) AddLine(Severity.Invalid, V209, CheckIdentifier.Shiny); } - else if (EncounterType == typeof(EncounterSlot[])) + else if (Type == typeof(EncounterSlot[])) { var slots = (EncounterSlot[])EncounterMatch; if (pkm.IsShiny && slots.All(slot => slot.Type == SlotType.HiddenGrotto)) @@ -166,7 +166,7 @@ private void verifyECPIDWurmple() } // Check if Wurmple was the origin (only Egg and Wild Encounter) - bool wasWurmple = pkm.WasEgg || (EncounterType == typeof (EncounterSlot[]) && ((EncounterSlot[])EncounterMatch).Any(slot => slot.Species == 265)); + bool wasWurmple = pkm.WasEgg || (Type == typeof (EncounterSlot[]) && ((EncounterSlot[])EncounterMatch).Any(slot => slot.Species == 265)); if (!wasWurmple) return; @@ -246,7 +246,7 @@ private void verifyNickname() return; } - if (EncounterType == typeof(EncounterTrade)) + if (Type == typeof(EncounterTrade)) { verifyNicknameTrade(); return; @@ -466,7 +466,7 @@ private void verifyDVs() #region verifyOT private void verifyOT() { - if (EncounterType == typeof(EncounterTrade)) + if (Type == typeof(EncounterTrade)) return; // Already matches Encounter Trade information if (pkm.TID == 0 && pkm.SID == 0) @@ -749,7 +749,7 @@ private CheckResult verifyEncounterStatic() return new CheckResult(Severity.Invalid, V383, CheckIdentifier.Encounter); if (pkm.Species == 492 && s.Location == 063 && !pkm.Pt) // DP Shaymin return new CheckResult(Severity.Invalid, V354, CheckIdentifier.Encounter); - if (s.Location == 193 && s.TypeEncounter == Core.EncounterType.Surfing_Fishing) // Roaming pokemon surfin in Jhoto Route 45 + if (s.Location == 193 && (s as EncounterStaticTyped)?.TypeEncounter == EncounterType.Surfing_Fishing) // Roaming pokemon surfin in Jhoto Route 45 return new CheckResult(Severity.Invalid, V384, CheckIdentifier.Encounter); break; case 7: @@ -813,25 +813,25 @@ private CheckResult verifyEncounterVC() } private void verifyEncounterType() { - EncounterType Type = Core.EncounterType.None; + EncounterType type = EncounterType.None; // Encounter type data is only stored for gen 4 encounters // Gen 6 -> 7 transfer delete encounter type data // All eggs have encounter type none, even if they are from static encounters if (pkm.Format < 7 && pkm.Gen4 && !pkm.WasEgg) { - if (EncounterMatch as EncounterSlot[] != null) + if (EncounterMatch is EncounterSlot[]) // If there is more than one slot, the get wild encounter have filter for the pkm type encounter like safari/sports ball - Type = (EncounterMatch as EncounterSlot[]).First().TypeEncounter; - if (EncounterMatch as EncounterStatic != null) - Type = (EncounterMatch as EncounterStatic).TypeEncounter; + type = ((EncounterSlot[])EncounterMatch).First().TypeEncounter; + if (EncounterMatch is EncounterStaticTyped) + type = ((EncounterStaticTyped)EncounterMatch).TypeEncounter; } - if (Type == Core.EncounterType.Any) + if (type == EncounterType.Any) { // Temp analysis until all generation 4 static encounters have defined their encounter type values AddLine(Severity.NotImplemented, V382, CheckIdentifier.Encounter); return; } - if (Type != (EncounterType)pkm.EncounterType) + if (type != (EncounterType)pkm.EncounterType) { AddLine(Severity.Invalid, V381, CheckIdentifier.Encounter); return; @@ -976,6 +976,45 @@ private CheckResult verifyEncounterG4Transfer() CheckResult Gen4WildResult = null; EncounterSlot[] WildEncounter = null; + bool wasEvent = pkm.WasEvent || pkm.WasEventEgg; + if (wasEvent) + { + var result = verifyEncounterEvent(); + if (result != null) + Gen4Result = result; + } + + if (Gen4Result == null && null != (EncounterMatch = Legal.getValidWildEncounters(pkm))) + { + Gen4WildResult = verifyEncounterWild(); + WildEncounter = (EncounterSlot[])EncounterMatch; + } + + if (Gen4Result == null && null != (EncounterStaticMatch = Legal.getValidStaticEncounter(pkm))) + { + EncounterMatch = EncounterStaticMatch.First(); + var result = verifyEncounterStatic(); + // A pokemon could match a static encounter and a wild encounter at the same time, by default static encounter have preferences + // But if the pokemon does not match the static encounter ball and there is a valid wild encounter skip static encounter + if (result != null && (pkm.WasEgg || Gen4WildResult == null || EncounterStaticMatch.Any(s => !s.Gift || pkm.Ball == s.Ball))) + return result; + + EncounterStaticMatch = null; + EncounterMatch = null; // Reset Encounter Object, test for remaining encounters + } + + if (pkm.WasEgg) // Invalid transfer is already checked in encounter egg + return verifyEncounterEgg(); + + if (Gen4Result == null && Gen4WildResult != null) + { + Gen4Result = Gen4WildResult; + EncounterMatch = WildEncounter; + } + + if (Gen4Result == null && null != (EncounterMatch = Legal.getValidIngameTrade(pkm))) + Gen4Result = verifyEncounterTrade(); + // Transfer Legality int loc = pkm.Met_Location; if (loc != 30001) // PokéTransfer @@ -1001,51 +1040,9 @@ private CheckResult verifyEncounterG4Transfer() } } - bool wasEvent = pkm.WasEvent || pkm.WasEventEgg; - if (wasEvent) - { - var result = verifyEncounterEvent(); - if (result != null) - Gen4Result = result; - } - - if (Gen4Result == null && null != (EncounterMatch = Legal.getValidWildEncounters(pkm))) - { - Gen4WildResult = verifyEncounterWild(); - WildEncounter = (EncounterSlot[])EncounterMatch; - } - - if (Gen4Result == null && null != (EncounterStaticMatch = Legal.getValidStaticEncounter(pkm))) - { - EncounterMatch = EncounterStaticMatch.First(); - var result = verifyEncounterStatic(); - // A pokemon could match a static encounter and a wild encounter at the same time, by default static encounter have preferences - // But if the pokemon does not match the static encounter ball and there is a valid wild encounter skip static encounter - if (result != null && (pkm.WasEgg || Gen4WildResult == null || EncounterStaticMatch.Any(sttic => !sttic.Gift || pkm.Ball == sttic.Ball))) - return result; - - EncounterStaticMatch = null; - EncounterMatch = null; // Reset Encounter Object, test for remaining encounters - } - - if (pkm.WasEgg) // Invalid transfer is already checked in encounter egg - return verifyEncounterEgg(); - - if (Gen4Result == null && Gen4WildResult != null) - { - Gen4Result = Gen4WildResult; - EncounterMatch = WildEncounter; - } - - if (Gen4Result == null && null != (EncounterMatch = Legal.getValidIngameTrade(pkm))) - Gen4Result = verifyEncounterTrade(); - - if (Gen4Result == null) - Gen4Result = wasEvent - ? new CheckResult(Severity.Invalid, V78, CheckIdentifier.Encounter) - : new CheckResult(Severity.Invalid, V80, CheckIdentifier.Encounter); - - return Gen4Result; + return Gen4Result ?? (wasEvent + ? new CheckResult(Severity.Invalid, V78, CheckIdentifier.Encounter) + : new CheckResult(Severity.Invalid, V80, CheckIdentifier.Encounter)); } private CheckResult verifyVCEncounter(int baseSpecies) { @@ -1394,7 +1391,7 @@ private void verifyAbility() } private void verifyAbility5(int[] abilities) { - if (EncounterType == typeof (EncounterSlot[])) + if (Type == typeof (EncounterSlot[])) { // Hidden Abilities for Wild Encounters are only available at a Hidden Grotto bool grotto = ((EncounterSlot[]) EncounterMatch).All(slot => slot.Type == SlotType.HiddenGrotto); @@ -1406,7 +1403,7 @@ private void verifyAbility5(int[] abilities) } private void verifyAbility6(int[] abilities) { - if (EncounterType == typeof (EncounterSlot[]) && pkm.AbilityNumber == 4) + if (Type == typeof (EncounterSlot[]) && pkm.AbilityNumber == 4) { var slots = (EncounterSlot[]) EncounterMatch; bool valid = slots.Any(slot => slot.DexNav || @@ -1422,7 +1419,7 @@ private void verifyAbility6(int[] abilities) } private void verifyAbility7(int[] abilities) { - if (EncounterType == typeof (EncounterSlot[]) && pkm.AbilityNumber == 4) + if (Type == typeof (EncounterSlot[]) && pkm.AbilityNumber == 4) { var slots = (EncounterSlot[]) EncounterMatch; bool valid = slots.Any(slot => slot.Type == SlotType.SOS); @@ -1475,12 +1472,12 @@ private void verifyBall() verifyBallEquals(((MysteryGift)EncounterMatch).Ball); return; } - if (EncounterType == typeof (EncounterLink)) + if (Type == typeof (EncounterLink)) { verifyBallEquals(((EncounterLink)EncounterMatch).Ball); return; } - if (EncounterType == typeof (EncounterTrade)) + if (Type == typeof (EncounterTrade)) { verifyBallEquals(4); // Pokeball return; @@ -1502,7 +1499,7 @@ private void verifyBall() } } - if (EncounterType == typeof(EncounterStatic)) + if (Type == typeof(EncounterStatic)) { EncounterStatic enc = EncounterMatch as EncounterStatic; if (enc?.Gift ?? false) @@ -1513,7 +1510,7 @@ private void verifyBall() verifyBallEquals(Legal.getWildBalls(pkm)); return; } - if (EncounterType == typeof (EncounterSlot[])) + if (Type == typeof (EncounterSlot[])) { EncounterSlot[] enc = EncounterMatch as EncounterSlot[]; @@ -1927,7 +1924,7 @@ private CheckResult verifyHistory() if (pkm.OT_Memory != 0) return new CheckResult(Severity.Invalid, V151, CheckIdentifier.History); } - else if (EncounterType != typeof(WC6)) + else if (Type != typeof(WC6)) { if (pkm.OT_Memory == 0 ^ !pkm.Gen6) return new CheckResult(Severity.Invalid, V152, CheckIdentifier.History); @@ -2001,18 +1998,18 @@ private void verifyOTMemory() return; } - if (EncounterType == typeof(EncounterTrade)) + if (Type == typeof(EncounterTrade)) { // Undocumented, uncommon, and insignificant -- don't bother. return; } - if (EncounterType == typeof(WC6)) + if (Type == typeof(WC6)) { WC6 g = EncounterMatch as WC6; verifyOTMemoryIs(new[] {g.OT_Memory, g.OT_Intensity, g.OT_TextVar, g.OT_Feeling}); return; } - if (EncounterType == typeof(WC7)) + if (Type == typeof(WC7)) { WC7 g = EncounterMatch as WC7; verifyOTMemoryIs(new[] {g.OT_Memory, g.OT_Intensity, g.OT_TextVar, g.OT_Feeling}); @@ -2180,9 +2177,9 @@ private void verifyForm() switch (pkm.Species) { case 25: // Pikachu - if (pkm.Format == 6 && pkm.AltForm != 0 ^ EncounterType == typeof(EncounterStatic)) + if (pkm.Format == 6 && pkm.AltForm != 0 ^ Type == typeof(EncounterStatic)) { - string msg = EncounterType == typeof (EncounterStatic) ? V305 : V306; + string msg = Type == typeof (EncounterStatic) ? V305 : V306; AddLine(Severity.Invalid, msg, CheckIdentifier.Form); return; } @@ -2360,7 +2357,7 @@ private void verifyMisc() AddLine(Severity.Invalid, V322, CheckIdentifier.Fateful); return; } - if (EncounterType == typeof (EncounterStatic)) + if (Type == typeof (EncounterStatic)) { var enc = EncounterMatch as EncounterStatic; if (enc.Fateful) @@ -3244,7 +3241,7 @@ private CheckResult[] verifyRelearnMysteryGift() } // No gift match, thus no relearn moves - EncounterMatch = EncounterType = null; + EncounterMatch = Type = null; return verifyRelearnNone(); } private CheckResult[] verifyRelearnDexNav() diff --git a/PKHeX/Legality/Core.cs b/PKHeX/Legality/Core.cs index c83efda90..74c79efd7 100644 --- a/PKHeX/Legality/Core.cs +++ b/PKHeX/Legality/Core.cs @@ -1316,17 +1316,20 @@ internal static List getValidStaticEncounter(PKM pkm, GameVersi int lvl = getMinLevelEncounter(pkm); if (lvl <= 0) return null; - // Back Check against pkm - var enc = getMatchingStaticEncounters(pkm, poss, lvl).ToList(); - // If there is only one valid encounter defer encountertype check to verify encounter type - if(enc.Count > 1 && pkm.Gen4 && pkm.Format < 7) + // Back Check against pkm + var enc = getMatchingStaticEncounters(pkm, poss, lvl); + + // Filter for encounter types + if (pkm.Gen4 && pkm.Format < 7) // type is cleared on 6->7 { - var s_EncounterTypes = enc.Where(stc => stc.TypeEncounter == EncounterType.Any || stc.TypeEncounter == (EncounterType)pkm.EncounterType); - if (s_EncounterTypes.Any()) - return s_EncounterTypes.ToList(); + int type = pkm.EncounterType; + enc = type == 0 + ? enc.Where(z => !(z is EncounterStaticTyped)) // no typed encounters + : enc.Where(z => z is EncounterStaticTyped && (int) ((EncounterStaticTyped)z).TypeEncounter == type); } - return enc.Any() ? enc : null; + var result = enc.ToList(); + return result.Count == 0 ? null : result; } private static IEnumerable getMatchingStaticEncounters(PKM pkm, IEnumerable poss, int lvl) { diff --git a/PKHeX/Legality/Structures/EncounterStatic.cs b/PKHeX/Legality/Structures/EncounterStatic.cs index 63a101703..0449b764d 100644 --- a/PKHeX/Legality/Structures/EncounterStatic.cs +++ b/PKHeX/Legality/Structures/EncounterStatic.cs @@ -6,11 +6,10 @@ public class EncounterStatic : IEncounterable, IMoveset, IGeneration public int[] Moves { get; set; } public int Level; - public int LevelMin { get { return Level; } } - public int LevelMax { get { return Level; } } + public int LevelMin => Level; + public int LevelMax => Level; public int Generation { get; set; } = -1; public int Location; - public EncounterType TypeEncounter = EncounterType.Any; public int Ability; public int Form; public bool? Shiny; // false = never, true = always, null = possible @@ -42,7 +41,7 @@ public EncounterStatic[] Clone(int[] locations) return Encounters; } - public EncounterStatic Clone(int location) + protected virtual EncounterStatic Clone(int location) { return new EncounterStatic { @@ -70,7 +69,6 @@ public EncounterStatic Clone(int location) NSparkle = NSparkle, Roaming = Roaming, EggCycles = EggCycles, - TypeEncounter = TypeEncounter }; } @@ -110,7 +108,6 @@ public EncounterStatic DreamRadarClone(int level) NSparkle = NSparkle, Roaming = Roaming, EggCycles = EggCycles, - TypeEncounter = TypeEncounter }; } @@ -125,4 +122,41 @@ public string Name } } } + + public class EncounterStaticTyped : EncounterStatic + { + public EncounterType TypeEncounter = EncounterType.None; + + protected override EncounterStatic Clone(int location) + { + return new EncounterStaticTyped + { + Species = Species, + Level = Level, + Location = location, + Ability = Ability, + Form = Form, + Shiny = Shiny, + Relearn = Relearn, + Moves = Moves, + Gender = Gender, + EggLocation = EggLocation, + Nature = Nature, + Gift = Gift, + Ball = Ball, + Version = Version, + IVs = IVs, + IV3 = IV3, + Contest = Contest, + HeldItem = HeldItem, + Fateful = Fateful, + RibbonWishing = RibbonWishing, + SkipFormCheck = SkipFormCheck, + NSparkle = NSparkle, + Roaming = Roaming, + EggCycles = EggCycles, + TypeEncounter = TypeEncounter, + }; + } + } } diff --git a/PKHeX/Legality/Tables4.cs b/PKHeX/Legality/Tables4.cs index 01b8967d4..d9dc785d9 100644 --- a/PKHeX/Legality/Tables4.cs +++ b/PKHeX/Legality/Tables4.cs @@ -433,76 +433,78 @@ public static partial class Legal 47, // Valley Windworks 49, // Fuego Ironworks }; - internal static readonly EncounterStatic[] Encounter_DPPt_Roam_Grass = + internal static readonly EncounterStaticTyped[] Encounter_DPPt_Roam_Grass = { - new EncounterStatic { Species = 481, Level = 50, Roaming = true, TypeEncounter = EncounterType.TallGrass }, //Mesprit - new EncounterStatic { Species = 488, Level = 50, Roaming = true, TypeEncounter = EncounterType.TallGrass }, //Cresselia - new EncounterStatic { Species = 144, Level = 60, Version = GameVersion.Pt, Roaming = true, TypeEncounter = EncounterType.TallGrass }, //Articuno - new EncounterStatic { Species = 145, Level = 60, Version = GameVersion.Pt, Roaming = true, TypeEncounter = EncounterType.TallGrass }, //Zapdos - new EncounterStatic { Species = 146, Level = 60, Version = GameVersion.Pt, Roaming = true, TypeEncounter = EncounterType.TallGrass }, //Moltres + 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 }; - internal static readonly EncounterStatic[] Encounter_DPPt_Roam_Surf = + internal static readonly EncounterStaticTyped[] Encounter_DPPt_Roam_Surf = { - new EncounterStatic { Species = 481, Level = 50, Roaming = true, TypeEncounter = EncounterType.Surfing_Fishing }, //Mesprit - new EncounterStatic { Species = 488, Level = 50, Roaming = true, TypeEncounter = EncounterType.Surfing_Fishing }, //Cresselia - new EncounterStatic { Species = 144, Level = 60, Version = GameVersion.Pt, Roaming = true, TypeEncounter = EncounterType.Surfing_Fishing }, //Articuno - new EncounterStatic { Species = 145, Level = 60, Version = GameVersion.Pt, Roaming = true, TypeEncounter = EncounterType.Surfing_Fishing }, //Zapdos - new EncounterStatic { Species = 146, Level = 60, Version = GameVersion.Pt, Roaming = true, TypeEncounter = EncounterType.Surfing_Fishing }, //Moltres + 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 }; - internal static readonly EncounterStatic[] Encounter_DPPt_Regular = + internal static readonly EncounterStaticTyped[] Encounter_DPPt_Regular = { //Starters - new EncounterStatic { Gift = true, Species = 387, Level = 5, Location = 076, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, Version = GameVersion.DP,}, // Turtwig @ Lake Verity - new EncounterStatic { Gift = true, Species = 390, Level = 5, Location = 076, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, Version = GameVersion.DP,}, // Chimchar - new EncounterStatic { Gift = true, Species = 393, Level = 5, Location = 076, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, Version = GameVersion.DP,}, // Piplup - new EncounterStatic { Gift = true, Species = 387, Level = 5, Location = 016, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Version = GameVersion.Pt,}, // Turtwig @ Route 201 - new EncounterStatic { Gift = true, Species = 390, Level = 5, Location = 016, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, Version = GameVersion.Pt,}, // Chimchar - new EncounterStatic { 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 = 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 //Fossil @ Mining Museum - new EncounterStatic { Gift = true, Species = 138, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Omanyte - new EncounterStatic { Gift = true, Species = 140, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Kabuto - new EncounterStatic { Gift = true, Species = 142, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Aerodactyl - new EncounterStatic { Gift = true, Species = 345, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Lileep - new EncounterStatic { Gift = true, Species = 347, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Anorith - new EncounterStatic { Gift = true, Species = 408, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Cranidos - new EncounterStatic { Gift = true, Species = 410, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Shieldon + new EncounterStaticTyped { Gift = true, Species = 138, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP }, // Omanyte + new EncounterStaticTyped { Gift = true, Species = 140, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP }, // Kabuto + new EncounterStaticTyped { Gift = true, Species = 142, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP }, // Aerodactyl + new EncounterStaticTyped { Gift = true, Species = 345, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP }, // Lileep + new EncounterStaticTyped { Gift = true, Species = 347, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP }, // Anorith + new EncounterStaticTyped { Gift = true, Species = 408, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP }, // Cranidos + new EncounterStaticTyped { Gift = true, Species = 410, Level = 20, Location = 094, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP }, // Shieldon //Gift - new EncounterStatic { Gift = true, Species = 133, Level = 05, Location = 010, Version = GameVersion.DP, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, //Eevee @ Hearthome City - new EncounterStatic { Gift = true, Species = 133, Level = 20, Location = 010, Version = GameVersion.Pt, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, }, //Eevee @ Hearthome City - new EncounterStatic { Gift = true, Species = 137, Level = 25, Location = 012, Version = GameVersion.Pt, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, }, //Porygon @ Veilstone City - new EncounterStatic { Gift = true, Species = 175, Level = 01, EggLocation = 2011, TypeEncounter = EncounterType.None, Version = GameVersion.Pt,}, //Togepi Egg from Cynthia - new EncounterStatic { Gift = true, Species = 440, Level = 01, EggLocation = 2009, TypeEncounter = EncounterType.None, Version = GameVersion.DP,}, //Happiny Egg from Traveling Man - new EncounterStatic { Gift = true, Species = 447, Level = 01, EggLocation = 2010, TypeEncounter = EncounterType.None, }, //Riolu Egg from Riley + 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 EncounterStaticTyped { Gift = true, Species = 175, Level = 01, EggLocation = 2011, TypeEncounter = EncounterType.None, Version = GameVersion.Pt,}, //Togepi Egg from Cynthia + new EncounterStaticTyped { Gift = true, Species = 440, Level = 01, EggLocation = 2009, TypeEncounter = EncounterType.None, Version = GameVersion.DP,}, //Happiny Egg from Traveling Man + new EncounterStaticTyped { Gift = true, Species = 447, Level = 01, EggLocation = 2010, TypeEncounter = EncounterType.None, }, //Riolu Egg from Riley //Stationary - new EncounterStatic { Species = 425, Level = 22, Location = 47, Version = GameVersion.DP, TypeEncounter = EncounterType.TallGrass, },// Drifloon @ Valley Windworks - new EncounterStatic { Species = 425, Level = 15, Location = 47, Version = GameVersion.Pt, TypeEncounter = EncounterType.TallGrass, },// Drifloon @ Valley Windworks - new EncounterStatic { Species = 479, Level = 15, Location = 70, Version = GameVersion.DP, TypeEncounter = EncounterType.Building_EnigmaStone, },// Rotom @ Old Chateau - new EncounterStatic { Species = 479, Level = 20, Location = 70, Version = GameVersion.Pt, TypeEncounter = EncounterType.Building_EnigmaStone, },// Rotom @ Old Chateau - new EncounterStatic { Species = 442, Level = 25, Location = 24, TypeEncounter = EncounterType.Building_EnigmaStone, }, // Spiritomb @ Route 209 + new EncounterStaticTyped { Species = 425, Level = 22, Location = 47, Version = GameVersion.DP, TypeEncounter = EncounterType.TallGrass, },// Drifloon @ Valley Windworks + new EncounterStaticTyped { Species = 425, Level = 15, Location = 47, Version = GameVersion.Pt, TypeEncounter = EncounterType.TallGrass, },// 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 EncounterStaticTyped { Species = 442, Level = 25, Location = 24, TypeEncounter = EncounterType.Building_EnigmaStone, }, // Spiritomb @ Route 209 //Stationary Lengerdary - new EncounterStatic { Species = 377, Level = 30, Location = 125, Version = GameVersion.Pt, TypeEncounter = EncounterType.Cave_HallOfOrigin, }, //Regirock @ Rock Peak Ruins - new EncounterStatic { Species = 378, Level = 30, Location = 124, Version = GameVersion.Pt, TypeEncounter = EncounterType.Cave_HallOfOrigin, }, //Regice @ Iceberg Ruins - new EncounterStatic { Species = 379, Level = 30, Location = 123, Version = GameVersion.Pt, TypeEncounter = EncounterType.Cave_HallOfOrigin, }, //Registeel @ Iron Ruins - new EncounterStatic { Species = 480, Level = 50, Location = 089, TypeEncounter = EncounterType.Cave_HallOfOrigin, }, //Uxie @ Acuity Cavern - new EncounterStatic { Species = 482, Level = 50, Location = 088, TypeEncounter = EncounterType.Cave_HallOfOrigin, }, //Azelf @ Valor Cavern - new EncounterStatic { Species = 483, Level = 47, Location = 051, Version = GameVersion.D, TypeEncounter = EncounterType.DialgaPalkia, }, //Dialga @ Spear Pillar - new EncounterStatic { Species = 483, Level = 70, Location = 051, Version = GameVersion.Pt,}, //Dialga @ Spear Pillar - new EncounterStatic { Species = 484, Level = 47, Location = 051, Version = GameVersion.P, TypeEncounter = EncounterType.DialgaPalkia, }, //Palkia @ Spear Pillar - new EncounterStatic { Species = 484, Level = 70, Location = 051, Version = GameVersion.Pt,}, //Palkia @ Spear Pillar - new EncounterStatic { Species = 485, Level = 70, Location = 084, Version = GameVersion.DP, TypeEncounter = EncounterType.Cave_HallOfOrigin, }, //Heatran @ Stark Mountain - new EncounterStatic { Species = 485, Level = 50, Location = 084, Version = GameVersion.Pt, TypeEncounter = EncounterType.Cave_HallOfOrigin, }, //Heatran @ Stark Mountain - new EncounterStatic { Species = 486, Level = 70, Location = 064, Version = GameVersion.DP,}, //Regigigas @ Snowpoint Temple - new EncounterStatic { Species = 486, Level = 01, Location = 064, Version = GameVersion.Pt,}, //Regigigas @ Snowpoint Temple - new EncounterStatic { Species = 487, Level = 70, Location = 062, Version = GameVersion.DP, Form = 0, TypeEncounter = EncounterType.Cave_HallOfOrigin, }, //Giratina @ Turnback Cave - new EncounterStatic { Species = 487, Level = 47, Location = 117, Version = GameVersion.Pt, Form = 1, TypeEncounter = EncounterType.Cave_HallOfOrigin, }, //Giratina @ Distortion World - new EncounterStatic { Species = 487, Level = 47, Location = 062, Version = GameVersion.Pt, Form = 0, TypeEncounter = EncounterType.Cave_HallOfOrigin, }, //Giratina @ Turnback Cave + 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 = 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 = 483, Level = 70, Location = 051, Version = GameVersion.Pt,}, //Dialga @ Spear Pillar + new EncounterStaticTyped { Species = 484, Level = 47, Location = 051, Version = GameVersion.P, TypeEncounter = EncounterType.DialgaPalkia, }, //Palkia @ Spear Pillar + new EncounterStaticTyped { Species = 484, Level = 70, Location = 051, Version = GameVersion.Pt,}, //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,}, //Regigigas @ Snowpoint Temple + new EncounterStaticTyped { Species = 486, Level = 01, Location = 064, Version = GameVersion.Pt,}, //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.Cave_HallOfOrigin, }, //Giratina @ Distortion World + new EncounterStaticTyped { Species = 487, Level = 47, Location = 062, Version = GameVersion.Pt, Form = 0, TypeEncounter = EncounterType.Cave_HallOfOrigin, }, //Giratina @ Turnback Cave //Event - new EncounterStatic { Species = 491, Level = 40, Location = 079, Version = GameVersion.DP,}, //Darkrai @ Newmoon Island - new EncounterStatic { Species = 491, Level = 50, Location = 079, Version = GameVersion.Pt,}, //Darkrai @ Newmoon Island - new EncounterStatic { Species = 492, Form = 0, Level = 30, Location = 063, Fateful = true,}, //Shaymin @ Flower Paradise (Unreleased in Diamond and Pearl) - new EncounterStatic { Species = 493, Form = 0, Level = 80, Location = 086,}, //Arceus @ Hall of Origin (Unreleased) + new EncounterStaticTyped { Species = 491, Level = 40, Location = 079, Version = GameVersion.DP,}, //Darkrai @ Newmoon Island + new EncounterStaticTyped { Species = 491, Level = 50, Location = 079, Version = GameVersion.Pt,}, //Darkrai @ Newmoon Island + new EncounterStaticTyped { Species = 492, Form = 0, Level = 30, Location = 063, Fateful = true,}, //Shaymin @ Flower Paradise (Unreleased in Diamond and Pearl) + new EncounterStaticTyped { Species = 493, Form = 0, Level = 80, Location = 086,}, //Arceus @ Hall of Origin (Unreleased) }; - internal static readonly EncounterStatic[] Encounter_DPPt = Encounter_DPPt_Roam_Grass.SelectMany(e => e.Clone(Roaming_MetLocation_DPPt_Grass)).Concat(Encounter_DPPt_Roam_Surf.SelectMany(e => e.Clone(Roaming_MetLocation_DPPt_Surf))).Concat(Encounter_DPPt_Regular).ToArray(); + internal static readonly EncounterStatic[] Encounter_DPPt = Encounter_DPPt_Roam_Grass.SelectMany(e => e.Clone(Roaming_MetLocation_DPPt_Grass)).Concat( + Encounter_DPPt_Roam_Surf.SelectMany(e => e.Clone(Roaming_MetLocation_DPPt_Surf))).Concat( + Encounter_DPPt_Regular).ToArray(); // Grass 29-39, 42-46, 47, 48 // Surf 30-32 34-35, 40-45, 47 @@ -520,15 +522,15 @@ public static partial class Legal // Won't go to routes 40,41,47,48 178,179,180,182,183,190,191,192,193 }; - internal static readonly EncounterStatic[] Encounter_HGSS_JohtoRoam_Grass = + internal static readonly EncounterStaticTyped[] Encounter_HGSS_JohtoRoam_Grass = { - new EncounterStatic { Species = 243, Level = 40, Roaming = true, TypeEncounter = EncounterType.TallGrass, }, // Raikou - new EncounterStatic { Species = 244, Level = 40, Roaming = true, TypeEncounter = EncounterType.TallGrass, }, // Entei + new EncounterStaticTyped { Species = 243, Level = 40, Roaming = true, TypeEncounter = EncounterType.TallGrass, }, // Raikou + new EncounterStaticTyped { Species = 244, Level = 40, Roaming = true, TypeEncounter = EncounterType.TallGrass, }, // Entei }; - internal static readonly EncounterStatic[] Encounter_HGSS_JohtoRoam_Surf = + internal static readonly EncounterStaticTyped[] Encounter_HGSS_JohtoRoam_Surf = { - new EncounterStatic { Species = 243, Level = 40, Roaming = true, TypeEncounter = EncounterType.Surfing_Fishing, }, // Raikou - new EncounterStatic { Species = 244, Level = 40, Roaming = true, TypeEncounter = EncounterType.Surfing_Fishing, }, // Entei + new EncounterStaticTyped { Species = 243, Level = 40, Roaming = true, TypeEncounter = EncounterType.Surfing_Fishing, }, // Raikou + new EncounterStaticTyped { Species = 244, Level = 40, Roaming = true, TypeEncounter = EncounterType.Surfing_Fishing, }, // Entei }; internal static readonly int[] Roaming_MetLocation_HGSS_Kanto_Grass = { @@ -545,85 +547,85 @@ public static partial class Legal 152,154,157,158,160,161,167,168,169,170, 172,174,176, }; - internal static readonly EncounterStatic[] Encounter_HGSS_KantoRoam_Grass = + internal static readonly EncounterStaticTyped[] Encounter_HGSS_KantoRoam_Grass = { - new EncounterStatic { Species = 380, Level = 35, Version = GameVersion.HG, Roaming = true, TypeEncounter = EncounterType.TallGrass, }, //Latias - new EncounterStatic { Species = 381, Level = 35, Version = GameVersion.SS, Roaming = true, TypeEncounter = EncounterType.TallGrass, }, //Latios + 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 }; - internal static readonly EncounterStatic[] Encounter_HGSS_KantoRoam_Surf = + internal static readonly EncounterStaticTyped[] Encounter_HGSS_KantoRoam_Surf = { - new EncounterStatic { Species = 380, Level = 35, Version = GameVersion.HG, Roaming = true, TypeEncounter = EncounterType.Surfing_Fishing, }, //Latias - new EncounterStatic { Species = 381, Level = 35, Version = GameVersion.SS, Roaming = true, TypeEncounter = EncounterType.Surfing_Fishing, }, //Latios + 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 }; - internal static readonly EncounterStatic[] Encounter_HGSS_Regular = + internal static readonly EncounterStaticTyped[] Encounter_HGSS_Regular = { //Starters - new EncounterStatic { Gift = true, Species = 001, Level = 05, Location = 138, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Bulbasaur @ Pallet Town - new EncounterStatic { Gift = true, Species = 004, Level = 05, Location = 138, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Charmander - new EncounterStatic { Gift = true, Species = 007, Level = 05, Location = 138, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Squirtle - new EncounterStatic { Gift = true, Species = 152, Level = 05, Location = 126, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Chikorita @ New Bark Town - new EncounterStatic { Gift = true, Species = 155, Level = 05, Location = 126, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Cyndaquil - new EncounterStatic { Gift = true, Species = 158, Level = 05, Location = 126, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Totodile - new EncounterStatic { Gift = true, Species = 252, Level = 05, Location = 148, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Treecko @ Saffron City - new EncounterStatic { Gift = true, Species = 255, Level = 05, Location = 148, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Torchic - new EncounterStatic { Gift = true, Species = 258, Level = 05, Location = 148, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Mudkip + new EncounterStaticTyped { Gift = true, Species = 001, Level = 05, Location = 138, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Bulbasaur @ Pallet Town + new EncounterStaticTyped { Gift = true, Species = 004, Level = 05, Location = 138, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Charmander + new EncounterStaticTyped { Gift = true, Species = 007, Level = 05, Location = 138, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Squirtle + new EncounterStaticTyped { Gift = true, Species = 152, Level = 05, Location = 126, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Chikorita @ New Bark Town + new EncounterStaticTyped { Gift = true, Species = 155, Level = 05, Location = 126, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Cyndaquil + new EncounterStaticTyped { Gift = true, Species = 158, Level = 05, Location = 126, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Totodile + new EncounterStaticTyped { Gift = true, Species = 252, Level = 05, Location = 148, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Treecko @ Saffron City + new EncounterStaticTyped { Gift = true, Species = 255, Level = 05, Location = 148, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Torchic + new EncounterStaticTyped { Gift = true, Species = 258, Level = 05, Location = 148, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Mudkip //Fossil @ Pewter City - new EncounterStatic { Gift = true, Species = 138, Level = 20, Location = 140, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Omanyte - new EncounterStatic { Gift = true, Species = 140, Level = 20, Location = 140, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Kabuto - new EncounterStatic { Gift = true, Species = 142, Level = 20, Location = 140, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Aerodactyl - new EncounterStatic { Gift = true, Species = 345, Level = 20, Location = 140, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Lileep - new EncounterStatic { Gift = true, Species = 347, Level = 20, Location = 140, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Anorith - new EncounterStatic { Gift = true, Species = 408, Level = 20, Location = 140, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Cranidos - new EncounterStatic { Gift = true, Species = 410, Level = 20, Location = 140, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Shieldon + new EncounterStaticTyped { Gift = true, Species = 138, Level = 20, Location = 140, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Omanyte + new EncounterStaticTyped { Gift = true, Species = 140, Level = 20, Location = 140, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Kabuto + new EncounterStaticTyped { Gift = true, Species = 142, Level = 20, Location = 140, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Aerodactyl + new EncounterStaticTyped { Gift = true, Species = 345, Level = 20, Location = 140, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Lileep + new EncounterStaticTyped { Gift = true, Species = 347, Level = 20, Location = 140, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Anorith + new EncounterStaticTyped { Gift = true, Species = 408, Level = 20, Location = 140, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Cranidos + new EncounterStaticTyped { Gift = true, Species = 410, Level = 20, Location = 140, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Shieldon //Gift - new EncounterStatic { Gift = true, Species = 133, Level = 05, Location = 131, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, }, // Eevee @ Goldenrod City - new EncounterStatic { Gift = true, Species = 147, Level = 15, Location = 222, Moves = new[] {245}, }, // Dratini @ Dragon's Den (ExtremeSpeed) - new EncounterStatic { Gift = true, Species = 236, Level = 10, Location = 216, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Tyrogue @ Mt. Mortar - new EncounterStatic { Gift = true, Species = 175, Level = 01, EggLocation = 2013, TypeEncounter = EncounterType.None, Moves = new[] {326},}, // Togepi Egg from Mr. Pokemon (Extrasensory as Egg move) - new EncounterStatic { Gift = true, Species = 179, Level = 01, EggLocation = 2014, TypeEncounter = EncounterType.None, }, // Mareep Egg from Primo - new EncounterStatic { Gift = true, Species = 194, Level = 01, EggLocation = 2014, TypeEncounter = EncounterType.None, }, // Wooper Egg from Primo - new EncounterStatic { Gift = true, Species = 218, Level = 01, EggLocation = 2014, TypeEncounter = EncounterType.None, }, // Slugma Egg from Primo + 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, Moves = new[] {245}, }, // Dratini @ Dragon's Den (ExtremeSpeed) + new EncounterStaticTyped { Gift = true, Species = 236, Level = 10, Location = 216, TypeEncounter = EncounterType.Starter_Fossil_Gift_DP, }, // Tyrogue @ Mt. Mortar + new EncounterStaticTyped { Gift = true, Species = 175, Level = 01, EggLocation = 2013, TypeEncounter = EncounterType.None, Moves = new[] {326} }, // Togepi Egg from Mr. Pokemon (Extrasensory as Egg move) + new EncounterStaticTyped { Gift = true, Species = 179, Level = 01, EggLocation = 2014, TypeEncounter = EncounterType.None, }, // Mareep Egg from Primo + new EncounterStaticTyped { Gift = true, Species = 194, Level = 01, EggLocation = 2014, TypeEncounter = EncounterType.None, }, // Wooper Egg from Primo + new EncounterStaticTyped { Gift = true, Species = 218, Level = 01, EggLocation = 2014, TypeEncounter = EncounterType.None, }, // Slugma Egg from Primo // Celadon City Game Corner - new EncounterStatic { Gift = true, Species = 122, Level = 15, Location = 144, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, }, // Mr. Mime - new EncounterStatic { Gift = true, Species = 133, Level = 15, Location = 144, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio }, // Eevee - new EncounterStatic { Gift = true, Species = 137, Level = 15, Location = 144, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio }, // Porygon + new EncounterStaticTyped { Gift = true, Species = 122, Level = 15, Location = 144, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio, }, // Mr. Mime + new EncounterStaticTyped { Gift = true, Species = 133, Level = 15, Location = 144, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio }, // Eevee + new EncounterStaticTyped { Gift = true, Species = 137, Level = 15, Location = 144, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio }, // Porygon // Goldenrod City Game Corner - new EncounterStatic { Gift = true, Species = 063, Level = 15, Location = 131, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio }, // Abra - new EncounterStatic { Gift = true, Species = 023, Level = 15, Location = 131, Version = GameVersion.HG, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio }, // Ekans - new EncounterStatic { Gift = true, Species = 027, Level = 15, Location = 131, Version = GameVersion.SS, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio }, // Sandshrew - new EncounterStatic { Gift = true, Species = 147, Level = 15, Location = 131, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio }, // Dratini + 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, Version = GameVersion.HG, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio }, // Ekans + new EncounterStaticTyped { Gift = true, Species = 027, Level = 15, Location = 131, Version = GameVersion.SS, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio }, // Sandshrew + new EncounterStaticTyped { Gift = true, Species = 147, Level = 15, Location = 131, TypeEncounter = EncounterType.Starter_Fossil_Gift_Pt_DPTrio }, // Dratini // Team Rocket HQ Trap Floor - new EncounterStatic { Species = 100, Level = 23, Location = 213, TypeEncounter = EncounterType.Building_EnigmaStone, }, // Voltorb - new EncounterStatic { Species = 074, Level = 21, Location = 213, TypeEncounter = EncounterType.Building_EnigmaStone, }, // Geodude - new EncounterStatic { Species = 109, Level = 21, Location = 213, TypeEncounter = EncounterType.Building_EnigmaStone, }, // Koffing + new EncounterStaticTyped { Species = 100, Level = 23, Location = 213, TypeEncounter = EncounterType.Building_EnigmaStone, }, // Voltorb + new EncounterStaticTyped { Species = 074, Level = 21, Location = 213, TypeEncounter = EncounterType.Building_EnigmaStone, }, // Geodude + new EncounterStaticTyped { Species = 109, Level = 21, Location = 213, TypeEncounter = EncounterType.Building_EnigmaStone, }, // Koffing //Stationary - new EncounterStatic { Species = 130, Level = 30, Location = 135, TypeEncounter = EncounterType.Surfing_Fishing, Shiny = true }, //Gyarados @ Lake of Rage - new EncounterStatic { Species = 131, Level = 20, Location = 210, TypeEncounter = EncounterType.Cave_HallOfOrigin, }, //Lapras @ Union Cave Friday Only - new EncounterStatic { Species = 101, Level = 23, Location = 213, TypeEncounter = EncounterType.Building_EnigmaStone, }, //Electrode @ Team Rocket HQ - new EncounterStatic { Species = 143, Level = 50, Location = 159, }, //Snorlax @ Route 11 - new EncounterStatic { Species = 143, Level = 50, Location = 160, }, //Snorlax @ Route 12 - new EncounterStatic { Species = 185, Level = 20, Location = 184, TypeEncounter = EncounterType.None, }, //Sudowoodo @ Route 36 - new EncounterStatic { Species = 172, Level = 30, Location = 214, Gender = 1, Form = 1, Moves = new[]{344,270,207,220} }, //Spiky-eared Pichu @ Ilex forest + new EncounterStaticTyped { Species = 130, Level = 30, Location = 135, TypeEncounter = EncounterType.Surfing_Fishing, Shiny = true }, //Gyarados @ Lake of Rage + new EncounterStaticTyped { Species = 131, Level = 20, Location = 210, TypeEncounter = EncounterType.Cave_HallOfOrigin, }, //Lapras @ Union Cave Friday Only + new EncounterStaticTyped { Species = 101, Level = 23, Location = 213, TypeEncounter = EncounterType.Building_EnigmaStone, }, //Electrode @ Team Rocket HQ + new EncounterStaticTyped { Species = 143, Level = 50, Location = 159, }, //Snorlax @ Route 11 + new EncounterStaticTyped { Species = 143, Level = 50, Location = 160, }, //Snorlax @ Route 12 + new EncounterStaticTyped { Species = 185, Level = 20, Location = 184, TypeEncounter = EncounterType.None, }, //Sudowoodo @ Route 36 + new EncounterStaticTyped { Species = 172, Level = 30, Location = 214, Gender = 1, Form = 1, Moves = new[]{344,270,207,220} }, //Spiky-eared Pichu @ Ilex forest //Stationary Lengerdary - new EncounterStatic { Species = 144, Level = 50, Location = 203, }, //Articuno @ Seafoam Islands - new EncounterStatic { Species = 145, Level = 50, Location = 158, }, //Zapdos @ Route 10 - new EncounterStatic { Species = 146, Level = 50, Location = 219, }, //Moltres @ Mt. Silver Cave - new EncounterStatic { Species = 150, Level = 70, Location = 199, }, //Mewtwo @ Cerulean Cave - new EncounterStatic { Species = 245, Level = 40, Location = 173, }, //Suicune @ Route 25 - new EncounterStatic { Species = 245, Level = 40, Location = 206, }, //Suicune @ Burned Tower - new EncounterStatic { Species = 249, Level = 45, Location = 218, Version = GameVersion.SS, }, //Lugia @ Whirl Islands - new EncounterStatic { Species = 249, Level = 70, Location = 218, Version = GameVersion.HG, }, //Lugia @ Whirl Islands - new EncounterStatic { Species = 250, Level = 45, Location = 205, Version = GameVersion.HG, TypeEncounter = EncounterType.Building_EnigmaStone, }, //Ho-Oh @ Bell Tower - new EncounterStatic { Species = 250, Level = 70, Location = 205, Version = GameVersion.SS, TypeEncounter = EncounterType.Building_EnigmaStone, }, //Ho-Oh @ Bell Tower - new EncounterStatic { Species = 380, Level = 40, Location = 140, Version = GameVersion.SS, }, //Latias @ Pewter City - new EncounterStatic { Species = 381, Level = 40, Location = 140, Version = GameVersion.HG, }, //Latios @ Pewter City - new EncounterStatic { Species = 382, Level = 50, Location = 232, Version = GameVersion.HG, }, //Kyogre @ Embedded Tower - new EncounterStatic { Species = 383, Level = 50, Location = 232, Version = GameVersion.SS, }, //Groudon @ Embedded Tower - new EncounterStatic { Species = 384, Level = 50, Location = 232, }, //Rayquaza @ Embedded Tower - new EncounterStatic { Species = 483, Level = 01, Location = 231, Gift = true }, //Dialga @ Sinjoh Ruins - new EncounterStatic { Species = 484, Level = 01, Location = 231, Gift = true }, //Palkia @ Sinjoh Ruins - new EncounterStatic { Species = 487, Level = 01, Location = 231, Gift = true, Form = 1}, //Giratina @ Sinjoh Ruins + new EncounterStaticTyped { Species = 144, Level = 50, Location = 203, }, //Articuno @ Seafoam Islands + new EncounterStaticTyped { Species = 145, Level = 50, Location = 158, }, //Zapdos @ Route 10 + new EncounterStaticTyped { Species = 146, Level = 50, Location = 219, }, //Moltres @ Mt. Silver Cave + new EncounterStaticTyped { Species = 150, Level = 70, Location = 199, }, //Mewtwo @ Cerulean Cave + new EncounterStaticTyped { Species = 245, Level = 40, Location = 173, }, //Suicune @ Route 25 + new EncounterStaticTyped { Species = 245, Level = 40, Location = 206, }, //Suicune @ Burned Tower + new EncounterStaticTyped { Species = 249, Level = 45, Location = 218, Version = GameVersion.SS, }, //Lugia @ Whirl Islands + new EncounterStaticTyped { Species = 249, Level = 70, Location = 218, Version = GameVersion.HG, }, //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, }, //Latias @ Pewter City + new EncounterStaticTyped { Species = 381, Level = 40, Location = 140, Version = GameVersion.HG, }, //Latios @ Pewter City + new EncounterStaticTyped { Species = 382, Level = 50, Location = 232, Version = GameVersion.HG, }, //Kyogre @ Embedded Tower + new EncounterStaticTyped { Species = 383, Level = 50, Location = 232, Version = GameVersion.SS, }, //Groudon @ Embedded Tower + new EncounterStaticTyped { Species = 384, Level = 50, Location = 232, }, //Rayquaza @ Embedded Tower + new EncounterStaticTyped { Species = 483, Level = 01, Location = 231, Gift = true }, //Dialga @ Sinjoh Ruins + new EncounterStaticTyped { Species = 484, Level = 01, Location = 231, Gift = true }, //Palkia @ Sinjoh Ruins + new EncounterStaticTyped { Species = 487, Level = 01, Location = 231, Gift = true, Form = 1}, //Giratina @ Sinjoh Ruins }; internal static readonly EncounterStatic[] Encounter_HGSS = Encounter_HGSS_KantoRoam_Grass.SelectMany(e => e.Clone(Roaming_MetLocation_HGSS_Kanto_Grass)).Concat( Encounter_HGSS_KantoRoam_Surf.SelectMany(e => e.Clone(Roaming_MetLocation_HGSS_Kanto_Surf))).Concat(