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);
}
}
}