using System.Linq; using static PKHeX.Core.LegalityCheckStrings; namespace PKHeX.Core { /// /// Verify Evolution Information for a matched /// public static class EvolutionVerifier { /// /// Verifies Evolution scenarios of an for an input and relevant . /// /// Source data to verify /// Source supporting information to verify with /// public static CheckResult VerifyEvolution(PKM pkm, LegalInfo info) { return IsValidEvolution(pkm, info) ? new CheckResult(CheckIdentifier.Evolution) : new CheckResult(Severity.Invalid, LEvoInvalid, CheckIdentifier.Evolution); } /// /// Checks if the Evolution from the source is valid. /// /// Source data to verify /// Source supporting information to verify with /// Evolution is valid or not private static bool IsValidEvolution(PKM pkm, LegalInfo info) { if (info.EvoChainsAllGens[pkm.Format].Count == 0) return false; // Can't exist as current species int species = pkm.Species; if (info.EncounterMatch.Species == species) return true; if (info.EncounterMatch.EggEncounter && species == (int)Species.Milotic && pkm.Format >= 5 && !pkm.IsUntraded) // Prism Scale return true; if (species == (int)Species.Vespiquen && info.Generation < 6 && (pkm.PID & 0xFF) >= 0x1F) // Combee->Vespiquen Invalid Evolution return false; if (info.Generation > 0 && info.EvoChainsAllGens[info.Generation].All(z => z.Species != info.EncounterMatch.Species)) return false; // Can't exist as origin species // If current species evolved with a move evolution and encounter species is not current species check if the evolution by move is valid // Only the evolution by move is checked, if there is another evolution before the evolution by move is covered in IsEvolutionValid if (EvolutionRestrictions.SpeciesEvolutionWithMove.Contains(species)) return EvolutionRestrictions.IsEvolutionValidWithMove(pkm, info); return true; } } }