diff --git a/PKHeX.WinForms/MainWindow/Main.cs b/PKHeX.WinForms/MainWindow/Main.cs index 7e31b3d38..6a8f52390 100644 --- a/PKHeX.WinForms/MainWindow/Main.cs +++ b/PKHeX.WinForms/MainWindow/Main.cs @@ -12,6 +12,7 @@ using PKHeX.Core; using PKHeX.Core.Properties; using System.Configuration; +using System.Threading.Tasks; namespace PKHeX.WinForms { @@ -1390,6 +1391,14 @@ private static void refreshWC7DB() // Language Translation private void changeMainLanguage(object sender, EventArgs e) { + if (CB_MainLanguage.SelectedIndex < 8) + curlanguage = GameInfo.lang_val[CB_MainLanguage.SelectedIndex]; + + // Set the culture (makes it easy to pass language to other forms) + Properties.Settings.Default.Language = curlanguage; + Thread.CurrentThread.CurrentCulture = new CultureInfo(curlanguage.Substring(0, 2)); + Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; + PKM pk = SAV.getPKM((fieldsInitialized ? preparePKM() : pkm).Data); bool alreadyInit = fieldsInitialized; fieldsInitialized = false; @@ -1402,24 +1411,16 @@ private void changeMainLanguage(object sender, EventArgs e) // Recenter PKM SubEditors FLP_PKMEditors.Location = new Point((Tab_OTMisc.Width - FLP_PKMEditors.Width)/2, FLP_PKMEditors.Location.Y); populateFields(pk); // put data back in form - fieldsInitialized |= alreadyInit; - - // Set the culture (makes it easy to pass language to other forms) - Properties.Settings.Default.Language = curlanguage; - Thread.CurrentThread.CurrentCulture = new CultureInfo(curlanguage.Substring(0, 2)); - Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; + fieldsInitialized |= alreadyInit; } private void InitializeStrings() - { - if (CB_MainLanguage.SelectedIndex < 8) - curlanguage = GameInfo.lang_val[CB_MainLanguage.SelectedIndex]; - + { string l = curlanguage; GameInfo.Strings = GameInfo.getStrings(l); // Update Legality Strings // Clipboard.SetText(string.Join(Environment.NewLine, CheckStrings.getLocalization())); - new Thread(() => { CheckStrings.setLocalization(GameInfo.getCheckStrings(l)); }).Start(); + Task.Run(() => Util.setLocalization(typeof(LegalityCheckStrings))); // Force an update to the met locations origintrack = GameVersion.Unknown; @@ -1963,9 +1964,9 @@ private void clickOT(object sender, EventArgs e) CB_Language.SelectedValue = SAV.Language; if (SAV.HasGeolocation) { - CB_SubRegion.SelectedValue = SAV.SubRegion; - CB_Country.SelectedValue = SAV.Country; CB_3DSReg.SelectedValue = SAV.ConsoleRegion; + CB_Country.SelectedValue = SAV.Country; + CB_SubRegion.SelectedValue = SAV.SubRegion; } updateNickname(null, null); } diff --git a/PKHeX.WinForms/MainWindow/MainCK3.cs b/PKHeX.WinForms/MainWindow/MainCK3.cs index b04b8459d..236427d92 100644 --- a/PKHeX.WinForms/MainWindow/MainCK3.cs +++ b/PKHeX.WinForms/MainWindow/MainCK3.cs @@ -29,7 +29,8 @@ private void populateFieldsCK3() Label_OTGender.ForeColor = ck3.OT_Gender == 1 ? Color.Red : Color.Blue; TB_PID.Text = ck3.PID.ToString("X8"); CB_HeldItem.SelectedValue = ck3.HeldItem; - CB_Ability.SelectedIndex = ck3.AbilityNumber > CB_Ability.Items.Count ? 0 : ck3.AbilityNumber; + int abil = ck3.AbilityNumber >> 1; + CB_Ability.SelectedIndex = abil > CB_Ability.Items.Count ? 0 : abil; CB_Nature.SelectedValue = ck3.Nature; TB_TID.Text = ck3.TID.ToString("00000"); TB_SID.Text = ck3.SID.ToString("00000"); @@ -136,7 +137,7 @@ private PKM prepareCK3() ck3.SID = Util.ToInt32(TB_SID.Text); ck3.EXP = Util.ToUInt32(TB_EXP.Text); ck3.PID = Util.getHEXval(TB_PID.Text); - ck3.AbilityNumber = CB_Ability.SelectedIndex; + ck3.AbilityNumber = 1 << CB_Ability.SelectedIndex; // to match gen6+ ck3.FatefulEncounter = CHK_Fateful.Checked; ck3.Gender = PKX.getGender(Label_Gender.Text); diff --git a/PKHeX.WinForms/MainWindow/MainPK3.cs b/PKHeX.WinForms/MainWindow/MainPK3.cs index 86bf064d8..75bfb647c 100644 --- a/PKHeX.WinForms/MainWindow/MainPK3.cs +++ b/PKHeX.WinForms/MainWindow/MainPK3.cs @@ -29,7 +29,8 @@ private void populateFieldsPK3() Label_OTGender.ForeColor = pk3.OT_Gender == 1 ? Color.Red : Color.Blue; TB_PID.Text = pk3.PID.ToString("X8"); CB_HeldItem.SelectedValue = pk3.HeldItem; - CB_Ability.SelectedIndex = pk3.AbilityNumber > CB_Ability.Items.Count ? 0 : pk3.AbilityNumber; + int abil = pk3.AbilityNumber >> 1; + CB_Ability.SelectedIndex = abil > CB_Ability.Items.Count ? 0 : abil; CB_Nature.SelectedValue = pk3.Nature; TB_TID.Text = pk3.TID.ToString("00000"); TB_SID.Text = pk3.SID.ToString("00000"); @@ -114,7 +115,7 @@ private PKM preparePK3() pk3.SID = Util.ToInt32(TB_SID.Text); pk3.EXP = Util.ToUInt32(TB_EXP.Text); pk3.PID = Util.getHEXval(TB_PID.Text); - pk3.AbilityNumber = CB_Ability.SelectedIndex; // 0/1 (stored in IVbits) + pk3.AbilityNumber = 1 << CB_Ability.SelectedIndex; // to match gen6+ pk3.FatefulEncounter = CHK_Fateful.Checked; pk3.Gender = PKX.getGender(Label_Gender.Text); diff --git a/PKHeX.WinForms/MainWindow/MainXK3.cs b/PKHeX.WinForms/MainWindow/MainXK3.cs index 203ceb363..3731171f7 100644 --- a/PKHeX.WinForms/MainWindow/MainXK3.cs +++ b/PKHeX.WinForms/MainWindow/MainXK3.cs @@ -29,7 +29,8 @@ private void populateFieldsXK3() Label_OTGender.ForeColor = xk3.OT_Gender == 1 ? Color.Red : Color.Blue; TB_PID.Text = xk3.PID.ToString("X8"); CB_HeldItem.SelectedValue = xk3.HeldItem; - CB_Ability.SelectedIndex = xk3.AbilityNumber > CB_Ability.Items.Count ? 0 : xk3.AbilityNumber; + int abil = xk3.AbilityNumber >> 1; + CB_Ability.SelectedIndex = abil > CB_Ability.Items.Count ? 0 : abil; CB_Nature.SelectedValue = xk3.Nature; TB_TID.Text = xk3.TID.ToString("00000"); TB_SID.Text = xk3.SID.ToString("00000"); @@ -136,7 +137,7 @@ private PKM prepareXK3() xk3.SID = Util.ToInt32(TB_SID.Text); xk3.EXP = Util.ToUInt32(TB_EXP.Text); xk3.PID = Util.getHEXval(TB_PID.Text); - xk3.AbilityNumber = CB_Ability.SelectedIndex; // 0/1 (stored in IVbits) + xk3.AbilityNumber = 1 << CB_Ability.SelectedIndex; // to match gen6+ xk3.FatefulEncounter = CHK_Fateful.Checked; xk3.Gender = PKX.getGender(Label_Gender.Text); diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen6/SAV_BoxLayout.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen6/SAV_BoxLayout.cs index b713157b7..fa7978d0d 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen6/SAV_BoxLayout.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen6/SAV_BoxLayout.cs @@ -68,9 +68,13 @@ public SAV_BoxLayout(int box) if (SAV.BoxesUnlocked > 0) { CB_Unlocked.Items.Clear(); - for (int i = 0; i <= SAV.BoxCount; i++) + int max = SAV.BoxCount; + if (SAV.Generation == 6) + max -= 1; // cover legendary captured unlocks final box, not governed by BoxesUnlocked + + for (int i = 0; i <= max; i++) CB_Unlocked.Items.Add(i); - CB_Unlocked.SelectedIndex = Math.Min(SAV.BoxCount, SAV.BoxesUnlocked); + CB_Unlocked.SelectedIndex = Math.Min(max, SAV.BoxesUnlocked); } else { diff --git a/PKHeX/Game/GameInfo.cs b/PKHeX/Game/GameInfo.cs index 92162416e..8954de5f0 100644 --- a/PKHeX/Game/GameInfo.cs +++ b/PKHeX/Game/GameInfo.cs @@ -9,9 +9,7 @@ public static class GameInfo private static readonly string[] ptransp = { "ポケシフター", "Poké Transfer", "Poké Fret", "Pokétrasporto", "Poképorter", "Pokétransfer", "포케시프터", "宝可传送", "寶可傳送", "ポケシフター" }; public static readonly string[] lang_val = { "ja", "en", "fr", "it", "de", "es", "ko", "zh", "zh2", "pt" }; private const string DefaultLanguage = "en"; - private const string LegalityName = "legality_"; private static readonly GameStrings[] Languages = new GameStrings[lang_val.Length]; - private static readonly string[][] CheckStrings = new string[lang_val.Length][]; // Lazy fetch implementation private static int DefaultLanguageIndex => Array.IndexOf(lang_val, DefaultLanguage); @@ -25,11 +23,6 @@ public static GameStrings getStrings(string lang) int index = getLanguageIndex(lang); return Languages[index] ?? (Languages[index] = new GameStrings(lang_val[index])); } - public static IEnumerable getCheckStrings(string lang) - { - int index = getLanguageIndex(lang); - return CheckStrings[index] ?? (CheckStrings[index] = Util.getStringList(LegalityName + lang_val[index])); - } private static string getTransporterName(string lang) { int index = getLanguageIndex(lang); diff --git a/PKHeX/Legality/Analysis.cs b/PKHeX/Legality/Analysis.cs index 49e4daa07..951038255 100644 --- a/PKHeX/Legality/Analysis.cs +++ b/PKHeX/Legality/Analysis.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; -using static PKHeX.Core.CheckStrings; +using static PKHeX.Core.LegalityCheckStrings; namespace PKHeX.Core { @@ -50,7 +50,7 @@ public LegalityAnalysis(PKM pk) if (!Parse.Any()) switch (pk.GenNumber) { - case 3: parsePK3(pk); break; + case 3: if (pk.Version != 15) parsePK3(pk); break; case 4: parsePK4(pk); break; case 5: parsePK5(pk); break; case 6: parsePK6(pk); break; @@ -75,7 +75,15 @@ public LegalityAnalysis(PKM pk) else return; } - catch { Valid = false; } + catch (Exception e) + { + Console.WriteLine(e.Message); + Valid = false; + Parsed = true; + AddLine(Severity.Invalid, V190, CheckIdentifier.Misc); + AllSuggestedMoves = AllSuggestedRelearnMoves = AllSuggestedMovesAndRelearn = new int[0]; + return; + } AllSuggestedMoves = !pkm.IsOriginValid ? new int[4] : getSuggestedMoves(true, true, true); AllSuggestedRelearnMoves = !pkm.IsOriginValid ? new int[4] : Legal.getValidRelearn(pkm, -1).ToArray(); AllSuggestedMovesAndRelearn = AllSuggestedMoves.Concat(AllSuggestedRelearnMoves).ToArray(); @@ -121,7 +129,8 @@ private void parsePK4(PKM pk) pkm = pk; if (!pkm.IsOriginValid) { AddLine(Severity.Invalid, V187, CheckIdentifier.None); return; } - + + verifyPreRelearn(); updateEncounterChain(); updateMoveLegality(); updateEncounterInfo(); @@ -133,7 +142,8 @@ private void parsePK5(PKM pk) pkm = pk; if (!pkm.IsOriginValid) { AddLine(Severity.Invalid, V187, CheckIdentifier.None); return; } - + + verifyPreRelearn(); updateEncounterChain(); updateMoveLegality(); updateEncounterInfo(); @@ -220,11 +230,11 @@ private void updateChecks() verifyHyperTraining(); verifyMedals(); verifyRegion(); + verifyVersionEvolution(); } if (pkm.GenNumber < 5) verifyEggMoves(); - verifyVersionEvolution(); // SecondaryChecked = true; } private string getLegalityReport() @@ -293,14 +303,10 @@ public int[] getSuggestedRelearn() return RelearnBase; List window = new List(RelearnBase); - - for (int i = 0; i < 4; i++) - if (!vMoves[i].Valid || vMoves[i].Flag) - window.Add(pkm.Moves[i]); - + window.AddRange(pkm.Moves.Where((v, i) => !vMoves[i].Valid || vMoves[i].Flag)); if (window.Count < 4) window.AddRange(new int[4 - window.Count]); - return window.Skip(window.Count - 4).Take(4).ToArray(); + return window.Skip(window.Count - 4).ToArray(); } public int[] getSuggestedMoves(bool tm, bool tutor, bool reminder) { @@ -318,12 +324,19 @@ public EncounterStatic getSuggestedMetInfo() int loc = getSuggestedTransferLocation(pkm); if (pkm.WasEgg) + { + int lvl = 1; // gen5+ + if (!pkm.IsNative) + lvl = pkm.CurrentLevel; // be generous with transfer conditions + else if (pkm.Format < 5) // and native + lvl = 0; return new EncounterStatic { Species = Legal.getBaseSpecies(pkm), Location = loc != -1 ? loc : getSuggestedEggMetLocation(pkm), - Level = 1, + Level = lvl, }; + } var area = Legal.getCaptureLocation(pkm); if (area != null) @@ -347,6 +360,21 @@ private static int getSuggestedEggMetLocation(PKM pkm) // Return one of legal hatch locations for game switch ((GameVersion)pkm.Version) { + case GameVersion.R: + case GameVersion.S: + case GameVersion.E: + case GameVersion.FR: + case GameVersion.LG: + switch (pkm.Format) + { + case 3: + return pkm.FRLG ? 146 /* Four Island */ : 32; // Route 117 + case 4: + return 0x37; // Pal Park + default: + return 30001; // Transporter + } + case GameVersion.D: case GameVersion.P: case GameVersion.Pt: diff --git a/PKHeX/Legality/Checks.cs b/PKHeX/Legality/Checks.cs index f80922984..024aafc0b 100644 --- a/PKHeX/Legality/Checks.cs +++ b/PKHeX/Legality/Checks.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; -using static PKHeX.Core.CheckStrings; +using static PKHeX.Core.LegalityCheckStrings; namespace PKHeX.Core { @@ -42,7 +42,8 @@ internal enum CheckIdentifier Training, Ability, Evolution, - Special + Special, + Nature } public class CheckResult { @@ -65,10 +66,36 @@ public partial class LegalityAnalysis private void verifyGender() { if (pkm.PersonalInfo.Gender == 255 && pkm.Gender != 2) - { AddLine(Severity.Invalid, V203, CheckIdentifier.Gender); - // return; + + // Check for PID relationship to Gender & Nature if applicable + int gen = pkm.GenNumber; + + bool PIDGender = 3 <= gen && gen <= 5; + if (!PIDGender) + return; + + bool genderValid = pkm.getGenderIsValid(); + if (!genderValid && pkm.Format > 5 && (pkm.Species == 183 || pkm.Species == 184)) + { + var gv = pkm.PID & 0xFF; + if (gv > 63 && pkm.Gender == 1) // evolved from azurill after transferring to keep gender + genderValid = true; } + + if (genderValid) + AddLine(Severity.Valid, V250, CheckIdentifier.Gender); + else + AddLine(Severity.Invalid, V251, CheckIdentifier.Gender); + + bool PIDNature = gen != 5; + if (!PIDNature) + return; + + if (pkm.PID % 25 == pkm.Nature) + AddLine(Severity.Valid, V252, CheckIdentifier.Nature); + else + AddLine(Severity.Invalid, V253, CheckIdentifier.Nature); } private void verifyItem() { @@ -145,6 +172,7 @@ private void verifyECPID() : V216, CheckIdentifier.ECPID); } } + private void verifyNickname() { // If the Pokémon is not nicknamed, it should match one of the language strings. @@ -185,72 +213,13 @@ private void verifyNickname() if (EncounterType == typeof(EncounterTrade)) { - string[] validOT = new string[0]; - int index = -1; - if (pkm.XY) - { - validOT = Legal.TradeXY[pkm.Language]; - index = Array.IndexOf(Legal.TradeGift_XY, EncounterMatch); - } - else if (pkm.AO) - { - validOT = Legal.TradeAO[pkm.Language]; - index = Array.IndexOf(Legal.TradeGift_AO, EncounterMatch); - } - else if (pkm.SM) - { - // TODO - AddLine(Severity.Valid, V194, CheckIdentifier.Nickname); - return; - } - else if (pkm.Format <= 2 || pkm.VC) - { - var et = EncounterOriginal as EncounterTrade; - if (et?.TID == 0) // Gen1 Trade - { - if (!Legal.getEncounterTrade1Valid(pkm)) - AddLine(Severity.Invalid, V10, CheckIdentifier.Trainer); - } - else // Gen2 - { - return; // already checked all relevant properties when fetching with getValidEncounterTradeVC2 - } - return; - } - - if (validOT.Length == 0) - { - AddLine(Severity.Indeterminate, V7, CheckIdentifier.Trainer); - return; - } - if (index == -1 || validOT.Length < index*2) - { - AddLine(Severity.Indeterminate, V8, CheckIdentifier.Trainer); - return; - } - - string nick = validOT[index]; - string OT = validOT[validOT.Length/2 + index]; - - if (nick != pkm.Nickname) - AddLine(Severity.Fishy, V9, CheckIdentifier.Nickname); - else if (OT != pkm.OT_Name) - AddLine(Severity.Invalid, V10, CheckIdentifier.Trainer); - else - AddLine(Severity.Valid, V11, CheckIdentifier.Nickname); - + verifyNicknameTrade(); return; } if (pkm.IsEgg) { - if (!pkm.IsNicknamed && (pkm.Format != 7)) - AddLine(Severity.Invalid, V12, CheckIdentifier.Egg); - else if (PKX.SpeciesLang[pkm.Language][0] != pkm.Nickname) - AddLine(Severity.Invalid, V13, CheckIdentifier.Egg); - else - AddLine(Severity.Valid, V14, CheckIdentifier.Egg); - + verifyNicknameEgg(); return; } @@ -280,7 +249,10 @@ private void verifyNickname() { // Can't have another language name if it hasn't evolved or wasn't a language-traded egg. bool match = PKX.getSpeciesNameGeneration(pkm.Species, pkm.Language, pkm.Format) == nickname; - match |= (pkm.WasTradedEgg || Legal.getHasEvolved(pkm)) && PKX.getIsNicknamedAnyLanguage(pkm.Species, nickname, pkm.Format); + if (pkm.WasTradedEgg || Legal.getHasEvolved(pkm)) + match |= !PKX.getIsNicknamedAnyLanguage(pkm.Species, nickname, pkm.Format); + if (pkm.Format == 5 && !pkm.IsNative) // transfer + match |= PKX.getSpeciesNameGeneration(pkm.Species, pkm.Language, 4) == nickname; if (!match) { @@ -293,13 +265,79 @@ private void verifyNickname() AddLine(Severity.Valid, V18, CheckIdentifier.Nickname); } } + private void verifyNicknameEgg() + { + if (!pkm.IsNicknamed && (pkm.Format != 7)) + AddLine(Severity.Invalid, V12, CheckIdentifier.Egg); + else if (PKX.SpeciesLang[pkm.Language][0] != pkm.Nickname) + AddLine(Severity.Invalid, V13, CheckIdentifier.Egg); + else + AddLine(Severity.Valid, V14, CheckIdentifier.Egg); + } + private void verifyNicknameTrade() + { + string[] validOT = new string[0]; + int index = -1; + if (pkm.XY) + { + validOT = Legal.TradeXY[pkm.Language]; + index = Array.IndexOf(Legal.TradeGift_XY, EncounterMatch); + } + else if (pkm.AO) + { + validOT = Legal.TradeAO[pkm.Language]; + index = Array.IndexOf(Legal.TradeGift_AO, EncounterMatch); + } + else if (pkm.SM) + { + // TODO + AddLine(Severity.Valid, V194, CheckIdentifier.Nickname); + return; + } + else if (pkm.Format <= 2 || pkm.VC) + { + var et = EncounterOriginal as EncounterTrade; + if (et?.TID == 0) // Gen1 Trade + { + if (!Legal.getEncounterTrade1Valid(pkm)) + AddLine(Severity.Invalid, V10, CheckIdentifier.Trainer); + } + else // Gen2 + { + return; // already checked all relevant properties when fetching with getValidEncounterTradeVC2 + } + return; + } + + if (validOT.Length == 0) + { + AddLine(Severity.Indeterminate, V7, CheckIdentifier.Trainer); + return; + } + if (index == -1 || validOT.Length < index * 2) + { + AddLine(Severity.Indeterminate, V8, CheckIdentifier.Trainer); + return; + } + + string nick = validOT[index]; + string OT = validOT[validOT.Length / 2 + index]; + + if (nick != pkm.Nickname) + AddLine(Severity.Fishy, V9, CheckIdentifier.Nickname); + else if (OT != pkm.OT_Name) + AddLine(Severity.Invalid, V10, CheckIdentifier.Trainer); + else + AddLine(Severity.Valid, V11, CheckIdentifier.Nickname); + } + private void verifyEVs() { var evs = pkm.EVs; int sum = evs.Sum(); if (pkm.IsEgg && sum > 0) AddLine(Severity.Invalid, V22, CheckIdentifier.EVs); - else if (sum == 0 && pkm.Stat_Level - pkm.Met_Level > 0) + else if (sum == 0 && pkm.CurrentLevel - Math.Max(1, pkm.Met_Level) > 0) AddLine(Severity.Fishy, V23, CheckIdentifier.EVs); else if (sum == 508) AddLine(Severity.Fishy, V24, CheckIdentifier.EVs); @@ -448,9 +486,9 @@ private CheckResult verifyEncounterLink() private CheckResult verifyEncounterEvent() { MysteryGift MatchedGift = EncounterMatch as MysteryGift; - if (MatchedGift != null) - return new CheckResult(Severity.Valid, string.Format(V21, MatchedGift.CardID.ToString("0000"), MatchedGift.CardTitle), CheckIdentifier.Encounter); - return null; + if (MatchedGift == null) + return null; + return new CheckResult(Severity.Valid, string.Format(V21, MatchedGift.CardID.ToString("0000"), MatchedGift.CardTitle), CheckIdentifier.Encounter); } private CheckResult verifyEncounterEgg() @@ -475,41 +513,44 @@ private CheckResult verifyEncounterEgg() } private CheckResult verifyEncounterEgg3() { - if (pkm.Format == 3) + return pkm.Format == 3 ? verifyEncounterEgg3Native() : verifyEncounterEgg3Transfer(); + } + private CheckResult verifyEncounterEgg3Native() + { + if (pkm.Met_Level != 0) + return new CheckResult(Severity.Invalid, string.Format(V52, 0), CheckIdentifier.Encounter); + if (pkm.IsEgg) { - if (pkm.Met_Level != 0) - return new CheckResult(Severity.Invalid, string.Format(V52, 0), CheckIdentifier.Encounter); - if (pkm.IsEgg) - { - var loc = pkm.FRLG ? 146 /* Four Island */ : 32; /* RSE: Route 117 */ - if (pkm.Met_Location != loc) - return new CheckResult(Severity.Invalid, V55, CheckIdentifier.Encounter); - } - else - { - var locs = pkm.FRLG ? Legal.ValidMet_FRLG : pkm.E ? Legal.ValidMet_E : Legal.ValidMet_RS; - if (locs.Contains(pkm.Met_Location)) - return new CheckResult(Severity.Valid, V53, CheckIdentifier.Encounter); - if (Legal.ValidMet_FRLG.Contains(pkm.Met_Location) || Legal.ValidMet_E.Contains(pkm.Met_Location) || Legal.ValidMet_RS.Contains(pkm.Met_Location)) - return new CheckResult(Severity.Valid, V56, CheckIdentifier.Encounter); - return new CheckResult(Severity.Invalid, V54, CheckIdentifier.Encounter); - } + var loc = pkm.FRLG ? 146 /* Four Island */ : 32; /* RSE: Route 117 */ + if (pkm.Met_Location != loc) + return new CheckResult(Severity.Invalid, V55, CheckIdentifier.Encounter); } else { - if (pkm.IsEgg) - return new CheckResult(Severity.Invalid, V57, CheckIdentifier.Encounter); - if (pkm.Met_Level < 5) - return new CheckResult(Severity.Invalid, V58, CheckIdentifier.Encounter); - if (pkm.Egg_Location != 0) - return new CheckResult(Severity.Invalid, V59, CheckIdentifier.Encounter); - if (pkm.Format == 4 && pkm.Met_Location != 0x37) // Pal Park - return new CheckResult(Severity.Invalid, V60, CheckIdentifier.Encounter); - if (pkm.Format != 4 && pkm.Met_Location != 30001) - return new CheckResult(Severity.Invalid, V61, CheckIdentifier.Encounter); + var locs = pkm.FRLG ? Legal.ValidMet_FRLG : pkm.E ? Legal.ValidMet_E : Legal.ValidMet_RS; + if (locs.Contains(pkm.Met_Location)) + return new CheckResult(Severity.Valid, V53, CheckIdentifier.Encounter); + if (Legal.ValidMet_FRLG.Contains(pkm.Met_Location) || Legal.ValidMet_E.Contains(pkm.Met_Location) || Legal.ValidMet_RS.Contains(pkm.Met_Location)) + return new CheckResult(Severity.Valid, V56, CheckIdentifier.Encounter); + return new CheckResult(Severity.Invalid, V54, CheckIdentifier.Encounter); } return new CheckResult(Severity.Valid, V53, CheckIdentifier.Encounter); } + private CheckResult verifyEncounterEgg3Transfer() + { + if (pkm.IsEgg) + return new CheckResult(Severity.Invalid, V57, CheckIdentifier.Encounter); + if (pkm.Met_Level < 5) + return new CheckResult(Severity.Invalid, V58, CheckIdentifier.Encounter); + if (pkm.Egg_Location != 0) + return new CheckResult(Severity.Invalid, V59, CheckIdentifier.Encounter); + if (pkm.Format == 4 && pkm.Met_Location != 0x37) // Pal Park + return new CheckResult(Severity.Invalid, V60, CheckIdentifier.Encounter); + if (pkm.Format != 4 && pkm.Met_Location != 30001) + return new CheckResult(Severity.Invalid, V61, CheckIdentifier.Encounter); + + return new CheckResult(Severity.Valid, V53, CheckIdentifier.Encounter); + } private CheckResult verifyEncounterEgg4() { if (pkm.Format == 4) @@ -577,7 +618,7 @@ private CheckResult verifyEncounterSafari() break; case 710: // Pumpkaboo case 711: // Goregeist - if (pkm.AltForm != 1) // Average + if (pkm.AltForm != 0) // Average return new CheckResult(Severity.Invalid, V6, CheckIdentifier.Encounter); break; case 586: // Sawsbuck @@ -588,7 +629,6 @@ private CheckResult verifyEncounterSafari() return new CheckResult(Severity.Valid, V66, CheckIdentifier.Encounter); } - private CheckResult verifyEncounterWild() { EncounterSlot[] enc = (EncounterSlot[])EncounterMatch; @@ -657,25 +697,27 @@ private CheckResult verifyEncounterG12() Console.WriteLine($"Gen1 encounter fallthrough: {pkm.FileName}"); return new CheckResult(Severity.Invalid, V80, CheckIdentifier.Encounter); } + private CheckResult verifyEncounterVC() + { + int baseSpecies = Legal.getBaseSpecies(pkm); + bool g1 = pkm.VC1 || pkm.Format == 1; + + if ((g1 && baseSpecies > Legal.MaxSpeciesID_1) || (baseSpecies > Legal.MaxSpeciesID_2)) + return new CheckResult(Severity.Invalid, V77, CheckIdentifier.Encounter); + + // Get EncounterMatch prior to parsing transporter legality + var result = verifyEncounterG12(); + EncounterOriginal = EncounterMatch; + + if (pkm.Format > 2) // transported to 7+ + AddLine(verifyVCEncounter(baseSpecies)); + + return result; + } private CheckResult verifyEncounter() { if (pkm.VC || pkm.Format < 3) - { - int baseSpecies = Legal.getBaseSpecies(pkm); - bool g1 = pkm.VC1 || pkm.Format == 1; - - if ((g1 && baseSpecies > Legal.MaxSpeciesID_1) || (baseSpecies > Legal.MaxSpeciesID_2)) - return new CheckResult(Severity.Invalid, V77, CheckIdentifier.Encounter); - - // Get EncounterMatch prior to parsing transporter legality - var result = verifyEncounterG12(); - EncounterOriginal = EncounterMatch; - - if (pkm.Format > 2) // transported to 7+ - AddLine(verifyVCEncounter(baseSpecies)); - - return result; - } + return verifyEncounterVC(); if (pkm.WasLink) return verifyEncounterLink(); @@ -781,12 +823,17 @@ private void verifyLevel() else AddLine(Severity.Valid, V88, CheckIdentifier.Level); } + private void verifyMedals() { if (pkm.Format < 6) return; - - // Training Medals + + verifyMedalsRegular(); + verifyMedalsEvent(); + } + private void verifyMedalsRegular() + { var TrainNames = ReflectUtil.getPropertiesStartWithPrefix(pkm.GetType(), "SuperTrain").ToArray(); var TrainCount = TrainNames.Count(MissionName => ReflectUtil.GetValue(pkm, MissionName) as bool? == true); if (pkm.IsEgg && TrainCount > 0) @@ -808,8 +855,9 @@ private void verifyMedals() { AddLine(Severity.Invalid, V93, CheckIdentifier.Training); } } } - - // Distribution Training Medals + } + private void verifyMedalsEvent() + { var DistNames = ReflectUtil.getPropertiesStartWithPrefix(pkm.GetType(), "DistSuperTrain"); var DistCount = DistNames.Count(MissionName => ReflectUtil.GetValue(pkm, MissionName) as bool? == true); if (pkm.IsEgg && DistCount > 0) @@ -819,6 +867,7 @@ private void verifyMedals() else if (DistCount > 0) { AddLine(Severity.Fishy, V94, CheckIdentifier.Training); } } + private void verifyRibbons() { if (!Encounter.Valid) @@ -851,13 +900,13 @@ private void verifyRibbons() }; if (MatchedGift != null) // Wonder Card { - var mgRibbons = ReflectUtil.getPropertiesStartWithPrefix(MatchedGift.Content.GetType(), "Ribbon"); + var mgRibbons = MatchedGift.Format == 4 ? EventRib : ReflectUtil.getPropertiesStartWithPrefix(MatchedGift.Content.GetType(), "Ribbon"); var commonRibbons = mgRibbons.Intersect(RibbonData).ToArray(); foreach (string r in commonRibbons) { bool? pk = ReflectUtil.getBooleanState(pkm, r); - bool? mg = ReflectUtil.getBooleanState(MatchedGift, r); + bool? mg = ReflectUtil.getBooleanState(MatchedGift.Content, r); if (pk != mg) // Mismatch { if (pk ?? false) @@ -1067,7 +1116,7 @@ private void verifyAbility() if (3 <= pkm.Format && pkm.Format <= 5) // 3-5 { - if (pkm.Version != (int) GameVersion.CXD && abilities[0] != abilities[1] && pkm.PIDAbility != abilval) + if (pkm.Version != (int) GameVersion.CXD && abilities[0] != abilities[1] && pkm.AbilityNumber != 1 << abilval) { AddLine(Severity.Invalid, V113, CheckIdentifier.Ability); return; @@ -1363,7 +1412,6 @@ private void verifyBallEggGen7() return; } - if (ball >= 27) { AddLine(Severity.Invalid, V126, CheckIdentifier.Ball); @@ -1759,13 +1807,12 @@ private void verifyForm() int species = pkm.Species; if (species == 201) // Unown { - if (pkm.GenNumber == 2 && pkm.AltForm < 26) // A-Z - valid = true; - else if (pkm.GenNumber >= 3 && pkm.AltForm >= 28) // A-Z?! + int maxCount = pkm.GenNumber == 2 ? 26 : 28; // A-Z : A-Z?! + if (pkm.AltForm < maxCount) valid = true; } if (species == 414 && pkm.AltForm < 3) // Wormadam base form kept - valid = true; + valid = true; if ((species == 664 || species == 665) && pkm.AltForm < 18) // Vivillon Pre-evolutions valid = true; @@ -1849,10 +1896,8 @@ private void verifyForm() AddLine(Severity.Invalid, V311, CheckIdentifier.Form); return; } - else if (!Legal.CheckVivillonPattern(pkm.AltForm,pkm.Country,pkm.Region)) - { - AddLine(Severity.Invalid, V312, CheckIdentifier.Form); - } + if (!Legal.CheckVivillonPattern(pkm.AltForm, pkm.Country, pkm.Region)) + AddLine(Severity.Fishy, V312, CheckIdentifier.Form); break; case 666: // Vivillon if (pkm.AltForm > 17) // Fancy & Pokéball @@ -1864,10 +1909,8 @@ private void verifyForm() return; } - else if (!Legal.CheckVivillonPattern(pkm.AltForm, pkm.Country, pkm.Region)) - { - AddLine(Severity.Invalid, V312, CheckIdentifier.Form); - } + if (!Legal.CheckVivillonPattern(pkm.AltForm, pkm.Country, pkm.Region)) + AddLine(Severity.Fishy, V312, CheckIdentifier.Form); break; case 670: // Floette if (pkm.AltForm == 5) // Eternal Flower -- Never Released @@ -2031,6 +2074,8 @@ private CheckResult[] verifyMoves(GameVersion game = GameVersion.Any) res = parseMovesSketch(Moves); else if (EventGiftMatch?.Count > 1) // Multiple possible Mystery Gifts matched, get the best match too res = parseMovesGetGift(Moves, validLevelMoves, validTMHM, validTutor); + else if (pkm.WasEgg && pkm.GenNumber < 6) + res = verifyMovesEggPreRelearn(Moves, validLevelMoves, validTMHM, validTutor); else // Everything else res = parseMovesRegular(Moves, validLevelMoves, validTMHM, validTutor, game); @@ -2041,6 +2086,38 @@ private CheckResult[] verifyMoves(GameVersion game = GameVersion.Any) return res; } + private CheckResult[] verifyMovesEggPreRelearn(int[] Moves, int[] validLevelMoves, int[] validTMHM, int[] validTutor) + { + CheckResult[] res = new CheckResult[4]; + + // Some games can have different egg movepools. Have to check all situations. + GameVersion[] Games = { }; + switch (pkm.GenNumber) + { + case 3: + Games = new[] { GameVersion.RS, GameVersion.E, GameVersion.FRLG }; + break; + case 4: + Games = new[] { GameVersion.DP, GameVersion.Pt, GameVersion.HGSS }; + break; + case 5: + Games = new[] { GameVersion.BW, GameVersion.B2W2 }; + break; + } + + int splitctr = Legal.SplitBreed.Contains(pkm.Species) ? 1 : 0; + foreach (var ver in Games) + { + for (int i = 0; i <= splitctr; i++) + { + var lvlMoves = validLevelMoves.Concat(Legal.getBaseEggMoves(pkm, i, ver, 100)).ToArray(); + res = parseMovesRegular(Moves, lvlMoves, validTMHM, validTutor, ver); + if (res.All(r => r.Valid)) // moves is satisfactory + return res; + } + } + return res; + } private CheckResult[] parseMovesSketch(int[] Moves) { CheckResult[] res = new CheckResult[4]; @@ -2260,6 +2337,16 @@ private CheckResult[] parseMoves(int[] moves, int[][] learn, int[] relearn, int[ } return res; } + private void verifyPreRelearn() + { + // For origins prior to relearn moves, need to try to match a mystery gift if applicable. + + if (pkm.WasEvent || pkm.WasEventEgg) + { + EventGiftMatch = new List(Legal.getValidGifts(pkm)); + EncounterMatch = EventGiftMatch.FirstOrDefault(); + } + } private CheckResult[] verifyRelearn() { RelearnBase = null; @@ -2412,7 +2499,7 @@ private CheckResult[] verifyRelearnEggBase(int[] RelearnMoves, int skipOption, G CheckResult[] res = new CheckResult[4]; // Obtain level1 moves - List baseMoves = new List(Legal.getBaseEggMoves(pkm, skipOption, ver)); + List baseMoves = new List(Legal.getBaseEggMoves(pkm, skipOption, ver, 1)); int baseCt = baseMoves.Count; if (baseCt > 4) baseCt = 4; @@ -2421,24 +2508,11 @@ private CheckResult[] verifyRelearnEggBase(int[] RelearnMoves, int skipOption, G var inherited = RelearnMoves.Where(m => m != 0 && (!baseMoves.Contains(m) || inheritMoves.Contains(m))).ToList(); int inheritCt = inherited.Count; - // Get Move Window - var window = new List(); - window.AddRange(baseMoves); // initial moves (levelup for current level of egg) - window.AddRange(inherited); // nonstandard (egg or higher levelup moves) - // Get required amount of base moves int unique = baseMoves.Concat(inherited).Distinct().Count(); int reqBase = inheritCt == 4 || baseCt + inheritCt > 4 ? 4 - inheritCt : baseCt; if (RelearnMoves.Where(m => m != 0).Count() < Math.Min(4, baseMoves.Count)) reqBase = Math.Min(4, unique); - - // Store the base moves suggestion. - string em = string.Join(", ", baseMoves.Select(m => m >= movelist.Length ? V190 : movelist[m])); - - // Store the suggested relearn moves. - int[] moves = window.Skip(baseCt + inheritCt - 4).Take(4).ToArray(); - Array.Resize(ref moves, 4); - RelearnBase = moves; // Check if the required amount of Base Egg Moves are present. for (int i = 0; i < reqBase; i++) @@ -2452,6 +2526,7 @@ private CheckResult[] verifyRelearnEggBase(int[] RelearnMoves, int skipOption, G res[z] = new CheckResult(Severity.Invalid, V180, CheckIdentifier.RelearnMove); // provide the list of suggested base moves for the last required slot + string em = string.Join(", ", baseMoves.Select(m => m >= movelist.Length ? V190 : movelist[m])); res[reqBase - 1].Comment += string.Format(Environment.NewLine + V181, em); break; } @@ -2472,6 +2547,7 @@ private CheckResult[] verifyRelearnEggBase(int[] RelearnMoves, int skipOption, G res[i] = new CheckResult(Severity.Invalid, V182, CheckIdentifier.RelearnMove); } + RelearnBase = baseMoves.ToArray(); return res; } diff --git a/PKHeX/Legality/Core.cs b/PKHeX/Legality/Core.cs index d1ac67590..a1bdaec23 100644 --- a/PKHeX/Legality/Core.cs +++ b/PKHeX/Legality/Core.cs @@ -99,14 +99,14 @@ private static EncounterStatic[] getStaticEncounters(GameVersion Game) table = Encounter_DPPt; break; case GameVersion.HG: case GameVersion.SS: - table = Encounter_HGSS; + table = Encounter_HGSS.Concat(Encounter_PokeWalker).ToArray(); break; case GameVersion.B: case GameVersion.W: - table = Encounter_BW; + table = Encounter_BW.Concat(BW_DreamWorld).ToArray(); break; case GameVersion.B2: case GameVersion.W2: - table = Encounter_B2W2; + table = Encounter_B2W2.Concat(B2W2_DreamWorld).ToArray(); break; case GameVersion.X: case GameVersion.Y: @@ -159,14 +159,16 @@ private static EncounterArea[] getEncounterTables(byte[] mini, string ident) { return EncounterArea.getArray(Data.unpackMini(mini, ident)); } - private static IEnumerable addExtraTableSlots(IEnumerable GameSlots, IEnumerable SpecialSlots) + private static EncounterArea[] addExtraTableSlots(EncounterArea[] GameSlots, EncounterArea[] SpecialSlots) { foreach (EncounterArea g in GameSlots) { - foreach (var slots in SpecialSlots.Where(l => l.Location == g.Location)) - g.Slots = g.Slots.Concat(slots.Slots).ToArray(); + var tables = SpecialSlots.Where(l => l.Location == g.Location).ToList(); + if (tables.Any()) + g.Slots = g.Slots.Concat(tables.SelectMany(t => t.Slots)).ToArray(); } - return GameSlots.Concat(SpecialSlots.Where(s => !GameSlots.Any(g => g.Location == s.Location))).ToArray(); + var notInserted = SpecialSlots.Where(s => GameSlots.All(g => g.Location != s.Location)); + return GameSlots.Concat(notInserted).ToArray(); } private static void ReduceAreasSize(ref EncounterArea[] Areas) { @@ -195,6 +197,14 @@ private static void MarkG3Slots_RSE(ref EncounterArea[] Areas) { ReduceAreasSize(ref Areas); } + private static void MarkG4PokeWalker(ref EncounterStatic[] t) + { + foreach (EncounterStatic s in t) + { + s.Location = 233; //Pokéwalker + s.Gift = true; //Pokeball only + } + } private static void MarkG4SwarmSlots(ref EncounterArea[] Areas, EncounterArea[] SwarmAreas) { // Swarm slots replace slots 0 and 1 from encounters data @@ -249,6 +259,14 @@ private static void MarkG5HiddenGrottoSlots(ref EncounterArea[] Areas) foreach (EncounterSlot s in Areas[0].Slots) //Only 1 area s.Type = SlotType.HiddenGrotto; } + private static void MarkG5DreamWorld(ref EncounterStatic[] t) + { + foreach (EncounterStatic s in t) + { + s.Location = 75; //Entree Forest. Location can be a flag from dream world + s.Ability = 4; //What if 1=2=HA? + } + } private static void MarkG5Slots(ref EncounterArea[] Areas) { foreach (var area in Areas) @@ -348,7 +366,7 @@ private static EncounterArea[] getTables2(GameVersion Version) var h_g = EncounterArea.getArray2_H(Resources.encounter_gold_h); var h_s = EncounterArea.getArray2_H(Resources.encounter_silver_h); - Slots = addExtraTableSlots(addExtraTableSlots(addExtraTableSlots(addExtraTableSlots(g, s), h_g), h_s),f).ToArray(); + Slots = addExtraTableSlots(addExtraTableSlots(addExtraTableSlots(addExtraTableSlots(g, s), h_g), h_s),f); } if (Version == GameVersion.C || Version == GameVersion.GSC) { @@ -358,7 +376,7 @@ private static EncounterArea[] getTables2(GameVersion Version) var h_c = EncounterArea.getArray2_H(Resources.encounter_crystal_h); var extra = addExtraTableSlots(addExtraTableSlots(c, h_c),f); - return Version == GameVersion.C ? extra.ToArray() : addExtraTableSlots(Slots, extra).ToArray(); + return Version == GameVersion.C ? extra : addExtraTableSlots(Slots, extra); } return Slots; @@ -406,11 +424,11 @@ private static EncounterArea[] getTables2(GameVersion Version) MarkG3Slots_FRLG(ref FR_Slots); MarkG3Slots_FRLG(ref LG_Slots); - SlotsR = addExtraTableSlots(R_Slots, SlotsRSEAlt).ToArray(); - SlotsS = addExtraTableSlots(S_Slots, SlotsRSEAlt).ToArray(); - SlotsE = addExtraTableSlots(E_Slots, SlotsRSEAlt).ToArray(); - SlotsFR = addExtraTableSlots(FR_Slots, SlotsFRLGAlt).ToArray(); - SlotsLG = addExtraTableSlots(LG_Slots, SlotsFRLGAlt).ToArray(); + SlotsR = addExtraTableSlots(R_Slots, SlotsRSEAlt); + SlotsS = addExtraTableSlots(S_Slots, SlotsRSEAlt); + SlotsE = addExtraTableSlots(E_Slots, SlotsRSEAlt); + SlotsFR = addExtraTableSlots(FR_Slots, SlotsFRLGAlt); + SlotsLG = addExtraTableSlots(LG_Slots, SlotsFRLGAlt); Evolves3 = new EvolutionTree(new[] { Resources.evos_g3 }, GameVersion.RS, PersonalTable.RS, MaxSpeciesID_3); @@ -426,6 +444,7 @@ private static EncounterArea[] getTables2(GameVersion Version) } // Gen 4 { + MarkG4PokeWalker(ref Encounter_PokeWalker); StaticD = getStaticEncounters(GameVersion.D); StaticP = getStaticEncounters(GameVersion.P); StaticPt = getStaticEncounters(GameVersion.Pt); @@ -465,11 +484,11 @@ private static EncounterArea[] getTables2(GameVersion Version) MarkG4Slots(ref HG_Headbutt_Slots); MarkG4Slots(ref SS_Headbutt_Slots); - SlotsD = addExtraTableSlots(addExtraTableSlots(D_Slots, D_HoneyTrees_Slots), SlotsDPPPtAlt).ToArray(); - SlotsP = addExtraTableSlots(addExtraTableSlots(P_Slots, P_HoneyTrees_Slots), SlotsDPPPtAlt).ToArray(); - SlotsPt = addExtraTableSlots(addExtraTableSlots(Pt_Slots, Pt_HoneyTrees_Slots), SlotsDPPPtAlt).ToArray(); - SlotsHG = addExtraTableSlots(addExtraTableSlots(HG_Slots, HG_Headbutt_Slots), SlotsHGSSAlt).ToArray(); - SlotsSS = addExtraTableSlots(addExtraTableSlots(SS_Slots, SS_Headbutt_Slots), SlotsHGSSAlt).ToArray(); + SlotsD = addExtraTableSlots(addExtraTableSlots(D_Slots, D_HoneyTrees_Slots), SlotsDPPPtAlt); + SlotsP = addExtraTableSlots(addExtraTableSlots(P_Slots, P_HoneyTrees_Slots), SlotsDPPPtAlt); + SlotsPt = addExtraTableSlots(addExtraTableSlots(Pt_Slots, Pt_HoneyTrees_Slots), SlotsDPPPtAlt); + SlotsHG = addExtraTableSlots(addExtraTableSlots(HG_Slots, HG_Headbutt_Slots), SlotsHGSSAlt); + SlotsSS = addExtraTableSlots(addExtraTableSlots(SS_Slots, SS_Headbutt_Slots), SlotsHGSSAlt); Evolves4 = new EvolutionTree(new[] { Resources.evos_g4 }, GameVersion.DP, PersonalTable.DP, MaxSpeciesID_4); @@ -480,6 +499,8 @@ private static EncounterArea[] getTables2(GameVersion Version) } // Gen 5 { + MarkG5DreamWorld(ref BW_DreamWorld); + MarkG5DreamWorld(ref B2W2_DreamWorld); StaticB = getStaticEncounters(GameVersion.B); StaticW = getStaticEncounters(GameVersion.W); StaticB2 = getStaticEncounters(GameVersion.B2); @@ -491,8 +512,8 @@ private static EncounterArea[] getTables2(GameVersion Version) MarkG5Slots(ref WSlots); MarkBWSwarmSlots(ref SlotsB_Swarm); MarkBWSwarmSlots(ref SlotsW_Swarm); - SlotsB = addExtraTableSlots(BSlots, SlotsB_Swarm).ToArray(); - SlotsW = addExtraTableSlots(WSlots, SlotsW_Swarm).ToArray(); + SlotsB = addExtraTableSlots(BSlots, SlotsB_Swarm); + SlotsW = addExtraTableSlots(WSlots, SlotsW_Swarm); var B2Slots = getEncounterTables(GameVersion.B2); var W2Slots = getEncounterTables(GameVersion.W2); @@ -518,8 +539,8 @@ private static EncounterArea[] getTables2(GameVersion Version) var YSlots = getEncounterTables(GameVersion.Y); MarkG6XYSlots(ref XSlots); MarkG6XYSlots(ref YSlots); - SlotsX = addExtraTableSlots(XSlots, SlotsXYAlt).ToArray(); - SlotsY = addExtraTableSlots(YSlots, SlotsXYAlt).ToArray(); + SlotsX = addExtraTableSlots(XSlots, SlotsXYAlt); + SlotsY = addExtraTableSlots(YSlots, SlotsXYAlt); SlotsA = getEncounterTables(GameVersion.AS); SlotsO = getEncounterTables(GameVersion.OR); @@ -609,7 +630,7 @@ internal static IEnumerable getValidRelearn(PKM pkm, int skipOption) r.AddRange(getRelearnLVLMoves(pkm, species, 100, pkm.AltForm)); return r.Distinct(); } - internal static IEnumerable getBaseEggMoves(PKM pkm, int skipOption, GameVersion gameSource) + internal static IEnumerable getBaseEggMoves(PKM pkm, int skipOption, GameVersion gameSource, int lvl) { int species = getBaseSpecies(pkm, skipOption); @@ -622,49 +643,63 @@ internal static IEnumerable getBaseEggMoves(PKM pkm, int skipOption, GameVe case GameVersion.S: case GameVersion.RS: if (pkm.InhabitedGeneration(3)) - return LevelUpRS[species].getMoves(1); + return LevelUpRS[species].getMoves(lvl); break; case GameVersion.E: if (pkm.InhabitedGeneration(3)) - return LevelUpE[species].getMoves(1); + return LevelUpE[species].getMoves(lvl); break; case GameVersion.FR: case GameVersion.LG: case GameVersion.FRLG: // only difference in FR/LG is deoxys which doesn't breed. if (pkm.InhabitedGeneration(3)) - return LevelUpFR[species].getMoves(1); + return LevelUpFR[species].getMoves(lvl); break; case GameVersion.D: case GameVersion.P: case GameVersion.DP: if (pkm.InhabitedGeneration(4)) - return LevelUpDP[species].getMoves(1); + return LevelUpDP[species].getMoves(lvl); break; case GameVersion.Pt: if (pkm.InhabitedGeneration(4)) - return LevelUpPt[species].getMoves(1); + return LevelUpPt[species].getMoves(lvl); break; case GameVersion.HG: case GameVersion.SS: case GameVersion.HGSS: if (pkm.InhabitedGeneration(4)) - return LevelUpHGSS[species].getMoves(1); + return LevelUpHGSS[species].getMoves(lvl); + break; + + case GameVersion.B: + case GameVersion.W: + case GameVersion.BW: + if (pkm.InhabitedGeneration(5)) + return LevelUpBW[species].getMoves(lvl); + break; + + case GameVersion.B2: + case GameVersion.W2: + case GameVersion.B2W2: + if (pkm.InhabitedGeneration(5)) + return LevelUpBW[species].getMoves(lvl); break; case GameVersion.X: case GameVersion.Y: case GameVersion.XY: if (pkm.InhabitedGeneration(6)) - return LevelUpXY[species].getMoves(1); + return LevelUpXY[species].getMoves(lvl); break; case GameVersion.AS: case GameVersion.OR: case GameVersion.ORAS: if (pkm.InhabitedGeneration(6)) - return LevelUpAO[species].getMoves(1); + return LevelUpAO[species].getMoves(lvl); break; case GameVersion.SN: @@ -672,7 +707,7 @@ internal static IEnumerable getBaseEggMoves(PKM pkm, int skipOption, GameVe case GameVersion.SM: int index = PersonalTable.SM.getFormeIndex(species, pkm.AltForm); if (pkm.InhabitedGeneration(7)) - return LevelUpSM[index].getMoves(1); + return LevelUpSM[index].getMoves(lvl); break; } return null; @@ -1042,7 +1077,16 @@ private static IEnumerable getMatchingPCD(PKM pkm, IEnumerable().Where(wc => vs.Any(dl => dl.Species == wc.Species))) { @@ -1057,12 +1101,32 @@ private static IEnumerable getMatchingPCD(PKM pkm, IEnumerable !getCanFormChange(pkm, dl.Species))) continue; - if (wc.Met_Location != pkm.Met_Location) continue; - if (wc.Egg_Location != pkm.Egg_Location) continue; + + if (wc.IsEgg) + { + if (wc.Egg_Location + 3000 != pkm.Egg_Location) continue; + } + else + { + if (pkm.Format != 4) // transferred + { + bool valid = false; + if (pkm.Met_Location == 30001) + valid = true; + else if (CrownBeasts[0] == pkm.Species) // 251 = Celebi + valid = pkm.Met_Location == 30010 || pkm.Met_Location == 30011; // unused || used + else if (CrownBeasts.Skip(1).Any(x => x == pkm.Species)) // Raikou, Entei, Suicune + valid = pkm.Met_Location == 30012 || pkm.Met_Location == 30013; // unused || used + if (!valid) + continue; + } + else if (wc.Egg_Location + 3000 != pkm.Met_Location) continue; + } + if (wc.CurrentLevel != pkm.Met_Level) continue; if (wc.Ball != pkm.Ball) continue; if (wc.OT_Gender < 3 && wc.OT_Gender != pkm.OT_Gender) continue; - if (wc.Nature != 0xFF && wc.Nature != pkm.Nature) continue; + if (wc.PID == 1 && pkm.IsShiny) continue; if (wc.Gender != 3 && wc.Gender != pkm.Gender) continue; if (wc.CNT_Cool > pkm.CNT_Cool) continue; @@ -1092,13 +1156,12 @@ private static IEnumerable getMatchingPGF(PKM pkm, IEnumerable input) - { - return input.Select(l => l.Substring(0, l.IndexOf(splitter, StringComparison.Ordinal))).ToArray(); - } - private static IEnumerable DumpStrings() - { - var props = ReflectUtil.getPropertiesStartWithPrefix(t, "V"); - return props.Select(p => $"{p}{splitter}{ReflectUtil.GetValue(t, p).ToString()}"); - } - - public static void setLocalization(IEnumerable lines) - { - if (lines == null) - return; - foreach (var line in lines.Where(l => l != null)) - { - var index = line.IndexOf(splitter, StringComparison.Ordinal); - if (index < 0) - continue; - var prop = line.Substring(0, index); - var value = line.Substring(index + splitter.Length); - - try - { - ReflectUtil.SetValue(t, prop.ToUpper(), value); - } - catch - { - Console.WriteLine($"Property not present: {prop} || Value written: {value}"); - } - } - } - public static string[] getLocalization(string[] existingLines = null) - { - existingLines = existingLines ?? new string[0]; - var currentLines = DumpStrings().ToArray(); - var existing = getProps(existingLines); - var current = getProps(currentLines); - - var result = new string[currentLines.Length]; - for (int i = 0; i < current.Length; i++) - { - int index = Array.IndexOf(existing, current[i]); - result[i] = index < 0 ? currentLines[i] : existingLines[index]; - } - return result; - } #region General Strings @@ -99,6 +46,10 @@ public static string[] getLocalization(string[] existingLines = null) #region Legality Check Result Strings + public static string V250 {get; set;} = "Gender matches PID."; + public static string V251 {get; set;} = "PID-Gender mismatch."; + public static string V252 {get; set;} = "Nature matches PID."; + public static string V253 {get; set;} = "PID-Nature mismatch."; public static string V203 {get; set;} = "Genderless Pokémon should not have a gender."; public static string V201 {get; set;} = "Encryption Constant is not set."; public static string V204 {get; set;} = "Held item is unreleased."; diff --git a/PKHeX/Legality/Structures/EncounterStatic.cs b/PKHeX/Legality/Structures/EncounterStatic.cs index 0acdafd56..9fcb22d1a 100644 --- a/PKHeX/Legality/Structures/EncounterStatic.cs +++ b/PKHeX/Legality/Structures/EncounterStatic.cs @@ -66,6 +66,44 @@ public EncounterStatic Clone(int location) }; } + public EncounterStatic[] DreamRadarClone() + { + EncounterStatic[] Encounters = new EncounterStatic[8]; + for (int i = 0; i < 8; i++) + Encounters[i] = DreamRadarClone(5 * i + 5); //Level from 5->40 depends on the number of badage + return Encounters; + } + + public EncounterStatic DreamRadarClone(int level) + { + return new EncounterStatic() + { + Species = Species, + Level = level, + Location = 30015, //Pokemon Dream Radar + Ability = Ability, + Form = Form, + Shiny = Shiny, + Relearn = Relearn, + Moves = Moves, + Gender = Gender, + EggLocation = EggLocation, + Nature = Nature, + Gift = Gift, + Ball = 25, //Dream Ball + Version = Version, + IVs = IVs, + IV3 = IV3, + Contest = Contest, + HeldItem = HeldItem, + Fateful = Fateful, + RibbonWishing = RibbonWishing, + SkipFormCheck = SkipFormCheck, + NSparkle = NSparkle, + Roaming = Roaming + }; + } + public string Name { get diff --git a/PKHeX/Legality/Tables4.cs b/PKHeX/Legality/Tables4.cs index 0474a7890..d4475424a 100644 --- a/PKHeX/Legality/Tables4.cs +++ b/PKHeX/Legality/Tables4.cs @@ -198,6 +198,180 @@ public static partial class Legal new[] { 147, 148, 149, 230, 329, 330, 334, 371, 372, 373, 380, 381, 384, 443, 444, 445, 483, 484, 487 } }; + #region Pokéwalker Encounter + // all pkm are in Poke Ball and have a met location of "PokeWalker" + internal static readonly EncounterStatic[] Encounter_PokeWalker = + { + // Some pkm has a pre-level move, an egg move or even a special move, it might be also available via HM/TM/Tutor + // Johto/Kanto Courses + new EncounterStatic{ Species = 084, Gender = 1, Level = 08, }, // Doduo + new EncounterStatic{ Species = 115, Gender = 1, Level = 08, }, // Kangaskhan + new EncounterStatic{ Species = 029, Gender = 1, Level = 05, }, // Nidoran1 + new EncounterStatic{ Species = 032, Gender = 0, Level = 05, }, // Nidoran0 + new EncounterStatic{ Species = 016, Gender = 0, Level = 05, }, // Pidgey + new EncounterStatic{ Species = 161, Gender = 1, Level = 05, }, // Sentret + new EncounterStatic{ Species = 202, Gender = 1, Level = 15, }, // Wobbuffet + new EncounterStatic{ Species = 069, Gender = 1, Level = 08, }, // Bellsprout + new EncounterStatic{ Species = 046, Gender = 1, Level = 06, }, // Paras + new EncounterStatic{ Species = 048, Gender = 0, Level = 06, }, // Venonat + new EncounterStatic{ Species = 021, Gender = 0, Level = 05, }, // Spearow + new EncounterStatic{ Species = 043, Gender = 1, Level = 05, }, // Oddish + new EncounterStatic{ Species = 095, Gender = 0, Level = 09, }, // Onix + new EncounterStatic{ Species = 240, Gender = 0, Level = 09, Moves = new[]{241},}, // Magby: Sunny Day + new EncounterStatic{ Species = 066, Gender = 1, Level = 07, }, // Machop + new EncounterStatic{ Species = 077, Gender = 1, Level = 07, }, // Ponyta + new EncounterStatic{ Species = 074, Gender = 1, Level = 08, Moves = new[]{189},}, // Geodude: Mud-Slap + new EncounterStatic{ Species = 163, Gender = 1, Level = 06, }, // Hoothoot + new EncounterStatic{ Species = 054, Gender = 1, Level = 10, }, // Psyduck + new EncounterStatic{ Species = 120, Gender = 2, Level = 10, }, // Staryu + new EncounterStatic{ Species = 060, Gender = 0, Level = 08, }, // Poliwag + new EncounterStatic{ Species = 079, Gender = 0, Level = 08, }, // Slowpoke + new EncounterStatic{ Species = 191, Gender = 1, Level = 06, }, // Sunkern + new EncounterStatic{ Species = 194, Gender = 0, Level = 06, }, // Wooper + new EncounterStatic{ Species = 081, Gender = 2, Level = 11, }, // Magnemite + new EncounterStatic{ Species = 239, Gender = 0, Level = 11, Moves = new[]{009},}, // Elekid: Thunder Punch + new EncounterStatic{ Species = 081, Gender = 2, Level = 08, }, // Magnemite + new EncounterStatic{ Species = 198, Gender = 1, Level = 11, }, // Murkrow + new EncounterStatic{ Species = 019, Gender = 1, Level = 07, }, // Rattata + new EncounterStatic{ Species = 163, Gender = 1, Level = 07, }, // Hoothoot + new EncounterStatic{ Species = 092, Gender = 1, Level = 15, Moves = new[]{194},}, // Gastly: Destiny Bond + new EncounterStatic{ Species = 238, Gender = 1, Level = 12, Moves = new[]{419},}, // Smoochum: Avalanche + new EncounterStatic{ Species = 092, Gender = 1, Level = 10, }, // Gastly + new EncounterStatic{ Species = 095, Gender = 0, Level = 10, }, // Onix + new EncounterStatic{ Species = 041, Gender = 0, Level = 08, }, // Zubat + new EncounterStatic{ Species = 066, Gender = 0, Level = 08, }, // Machop + new EncounterStatic{ Species = 060, Gender = 1, Level = 15, Moves = new[]{187}, }, // Poliwag: Belly Drum + new EncounterStatic{ Species = 147, Gender = 1, Level = 10, }, // Dratini + new EncounterStatic{ Species = 090, Gender = 1, Level = 12, }, // Shellder + new EncounterStatic{ Species = 098, Gender = 0, Level = 12, Moves = new[]{152}, }, // Krabby: Crabhammer + new EncounterStatic{ Species = 072, Gender = 1, Level = 09, }, // Tentacool + new EncounterStatic{ Species = 118, Gender = 1, Level = 09, }, // Goldeen + new EncounterStatic{ Species = 063, Gender = 1, Level = 15, }, // Abra + new EncounterStatic{ Species = 100, Gender = 2, Level = 15, }, // Voltorb + new EncounterStatic{ Species = 088, Gender = 0, Level = 13, }, // Grimer + new EncounterStatic{ Species = 109, Gender = 1, Level = 13, Moves = new[]{120}, }, // Koffing: Self-Destruct + new EncounterStatic{ Species = 019, Gender = 1, Level = 16, }, // Rattata + new EncounterStatic{ Species = 162, Gender = 0, Level = 15, }, // Furret + // Hoenn Courses + new EncounterStatic{ Species = 264, Gender = 1, Level = 30, }, // Linoone + new EncounterStatic{ Species = 300, Gender = 1, Level = 30, }, // Skitty + new EncounterStatic{ Species = 313, Gender = 0, Level = 25, }, // Volbeat + new EncounterStatic{ Species = 314, Gender = 1, Level = 25, }, // Illumise + new EncounterStatic{ Species = 263, Gender = 1, Level = 17, }, // Zigzagoon + new EncounterStatic{ Species = 265, Gender = 1, Level = 15, }, // Wurmple + new EncounterStatic{ Species = 298, Gender = 1, Level = 20, }, // Azurill + new EncounterStatic{ Species = 320, Gender = 1, Level = 31, }, // Wailmer + new EncounterStatic{ Species = 116, Gender = 1, Level = 20, }, // Horsea + new EncounterStatic{ Species = 318, Gender = 1, Level = 26, }, // Carvanha + new EncounterStatic{ Species = 118, Gender = 1, Level = 22, Moves = new[]{401}, }, // Goldeen: Aqua Tail + new EncounterStatic{ Species = 129, Gender = 1, Level = 15, }, // Magikarp + new EncounterStatic{ Species = 218, Gender = 1, Level = 31, }, // Slugma + new EncounterStatic{ Species = 307, Gender = 0, Level = 32, }, // Meditite + new EncounterStatic{ Species = 111, Gender = 0, Level = 25, }, // Rhyhorn + new EncounterStatic{ Species = 228, Gender = 0, Level = 27, }, // Houndour + new EncounterStatic{ Species = 074, Gender = 0, Level = 29, }, // Geodude + new EncounterStatic{ Species = 077, Gender = 1, Level = 19, }, // Ponyta + new EncounterStatic{ Species = 351, Gender = 1, Level = 30, }, // Castform + new EncounterStatic{ Species = 352, Gender = 0, Level = 30, }, // Kecleon + new EncounterStatic{ Species = 203, Gender = 1, Level = 28, }, // Girafarig + new EncounterStatic{ Species = 234, Gender = 1, Level = 28, }, // Stantler + new EncounterStatic{ Species = 044, Gender = 1, Level = 14, }, // Gloom + new EncounterStatic{ Species = 070, Gender = 0, Level = 13, }, // Weepinbell + new EncounterStatic{ Species = 105, Gender = 1, Level = 30, Moves = new[]{037}, }, // Marowak: Tharsh + new EncounterStatic{ Species = 128, Gender = 0, Level = 30, }, // Tauros + new EncounterStatic{ Species = 042, Gender = 0, Level = 33, }, // Golbat + new EncounterStatic{ Species = 177, Gender = 1, Level = 24, }, // Natu + new EncounterStatic{ Species = 066, Gender = 0, Level = 13, Moves = new[]{418}, }, // Machop: Bullet Punch + new EncounterStatic{ Species = 092, Gender = 1, Level = 15, }, // Gastly + // Sinnoh Courses + new EncounterStatic{ Species = 415, Gender = 0, Level = 30, }, // Combee + new EncounterStatic{ Species = 439, Gender = 0, Level = 29, }, // Mime Jr. + new EncounterStatic{ Species = 403, Gender = 1, Level = 33, }, // Shinx + new EncounterStatic{ Species = 406, Gender = 0, Level = 30, }, // Budew + new EncounterStatic{ Species = 399, Gender = 1, Level = 13, }, // Bidoof + new EncounterStatic{ Species = 401, Gender = 0, Level = 15, }, // Kricketot + new EncounterStatic{ Species = 361, Gender = 1, Level = 28, }, // Snorunt + new EncounterStatic{ Species = 459, Gender = 0, Level = 31, Moves = new[]{452}, }, // Snover: Wood Hammer + new EncounterStatic{ Species = 215, Gender = 0, Level = 28, Moves = new[]{306}, }, // Sneasel: Crash Claw + new EncounterStatic{ Species = 436, Gender = 2, Level = 20, }, // Bronzor + new EncounterStatic{ Species = 179, Gender = 1, Level = 15, }, // Mareep + new EncounterStatic{ Species = 220, Gender = 1, Level = 16, }, // Swinub + new EncounterStatic{ Species = 357, Gender = 1, Level = 35, }, // Tropius + new EncounterStatic{ Species = 438, Gender = 0, Level = 30, }, // Bonsly + new EncounterStatic{ Species = 114, Gender = 1, Level = 30, }, // Tangela + new EncounterStatic{ Species = 400, Gender = 1, Level = 30, }, // Bibarel + new EncounterStatic{ Species = 102, Gender = 1, Level = 17, }, // Exeggcute + new EncounterStatic{ Species = 179, Gender = 0, Level = 19, }, // Mareep + new EncounterStatic{ Species = 200, Gender = 1, Level = 32, Moves = new[]{194},}, // Misdreavus: Destiny Bond + new EncounterStatic{ Species = 433, Gender = 0, Level = 22, Moves = new[]{105},}, // Chingling: Recover + new EncounterStatic{ Species = 093, Gender = 0, Level = 25, }, // Haunter + new EncounterStatic{ Species = 418, Gender = 0, Level = 28, Moves = new[]{226},}, // Buizel: Baton Pass + new EncounterStatic{ Species = 170, Gender = 1, Level = 17, }, // Chinchou + new EncounterStatic{ Species = 223, Gender = 1, Level = 19, }, // Remoraid + new EncounterStatic{ Species = 422, Gender = 1, Level = 30, }, // Shellos + new EncounterStatic{ Species = 456, Gender = 1, Level = 26, }, // Finneon + new EncounterStatic{ Species = 086, Gender = 1, Level = 27, }, // Seel + new EncounterStatic{ Species = 129, Gender = 1, Level = 30, }, // Magikarp + new EncounterStatic{ Species = 054, Gender = 1, Level = 22, }, // Psyduck + new EncounterStatic{ Species = 090, Gender = 0, Level = 20, }, // Shellder + new EncounterStatic{ Species = 025, Gender = 1, Level = 30, }, // Pikachu + new EncounterStatic{ Species = 417, Gender = 1, Level = 33, }, // Pachirisu + new EncounterStatic{ Species = 035, Gender = 1, Level = 31, }, // Clefairy + new EncounterStatic{ Species = 039, Gender = 1, Level = 30, }, // Jigglypuff + new EncounterStatic{ Species = 183, Gender = 1, Level = 25, }, // Marill + new EncounterStatic{ Species = 187, Gender = 1, Level = 25, }, // Hoppip + new EncounterStatic{ Species = 442, Gender = 0, Level = 31, }, // Spiritomb + new EncounterStatic{ Species = 446, Gender = 0, Level = 33, }, // Munchlax + new EncounterStatic{ Species = 349, Gender = 0, Level = 30, }, // Feebas + new EncounterStatic{ Species = 433, Gender = 1, Level = 26, }, // Chingling + new EncounterStatic{ Species = 042, Gender = 0, Level = 33, }, // Golbat + new EncounterStatic{ Species = 164, Gender = 1, Level = 30, }, // Noctowl + // Special Courses + new EncounterStatic{ Species = 120, Gender = 2, Level = 18, Moves = new[]{113}, }, // Staryu: Light Screen + new EncounterStatic{ Species = 224, Gender = 1, Level = 19, Moves = new[]{324}, }, // Octillery: Signal Beam + new EncounterStatic{ Species = 116, Gender = 0, Level = 15, }, // Horsea + new EncounterStatic{ Species = 222, Gender = 1, Level = 16, }, // Corsola + new EncounterStatic{ Species = 170, Gender = 1, Level = 12, }, // Chinchou + new EncounterStatic{ Species = 223, Gender = 0, Level = 14, }, // Remoraid + new EncounterStatic{ Species = 035, Gender = 0, Level = 08, Moves = new[]{236}, }, // Clefairy: Moonlight + new EncounterStatic{ Species = 039, Gender = 0, Level = 10, }, // Jigglypuff + new EncounterStatic{ Species = 041, Gender = 0, Level = 09, }, // Zubat + new EncounterStatic{ Species = 163, Gender = 1, Level = 06, }, // Hoothoot + new EncounterStatic{ Species = 074, Gender = 0, Level = 05, }, // Geodude + new EncounterStatic{ Species = 095, Gender = 1, Level = 05, Moves = new[]{088}, }, // Onix: Rock Throw + new EncounterStatic{ Species = 025, Gender = 0, Level = 15, Moves = new[]{019}, }, // Pikachu: Fly + new EncounterStatic{ Species = 025, Gender = 1, Level = 14, Moves = new[]{057}, }, // Pikachu: Surf + new EncounterStatic{ Species = 025, Gender = 1, Level = 12, Moves = new[]{344}, }, // Pikachu: Volt Tackle + new EncounterStatic{ Species = 025, Gender = 0, Level = 13, Moves = new[]{175}, }, // Pikachu: Flail + new EncounterStatic{ Species = 025, Gender = 0, Level = 10, }, // Pikachu + new EncounterStatic{ Species = 025, Gender = 1, Level = 10, }, // Pikachu + new EncounterStatic{ Species = 302, Gender = 1, Level = 15, }, // Sableye + new EncounterStatic{ Species = 441, Gender = 0, Level = 15, }, // Chatot + new EncounterStatic{ Species = 025, Gender = 1, Level = 10, }, // Pikachu + new EncounterStatic{ Species = 453, Gender = 0, Level = 10, }, // Croagunk + new EncounterStatic{ Species = 417, Gender = 0, Level = 05, }, // Pachirisu + new EncounterStatic{ Species = 427, Gender = 1, Level = 05, }, // Buneary + new EncounterStatic{ Species = 133, Gender = 0, Level = 10, }, // Eevee + new EncounterStatic{ Species = 255, Gender = 0, Level = 10, }, // Torchic + new EncounterStatic{ Species = 061, Gender = 1, Level = 15, Moves = new[]{003}, }, // Poliwhirl: Double Slap + new EncounterStatic{ Species = 279, Gender = 0, Level = 15, }, // Pelipper + new EncounterStatic{ Species = 025, Gender = 1, Level = 08, }, // Pikachu + new EncounterStatic{ Species = 052, Gender = 0, Level = 10, }, // Meowth + new EncounterStatic{ Species = 374, Gender = 2, Level = 05, Moves = new[]{428,334,442}, }, // Beldum: Zen Headbutt, Iron Defense & Iron Head. + new EncounterStatic{ Species = 446, Gender = 0, Level = 05, Moves = new[]{120}, }, // Munchlax: Self-Destruct + new EncounterStatic{ Species = 116, Gender = 0, Level = 05, Moves = new[]{330}, }, // Horsea: Muddy Water + new EncounterStatic{ Species = 355, Gender = 0, Level = 05, Moves = new[]{286}, }, // Duskull: Imprison + new EncounterStatic{ Species = 129, Gender = 0, Level = 05, Moves = new[]{340}, }, // Magikarp: Bounce + new EncounterStatic{ Species = 436, Gender = 2, Level = 05, Moves = new[]{433}, }, // Bronzor: Trick Room + new EncounterStatic{ Species = 239, Gender = 0, Level = 05, }, // Elekid + new EncounterStatic{ Species = 240, Gender = 0, Level = 05, }, // Magby + new EncounterStatic{ Species = 238, Gender = 1, Level = 05, }, // Smoochum + new EncounterStatic{ Species = 440, Gender = 1, Level = 05, }, // Happiny + new EncounterStatic{ Species = 173, Gender = 1, Level = 05, }, // Cleffa + new EncounterStatic{ Species = 174, Gender = 0, Level = 05, }, // Igglybuff + }; + #endregion + #region Static Encounter/Gift Tables internal static readonly int[] Roaming_MetLocation_DPPt = { // Route 201-222 can be encountered in either grass or water @@ -225,7 +399,6 @@ public static partial class Legal new EncounterStatic { Gift = true, Species = 387, Level = 5, Location = 016, Version = GameVersion.Pt,}, // Turtwig @ Route 201 new EncounterStatic { Gift = true, Species = 390, Level = 5, Location = 016, Version = GameVersion.Pt,}, // Chimchar new EncounterStatic { Gift = true, Species = 393, Level = 5, Location = 016, Version = GameVersion.Pt,}, // Piplup - //Fossil @ Mining Museum new EncounterStatic { Gift = true, Species = 138, Level = 20, Location = 094, }, // Omanyte new EncounterStatic { Gift = true, Species = 140, Level = 20, Location = 094, }, // Kabuto @@ -234,7 +407,6 @@ public static partial class Legal new EncounterStatic { Gift = true, Species = 347, Level = 20, Location = 094, }, // Anorith new EncounterStatic { Gift = true, Species = 408, Level = 20, Location = 094, }, // Cranidos new EncounterStatic { Gift = true, Species = 410, Level = 20, Location = 094, }, // Shieldon - //Gift new EncounterStatic { Gift = true, Species = 133, Level = 05, Location = 010, Version = GameVersion.DP,}, //Eevee @ Hearthome City new EncounterStatic { Gift = true, Species = 133, Level = 20, Location = 010, Version = GameVersion.Pt,}, //Eevee @ Hearthome City @@ -242,13 +414,17 @@ public static partial class Legal new EncounterStatic { Gift = true, Species = 175, Level = 01, EggLocation = 2011, Version = GameVersion.Pt,}, //Togepi Egg from Cynthia new EncounterStatic { Gift = true, Species = 440, Level = 01, EggLocation = 2009, Version = GameVersion.DP,}, //Happiny Egg from Traveling Man new EncounterStatic { Gift = true, Species = 447, Level = 01, EggLocation = 2010,}, //Riolu Egg from Riley - + //Stationary + new EncounterStatic { Species = 425, Level = 22, Location = 47, Version = GameVersion.DP, },// Drifloon @ Valley Windworks + new EncounterStatic { Species = 425, Level = 15, Location = 47, Version = GameVersion.Pt, },// Drifloon @ Valley Windworks + new EncounterStatic { Species = 479, Level = 15, Location = 70, Version = GameVersion.DP, },// Rotom @ Old Chateau + new EncounterStatic { Species = 479, Level = 20, Location = 70, Version = GameVersion.Pt, },// Rotom @ Old Chateau //Stationary Lengerdary new EncounterStatic { Species = 377, Level = 30, Location = 125, Version = GameVersion.Pt,}, //Regirock @ Rock Peak Ruins new EncounterStatic { Species = 378, Level = 30, Location = 124, Version = GameVersion.Pt,}, //Regice @ Iceberg Ruins new EncounterStatic { Species = 379, Level = 30, Location = 123, Version = GameVersion.Pt,}, //Registeel @ Iron Ruins - new EncounterStatic { Species = 480, Level = 50, Location = 078,}, //Uxie @ Lake Acuity - new EncounterStatic { Species = 482, Level = 50, Location = 077,}, //Azelf @ Lake Valor + new EncounterStatic { Species = 480, Level = 50, Location = 089,}, //Uxie @ Acuity Cavern + new EncounterStatic { Species = 482, Level = 50, Location = 088,}, //Azelf @ Valor Cavern new EncounterStatic { Species = 483, Level = 47, Location = 051, Version = GameVersion.D,}, //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,}, //Palkia @ Spear Pillar @@ -260,7 +436,6 @@ public static partial class Legal new EncounterStatic { Species = 487, Level = 70, Location = 062, Version = GameVersion.DP, Form = 0, }, //Giratina @ Turnback Cave new EncounterStatic { Species = 487, Level = 47, Location = 117, Version = GameVersion.Pt, Form = 1, }, //Giratina @ Distortion World new EncounterStatic { Species = 487, Level = 47, Location = 062, Version = GameVersion.Pt, Form = 0, }, //Giratina @ Turnback Cave - //Event new EncounterStatic { Species = 490, Level = 01, EggLocation = 3001, Fateful = true, Gift = true }, //Manaphy from Pokemon Ranger new EncounterStatic { Species = 491, Level = 40, Location = 079, Version = GameVersion.DP,}, //Darkrai @ Newmoon Island @@ -268,7 +443,6 @@ public static partial class Legal new EncounterStatic { Species = 492, Form = 0, Level = 30, Location = 063,}, //Shaymin @ Flower Paradise //new EncounterStatic { Species = 493, Level = 80, Location = 086,}, //Arceus @ Hall of Origin }; - internal static readonly EncounterStatic[] Encounter_DPPt = Encounter_DPPt_Roam.SelectMany(e => e.Clone(Roaming_MetLocation_DPPt)).Concat(Encounter_DPPt_Regular).ToArray(); internal static readonly int[] Roaming_MetLocation_HGSS_Johto = @@ -282,7 +456,6 @@ public static partial class Legal new EncounterStatic { Species = 243, Level = 40, Roaming = true }, // Raikou new EncounterStatic { Species = 244, Level = 40, Roaming = true }, // Entei }; - internal static readonly int[] Roaming_MetLocation_HGSS_Kanto = { // Route 01-28 can be encountered in either grass or water @@ -295,7 +468,6 @@ public static partial class Legal new EncounterStatic { Species = 380, Level = 35, Version = GameVersion.HG, Roaming = true }, //Latias new EncounterStatic { Species = 381, Level = 35, Version = GameVersion.SS, Roaming = true }, //Latios }; - internal static readonly EncounterStatic[] Encounter_HGSS_Regular = { //Starters @@ -308,7 +480,6 @@ public static partial class Legal new EncounterStatic { Gift = true, Species = 252, Level = 05, Location = 148, }, // Treecko @ Saffron City new EncounterStatic { Gift = true, Species = 255, Level = 05, Location = 148, }, // Torchic new EncounterStatic { Gift = true, Species = 258, Level = 05, Location = 148, }, // Mudkip - //Fossil @ Pewter City new EncounterStatic { Gift = true, Species = 138, Level = 20, Location = 140, }, // Omanyte new EncounterStatic { Gift = true, Species = 140, Level = 20, Location = 140, }, // Kabuto @@ -317,7 +488,6 @@ public static partial class Legal new EncounterStatic { Gift = true, Species = 347, Level = 20, Location = 140, }, // Anorith new EncounterStatic { Gift = true, Species = 408, Level = 20, Location = 140, }, // Cranidos new EncounterStatic { Gift = true, Species = 410, Level = 20, Location = 140, }, // Shieldon - //Gift new EncounterStatic { Gift = true, Species = 133, Level = 05, Location = 131, }, // Eevee @ Goldenrod City new EncounterStatic { Gift = true, Species = 147, Level = 15, Location = 222, Moves = new[] {245, 086, 239, 082}, }, // Dratini @ Dragon's Den (ExtremeSpeed) @@ -328,14 +498,14 @@ public static partial class Legal new EncounterStatic { Gift = true, Species = 194, Level = 01, EggLocation = 2014,}, // Wooper Egg from Primo new EncounterStatic { Gift = true, Species = 218, Level = 01, EggLocation = 2014,}, // Slugma Egg from Primo new EncounterStatic { Gift = true, Species = 490, Level = 01, EggLocation = 3001, Fateful = true, }, //Manaphy from Pokemon Ranger - //Stationary new EncounterStatic { Species = 130, Level = 30, Location = 135, Shiny = true }, //Gyarados @ Lake of Rage new EncounterStatic { Species = 131, Level = 20, Location = 210, }, //Lapras @ Union Cave Friday Only + new EncounterStatic { Species = 101, Level = 23, Location = 213, }, //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, }, //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 //Stationary Lengerdary new EncounterStatic { Species = 144, Level = 50, Location = 203, }, //Articuno @ Seafoam Islands new EncounterStatic { Species = 145, Level = 50, Location = 158, }, //Zapdos @ Route 10 @@ -352,15 +522,15 @@ public static partial class Legal 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, }, //Dialga @ Sinjoh Ruins - new EncounterStatic { Species = 484, Level = 01, Location = 231, }, //Palkia @ Sinjoh Ruins - new EncounterStatic { Species = 487, Level = 01, Location = 231, Form = 1}, //Giratina @ Sinjoh Ruins + 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 }; - internal static readonly EncounterStatic[] Encounter_HGSS = Encounter_HGSS_KantoRoam.SelectMany(e => e.Clone(Roaming_MetLocation_HGSS_Kanto)).Concat( Encounter_HGSS_JohtoRoam.SelectMany(e => e.Clone(Roaming_MetLocation_HGSS_Johto))).Concat( Encounter_HGSS_Regular).ToArray(); - + #endregion + #region Trade Tables internal static readonly EncounterTrade[] TradeGift_DPPt = { new EncounterTrade { Species = 063, Ability = 1, TID = 25643, SID = 00000, OTGender = 1, Gender = 0, IVs = new[] {15,15,15,25,25,20}, Nature = Nature.Quiet,}, // Abra @@ -380,11 +550,11 @@ public static partial class Legal new EncounterTrade { Species = 374, Ability = 1, TID = 23478, SID = 00000, OTGender = 0, Gender = 2, IVs = new[] {28,29,24,24,25,23}, Nature = Nature.Brave,}, // Beldum new EncounterTrade { Species = 111, Ability = 1, TID = 06845, SID = 00000, OTGender = 0, Gender = 1, IVs = new[] {22,31,13,22,09,00}, Nature = Nature.Relaxed, Moves= new[]{422,-1,-1,-1} }, // Rhyhorn new EncounterTrade { Species = 208, Ability = 1, TID = 26491, SID = 00000, OTGender = 1, Gender = 0, IVs = new[] {08,30,28,18,20,06}, Nature = Nature.Brave,}, // Steelix - //Gift new EncounterTrade { Species = 021, Ability = 1, TID = 01001, SID = 00000, OTGender = 0, Gender = 1, Nature = Nature.Hasty, Level = 20, Location = 183, Moves= new[]{043,031,228,332}},//Webster's Spearow new EncounterTrade { Species = 213, Ability = 2, TID = 04336, SID = 00000, OTGender = 0, Gender = 1, Nature = Nature.Relaxed, Level = 20, Location = 130, Moves= new[]{132,117,227,219}},//Kirk's Shuckle }; + #endregion // Encounter Slots that are replaced internal static readonly int[] Slot4_Time = {2, 3}; diff --git a/PKHeX/Legality/Tables5.cs b/PKHeX/Legality/Tables5.cs index 565776236..dfde861a4 100644 --- a/PKHeX/Legality/Tables5.cs +++ b/PKHeX/Legality/Tables5.cs @@ -118,12 +118,365 @@ public static partial class Legal internal static readonly bool[] ReleasedHeldItems_5 = Enumerable.Range(0, MaxItemID_5_B2W2 + 1).Select(i => HeldItems_BW.Contains((ushort)i) && !UnreleasedItems_5.Contains(i)).ToArray(); internal static readonly int[][] Tutors_B2W2 = { - new[] { 343, 450, 529, 340, 324, 442, 162, 253, 402, 530, 067, 441, 007, 009, 008 }, // Driftveil City - new[] { 387, 334, 393, 277, 335, 304, 527, 196, 231, 401, 414, 428, 492, 276, 356, 406, 399 }, // Lentimas Town - new[] { 020, 173, 215, 282, 235, 355, 143, 272, 257, 202, 409, 220, 366 }, // Humilau City - new[] { 388, 380, 270, 495, 478, 472, 180, 278, 271, 446, 200, 283, 214, 285, 289, } // Nacrene City + new[] { 450, 343, 162, 530, 324, 442, 402, 529, 340, 067, 441, 253, 009, 007, 008 }, // Driftveil City + new[] { 277, 335, 414, 492, 356, 393, 334, 387, 276, 527, 196, 401, 399, 428, 406, 304 }, // Lentimas Town + new[] { 231, 020, 173, 282, 235, 257, 272, 215, 366, 143, 220, 202, 409, 355 }, // Humilau City + new[] { 380, 388, 180, 495, 270, 271, 478, 472, 283, 200, 278, 289, 446, 214, 285 } // Nacrene City }; + #region Dream Radar Tables + internal static readonly EncounterStatic[] Encounter_DreamRadar = + { + new EncounterStatic { Species=120, Ability = 4 }, + new EncounterStatic { Species=137, Ability = 4 }, + new EncounterStatic { Species=174, Ability = 4 }, + new EncounterStatic { Species=175, Ability = 4 }, + new EncounterStatic { Species=213, Ability = 4 }, + new EncounterStatic { Species=238, Ability = 4 }, + new EncounterStatic { Species=280, Ability = 4 }, + new EncounterStatic { Species=333, Ability = 4 }, + new EncounterStatic { Species=425, Ability = 4 }, + new EncounterStatic { Species=436, Ability = 4 }, + new EncounterStatic { Species=442, Ability = 4 }, + new EncounterStatic { Species=447, Ability = 4 }, + new EncounterStatic { Species=479,}, // Rotom has no HA + new EncounterStatic { Species=517, Ability = 4 }, + new EncounterStatic { Species=561, Ability = 4 }, + new EncounterStatic { Species=641, Ability = 4, Form = 1}, //Tornadus-T + new EncounterStatic { Species=642, Ability = 4, Form = 1}, //Thunderus-T + new EncounterStatic { Species=645, Ability = 4, Form = 1}, //Landorus-T + new EncounterStatic { Species=249, Ability = 4 }, //SS + new EncounterStatic { Species=250, Ability = 4 }, //HG + new EncounterStatic { Species=483, Ability = 4 }, //D + new EncounterStatic { Species=484, Ability = 4 }, //P + new EncounterStatic { Species=487, Ability = 4 }, //Pt + new EncounterStatic { Species=079, Ability = 4 }, //Slowpoke + new EncounterStatic { Species=163, Ability = 4 }, //Hoothoot + new EncounterStatic { Species=374, Ability = 4 }, //Beldum + }; + #endregion + #region DreamWorld Encounter + internal static readonly EncounterStatic[] DreamWorld_Common = + { + // Pleasant forest + new EncounterStatic { Species=019, Level = 10, Moves = new[]{098, 382, 231}, }, //Rattata + new EncounterStatic { Species=043, Level = 10, Moves = new[]{230, 298, 202}, }, //Oddish + new EncounterStatic { Species=069, Level = 10, Moves = new[]{022, 235, 402}, }, //Bellsprout + new EncounterStatic { Species=077, Level = 10, Moves = new[]{033, 037, 257}, }, //Ponyta + new EncounterStatic { Species=083, Level = 10, Moves = new[]{210, 355, 348}, }, //Farfetch'd + new EncounterStatic { Species=084, Level = 10, Moves = new[]{045, 175, 355}, }, //Doduo + new EncounterStatic { Species=102, Level = 10, Moves = new[]{140, 235, 202}, }, //Exeggcute + new EncounterStatic { Species=108, Level = 10, Moves = new[]{122, 214, 431}, }, //Lickitung + new EncounterStatic { Species=114, Level = 10, Moves = new[]{079, 073, 402}, }, //Tangela + new EncounterStatic { Species=115, Level = 10, Moves = new[]{252, 068, 409}, }, //Kangaskhan + new EncounterStatic { Species=161, Level = 10, Moves = new[]{010, 203, 343}, }, //Sentret + new EncounterStatic { Species=179, Level = 10, Moves = new[]{084, 115, 351}, }, //Mareep + new EncounterStatic { Species=191, Level = 10, Moves = new[]{072, 230, 414}, }, //Sunkern + new EncounterStatic { Species=234, Level = 10, Moves = new[]{033, 050, 285}, }, //Stantler + new EncounterStatic { Species=261, Level = 10, Moves = new[]{336, 305, 399}, }, //Poochyena + new EncounterStatic { Species=283, Level = 10, Moves = new[]{145, 056, 202}, }, //Surskit + new EncounterStatic { Species=399, Level = 10, Moves = new[]{033, 401, 290}, }, //Bidoof + new EncounterStatic { Species=403, Level = 10, Moves = new[]{268, 393, 400}, }, //Shinx + new EncounterStatic { Species=431, Level = 10, Moves = new[]{252, 372, 290}, }, //Glameow + new EncounterStatic { Species=054, Level = 10, Moves = new[]{346, 227, 362}, }, //Psyduck + new EncounterStatic { Species=058, Level = 10, Moves = new[]{044, 034, 203}, }, //Growlithe + new EncounterStatic { Species=123, Level = 10, Moves = new[]{098, 226, 366}, }, //Scyther + new EncounterStatic { Species=128, Level = 10, Moves = new[]{099, 231, 431}, }, //Tauros + new EncounterStatic { Species=183, Level = 10, Moves = new[]{111, 453, 008}, }, //Marill + new EncounterStatic { Species=185, Level = 10, Moves = new[]{175, 205, 272}, }, //Sudowoodo + new EncounterStatic { Species=203, Level = 10, Moves = new[]{093, 243, 285}, }, //Girafarig + new EncounterStatic { Species=241, Level = 10, Moves = new[]{111, 174, 231}, }, //Miltank + new EncounterStatic { Species=263, Level = 10, Moves = new[]{033, 271, 387}, }, //Zigzagoon + new EncounterStatic { Species=427, Level = 10, Moves = new[]{193, 252, 409}, }, //Buneary + new EncounterStatic { Species=037, Level = 10, Moves = new[]{046, 257, 399}, }, //Vulpix + new EncounterStatic { Species=060, Level = 10, Moves = new[]{095, 054, 214}, }, //Poliwag + new EncounterStatic { Species=177, Level = 10, Moves = new[]{101, 297, 202}, }, //Natu + new EncounterStatic { Species=239, Level = 10, Moves = new[]{084, 238, 393}, }, //Elekid + new EncounterStatic { Species=300, Level = 10, Moves = new[]{193, 321, 445}, }, //Skitty + // Windskept Sky + new EncounterStatic { Species=016, Level = 10, Moves = new[]{016, 211, 290}, }, //Pidgey + new EncounterStatic { Species=021, Level = 10, Moves = new[]{064, 185, 211}, }, //Spearow + new EncounterStatic { Species=041, Level = 10, Moves = new[]{048, 095, 162}, }, //Zubat + new EncounterStatic { Species=142, Level = 10, Moves = new[]{044, 372, 446}, }, //Aerodactyl + new EncounterStatic { Species=165, Level = 10, Moves = new[]{004, 450, 009}, }, //Ledyba + new EncounterStatic { Species=187, Level = 10, Moves = new[]{235, 227, 340}, }, //Hoppip + new EncounterStatic { Species=193, Level = 10, Moves = new[]{098, 364, 202}, }, //Yanma + new EncounterStatic { Species=198, Level = 10, Moves = new[]{064, 109, 355}, }, //Murkrow + new EncounterStatic { Species=207, Level = 10, Moves = new[]{028, 364, 366}, }, //Gligar + new EncounterStatic { Species=225, Level = 10, Moves = new[]{217, 420, 264}, }, //Delibird + new EncounterStatic { Species=276, Level = 10, Moves = new[]{064, 203, 413}, }, //Taillow + new EncounterStatic { Species=397, Level = 14, Moves = new[]{017, 297, 366}, }, //Staravia + new EncounterStatic { Species=227, Level = 10, Moves = new[]{064, 065, 355}, }, //Skarmory + new EncounterStatic { Species=357, Level = 10, Moves = new[]{016, 073, 318}, }, //Tropius + // Sprakling Sea + new EncounterStatic { Species=086, Level = 10, Moves = new[]{029, 333, 214}, }, //Seel + new EncounterStatic { Species=090, Level = 10, Moves = new[]{110, 112, 196}, }, //Shellder + new EncounterStatic { Species=116, Level = 10, Moves = new[]{145, 190, 362}, }, //Horsea + new EncounterStatic { Species=118, Level = 10, Moves = new[]{064, 060, 352}, }, //Goldeen + new EncounterStatic { Species=129, Level = 10, Moves = new[]{150, 175, 340}, }, //Magikarp + new EncounterStatic { Species=138, Level = 10, Moves = new[]{044, 330, 196}, }, //Omanyte + new EncounterStatic { Species=140, Level = 10, Moves = new[]{071, 175, 446}, }, //Kabuto + new EncounterStatic { Species=170, Level = 10, Moves = new[]{086, 133, 351}, }, //Chinchou + new EncounterStatic { Species=194, Level = 10, Moves = new[]{055, 034, 401}, }, //Wooper + new EncounterStatic { Species=211, Level = 10, Moves = new[]{040, 453, 290}, }, //Qwilfish + new EncounterStatic { Species=223, Level = 10, Moves = new[]{199, 350, 362}, }, //Remoraid + new EncounterStatic { Species=226, Level = 10, Moves = new[]{048, 243, 314}, }, //Mantine + new EncounterStatic { Species=320, Level = 10, Moves = new[]{055, 214, 340}, }, //Wailmer + new EncounterStatic { Species=339, Level = 10, Moves = new[]{189, 214, 209}, }, //Barboach + new EncounterStatic { Species=366, Level = 10, Moves = new[]{250, 445, 392}, }, //Clamperl + new EncounterStatic { Species=369, Level = 10, Moves = new[]{055, 214, 414}, }, //Relicanth + new EncounterStatic { Species=370, Level = 10, Moves = new[]{204, 300, 196}, }, //Luvdisc + new EncounterStatic { Species=418, Level = 10, Moves = new[]{346, 163, 352}, }, //Buizel + new EncounterStatic { Species=456, Level = 10, Moves = new[]{213, 186, 352}, }, //Finneon + new EncounterStatic { Species=072, Level = 10, Moves = new[]{048, 367, 202}, }, //Tentacool + new EncounterStatic { Species=318, Level = 10, Moves = new[]{044, 037, 399}, }, //Carvanha + new EncounterStatic { Species=341, Level = 10, Moves = new[]{106, 232, 283}, }, //Corphish + new EncounterStatic { Species=345, Level = 10, Moves = new[]{051, 243, 202}, }, //Lileep + new EncounterStatic { Species=347, Level = 10, Moves = new[]{010, 446, 440}, }, //Anorith + new EncounterStatic { Species=349, Level = 10, Moves = new[]{150, 445, 243}, }, //Feebas + new EncounterStatic { Species=131, Level = 10, Moves = new[]{109, 032, 196}, }, //Lapras + new EncounterStatic { Species=147, Level = 10, Moves = new[]{086, 352, 225}, }, //Dratini + // Spooky Mannor + new EncounterStatic { Species=092, Level = 10, Moves = new[]{095, 050, 482}, }, //Gastly + new EncounterStatic { Species=096, Level = 10, Moves = new[]{095, 427, 409}, }, //Drowzee + new EncounterStatic { Species=122, Level = 10, Moves = new[]{112, 298, 285}, }, //Mr. Mime + new EncounterStatic { Species=167, Level = 10, Moves = new[]{040, 527, 450}, }, //Spinarak + new EncounterStatic { Species=200, Level = 10, Moves = new[]{149, 194, 517}, }, //Misdreavus + new EncounterStatic { Species=228, Level = 10, Moves = new[]{336, 364, 399}, }, //Houndour + new EncounterStatic { Species=325, Level = 10, Moves = new[]{149, 285, 278}, }, //Spoink + new EncounterStatic { Species=353, Level = 10, Moves = new[]{101, 194, 220}, }, //Shuppet + new EncounterStatic { Species=355, Level = 10, Moves = new[]{050, 220, 271}, }, //Duskull + new EncounterStatic { Species=358, Level = 10, Moves = new[]{035, 095, 304}, }, //Chimecho + new EncounterStatic { Species=434, Level = 10, Moves = new[]{103, 492, 389}, }, //Stunky + new EncounterStatic { Species=209, Level = 10, Moves = new[]{204, 370, 038}, }, //Snubbull + new EncounterStatic { Species=235, Level = 10, Moves = new[]{166, 445, 214}, }, //Smeargle + new EncounterStatic { Species=313, Level = 10, Moves = new[]{148, 271, 366}, }, //Volbeat + new EncounterStatic { Species=314, Level = 10, Moves = new[]{204, 313, 366}, }, //Illumise + new EncounterStatic { Species=063, Level = 10, Moves = new[]{100, 285, 356}, }, //Abra + // Rugged Mountain + new EncounterStatic { Species=066, Level = 10, Moves = new[]{067, 418, 270}, }, //Machop + new EncounterStatic { Species=081, Level = 10, Moves = new[]{319, 278, 356}, }, //Magnemite + new EncounterStatic { Species=109, Level = 10, Moves = new[]{123, 399, 482}, }, //Koffing + new EncounterStatic { Species=218, Level = 10, Moves = new[]{052, 517, 257}, }, //Slugma + new EncounterStatic { Species=246, Level = 10, Moves = new[]{044, 399, 446}, }, //Larvitar + new EncounterStatic { Species=324, Level = 10, Moves = new[]{052, 090, 446}, }, //Torkoal + new EncounterStatic { Species=328, Level = 10, Moves = new[]{044, 324, 202}, }, //Trapinch + new EncounterStatic { Species=331, Level = 10, Moves = new[]{071, 298, 009}, }, //Cacnea + new EncounterStatic { Species=412, Level = 10, Moves = new[]{182, 450, 173}, }, //Burmy + new EncounterStatic { Species=449, Level = 10, Moves = new[]{044, 254, 276}, }, //Hippopotas + new EncounterStatic { Species=240, Level = 10, Moves = new[]{052, 009, 257}, }, //Magby + new EncounterStatic { Species=322, Level = 10, Moves = new[]{052, 034, 257}, }, //Numel + new EncounterStatic { Species=359, Level = 10, Moves = new[]{364, 224, 276}, }, //Absol + new EncounterStatic { Species=453, Level = 10, Moves = new[]{040, 409, 441}, }, //Croagunk + new EncounterStatic { Species=236, Level = 10, Moves = new[]{252, 364, 183}, }, //Tyrogue + new EncounterStatic { Species=371, Level = 10, Moves = new[]{044, 349, 200}, }, //Bagon + // Icy Cave + new EncounterStatic { Species=027, Level = 10, Moves = new[]{028, 068, 162}, }, //Sandshrew + new EncounterStatic { Species=074, Level = 10, Moves = new[]{111, 446, 431}, }, //Geodude + new EncounterStatic { Species=095, Level = 10, Moves = new[]{020, 446, 431}, }, //Onix + new EncounterStatic { Species=100, Level = 10, Moves = new[]{268, 324, 363}, }, //Voltorb + new EncounterStatic { Species=104, Level = 10, Moves = new[]{125, 195, 067}, }, //Cubone + new EncounterStatic { Species=293, Level = 10, Moves = new[]{253, 283, 428}, }, //Whismur + new EncounterStatic { Species=304, Level = 10, Moves = new[]{106, 283, 457}, }, //Aron + new EncounterStatic { Species=337, Level = 10, Moves = new[]{093, 414, 236}, }, //Lunatone + new EncounterStatic { Species=338, Level = 10, Moves = new[]{093, 428, 234}, }, //Solrock + new EncounterStatic { Species=343, Level = 10, Moves = new[]{229, 356, 428}, }, //Baltoy + new EncounterStatic { Species=459, Level = 10, Moves = new[]{075, 419, 202}, }, //Snover + new EncounterStatic { Species=050, Level = 10, Moves = new[]{028, 251, 446}, }, //Diglett + new EncounterStatic { Species=215, Level = 10, Moves = new[]{269, 008, 067}, }, //Sneasel + new EncounterStatic { Species=361, Level = 10, Moves = new[]{181, 311, 352}, }, //Snorunt + new EncounterStatic { Species=220, Level = 10, Moves = new[]{316, 246, 333}, }, //Swinub + new EncounterStatic { Species=443, Level = 10, Moves = new[]{082, 200, 203}, }, //Gible + // Dream Park + new EncounterStatic { Species=046, Level = 10, Moves = new[]{078, 440, 235}, }, //Paras + new EncounterStatic { Species=204, Level = 10, Moves = new[]{120, 390, 356}, }, //Pineco + new EncounterStatic { Species=265, Level = 10, Moves = new[]{040, 450, 173}, }, //Wurmple + new EncounterStatic { Species=273, Level = 10, Moves = new[]{074, 331, 492}, }, //Seedot + new EncounterStatic { Species=287, Level = 10, Moves = new[]{281, 400, 389}, }, //Slakoth + new EncounterStatic { Species=290, Level = 10, Moves = new[]{141, 203, 400}, }, //Nincada + new EncounterStatic { Species=311, Level = 10, Moves = new[]{086, 435, 324}, }, //Plusle + new EncounterStatic { Species=312, Level = 10, Moves = new[]{086, 435, 324}, }, //Minun + new EncounterStatic { Species=316, Level = 10, Moves = new[]{139, 151, 202}, }, //Gulpin + new EncounterStatic { Species=352, Level = 10, Moves = new[]{185, 285, 513}, }, //Kecleon + new EncounterStatic { Species=401, Level = 10, Moves = new[]{522, 283, 253}, }, //Kricketot + new EncounterStatic { Species=420, Level = 10, Moves = new[]{073, 505, 331}, }, //Cherubi + new EncounterStatic { Species=455, Level = 10, Moves = new[]{044, 476, 380}, }, //Carnivine + new EncounterStatic { Species=023, Level = 10, Moves = new[]{040, 251, 399}, }, //Ekans + new EncounterStatic { Species=175, Level = 10, Moves = new[]{118, 381, 253}, }, //Togepi + new EncounterStatic { Species=190, Level = 10, Moves = new[]{010, 252, 007}, }, //Aipom + new EncounterStatic { Species=285, Level = 10, Moves = new[]{078, 331, 264}, }, //Shroomish + new EncounterStatic { Species=315, Level = 10, Moves = new[]{074, 079, 129}, }, //Roselia + new EncounterStatic { Species=113, Level = 10, Moves = new[]{045, 068, 270}, }, //Chansey + new EncounterStatic { Species=127, Level = 10, Moves = new[]{011, 370, 382}, }, //Pinsir + new EncounterStatic { Species=133, Level = 10, Moves = new[]{028, 204, 129}, }, //Eevee + new EncounterStatic { Species=143, Level = 10, Moves = new[]{133, 007, 278}, }, //Snorlax + new EncounterStatic { Species=214, Level = 10, Moves = new[]{030, 175, 264}, }, //Heracross + // Pokémon Café Forest + new EncounterStatic { Species=061, Level = 25, Moves = new[]{240, 114, 352}, }, //Poliwhirl + new EncounterStatic { Species=133, Level = 10, Moves = new[]{270, 204, 129}, }, //Eevee + new EncounterStatic { Species=235, Level = 10, Moves = new[]{166, 445, 214}, }, //Smeargle + new EncounterStatic { Species=412, Level = 10, Moves = new[]{182, 450, 173}, }, //Burmy + //PGL + new EncounterStatic { Species=212, Level = 10, Moves = new[]{211}, Gender = 0, }, //Scizor + new EncounterStatic { Species=445, Level = 48, Gender = 0, }, //Garchomp + new EncounterStatic { Species=149, Level = 55, Moves = new[]{009}, Gender = 0, }, //Dragonite + new EncounterStatic { Species=248, Level = 55, Moves = new[]{069}, Gender = 0, }, //Tyranitar + new EncounterStatic { Species=149, Level = 55, Moves = new[]{245}, Gender = 0, }, //Dragonite + new EncounterStatic { Species=376, Level = 45, Moves = new[]{038}, Gender = 2, }, //Metagross + }; + + internal static readonly EncounterStatic[] BW_DreamWorld = DreamWorld_Common.Concat(new[] + { + // Pleasant forest + new EncounterStatic { Species=029, Level = 10, Moves = new[]{010, 389, 162}, }, //Nidoran (F) + new EncounterStatic { Species=032, Level = 10, Moves = new[]{064, 068, 162}, }, //Nidoran (M) + new EncounterStatic { Species=174, Level = 10, Moves = new[]{047, 313, 270}, }, //Igglybuff + new EncounterStatic { Species=187, Level = 10, Moves = new[]{235, 270, 331}, }, //Hoppip + new EncounterStatic { Species=270, Level = 10, Moves = new[]{071, 073, 352}, }, //Lotad + new EncounterStatic { Species=276, Level = 10, Moves = new[]{064, 119, 366}, }, //Taillow + new EncounterStatic { Species=309, Level = 10, Moves = new[]{086, 423, 324}, }, //Electrike + new EncounterStatic { Species=351, Level = 10, Moves = new[]{052, 466, 352}, }, //Castform + new EncounterStatic { Species=417, Level = 10, Moves = new[]{098, 343, 351}, }, //Pachirisu + // Windskept Sky + new EncounterStatic { Species=012, Level = 10, Moves = new[]{093, 355, 314}, }, //Butterfree + new EncounterStatic { Species=163, Level = 10, Moves = new[]{193, 101, 278}, }, //Hoothoot + new EncounterStatic { Species=278, Level = 10, Moves = new[]{055, 239, 351}, }, //Wingull + new EncounterStatic { Species=333, Level = 10, Moves = new[]{064, 297, 355}, }, //Swablu + new EncounterStatic { Species=425, Level = 10, Moves = new[]{107, 095, 285}, }, //Drifloon + new EncounterStatic { Species=441, Level = 10, Moves = new[]{119, 417, 272}, }, //Chatot + // Sprakling Sea + new EncounterStatic { Species=079, Level = 10, Moves = new[]{281, 335, 362}, }, //Slowpoke + new EncounterStatic { Species=098, Level = 10, Moves = new[]{011, 133, 290}, }, //Krabby + new EncounterStatic { Species=119, Level = 33, Moves = new[]{352, 214, 203}, }, //Seaking + new EncounterStatic { Species=120, Level = 10, Moves = new[]{055, 278, 196}, }, //Staryu + new EncounterStatic { Species=222, Level = 10, Moves = new[]{145, 109, 446}, }, //Corsola + new EncounterStatic { Species=422, Level = 10, Moves = new[]{189, 281, 290}, Form = 0 }, //Shellos + new EncounterStatic { Species=422, Level = 10, Moves = new[]{189, 281, 290}, Form = 1 }, + // Spooky Mannor + new EncounterStatic { Species=202, Level = 15, Moves = new[]{243, 204, 227}, }, //Wobbuffet + new EncounterStatic { Species=238, Level = 10, Moves = new[]{186, 445, 285}, }, //Smoochum + new EncounterStatic { Species=303, Level = 10, Moves = new[]{313, 424, 008}, }, //Mawile + new EncounterStatic { Species=307, Level = 10, Moves = new[]{096, 409, 203}, }, //Meditite + new EncounterStatic { Species=436, Level = 10, Moves = new[]{095, 285, 356}, }, //Bronzor + new EncounterStatic { Species=052, Level = 10, Moves = new[]{010, 095, 290}, }, //Meowth + new EncounterStatic { Species=479, Level = 10, Moves = new[]{086, 351, 324}, }, //Rotom + new EncounterStatic { Species=280, Level = 10, Moves = new[]{093, 194, 270}, }, //Ralts + new EncounterStatic { Species=302, Level = 10, Moves = new[]{193, 389, 180}, }, //Sableye + new EncounterStatic { Species=442, Level = 10, Moves = new[]{180, 220, 196}, }, //Spiritomb + // Rugged Mountain + new EncounterStatic { Species=056, Level = 10, Moves = new[]{067, 179, 009}, }, //Mankey + new EncounterStatic { Species=111, Level = 10, Moves = new[]{030, 068, 038}, }, //Rhyhorn + new EncounterStatic { Species=231, Level = 10, Moves = new[]{175, 484, 402}, }, //Phanpy + new EncounterStatic { Species=451, Level = 10, Moves = new[]{044, 097, 401}, }, //Skorupi + new EncounterStatic { Species=216, Level = 10, Moves = new[]{313, 242, 264}, }, //Teddiursa + new EncounterStatic { Species=296, Level = 10, Moves = new[]{292, 270, 008}, }, //Makuhita + new EncounterStatic { Species=327, Level = 10, Moves = new[]{383, 252, 276}, }, //Spinda + new EncounterStatic { Species=374, Level = 10, Moves = new[]{036, 428, 442}, }, //Beldum + new EncounterStatic { Species=447, Level = 10, Moves = new[]{203, 418, 264}, }, //Riolu + // Icy Cave + new EncounterStatic { Species=173, Level = 10, Moves = new[]{227, 312, 214}, }, //Cleffa + new EncounterStatic { Species=213, Level = 10, Moves = new[]{227, 270, 504}, }, //Shuckle + new EncounterStatic { Species=299, Level = 10, Moves = new[]{033, 446, 246}, }, //Nosepass + new EncounterStatic { Species=363, Level = 10, Moves = new[]{181, 090, 401}, }, //Spheal + new EncounterStatic { Species=408, Level = 10, Moves = new[]{029, 442, 007}, }, //Cranidos + new EncounterStatic { Species=206, Level = 10, Moves = new[]{111, 277, 446}, }, //Dunsparce + new EncounterStatic { Species=410, Level = 10, Moves = new[]{182, 068, 090}, }, //Shieldon + // Dream Park + new EncounterStatic { Species=048, Level = 10, Moves = new[]{050, 226, 285}, }, //Venonat + new EncounterStatic { Species=088, Level = 10, Moves = new[]{139, 114, 425}, }, //Grimer + new EncounterStatic { Species=415, Level = 10, Moves = new[]{016, 366, 314}, }, //Combee + new EncounterStatic { Species=015, Level = 10, Moves = new[]{031, 314, 210}, }, //Beedrill + new EncounterStatic { Species=335, Level = 10, Moves = new[]{098, 458, 067}, }, //Zangoose + new EncounterStatic { Species=336, Level = 10, Moves = new[]{044, 034, 401}, }, //Seviper + // PGL + new EncounterStatic { Species=134, Level = 10, Gender = 0, }, //Vaporeon + new EncounterStatic { Species=135, Level = 10, Gender = 0, }, //Jolteon + new EncounterStatic { Species=136, Level = 10, Gender = 0, }, //Flareon + new EncounterStatic { Species=196, Level = 10, Gender = 0, }, //Espeon + new EncounterStatic { Species=197, Level = 10, Gender = 0, }, //Umbreon + new EncounterStatic { Species=470, Level = 10, Gender = 0, }, //Leafeon + new EncounterStatic { Species=471, Level = 10, Gender = 0, }, //Glaceon + new EncounterStatic { Species=001, Level = 10, Gender = 0, }, //Bulbasaur + new EncounterStatic { Species=004, Level = 10, Gender = 0, }, //Charmander + new EncounterStatic { Species=007, Level = 10, Gender = 0, }, //Squirtle + new EncounterStatic { Species=453, Level = 10, Gender = 0, }, //Croagunk + new EncounterStatic { Species=387, Level = 10, Gender = 0, }, //Turtwig + new EncounterStatic { Species=390, Level = 10, Gender = 0, }, //Chimchar + new EncounterStatic { Species=393, Level = 10, Gender = 0, }, //Piplup + new EncounterStatic { Species=493, Level = 100 }, //Arceus + new EncounterStatic { Species=252, Level = 10, Gender = 0, }, //Treecko + new EncounterStatic { Species=255, Level = 10, Gender = 0, }, //Torchic + new EncounterStatic { Species=258, Level = 10, Gender = 0, }, //Mudkip + new EncounterStatic { Species=468, Level = 10, Moves = new[]{217}, Gender = 0, }, //Togekiss + new EncounterStatic { Species=473, Level = 34, Gender = 0, }, //Mamoswine + new EncounterStatic { Species=137, Level = 10 }, //Porygon + new EncounterStatic { Species=384, Level = 50 }, //Rayquaza + new EncounterStatic { Species=354, Level = 37, Moves = new[]{538}, Gender = 1, }, //Banette + new EncounterStatic { Species=453, Level = 10, Moves = new[]{398}, Gender = 0, }, //Croagunk + new EncounterStatic { Species=334, Level = 35, Moves = new[]{206}, Gender = 0,}, //Altaria + new EncounterStatic { Species=242, Level = 10 }, //Blissey + new EncounterStatic { Species=448, Level = 10, Moves = new[]{418}, Gender = 0, }, //Lucario + new EncounterStatic { Species=189, Level = 27, Moves = new[]{206}, Gender = 0, }, //Jumpluff + }).ToArray(); + + internal static readonly EncounterStatic[] B2W2_DreamWorld = DreamWorld_Common.Concat(new[] + { + // Pleasant forest + new EncounterStatic { Species=535, Level = 10, Moves = new[]{496, 414, 352}, }, //Tympole + new EncounterStatic { Species=546, Level = 10, Moves = new[]{073, 227, 388}, }, //Cottonee + new EncounterStatic { Species=548, Level = 10, Moves = new[]{079, 204, 230}, }, //Petilil + new EncounterStatic { Species=588, Level = 10, Moves = new[]{203, 224, 450}, }, //Karrablast + new EncounterStatic { Species=616, Level = 10, Moves = new[]{051, 226, 227}, }, //Shelmet + new EncounterStatic { Species=545, Level = 30, Moves = new[]{342, 390, 276}, }, //Scolipede + // Windskept Sky + new EncounterStatic { Species=519, Level = 10, Moves = new[]{016, 095, 234}, }, //Pidove + new EncounterStatic { Species=561, Level = 10, Moves = new[]{095, 500, 257}, }, //Sigilyph + new EncounterStatic { Species=580, Level = 10, Moves = new[]{432, 362, 382}, }, //Ducklett + new EncounterStatic { Species=587, Level = 10, Moves = new[]{098, 403, 204}, }, //Emolga + // Sprakling Sea + new EncounterStatic { Species=550, Level = 10, Moves = new[]{029, 097, 428}, Form = 0 },//Basculin + new EncounterStatic { Species=550, Level = 10, Moves = new[]{029, 097, 428}, Form = 1 }, + new EncounterStatic { Species=594, Level = 10, Moves = new[]{392, 243, 220}, }, //Alomomola + new EncounterStatic { Species=618, Level = 10, Moves = new[]{189, 174, 281}, }, //Stunfisk + new EncounterStatic { Species=564, Level = 10, Moves = new[]{205, 175, 334}, }, //Tirtouga + // Spooky Mannor + new EncounterStatic { Species=605, Level = 10, Moves = new[]{377, 112, 417}, }, //Elgyem + new EncounterStatic { Species=624, Level = 10, Moves = new[]{210, 427, 389}, }, //Pawniard + new EncounterStatic { Species=596, Level = 36, Moves = new[]{486, 050, 228}, }, //Galvantula + new EncounterStatic { Species=578, Level = 32, Moves = new[]{105, 286, 271}, }, //Duosion + new EncounterStatic { Species=622, Level = 10, Moves = new[]{205, 007, 009}, }, //Golett + // Rugged Mountain + new EncounterStatic { Species=631, Level = 10, Moves = new[]{510, 257, 202}, }, //Heatmor + new EncounterStatic { Species=632, Level = 10, Moves = new[]{210, 203, 422}, }, //Durant + new EncounterStatic { Species=556, Level = 10, Moves = new[]{042, 073, 191}, }, //Maractus + new EncounterStatic { Species=558, Level = 34, Moves = new[]{157, 068, 400}, }, //Crustle + new EncounterStatic { Species=553, Level = 40, Moves = new[]{242, 068, 212}, }, //Krookodile + // Icy Cave + new EncounterStatic { Species=529, Level = 10, Moves = new[]{229, 319, 431}, }, //Drilbur + new EncounterStatic { Species=621, Level = 10, Moves = new[]{044, 424, 389}, }, //Druddigon + new EncounterStatic { Species=525, Level = 25, Moves = new[]{479, 174, 484}, }, //Boldore + new EncounterStatic { Species=583, Level = 35, Moves = new[]{429, 420, 286}, }, //Vanillish + new EncounterStatic { Species=600, Level = 38, Moves = new[]{451, 356, 393}, }, //Klang + new EncounterStatic { Species=610, Level = 10, Moves = new[]{082, 068, 400}, }, //Axew + // Dream Park + new EncounterStatic { Species=531, Level = 10, Moves = new[]{270, 227, 281}, }, //Audino + new EncounterStatic { Species=538, Level = 10, Moves = new[]{020, 008, 276}, }, //Throh + new EncounterStatic { Species=539, Level = 10, Moves = new[]{249, 009, 530}, }, //Sawk + new EncounterStatic { Species=559, Level = 10, Moves = new[]{067, 252, 409}, }, //Scraggy + new EncounterStatic { Species=533, Level = 25, Moves = new[]{067, 183, 409}, }, //Gurdurr + // PGL + new EncounterStatic { Species=575, Level = 32, Moves = new[]{243}, Gender = 0, }, //Gothorita + new EncounterStatic { Species=025, Level = 10, Moves = new[]{029}, Gender = 0, }, //Pikachu + new EncounterStatic { Species=511, Level = 10, Moves = new[]{437}, Gender = 0, }, //Pansage + new EncounterStatic { Species=513, Level = 10, Moves = new[]{257}, Gender = 0, }, //Pansear + new EncounterStatic { Species=515, Level = 10, Moves = new[]{056}, Gender = 0, }, //Panpour + new EncounterStatic { Species=387, Level = 10, Moves = new[]{254}, Gender = 0, }, //Turtwig + new EncounterStatic { Species=390, Level = 10, Moves = new[]{252}, Gender = 0, }, //Chimchar + new EncounterStatic { Species=393, Level = 10, Moves = new[]{297}, Gender = 0, }, //Piplup + new EncounterStatic { Species=575, Level = 32, Moves = new[]{286}, Gender = 0, }, //Gothorita + }).ToArray(); + #endregion + #region Static Encounter/Gift Tables internal static readonly int[] Roaming_MetLocation_BW = { 25,26,27,28, // Route 12,13,14,15 Night latter half @@ -137,14 +490,12 @@ public static partial class Legal new EncounterStatic { Species = 641, Level = 40, Version = GameVersion.B, Roaming = true }, //Tornadus new EncounterStatic { Species = 642, Level = 40, Version = GameVersion.W, Roaming = true }, //Thundurus }; - internal static readonly EncounterStatic[] Encounter_BW_Regular = { //Starters @ Nuvema Town new EncounterStatic { Gift = true, Species = 495, Level = 5, Location = 4, }, // Snivys new EncounterStatic { Gift = true, Species = 498, Level = 5, Location = 4, }, // Tepig new EncounterStatic { Gift = true, Species = 501, Level = 5, Location = 4, }, // Oshawott - //Fossil @ Nacrene City new EncounterStatic { Gift = true, Species = 138, Level = 25, Location = 7, }, // Omanyte new EncounterStatic { Gift = true, Species = 140, Level = 25, Location = 7, }, // Kabuto @@ -155,14 +506,12 @@ public static partial class Legal new EncounterStatic { Gift = true, Species = 410, Level = 25, Location = 7, }, // Shieldon new EncounterStatic { Gift = true, Species = 564, Level = 25, Location = 7, }, // Tirtouga new EncounterStatic { Gift = true, Species = 566, Level = 25, Location = 7, }, // Archen - //Gift new EncounterStatic { Gift = true, Species = 511, Level = 10, Location = 32, }, // Pansage @ Dreamyard new EncounterStatic { Gift = true, Species = 513, Level = 10, Location = 32, }, // Pansear new EncounterStatic { Gift = true, Species = 515, Level = 10, Location = 32, }, // Panpour new EncounterStatic { Gift = true, Species = 129, Level = 05, Location = 68, }, // Magikarp @ Marvelous Bridge new EncounterStatic { Gift = true, Species = 636, Level = 01, EggLocation = 60003, }, // Larvesta Egg from Treasure Hunter - //Stationary new EncounterStatic { Species = 518, Level = 50, Location = 32, Ability = 4, }, //Musharna @ Dreamyard Friday Only new EncounterStatic { Species = 590, Level = 20, Location = 19, }, //Foongus @ Route 6 @@ -170,7 +519,6 @@ public static partial class Legal new EncounterStatic { Species = 591, Level = 40, Location = 23, }, //Amoonguss @ Route 10 new EncounterStatic { Species = 555, Level = 35, Location = 34, Ability = 4, }, //Darmanitan @ Desert Resort new EncounterStatic { Species = 637, Level = 70, Location = 35, }, //Volcarona @ Relic Castle - //Stationary Lengerdary new EncounterStatic { Species = 638, Level = 42, Location = 54,}, //Cobalion @ Mistralton Cave new EncounterStatic { Species = 639, Level = 42, Location = 40,}, //Terrakion @ Victory Road @@ -181,22 +529,18 @@ public static partial class Legal new EncounterStatic { Species = 644, Level = 50, Location = 39, Shiny = false, Version = GameVersion.W, }, //Zekrom @ Dragonspiral Tower new EncounterStatic { Species = 645, Level = 70, Location = 70,}, //Landorus @ Abundant Shrine new EncounterStatic { Species = 646, Level = 75, Location = 61,}, //Kyurem @ Giant Chasm - //Event new EncounterStatic { Species = 494, Level = 15, Location = 62, Shiny = false}, // Victini @ Liberty Garden - new EncounterStatic { Species = 570, Level = 10, Location = 32, Gender = 0, Gift = true, }, // Zorua @ Castelia City + new EncounterStatic { Species = 570, Level = 10, Location = 32, Gender = 0, }, // Zorua @ Castelia City new EncounterStatic { Species = 571, Level = 25, Location = 72, Gender = 1, }, // Zoroark @ Lostlorn Forest }; - internal static readonly EncounterStatic[] Encounter_BW = Encounter_BW_Roam.SelectMany(e => e.Clone(Roaming_MetLocation_BW)).Concat(Encounter_BW_Regular).ToArray(); - - internal static readonly EncounterStatic[] Encounter_B2W2 = + internal static readonly EncounterStatic[] Encounter_B2W2_Regular = { //Starters @ Aspertia City new EncounterStatic { Gift = true, Species = 495, Level = 5, Location = 117, }, // Snivy new EncounterStatic { Gift = true, Species = 498, Level = 5, Location = 117, }, // Tepig new EncounterStatic { Gift = true, Species = 501, Level = 5, Location = 117, }, // Oshawott - //Fossil @ Nacrene City new EncounterStatic { Gift = true, Species = 138, Level = 25, Location = 7, }, // Omanyte new EncounterStatic { Gift = true, Species = 140, Level = 25, Location = 7, }, // Kabuto @@ -207,7 +551,6 @@ public static partial class Legal new EncounterStatic { Gift = true, Species = 410, Level = 25, Location = 7, }, // Shieldon new EncounterStatic { Gift = true, Species = 564, Level = 25, Location = 7, }, // Tirtouga new EncounterStatic { Gift = true, Species = 566, Level = 25, Location = 7, }, // Archen - //Gift new EncounterStatic { Gift = true, Species = 133, Level = 10, Ability = 4, Location = 8, }, //HA Eevee @ Castelia City new EncounterStatic { Gift = true, Species = 585, Level = 30, Ability = 4, Location = 19, Form = 0, }, //HA Deerling @ Route 6 @@ -218,7 +561,6 @@ public static partial class Legal new EncounterStatic { Gift = true, Species = 147, Level = 01, Shiny = true, Location = 122, Gender = 0, Version = GameVersion.W2, }, //Shiny Dratini @ Floccesy Town new EncounterStatic { Gift = true, Species = 129, Level = 05, Location = 68, }, // Magikarp @ Marvelous Bridge new EncounterStatic { Gift = true, Species = 440, Level = 01, Ability = 1, EggLocation = 60003, }, // Happiny Egg from PKMN Breeder - //Stationary new EncounterStatic { Species = 590, Level = 29, Location = 19, }, // Foongus @ Route 6 new EncounterStatic { Species = 591, Level = 47, Location = 24, }, // Amoonguss @ Route 11 @@ -230,7 +572,6 @@ public static partial class Legal new EncounterStatic { Species = 637, Level = 65, Location = 35, }, // Volcarona @ Relic Castle new EncounterStatic { Species = 558, Level = 42, Location = 141, }, // Crustle @ Seaside Cave new EncounterStatic { Species = 612, Level = 60, Location = 147, Shiny = true}, // Haxorus @ Nature Preserve - //Stationary Lengerdary new EncounterStatic { Species = 377, Level = 65, Location = 150,}, //Regirock @ Rock Peak Chamber new EncounterStatic { Species = 378, Level = 65, Location = 151,}, //Regice @ Iceberg Chamber @@ -253,7 +594,26 @@ public static partial class Legal new EncounterStatic { Species = 643, Level = 70, Location = 039, Shiny = false, Version = GameVersion.W2, }, // Reshiram @ Dragonspiral Tower new EncounterStatic { Species = 644, Level = 70, Location = 039, Shiny = false, Version = GameVersion.B2, }, // Zekrom @ Dragonspiral Tower new EncounterStatic { Species = 646, Level = 70, Location = 061, Form = 0}, // Kyurem @ Giant Chasm + //N's Pokemon + new EncounterStatic { Species = 509, Level = 07, Location = 15, NSparkle = true, Ability = 2, Nature = Nature.Timid }, //Purloin @ Route 2 + new EncounterStatic { Species = 519, Level = 13, Location = 33, NSparkle = true, Ability = 2, Nature = Nature.Sassy }, //Pidove @ Pinwheel Forest + new EncounterStatic { Species = 532, Level = 13, Location = 33, NSparkle = true, Ability = 1, Nature = Nature.Rash }, //Timburr @ Pinwheel Forest + new EncounterStatic { Species = 535, Level = 13, Location = 33, NSparkle = true, Ability = 2, Nature = Nature.Modest }, //Tympole @ Pinwheel Forest + new EncounterStatic { Species = 527, Level = 55, Location = 53, NSparkle = true, Ability = 1, Nature = Nature.Timid }, //Woobat @ Wellspring Cave + new EncounterStatic { Species = 551, Level = 22, Location = 34, NSparkle = true, Ability = 2, Nature = Nature.Docile }, //Sandile @ Desert Resort + new EncounterStatic { Species = 554, Level = 22, Location = 34, NSparkle = true, Ability = 1, Nature = Nature.Naive }, //Darumaka @ Desert Resort + new EncounterStatic { Species = 555, Level = 35, Location = 34, NSparkle = true, Ability = 4, Nature = Nature.Calm }, //Darmanitan @ Desert Resort + new EncounterStatic { Species = 559, Level = 22, Location = 34, NSparkle = true, Ability = 1, Nature = Nature.Lax }, //Scaggy @ Desert Resort + new EncounterStatic { Species = 561, Level = 22, Location = 34, NSparkle = true, Ability = 2, Nature = Nature.Gentle }, //Sigilyph @ Desert Resort + new EncounterStatic { Species = 525, Level = 28, Location = 37, NSparkle = true, Ability = 1, Nature = Nature.Naive }, //Boldore @ Chargestone Cave + new EncounterStatic { Species = 595, Level = 28, Location = 37, NSparkle = true, Ability = 2, Nature = Nature.Docile }, //Joltik @ Chargestone Cave + new EncounterStatic { Species = 597, Level = 28, Location = 37, NSparkle = true, Ability = 1, Nature = Nature.Bashful }, //Ferroseed @ Chargestone Cave + new EncounterStatic { Species = 599, Level = 28, Location = 37, NSparkle = true, Ability = 1, Nature = Nature.Rash }, //Klink @ Chargestone Cave + new EncounterStatic { Species = 570, Level = 25, Location = 10, NSparkle = true, Ability = 1, Nature = Nature.Hasty, Gift = true} //N's Zorua @ Driftveil City }; + internal static readonly EncounterStatic[] Encounter_B2W2 = Encounter_DreamRadar.SelectMany(e => e.DreamRadarClone()).Concat(Encounter_B2W2_Regular).ToArray(); + #endregion + #region Trade Tables internal static readonly EncounterTrade[] TradeGift_BW = { new EncounterTrade { Species = 548, Level = 15, Ability = 1, TID = 39922, SID = 00000, OTGender = 1, Gender = 1, IVs = new[] {20,20,20,31,20,20}, Nature = Nature.Modest, Version = GameVersion.B, }, // Petilil @@ -299,9 +659,8 @@ public static partial class Legal new EncounterTrade { Species = 231, Level = 50, Ability = 4, TID = 54118, SID = 00000, OTGender = 0,}, new EncounterTrade { Species = 327, Level = 50, Ability = 4, TID = 54118, SID = 00000, OTGender = 0,}, new EncounterTrade { Species = 175, Level = 50, Ability = 4, TID = 54118, SID = 00000, OTGender = 0,}, - // Gift - new EncounterTrade { Species = 570, Level = 25, Ability = 1, TID = 00002, SID = 00000, OTGender = 0, Gender = 0, IVs = new[] {30,30,30,30,30,30}, Nature = Nature.Hasty, Location = 10} //N's Zorua @ Driftveil City }; + #endregion #region Alt Slots private static readonly EncounterArea[] SlotsBW_Swarm = { @@ -457,7 +816,7 @@ public static partial class Legal new EncounterSlot{Species = 196, LevelMin = 10, LevelMax = 60, }, new EncounterSlot{Species = 197, LevelMin = 10, LevelMax = 60, }, new EncounterSlot{Species = 470, LevelMin = 10, LevelMax = 60, }, - new EncounterSlot{Species = 471, LevelMin = 10, LevelMax = 60, }, + new EncounterSlot{Species = 471, LevelMin = 10, LevelMax = 60, }, }; private static readonly EncounterArea[] SlotsB2_HiddenGrotto = { @@ -481,7 +840,6 @@ public static partial class Legal }).ToArray(), } }; - #endregion internal static readonly int[] ValidMet_BW = @@ -492,7 +850,7 @@ public static partial class Legal 061, 062, 063, 064, 065, 066, 067, 068, 069, 070, 071, 072, 073, 074, 075, 076, 077, 078, 079, 080, 081, 082, 083, 084, 085, 086, 087, 088, 089, 090, 091, 092, 093, 094, 095, 096, 097, 098, 099, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - + }; internal static readonly int[] ValidMet_B2W2 = { diff --git a/PKHeX/Legality/VivillonTables.cs b/PKHeX/Legality/VivillonTables.cs index 72737fa31..99cfd4228 100644 --- a/PKHeX/Legality/VivillonTables.cs +++ b/PKHeX/Legality/VivillonTables.cs @@ -18,42 +18,24 @@ private class FormSubregionTable private static readonly int[][] VivillonCountryTable = { //missing ID 051,068,102,127,160,186 - // 0-Icy Snow - new[] { 018, 076, 096, 100, 107 }, - // 1-Polar - new[] { 010, 018, 020, 049, 076, 096, 100, 107 }, - // 2-Tundra - new[] { 001, 081, 096, }, - // 3-Continental - new[] { 010, 067, 073, 074, 075, 077, 078, 084, 087, 094, 096, 097, 100, 107, 136}, - // 4-Garden - new[] { 065, 082, 095, 097, 101, 110, 125}, - // 5-Elegant - new[] { 001 }, - // 6-Meadow - new[] { 066, 077, 078, 083, 086, 088, 105, 108, 122}, - // 7-Modern - new[] { 018, 049}, - // 8-Marine - new[] { 020, 064, 066, 070, 071, 073, 077, 078, 079, 080, 083, 089, 090, 091, 098, 099, 103, 105, 123, 124, 126, 184, 185}, - // 9-Archipelago - new[] { 008, 009, 011, 012, 013, 017, 021, 023, 024, 028, 029, 032, 034, 035, 036, 037, 038, 043, 044, 045, 047, 048, 049, 052, 085, 104,}, - // 10-High-Plains - new[] { 018, 036, 049, 100, 113}, - // 11-Sandstorm - new[] { 072, 109, 118, 119, 120, 121, 168, 174}, - // 12-River - new[] { 065, 069, 085, 093, 104, 105, 114, 115, 116, 117}, - // 13-Monsoon - new[] { 001, 128, 144, 169}, - // 14-Savanna - new[] { 010, 015, 016, 041, 042, 050}, - // 15-Sun - new[] { 036, 014, 019, 026, 030, 033, 036, 039, 065, 092, 106, 111, 112}, - // 16-Ocean - new[] { 049, 077}, - // 17-Jungle - new[] { 016, 021, 022, 025, 027, 031, 040, 046, 052, 169, 153, 156}, + /* 0 Icy Snow */ new[] { 018, 076, 096, 100, 107 }, + /* 1 Polar */ new[] { 010, 018, 020, 049, 076, 096, 100, 107 }, + /* 2 Tundra */ new[] { 001, 081, 096, }, + /* 3 Continental */ new[] { 010, 067, 073, 074, 075, 077, 078, 084, 087, 094, 096, 097, 100, 107, 136}, + /* 4 Garden */ new[] { 065, 082, 095, 097, 101, 110, 125}, + /* 5 Elegant */ new[] { 001 }, + /* 6 Meadow */ new[] { 066, 077, 078, 083, 086, 088, 105, 108, 122}, + /* 7 Modern */ new[] { 018, 049}, + /* 8 Marine */ new[] { 020, 064, 066, 070, 071, 073, 077, 078, 079, 080, 083, 089, 090, 091, 098, 099, 103, 105, 123, 124, 126, 184, 185}, + /* 9 Archipelago */ new[] { 008, 009, 011, 012, 013, 017, 021, 023, 024, 028, 029, 032, 034, 035, 036, 037, 038, 043, 044, 045, 047, 048, 049, 052, 085, 104,}, + /*10 High Plains */ new[] { 018, 036, 049, 100, 113}, + /*11 Sandstorm */ new[] { 072, 109, 118, 119, 120, 121, 168, 174}, + /*12 River */ new[] { 065, 069, 085, 093, 104, 105, 114, 115, 116, 117}, + /*13 Monsoon */ new[] { 001, 128, 144, 169}, + /*14-Savanna */ new[] { 010, 015, 016, 041, 042, 050}, + /*15 Sun */ new[] { 036, 014, 019, 026, 030, 033, 036, 039, 065, 092, 106, 111, 112}, + /*16 Ocean */ new[] { 049, 077}, + /*17 Jungle */ new[] { 016, 021, 022, 025, 027, 031, 040, 046, 052, 169, 153, 156}, }; private static readonly CountryTable[] RegionFormTable = { @@ -81,7 +63,7 @@ private class FormSubregionTable mainform = 01, // Polar otherforms = new[] { - new FormSubregionTable { form = 01, region = new[] {12,13,14} }, + new FormSubregionTable { form = 00, region = new[] {12,13,14} }, new FormSubregionTable { form = 07, region = new[] {05} }, new FormSubregionTable { form = 10, region = new[] {04} }, } @@ -262,21 +244,16 @@ private class FormSubregionTable public static bool CheckVivillonPattern(int form, int pkmcountry, int pkmregion) { - if (VivillonCountryTable[form].Contains(pkmcountry)) - { - if (RegionFormTable.Any(ct => ct.countryID == pkmcountry)) - { - CountryTable ct = RegionFormTable.Where(t => t.countryID == pkmcountry).ToArray()[0]; - if (ct.mainform == form) - return !(ct.otherforms.SelectMany(e => e.region).Contains(pkmregion)); //true if Mainform not in other specific region - else - return ct.otherforms.Any(e => e.form == form && e.region.Contains(pkmregion)); - } - else - return true; // No subregion - } - else + if (!VivillonCountryTable[form].Contains(pkmcountry)) return false; // Country mismatch + if (RegionFormTable.All(c => c.countryID != pkmcountry)) + return true; // No subregion table + + CountryTable ct = RegionFormTable.Where(t => t.countryID == pkmcountry).ToArray()[0]; + if (ct.mainform == form) + return !ct.otherforms.SelectMany(e => e.region).Contains(pkmregion); //true if Mainform not in other specific region + + return ct.otherforms.Any(e => e.form == form && e.region.Contains(pkmregion)); } } } \ No newline at end of file diff --git a/PKHeX/MysteryGifts/PGT.cs b/PKHeX/MysteryGifts/PGT.cs index 99b783d60..1c9d90d91 100644 --- a/PKHeX/MysteryGifts/PGT.cs +++ b/PKHeX/MysteryGifts/PGT.cs @@ -72,7 +72,7 @@ public override string CardTitle } } - public override int Species { get { return Gift.Species; } set { Gift.Species = value; } } + public override int Species { get { return Gift.IsManaphyEgg ? 490 : Gift.Species; } set { Gift.Species = value; } } public override int[] Moves { get { return Gift.Moves; } set { Gift.Moves = value; } } public override int HeldItem { get { return Gift.HeldItem; } set { Gift.HeldItem = value; } } public override bool IsShiny => Gift.IsShiny; @@ -192,7 +192,7 @@ private byte[] Unknown public override bool IsItem { get { return PGTGiftType == GiftType.Item; } set { if (value) PGTGiftType = GiftType.Item; } } public override bool IsPokémon { get { return PGTGiftType == GiftType.Pokémon || PGTGiftType == GiftType.PokémonEgg || PGTGiftType == GiftType.ManaphyEgg; } set { } } - public override int Species { get { return PK.Species; } set { PK.Species = value; } } + public override int Species { get { return IsManaphyEgg ? 490 : PK.Species; } set { PK.Species = value; } } public override int[] Moves { get { return PK.Moves; } set { PK.Moves = value; } } public override int HeldItem { get { return PK.HeldItem; } set { PK.HeldItem = value; } } public override bool IsShiny => PK.IsShiny; @@ -209,6 +209,7 @@ public override PKM convertToPKM(SaveFile SAV) pk4.TID = SAV.TID; pk4.SID = SAV.SID; pk4.OT_Gender = SAV.Gender; + pk4.Language = SAV.Language; } if (IsManaphyEgg) { @@ -218,6 +219,7 @@ public override PKM convertToPKM(SaveFile SAV) pk4.Move1 = 294; pk4.Move2 = 145; pk4.Move3 = 346; + pk4.Ability = pk4.PersonalInfo.Abilities[0]; pk4.FatefulEncounter = true; pk4.Ball = 4; pk4.Version = 10; // Diamond @@ -228,7 +230,7 @@ public override PKM convertToPKM(SaveFile SAV) // Generate IV uint seed = Util.rnd32(); - if (pk4.PID == 1 || IsManaphyEgg) // Create Nonshiny + if (pk4.PID == 1) // Create Nonshiny { uint pid1 = PKX.LCRNG(ref seed) >> 16; uint pid2 = PKX.LCRNG(ref seed) >> 16; @@ -255,7 +257,7 @@ public override PKM convertToPKM(SaveFile SAV) } // Generate Met Info - if (!IsEgg) + if (!IsEgg && !IsManaphyEgg) { pk4.Met_Location = pk4.Egg_Location + 3000; pk4.Egg_Location = 0; @@ -264,15 +266,25 @@ public override PKM convertToPKM(SaveFile SAV) } else { - pk4.Egg_Location = pk4.Egg_Location + 3000; - pk4.MetDate = DateTime.Now; - pk4.IsEgg = false; - // Met Location is modified when transferred to pk5; don't worry about it. + if (SAV.Generation == 4) + { + pk4.IsEgg = true; + pk4.Met_Location = pk4.Egg_Location + 3000; + pk4.Egg_Location = 0; + pk4.IsNicknamed = true; + pk4.Nickname = PKX.getSpeciesName(0, pk4.Language).ToUpper(); + pk4.MetDate = DateTime.Now; + } + else + { + pk4.IsEgg = false; + // Met Location is modified when transferred to pk5; don't worry about it. + pk4.Egg_Location = pk4.Egg_Location + 3000; + pk4.EggMetDate = DateTime.Now; + } } if (pk4.Species == 201) // Never will be true; Unown was never distributed. pk4.AltForm = PKX.getUnownForm(pk4.PID); - if (IsEgg || IsManaphyEgg) - pk4.IsEgg = true; pk4.RefreshChecksum(); return pk4; diff --git a/PKHeX/PKHeX.Core.csproj b/PKHeX/PKHeX.Core.csproj index 855a7bc08..f39d07cb1 100644 --- a/PKHeX/PKHeX.Core.csproj +++ b/PKHeX/PKHeX.Core.csproj @@ -152,7 +152,7 @@ - + @@ -3521,8 +3521,8 @@ - - + +