using System; using System.Collections.Generic; using static PKHeX.Core.LegalityCheckStrings; namespace PKHeX.Core { /// /// Verifies the transfer data for a that has been irreversably transferred forward. /// public sealed class TransferVerifier : Verifier { protected override CheckIdentifier Identifier => CheckIdentifier.Encounter; public override void Verify(LegalityAnalysis data) { throw new NotImplementedException(); } public void VerifyTransferLegalityG3(LegalityAnalysis data) { var pkm = data.pkm; if (pkm.Format == 4 && pkm.Met_Location != Legal.Transfer3) // Pal Park data.AddLine(GetInvalid(LEggLocationPalPark)); if (pkm.Format != 4 && pkm.Met_Location != Legal.Transfer4) data.AddLine(GetInvalid(LTransferEggLocationTransporter)); } public void VerifyTransferLegalityG4(LegalityAnalysis data) { var pkm = data.pkm; int loc = pkm.Met_Location; if (loc == Legal.Transfer4) return; // Crown met location must be present switch (pkm.Species) { case 251: // Celebi if (loc != Legal.Transfer4_CelebiUnused && loc != Legal.Transfer4_CelebiUsed) data.AddLine(GetInvalid(LTransferMet)); break; case 243: // Raikou case 244: // Entei case 245: // Suicune if (loc != Legal.Transfer4_CrownUnused && loc != Legal.Transfer4_CrownUsed) data.AddLine(GetInvalid(LTransferMet)); break; default: data.AddLine(GetInvalid(LTransferEggLocationTransporter)); break; } } public IEnumerable VerifyVCEncounter(PKM pkm, IEncounterable encounter, ILocation transfer, IList Moves) { // Check existing EncounterMatch if (encounter is EncounterInvalid || transfer == null) yield break; // Avoid duplicate invaild message if (encounter is EncounterStatic v && (GameVersion.GBCartEraOnly.Contains(v.Version) || v.Version == GameVersion.VCEvents)) { bool exceptions = false; exceptions |= v.Version == GameVersion.VCEvents && encounter.Species == 151 && pkm.TID == 22796; if (!exceptions) yield return GetInvalid(LG1GBEncounter); } if (pkm.Met_Location != transfer.Location) yield return GetInvalid(LTransferMetLocation); if (pkm.Egg_Location != transfer.EggLocation) yield return GetInvalid(LEggLocationNone); // Flag Moves that cannot be transferred if (encounter is EncounterStatic s && s.Version == GameVersion.C && s.EggLocation == 256) // Dizzy Punch Gifts FlagIncompatibleTransferMove(pkm, Moves, 146, 2); // can't have Dizzy Punch at all bool checkShiny = pkm.VC2 || (pkm.TradebackStatus == TradebackType.WasTradeback && pkm.VC1); if (!checkShiny) yield break; if (pkm.Gender == 1) // female { if (pkm.PersonalInfo.Gender == 31 && pkm.IsShiny) // impossible gender-shiny yield return GetInvalid(LEncStaticPIDShiny, CheckIdentifier.PID); } else if (pkm.Species == 201) // unown { if (pkm.AltForm != 8 && pkm.AltForm != 21 && pkm.IsShiny) // impossibly form-shiny (not I or V) yield return GetInvalid(LEncStaticPIDShiny, CheckIdentifier.PID); } } private static void FlagIncompatibleTransferMove(PKM pkm, IList Moves, int move, int gen) { int index = Array.IndexOf(pkm.Moves, move); if (index < 0) return; // doesn't have move var chk = Moves[index]; if (chk.Generation == gen) // not obtained from a future gen Moves[index] = new CheckMoveResult(chk.Source, chk.Generation, Severity.Invalid, LTransferMove, CheckIdentifier.Move); } } }