mirror of
https://github.com/kwsch/PKHeX
synced 2024-12-18 08:23:12 +00:00
e29cf2a903
Checks.cs initially started out small, but over the years it has grown to handle multiple types of checks. With all these checks next to eachother, it's hard to see the overall groups. Splitting them up (potentially further?) allows for more focused maintenance & understanding. Not sure if I'm happy with the overall bandaids used (checks no longer done within LegalityAnalysis so variable repointing is excessively used), but I'm happier the way it is now compared to the huge Checks.cs
98 lines
4.2 KiB
C#
98 lines
4.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using static PKHeX.Core.LegalityCheckStrings;
|
|
|
|
namespace PKHeX.Core
|
|
{
|
|
public 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(V60));
|
|
if (pkm.Format != 4 && pkm.Met_Location != Legal.Transfer4)
|
|
data.AddLine(GetInvalid(V61));
|
|
}
|
|
|
|
public void VerifyTransferLegalityG4(LegalityAnalysis data)
|
|
{
|
|
var pkm = data.pkm;
|
|
// Transfer Legality
|
|
int loc = pkm.Met_Location;
|
|
if (loc != 30001) // PokéTransfer
|
|
{
|
|
// Crown
|
|
switch (pkm.Species)
|
|
{
|
|
case 251: // Celebi
|
|
if (loc != Legal.Transfer4_CelebiUnused && loc != Legal.Transfer4_CelebiUsed)
|
|
data.AddLine(GetInvalid(V351));
|
|
break;
|
|
case 243: // Raikou
|
|
case 244: // Entei
|
|
case 245: // Suicune
|
|
if (loc != Legal.Transfer4_CrownUnused && loc != Legal.Transfer4_CrownUsed)
|
|
data.AddLine(GetInvalid(V351));
|
|
break;
|
|
default:
|
|
data.AddLine(GetInvalid(V61));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
public static IEnumerable<CheckResult> VerifyVCEncounter(PKM pkm, IEncounterable encounter, ILocation transfer, IList<CheckMoveResult> 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 new CheckResult(Severity.Invalid, V79, CheckIdentifier.Encounter);
|
|
}
|
|
|
|
if (pkm.Met_Location != transfer.Location)
|
|
yield return new CheckResult(Severity.Invalid, V81, CheckIdentifier.Encounter);
|
|
if (pkm.Egg_Location != transfer.EggLocation)
|
|
yield return new CheckResult(Severity.Invalid, V59, CheckIdentifier.Encounter);
|
|
|
|
// Flag Moves that cannot be transferred
|
|
if (encounter is EncounterStatic s && s.Version == GameVersion.C && s.EggLocation == 256) // Dizzy Punch Gifts
|
|
{
|
|
// can't have Dizzy Punch at all
|
|
int index = Array.IndexOf(pkm.Moves, 146); // Dizzy Punch
|
|
if (index >= 0)
|
|
{
|
|
var chk = Moves[index];
|
|
if (chk.Generation == 2) // not obtained from a future gen
|
|
Moves[index] = new CheckMoveResult(chk.Source, chk.Generation, Severity.Invalid, V82, CheckIdentifier.Move);
|
|
}
|
|
}
|
|
|
|
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 new CheckResult(Severity.Invalid, V209, 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 new CheckResult(Severity.Invalid, V209, CheckIdentifier.PID);
|
|
}
|
|
}
|
|
}
|
|
}
|