diff --git a/PKHeX/Legality/Checks.cs b/PKHeX/Legality/Checks.cs index 2903566c0..5c293e490 100644 --- a/PKHeX/Legality/Checks.cs +++ b/PKHeX/Legality/Checks.cs @@ -175,8 +175,10 @@ private LegalityCheck verifyEVs() { var evs = pk6.EVs; int sum = evs.Sum(); + if (pk6.IsEgg && sum > 0) + return new LegalityCheck(Severity.Invalid, "Eggs cannot receive EVs."); if (sum == 0 && pk6.Stat_Level - pk6.Met_Level > 0) - return new LegalityCheck(Severity.Fishy, "All EVs are zero, but leveled above Met Level"); + return new LegalityCheck(Severity.Fishy, "All EVs are zero, but leveled above Met Level."); if (sum == 508) return new LegalityCheck(Severity.Fishy, "2 EVs remaining."); if (sum > 510) @@ -349,6 +351,8 @@ private LegalityCheck verifyLevel() return new LegalityCheck(Severity.Invalid, "Met Level does not match Wonder Card level."); int lvl = pk6.CurrentLevel; + if (lvl > 1 && pk6.IsEgg) + return new LegalityCheck(Severity.Invalid, "Current level for an egg is invalid."); if (lvl < pk6.Met_Level) return new LegalityCheck(Severity.Invalid, "Current level is below met level."); if ((pk6.WasEgg || EncounterMatch == null) && !Legal.getEvolutionValid(pk6) && pk6.Species != 350) @@ -365,6 +369,28 @@ private LegalityCheck verifyRibbons() List missingRibbons = new List(); List invalidRibbons = new List(); + + if (pk6.IsEgg) + { + var RibbonNames = ReflectUtil.getPropertiesStartWithPrefix(pk6.GetType(), "Ribbon"); + foreach (object RibbonValue in RibbonNames.Select(RibbonName => ReflectUtil.GetValue(pk6, RibbonName))) + { + if ((RibbonValue as int?) > 0) + return new LegalityCheck(Severity.Invalid, "Eggs should not have ribbons."); + if (RibbonValue as bool? == true) + return new LegalityCheck(Severity.Invalid, "Eggs should not have ribbons."); + } + + var DistNames = ReflectUtil.getPropertiesStartWithPrefix(pk6.GetType(), "DistSuperTrain"); + if (DistNames.Select(MissionName => ReflectUtil.GetValue(pk6, MissionName)).Any(Flag => Flag as bool? == true)) + return new LegalityCheck(Severity.Invalid, "Distribution Super Training missions on Egg."); + + var TrainNames = ReflectUtil.getPropertiesStartWithPrefix(pk6.GetType(), "SuperTrain"); + if (TrainNames.Select(MissionName => ReflectUtil.GetValue(pk6, MissionName)).Any(Flag => Flag as bool? == true)) + return new LegalityCheck(Severity.Fishy, "Super Training missions on Egg."); + + return new LegalityCheck(); + } // Check Event Ribbons bool[] EventRib = @@ -420,7 +446,13 @@ private LegalityCheck verifyRibbons() invalidRibbons.Add("Battle Memory"); // Gen3/4 Battle if (missingRibbons.Count + invalidRibbons.Count == 0) + { + var DistNames = ReflectUtil.getPropertiesStartWithPrefix(pk6.GetType(), "DistSuperTrain"); + if (DistNames.Select(MissionName => ReflectUtil.GetValue(pk6, MissionName)).Any(Flag => Flag as bool? == true)) + return new LegalityCheck(Severity.Fishy, "Distribution Super Training missions are not released."); + return new LegalityCheck(Severity.Valid, "All ribbons accounted for."); + } string[] result = new string[2]; if (missingRibbons.Count > 0) @@ -820,6 +852,14 @@ private LegalityCheck verifyForm() } private LegalityCheck verifyMisc() { + if (pk6.IsEgg) + { + if (new[] { pk6.Move1_PPUps, pk6.Move2_PPUps, pk6.Move3_PPUps, pk6.Move4_PPUps }.Any(ppup => ppup > 0)) + return new LegalityCheck(Severity.Invalid, "Cannot apply PP Ups to an Egg."); + if (pk6.CNTs.Any(stat => stat > 0)) + return new LegalityCheck(Severity.Invalid, "Cannot increase Contest Stats of an Egg."); + } + if (pk6.Gen6 && Encounter.Valid && EncounterType == typeof(WC6) ^ pk6.FatefulEncounter) { if (EncounterType == typeof(EncounterStatic) && pk6.Species == 386) // Deoxys Matched @ Sky Pillar diff --git a/PKHeX/MainWindow/Main.cs b/PKHeX/MainWindow/Main.cs index 87b540fcc..a15dc211f 100644 --- a/PKHeX/MainWindow/Main.cs +++ b/PKHeX/MainWindow/Main.cs @@ -412,9 +412,12 @@ private void clickShowdownImportPK6(object sender, EventArgs e) if (Set.Species < 0) { Util.Alert("Set data not found in clipboard."); return; } - if (DialogResult.Yes != Util.Prompt(MessageBoxButtons.YesNo, "Import this set?", Clipboard.GetText())) + if (DialogResult.Yes != Util.Prompt(MessageBoxButtons.YesNo, "Import this set?", Set.getText())) { return; } + if (Set.InvalidLines.Any()) + Util.Alert("Invalid lines detected:", string.Join(Environment.NewLine, Set.InvalidLines)); + // Set Species & Nickname CB_Species.SelectedValue = Set.Species; CHK_Nicknamed.Checked = Set.Nickname != null; @@ -1096,7 +1099,14 @@ private void InitializeStrings() puffs = Util.getStringList("puff", l); } + // Gen4 Mail names not stored in future games. No clever solution like for HM's, so improvise. + for (int i = 137; i <= 148; i++) + itemlist[i] = $"Mail #{i-137+1} (G4)"; + // Fix Item Names (Duplicate entries) + int len = itemlist[425].Length; + itemlist[426] = itemlist[425].Substring(0, len-1) + (char)(itemlist[425][len-1]+1) + " (G4)"; + itemlist[427] = itemlist[425].Substring(0, len-1) + (char)(itemlist[425][len-1]+2) + " (G4)"; itemlist[456] += " (HG/SS)"; // S.S. Ticket itemlist[736] += " (OR/AS)"; // S.S. Ticket itemlist[463] += " (DPPt)"; // Storage Key diff --git a/PKHeX/PKHeX.csproj b/PKHeX/PKHeX.csproj index b4231e5b5..27edae06b 100644 --- a/PKHeX/PKHeX.csproj +++ b/PKHeX/PKHeX.csproj @@ -2757,6 +2757,7 @@ +