PKHeX/PKHeX.Core/Legality/Verifiers/TrainerIDVerifier.cs
Kurt 95fbf66a6e
Refactor: Gen3/4 Lead Encounters, property fixing (#4193)
In addition to the Method 1 (and other sibling PIDIV types) correlation, an encounter can only be triggered if the calls prior land on the Method {1} seed. The RNG community has dubbed these patterns as "Method J" (D/P/Pt), "Method K" (HG/SS), and "Method H" (Gen3, coined by yours truly). The basic gist of these is that they are pre-requisites, like the Shadow locks of Colosseum/XD. 

Rename/re-type a bunch of properties to get the codebase more in line with correct property names & more obvious underlying types.
2024-02-22 21:20:54 -06:00

64 lines
2 KiB
C#

using static PKHeX.Core.LegalityCheckStrings;
namespace PKHeX.Core;
/// <summary>
/// Verifies the <see cref="PKM.OriginalTrainerName"/>.
/// </summary>
public sealed class TrainerIDVerifier : Verifier
{
protected override CheckIdentifier Identifier => CheckIdentifier.Trainer;
public override void Verify(LegalityAnalysis data)
{
var pk = data.Entity;
if (!TrainerNameVerifier.IsPlayerOriginalTrainer(data.EncounterMatch))
return; // already verified
if (pk.BDSP)
{
// Game loops to ensure a nonzero full-ID
// int.MaxValue cannot be yielded by Unity's Random.Range[min, max)
var id32 = pk.ID32;
if (id32 is 0 or int.MaxValue)
{
data.AddLine(GetInvalid(LOT_IDInvalid));
return;
}
}
else if (pk.VC)
{
// Only TID is used for Gen 1/2 VC
if (pk.SID16 != 0)
data.AddLine(GetInvalid(LOT_SID0Invalid));
if (pk.TID16 == 0)
data.AddLine(Get(LOT_TID0, Severity.Fishy));
return;
}
else if (pk.Format <= 2)
{
// Only TID is used for Gen 1/2
if (pk.TID16 == 0)
data.AddLine(Get(LOT_TID0, Severity.Fishy));
return;
}
if (pk is { ID32: 0 })
data.AddLine(Get(LOT_IDs0, Severity.Fishy));
else if (pk.TID16 == pk.SID16)
data.AddLine(Get(LOT_IDEqual, Severity.Fishy));
else if (pk.TID16 == 0)
data.AddLine(Get(LOT_TID0, Severity.Fishy));
else if (pk.SID16 == 0)
data.AddLine(Get(LOT_SID0, Severity.Fishy));
else if (IsOTIDSuspicious(pk.TID16, pk.SID16))
data.AddLine(Get(LOTSuspicious, Severity.Fishy));
}
public static bool IsOTIDSuspicious(ushort tid16, ushort sid16) => (tid16, sid16) switch
{
(12345, 54321) => true,
(15040, 18831) => true, // 1234_123456 (SID7_TID7)
_ => false,
};
}