diff --git a/PKHeX.Core/Legality/Encounters/Data/Gen5/Encounters5BW.cs b/PKHeX.Core/Legality/Encounters/Data/Gen5/Encounters5BW.cs
index 96edd875c..b2ed0d1a8 100644
--- a/PKHeX.Core/Legality/Encounters/Data/Gen5/Encounters5BW.cs
+++ b/PKHeX.Core/Legality/Encounters/Data/Gen5/Encounters5BW.cs
@@ -183,21 +183,21 @@ public static class Encounters5BW
#region Trade Tables
internal static readonly EncounterTrade5BW[] TradeGift_BW =
[
- new(TradeNames, 04, BW, 0xD400007F) { Species = 587, Level = 30, Ability = OnlyFirst, ID32 = 11195, OTGender = 0, Gender = 0, IVs = new(20,20,31,20,20,20), Nature = Nature.Lax }, // Emolga
- new(TradeNames, 05, BW, 0x2A000000) { Species = 479, Level = 60, Ability = OnlyFirst, ID32 = 54673, OTGender = 1, Gender = 2, IVs = new(20,20,20,20,20,31), Nature = Nature.Gentle }, // Rotom
- new(TradeNames, 06, BW, 0x6200001F) { Species = 446, Level = 60, Ability = OnlySecond, ID32 = 40217, OTGender = 0, Gender = 0, IVs = new(31,20,20,20,20,20), Nature = Nature.Serious }, // Munchlax
+ new(TradeNames, 04, BW, 0xD400007F) { Species = 587, Level = 30, Ability = OnlyFirst, TID16 = 11195, OTGender = 0, Gender = 0, IVs = new(20,20,31,20,20,20), Nature = Nature.Lax }, // Emolga
+ new(TradeNames, 05, BW, 0x2A000000) { Species = 479, Level = 60, Ability = OnlyFirst, TID16 = 54673, OTGender = 1, Gender = 2, IVs = new(20,20,20,20,20,31), Nature = Nature.Gentle }, // Rotom
+ new(TradeNames, 06, BW, 0x6200001F) { Species = 446, Level = 60, Ability = OnlySecond, TID16 = 40217, OTGender = 0, Gender = 0, IVs = new(31,20,20,20,20,20), Nature = Nature.Serious }, // Munchlax
];
internal static readonly EncounterTrade5BW[] TradeGift_B =
[
- new(TradeNames, 00, B , 0x64000000) { Species = 548, Level = 15, Ability = OnlyFirst, ID32 = 39922, OTGender = 1, Gender = 1, IVs = new(20,20,20,20,31,20), Nature = Nature.Modest }, // Petilil
- new(TradeNames, 02, B , 0x9400007F) { Species = 550, Level = 25, Ability = OnlyFirst, ID32 = 27646, OTGender = 0, Gender = 0, IVs = new(20,31,20,20,20,20), Nature = Nature.Adamant, Form = 0 }, // Basculin-Red
+ new(TradeNames, 00, B , 0x64000000) { Species = 548, Level = 15, Ability = OnlyFirst, TID16 = 39922, OTGender = 1, Gender = 1, IVs = new(20,20,20,20,31,20), Nature = Nature.Modest }, // Petilil
+ new(TradeNames, 02, B , 0x9400007F) { Species = 550, Level = 25, Ability = OnlyFirst, TID16 = 27646, OTGender = 0, Gender = 0, IVs = new(20,31,20,20,20,20), Nature = Nature.Adamant, Form = 0 }, // Basculin-Red
];
internal static readonly EncounterTrade5BW[] TradeGift_W =
[
- new(TradeNames, 01, W, 0x6400007E) { Species = 546, Level = 15, Ability = OnlyFirst, ID32 = 39922, OTGender = 1, Gender = 1, IVs = new(20,20,20,20,31,20), Nature = Nature.Modest }, // Cottonee
- new(TradeNames, 03, W, 0x9400007F) { Species = 550, Level = 25, Ability = OnlyFirst, ID32 = 27646, OTGender = 0, Gender = 0, IVs = new(20,31,20,20,20,20), Nature = Nature.Adamant, Form = 1 }, // Basculin-Blue
+ new(TradeNames, 01, W, 0x6400007E) { Species = 546, Level = 15, Ability = OnlyFirst, TID16 = 39922, OTGender = 1, Gender = 1, IVs = new(20,20,20,20,31,20), Nature = Nature.Modest }, // Cottonee
+ new(TradeNames, 03, W, 0x9400007F) { Species = 550, Level = 25, Ability = OnlyFirst, TID16 = 27646, OTGender = 0, Gender = 0, IVs = new(20,31,20,20,20,20), Nature = Nature.Adamant, Form = 1 }, // Basculin-Blue
];
#endregion
}
diff --git a/PKHeX.Core/Legality/Encounters/Data/Gen6/Encounters6AO.cs b/PKHeX.Core/Legality/Encounters/Data/Gen6/Encounters6AO.cs
index ad38e2841..9ecad95ec 100644
--- a/PKHeX.Core/Legality/Encounters/Data/Gen6/Encounters6AO.cs
+++ b/PKHeX.Core/Legality/Encounters/Data/Gen6/Encounters6AO.cs
@@ -156,9 +156,9 @@ internal static class Encounters6AO
#region Trade Tables
internal static readonly EncounterTrade6[] TradeGift_AO =
[
- new(TradeNames, 00, ORAS, 01,3,05,040) { Species = 296, Level = 09, Ability = OnlySecond, ID32 = 30724, Gender = 0, OTGender = 0, IVs = new(-1,31,-1,-1,-1,-1), Nature = Nature.Brave }, // Makuhita
- new(TradeNames, 01, ORAS, 34,3,13,176) { Species = 300, Level = 30, Ability = OnlyFirst, ID32 = 03239, Gender = 1, OTGender = 1, IVs = new(-1,-1,-1,31,-1,-1), Nature = Nature.Naughty }, // Skitty
- new(TradeNames, 02, ORAS, 07,4,10,319) { Species = 222, Level = 50, Ability = OnlyHidden, ID32 = 00325, Gender = 1, OTGender = 1, IVs = new(31,-1,-1,-1,-1,31), Nature = Nature.Calm }, // Corsola
+ new(TradeNames, 00, ORAS, 01,3,05,040) { Species = 296, Level = 09, Ability = OnlySecond, TID16 = 30724, Gender = 0, OTGender = 0, IVs = new(-1,31,-1,-1,-1,-1), Nature = Nature.Brave }, // Makuhita
+ new(TradeNames, 01, ORAS, 34,3,13,176) { Species = 300, Level = 30, Ability = OnlyFirst, TID16 = 03239, Gender = 1, OTGender = 1, IVs = new(-1,-1,-1,31,-1,-1), Nature = Nature.Naughty }, // Skitty
+ new(TradeNames, 02, ORAS, 07,4,10,319) { Species = 222, Level = 50, Ability = OnlyHidden, TID16 = 00325, Gender = 1, OTGender = 1, IVs = new(31,-1,-1,-1,-1,31), Nature = Nature.Calm }, // Corsola
];
#endregion
}
diff --git a/PKHeX.Core/Legality/Encounters/Data/Gen6/Encounters6XY.cs b/PKHeX.Core/Legality/Encounters/Data/Gen6/Encounters6XY.cs
index ad0bc9e16..3fd407835 100644
--- a/PKHeX.Core/Legality/Encounters/Data/Gen6/Encounters6XY.cs
+++ b/PKHeX.Core/Legality/Encounters/Data/Gen6/Encounters6XY.cs
@@ -90,17 +90,17 @@ internal static class Encounters6XY
#region Trade Tables
internal static readonly EncounterTrade6[] TradeGift_XY =
[
- new(TradeNames, 00, XY, 01,3,23,049) { Species = 129, Level = 05, Ability = OnlyFirst, ID32 = 44285, Gender = 0, OTGender = 0, IVs = new(-1,31,-1,-1,31,-1), Nature = Nature.Adamant }, // Magikarp
- new(TradeNames, 01, XY, 10,3,00,000) { Species = 133, Level = 05, Ability = OnlyFirst, ID32 = 29294, Gender = 1, OTGender = 1, IVs = default, Nature = Nature.Docile }, // Eevee
+ new(TradeNames, 00, XY, 01,3,23,049) { Species = 129, Level = 05, Ability = OnlyFirst, TID16 = 44285, Gender = 0, OTGender = 0, IVs = new(-1,31,-1,-1,31,-1), Nature = Nature.Adamant }, // Magikarp
+ new(TradeNames, 01, XY, 10,3,00,000) { Species = 133, Level = 05, Ability = OnlyFirst, TID16 = 29294, Gender = 1, OTGender = 1, IVs = default, Nature = Nature.Docile }, // Eevee
- new(TradeNames, 02, XY, 15,4,13,017) { Species = 083, Level = 10, Ability = OnlyFirst, ID32 = 00185, Gender = 0, OTGender = 0, IVs = new(-1,-1,-1,31,-1,-1), Nature = Nature.Jolly }, // Farfetch'd
- new(TradeNames, 03, XY, 17,5,08,025) { Species = 208, Level = 20, Ability = OnlyFirst, ID32 = 19250, Gender = 1, OTGender = 0, IVs = new(-1,-1,31,-1,-1,-1), Nature = Nature.Impish }, // Steelix
- new(TradeNames, 04, XY, 18,7,20,709) { Species = 625, Level = 50, Ability = OnlyFirst, ID32 = 03447, Gender = 0, OTGender = 1, IVs = new(-1,31,-1,-1,-1,-1), Nature = Nature.Adamant }, // Bisharp
+ new(TradeNames, 02, XY, 15,4,13,017) { Species = 083, Level = 10, Ability = OnlyFirst, TID16 = 00185, Gender = 0, OTGender = 0, IVs = new(-1,-1,-1,31,-1,-1), Nature = Nature.Jolly }, // Farfetch'd
+ new(TradeNames, 03, XY, 17,5,08,025) { Species = 208, Level = 20, Ability = OnlyFirst, TID16 = 19250, Gender = 1, OTGender = 0, IVs = new(-1,-1,31,-1,-1,-1), Nature = Nature.Impish }, // Steelix
+ new(TradeNames, 04, XY, 18,7,20,709) { Species = 625, Level = 50, Ability = OnlyFirst, TID16 = 03447, Gender = 0, OTGender = 1, IVs = new(-1,31,-1,-1,-1,-1), Nature = Nature.Adamant }, // Bisharp
- new(TradeNames, 05, XY, 02,3,11,005) { Species = 656, Level = 05, Ability = OnlyFirst, ID32 = 00037, Gender = 0, OTGender = 1, IVs = new(20,20,20,31,20,20), Nature = Nature.Jolly }, // Froakie
- new(TradeNames, 06, XY, 02,3,09,005) { Species = 650, Level = 05, Ability = OnlyFirst, ID32 = 00037, Gender = 0, OTGender = 1, IVs = new(20,31,20,20,20,20), Nature = Nature.Adamant }, // Chespin
- new(TradeNames, 07, XY, 02,3,18,005) { Species = 653, Level = 05, Ability = OnlyFirst, ID32 = 00037, Gender = 0, OTGender = 1, IVs = new(20,20,20,20,31,20), Nature = Nature.Modest }, // Fennekin
- new(TradeNames, 08, XY, 51,4,04,033) { Species = 280, Level = 05, Ability = OnlyFirst, ID32 = 37110, Gender = 1, OTGender = 1, IVs = new(20,20,20,31,31,20), Nature = Nature.Modest, IsFixedNickname = false }, // Ralts
+ new(TradeNames, 05, XY, 02,3,11,005) { Species = 656, Level = 05, Ability = OnlyFirst, TID16 = 00037, Gender = 0, OTGender = 1, IVs = new(20,20,20,31,20,20), Nature = Nature.Jolly }, // Froakie
+ new(TradeNames, 06, XY, 02,3,09,005) { Species = 650, Level = 05, Ability = OnlyFirst, TID16 = 00037, Gender = 0, OTGender = 1, IVs = new(20,31,20,20,20,20), Nature = Nature.Adamant }, // Chespin
+ new(TradeNames, 07, XY, 02,3,18,005) { Species = 653, Level = 05, Ability = OnlyFirst, TID16 = 00037, Gender = 0, OTGender = 1, IVs = new(20,20,20,20,31,20), Nature = Nature.Modest }, // Fennekin
+ new(TradeNames, 08, XY, 51,4,04,033) { Species = 280, Level = 05, Ability = OnlyFirst, TID16 = 37110, Gender = 1, OTGender = 1, IVs = new(20,20,20,31,31,20), Nature = Nature.Modest, IsFixedNickname = false }, // Ralts
];
#endregion
}
diff --git a/PKHeX.Core/Legality/Encounters/Data/Gen8/Encounters8b.cs b/PKHeX.Core/Legality/Encounters/Data/Gen8/Encounters8b.cs
index 9efbfb9c1..a81453285 100644
--- a/PKHeX.Core/Legality/Encounters/Data/Gen8/Encounters8b.cs
+++ b/PKHeX.Core/Legality/Encounters/Data/Gen8/Encounters8b.cs
@@ -97,9 +97,9 @@ internal static class Encounters8b
internal static readonly EncounterTrade8b[] TradeGift_BDSP =
[
- new(TradeNames, 00, BDSP) { Species = 063, EncryptionConstant = 0x0000008E, PID = 0xFF50A8F5, Level = 09, Ability = OnlyFirst, Gender = 0, OTGender = 0, ID32 = 25643, IVs = new(28,10,09,31,11,03), Moves = new(100,000,000,000), HeightScalar = 029, WeightScalar = 202, Nature = Nature.Quiet }, // Abra
- new(TradeNames, 01, BDSP) { Species = 441, EncryptionConstant = 0x00000867, PID = 0x17DAAB19, Level = 15, Ability = OnlySecond, Gender = 1, OTGender = 0, ID32 = 44142, IVs = new(17,08,29,25,17,23), Moves = new(448,047,064,045), HeightScalar = 088, WeightScalar = 091, Nature = Nature.Lonely }, // Chatot
- new(TradeNames, 02, BDSP) { Species = 093, EncryptionConstant = 0x00000088, PID = 0xF60AB5BB, Level = 33, Ability = OnlyFirst, Gender = 0, OTGender = 0, ID32 = 19248, IVs = new(18,24,28,02,22,30), Moves = new(247,371,389,109), HeightScalar = 096, WeightScalar = 208, Nature = Nature.Hasty }, // Haunter
- new(TradeNames, 03, BDSP) { Species = 129, EncryptionConstant = 0x0000045C, PID = 0xFCE82F88, Level = 45, Ability = OnlyFirst, Gender = 1, OTGender = 0, ID32 = 53277, IVs = new(03,03,31,02,11,03), Moves = new(150,000,000,000), HeightScalar = 169, WeightScalar = 068, Nature = Nature.Mild }, // Magikarp
+ new(TradeNames, 00, BDSP) { Species = 063, EncryptionConstant = 0x0000008E, PID = 0xFF50A8F5, Level = 09, Ability = OnlyFirst, Gender = 0, OTGender = 0, TID16 = 25643, IVs = new(28,10,09,31,11,03), Moves = new(100,000,000,000), HeightScalar = 029, WeightScalar = 202, Nature = Nature.Quiet }, // Abra
+ new(TradeNames, 01, BDSP) { Species = 441, EncryptionConstant = 0x00000867, PID = 0x17DAAB19, Level = 15, Ability = OnlySecond, Gender = 1, OTGender = 0, TID16 = 44142, IVs = new(17,08,29,25,17,23), Moves = new(448,047,064,045), HeightScalar = 088, WeightScalar = 091, Nature = Nature.Lonely }, // Chatot
+ new(TradeNames, 02, BDSP) { Species = 093, EncryptionConstant = 0x00000088, PID = 0xF60AB5BB, Level = 33, Ability = OnlyFirst, Gender = 0, OTGender = 0, TID16 = 19248, IVs = new(18,24,28,02,22,30), Moves = new(247,371,389,109), HeightScalar = 096, WeightScalar = 208, Nature = Nature.Hasty }, // Haunter
+ new(TradeNames, 03, BDSP) { Species = 129, EncryptionConstant = 0x0000045C, PID = 0xFCE82F88, Level = 45, Ability = OnlyFirst, Gender = 1, OTGender = 0, TID16 = 53277, IVs = new(03,03,31,02,11,03), Moves = new(150,000,000,000), HeightScalar = 169, WeightScalar = 068, Nature = Nature.Mild }, // Magikarp
];
}
diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen2/EncounterTrade2.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen2/EncounterTrade2.cs
index ae6433857..98908a638 100644
--- a/PKHeX.Core/Legality/Encounters/Templates/Gen2/EncounterTrade2.cs
+++ b/PKHeX.Core/Legality/Encounters/Templates/Gen2/EncounterTrade2.cs
@@ -6,7 +6,8 @@ namespace PKHeX.Core;
///
/// Generation 2 Trade Encounter
///
-public sealed record EncounterTrade2 : IEncounterable, IEncounterMatch, IFixedTrainer, IFixedNickname, IFixedGender, IFixedIVSet, IEncounterConvertible
+public sealed record EncounterTrade2 : IEncounterable, IEncounterMatch, IEncounterConvertible,
+ IFixedTrainer, IFixedNickname, IFixedGender, IFixedIVSet, ITrainerID16ReadOnly
{
public byte Generation => 2;
public EntityContext Context => EntityContext.Gen2;
diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen3/Colo/EncounterGift3Colo.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen3/Colo/EncounterGift3Colo.cs
index 2464ef533..7bb608fa6 100644
--- a/PKHeX.Core/Legality/Encounters/Templates/Gen3/Colo/EncounterGift3Colo.cs
+++ b/PKHeX.Core/Legality/Encounters/Templates/Gen3/Colo/EncounterGift3Colo.cs
@@ -5,7 +5,8 @@ namespace PKHeX.Core;
///
/// Generation 3 Static Encounter
///
-public sealed record EncounterGift3Colo : IEncounterable, IEncounterMatch, IEncounterConvertible, IRandomCorrelation, IFixedTrainer, IMoveset
+public sealed record EncounterGift3Colo : IEncounterable, IEncounterMatch, IEncounterConvertible,
+ IRandomCorrelation, IFixedTrainer, IMoveset, ITrainerID16ReadOnly
{
public byte Generation => 3;
public EntityContext Context => EntityContext.Gen3;
diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen3/EncounterTrade3.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen3/EncounterTrade3.cs
index 18e4636dc..a38435981 100644
--- a/PKHeX.Core/Legality/Encounters/Templates/Gen3/EncounterTrade3.cs
+++ b/PKHeX.Core/Legality/Encounters/Templates/Gen3/EncounterTrade3.cs
@@ -6,7 +6,7 @@ namespace PKHeX.Core;
/// Generation 3 Trade Encounter
///
public sealed record EncounterTrade3 : IEncounterable, IEncounterMatch, IFixedTrainer, IFixedNickname,
- IFixedGender, IFixedNature, IFixedIVSet, IEncounterConvertible, IContestStatsReadOnly
+ IFixedGender, IFixedNature, IFixedIVSet, IEncounterConvertible, IContestStatsReadOnly, ITrainerID32ReadOnly
{
public byte Generation => 3;
public EntityContext Context => EntityContext.Gen3;
@@ -45,6 +45,7 @@ public sealed record EncounterTrade3 : IEncounterable, IEncounterMatch, IFixedTr
public required ushort TID16 { get; init; }
public ushort SID16 { get; init; }
+ public uint ID32 => TID16 | (uint)(SID16 << 16);
public byte ContestCool { get; private init; }
public byte ContestBeauty { get; private init; }
diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen3/XD/EncounterTrade3XD.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen3/XD/EncounterTrade3XD.cs
index 3dedb23e0..f6395a2c9 100644
--- a/PKHeX.Core/Legality/Encounters/Templates/Gen3/XD/EncounterTrade3XD.cs
+++ b/PKHeX.Core/Legality/Encounters/Templates/Gen3/XD/EncounterTrade3XD.cs
@@ -5,7 +5,8 @@ namespace PKHeX.Core;
///
/// Generation 3 Static Encounter
///
-public sealed record EncounterTrade3XD : IEncounterable, IEncounterMatch, IEncounterConvertible, IRandomCorrelation, IFixedTrainer, IFixedNickname, IFatefulEncounterReadOnly, IMoveset
+public sealed record EncounterTrade3XD : IEncounterable, IEncounterMatch, IEncounterConvertible,
+ IRandomCorrelation, IFixedTrainer, IFixedNickname, IFatefulEncounterReadOnly, IMoveset, ITrainerID16ReadOnly
{
public byte Generation => 3;
public EntityContext Context => EntityContext.Gen3;
diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen4/EncounterTrade4PID.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen4/EncounterTrade4PID.cs
index 16f3fd0fd..ad56ec888 100644
--- a/PKHeX.Core/Legality/Encounters/Templates/Gen4/EncounterTrade4PID.cs
+++ b/PKHeX.Core/Legality/Encounters/Templates/Gen4/EncounterTrade4PID.cs
@@ -5,8 +5,8 @@ namespace PKHeX.Core;
///
/// Generation 4 Trade Encounter with a fixed PID value.
///
-public sealed record EncounterTrade4PID
- : IEncounterable, IEncounterMatch, IFixedTrainer, IFixedNickname, IFixedIVSet, IEncounterConvertible, IContestStatsReadOnly, IMoveset, IFixedGender, IFixedNature
+public sealed record EncounterTrade4PID : IEncounterable, IEncounterMatch, IEncounterConvertible,
+ IFixedTrainer, IFixedNickname, IFixedIVSet, IContestStatsReadOnly, IMoveset, IFixedGender, IFixedNature, ITrainerID32ReadOnly
{
public byte Generation => 4;
public EntityContext Context => EntityContext.Gen4;
@@ -39,7 +39,7 @@ public sealed record EncounterTrade4PID
public Nature Nature => (Nature)(PID % 25);
public byte Form => 0;
- private uint ID32 => (uint)(TID16 | (SID16 << 16));
+ public uint ID32 => (uint)(TID16 | (SID16 << 16));
private bool IsMetUnset => MetLocation == 0;
///
diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen4/EncounterTrade4RanchGift.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen4/EncounterTrade4RanchGift.cs
index d1f8c8601..454230896 100644
--- a/PKHeX.Core/Legality/Encounters/Templates/Gen4/EncounterTrade4RanchGift.cs
+++ b/PKHeX.Core/Legality/Encounters/Templates/Gen4/EncounterTrade4RanchGift.cs
@@ -5,9 +5,8 @@ namespace PKHeX.Core;
///
/// Generation 4 Trade Encounter with a fixed PID value, met location, and version.
///
-public sealed record EncounterTrade4RanchGift
- : IEncounterable, IEncounterMatch, IEncounterConvertible, IFatefulEncounterReadOnly, IFixedTrainer,
- IMoveset, IFixedGender, IFixedNature, IMetLevel
+public sealed record EncounterTrade4RanchGift : IEncounterable, IEncounterMatch, IEncounterConvertible,
+ IFatefulEncounterReadOnly, IFixedTrainer, IMoveset, IFixedGender, IFixedNature, IMetLevel, ITrainerID32ReadOnly
{
public byte Generation => 4;
public EntityContext Context => EntityContext.Gen4;
@@ -36,9 +35,9 @@ public sealed record EncounterTrade4RanchGift
public bool FatefulEncounter { get; }
public required Moveset Moves { get; init; }
- public const ushort TID16 = 1000;
+ public ushort TID16 => 1000;
public required ushort SID16 { get; init; }
- private uint ID32 => (uint)(TID16 | (SID16 << 16));
+ public uint ID32 => (uint)(TID16 | (SID16 << 16));
public required byte OTGender { get; init; }
public required byte Gender { get; init; }
public required AbilityPermission Ability { get; init; }
diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen5/EncounterTrade5B2W2.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen5/EncounterTrade5B2W2.cs
index 956a0c049..2391c1070 100644
--- a/PKHeX.Core/Legality/Encounters/Templates/Gen5/EncounterTrade5B2W2.cs
+++ b/PKHeX.Core/Legality/Encounters/Templates/Gen5/EncounterTrade5B2W2.cs
@@ -6,7 +6,8 @@ namespace PKHeX.Core;
///
/// Generation 5 Trade Encounter
///
-public sealed record EncounterTrade5B2W2 : IEncounterable, IEncounterMatch, IFixedTrainer, IFixedNickname, IEncounterConvertible, IFixedGender, IFixedNature, IFixedIVSet
+public sealed record EncounterTrade5B2W2 : IEncounterable, IEncounterMatch, IEncounterConvertible,
+ IFixedTrainer, IFixedNickname, IFixedGender, IFixedNature, IFixedIVSet, ITrainerID32ReadOnly
{
public byte Generation => 5;
public EntityContext Context => EntityContext.Gen5;
@@ -25,6 +26,8 @@ public sealed record EncounterTrade5B2W2 : IEncounterable, IEncounterMatch, IFix
public required AbilityPermission Ability { get; init; }
public required byte OTGender { get; init; }
public required uint ID32 { get; init; }
+ public ushort TID16 => (ushort)ID32;
+ public ushort SID16 => (ushort)(ID32 >> 16);
public byte Form { get; init; }
public required byte Gender { get; init; }
diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen5/EncounterTrade5BW.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen5/EncounterTrade5BW.cs
index 2ca9e9497..3ef943744 100644
--- a/PKHeX.Core/Legality/Encounters/Templates/Gen5/EncounterTrade5BW.cs
+++ b/PKHeX.Core/Legality/Encounters/Templates/Gen5/EncounterTrade5BW.cs
@@ -3,7 +3,8 @@
namespace PKHeX.Core;
/// Generation 5 Trade with Fixed PID
-public sealed record EncounterTrade5BW : IEncounterable, IEncounterMatch, IFixedTrainer, IFixedNickname, IFixedGender, IFixedNature, IFixedIVSet, IEncounterConvertible
+public sealed record EncounterTrade5BW : IEncounterable, IEncounterMatch, IEncounterConvertible,
+ IFixedTrainer, IFixedNickname, IFixedGender, IFixedNature, IFixedIVSet, ITrainerID32ReadOnly
{
public byte Generation => 5;
public EntityContext Context => EntityContext.Gen5;
@@ -26,7 +27,9 @@ public sealed record EncounterTrade5BW : IEncounterable, IEncounterMatch, IFixed
public required byte Level { get; init; }
public required AbilityPermission Ability { get; init; }
public required byte OTGender { get; init; }
- public required ushort ID32 { get; init; }
+ public required ushort TID16 { get; init; }
+ public ushort SID16 => 0;
+ public uint ID32 => TID16;
public required byte Gender { get; init; }
public required IndividualValueSet IVs { get; init; }
public required Nature Nature { get; init; }
@@ -82,7 +85,7 @@ public PK5 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria)
Nature = Nature,
Ball = (byte)FixedBall,
- ID32 = ID32,
+ TID16 = TID16,
Version = version,
Language = lang == 1 ? 0 : lang, // Trades for JPN games have language ID of 0, not 1.
OriginalTrainerGender = OTGender,
diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen6/EncounterTrade6.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen6/EncounterTrade6.cs
index 9039bc14d..d7522e981 100644
--- a/PKHeX.Core/Legality/Encounters/Templates/Gen6/EncounterTrade6.cs
+++ b/PKHeX.Core/Legality/Encounters/Templates/Gen6/EncounterTrade6.cs
@@ -5,7 +5,8 @@ namespace PKHeX.Core;
///
/// Generation 6 Trade Encounter
///
-public sealed record EncounterTrade6 : IEncounterable, IEncounterMatch, IFixedTrainer, IFixedNickname, IFixedGender, IFixedNature, IFixedIVSet, IEncounterConvertible, IMemoryOTReadOnly
+public sealed record EncounterTrade6 : IEncounterable, IEncounterMatch, IEncounterConvertible,
+ IFixedTrainer, IFixedNickname, IFixedGender, IFixedNature, IFixedIVSet, IMemoryOTReadOnly, ITrainerID32ReadOnly
{
public byte Generation => 6;
public EntityContext Context => EntityContext.Gen6;
@@ -22,7 +23,9 @@ public sealed record EncounterTrade6 : IEncounterable, IEncounterMatch, IFixedTr
private readonly ReadOnlyMemory Nicknames;
public required Nature Nature { get; init; }
- public required ushort ID32 { get; init; }
+ public required ushort TID16 { get; init; }
+ public ushort SID16 => 0;
+ public uint ID32 => TID16;
public required AbilityPermission Ability { get; init; }
public required byte Gender { get; init; }
public required byte OTGender { get; init; }
diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen7/EncounterTrade7.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen7/EncounterTrade7.cs
index 9a84c19af..ffe100e71 100644
--- a/PKHeX.Core/Legality/Encounters/Templates/Gen7/EncounterTrade7.cs
+++ b/PKHeX.Core/Legality/Encounters/Templates/Gen7/EncounterTrade7.cs
@@ -5,7 +5,8 @@ namespace PKHeX.Core;
///
/// Generation 7 Trade Encounter
///
-public sealed record EncounterTrade7 : IEncounterable, IEncounterMatch, IFixedTrainer, IFixedNickname, IEncounterConvertible, IMemoryOTReadOnly, IFixedGender, IFixedNature, IFixedIVSet
+public sealed record EncounterTrade7 : IEncounterable, IEncounterMatch, IEncounterConvertible,
+ IFixedTrainer, IFixedNickname, IMemoryOTReadOnly, IFixedGender, IFixedNature, IFixedIVSet, ITrainerID32ReadOnly
{
public byte Generation => 7;
public EntityContext Context => EntityContext.Gen7;
@@ -27,6 +28,8 @@ public sealed record EncounterTrade7 : IEncounterable, IEncounterMatch, IFixedTr
public required Nature Nature { get; init; }
public required uint ID32 { get; init; }
+ public ushort TID16 => (ushort)ID32;
+ public ushort SID16 => (ushort)(ID32 >> 16);
public required AbilityPermission Ability { get; init; }
public required byte Gender { get; init; }
public required byte OTGender { get; init; }
diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen7b/EncounterTrade7b.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen7b/EncounterTrade7b.cs
index 001ee0694..0c7300884 100644
--- a/PKHeX.Core/Legality/Encounters/Templates/Gen7b/EncounterTrade7b.cs
+++ b/PKHeX.Core/Legality/Encounters/Templates/Gen7b/EncounterTrade7b.cs
@@ -5,7 +5,8 @@ namespace PKHeX.Core;
///
/// Generation 7 LGP/E Trade Encounter
///
-public sealed record EncounterTrade7b(GameVersion Version) : IEncounterable, IEncounterMatch, IFixedTrainer, IFixedIVSet, IEncounterConvertible
+public sealed record EncounterTrade7b(GameVersion Version) : IEncounterable, IEncounterMatch, IEncounterConvertible,
+ IFixedTrainer, IFixedIVSet, ITrainerID32ReadOnly
{
public byte Generation => 7;
public EntityContext Context => EntityContext.Gen7b;
@@ -21,6 +22,8 @@ public sealed record EncounterTrade7b(GameVersion Version) : IEncounterable, IEn
public required ReadOnlyMemory TrainerNames { get; init; }
public required uint ID32 { get; init; }
+ public ushort SID16 => (ushort)(ID32 >> 16);
+ public ushort TID16 => (ushort)ID32;
public required byte OTGender { get; init; }
public required ushort Species { get; init; }
public required byte Form { get; init; }
diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterTrade8.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterTrade8.cs
index 4cd96e0ce..a4e499d79 100644
--- a/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterTrade8.cs
+++ b/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterTrade8.cs
@@ -6,7 +6,9 @@ namespace PKHeX.Core;
///
/// Generation 8 Trade Encounter
///
-public sealed record EncounterTrade8 : IEncounterable, IEncounterMatch, IFixedTrainer, IFixedNickname, IEncounterConvertible, IDynamaxLevelReadOnly, IRelearn, IMemoryOTReadOnly, IFlawlessIVCount, IFixedGender, IFixedNature, IFixedIVSet
+public sealed record EncounterTrade8 : IEncounterable, IEncounterMatch, IEncounterConvertible,
+ IFixedTrainer, IFixedNickname, IDynamaxLevelReadOnly, IRelearn, IMemoryOTReadOnly, IFlawlessIVCount,
+ IFixedGender, IFixedNature, IFixedIVSet, ITrainerID32ReadOnly
{
public byte Generation => 8;
public EntityContext Context => EntityContext.Gen8;
@@ -33,6 +35,8 @@ public sealed record EncounterTrade8 : IEncounterable, IEncounterMatch, IFixedTr
public Nature Nature { get; init; } // always set by either constructor or initializer
public required uint ID32 { get; init; }
+ public ushort TID16 => (ushort)ID32;
+ public ushort SID16 => (ushort)(ID32 >> 16);
public required AbilityPermission Ability { get; init; }
public required byte Gender { get; init; }
public required byte OTGender { get; init; }
diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen8b/EncounterTrade8b.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen8b/EncounterTrade8b.cs
index 4c34e42df..65a3c804d 100644
--- a/PKHeX.Core/Legality/Encounters/Templates/Gen8b/EncounterTrade8b.cs
+++ b/PKHeX.Core/Legality/Encounters/Templates/Gen8b/EncounterTrade8b.cs
@@ -5,7 +5,9 @@ namespace PKHeX.Core;
///
/// Generation 8 BD/SP Trade Encounter
///
-public sealed record EncounterTrade8b : IEncounterable, IEncounterMatch, IFixedTrainer, IFixedNickname, IEncounterConvertible, IScaledSizeReadOnly, IFixedOTFriendship, IMoveset, IContestStatsReadOnly, IFixedGender, IFixedNature, IFixedIVSet
+public sealed record EncounterTrade8b : IEncounterable, IEncounterMatch, IEncounterConvertible,
+ IFixedTrainer, IFixedNickname, IScaledSizeReadOnly, IFixedOTFriendship, IMoveset,
+ IContestStatsReadOnly, IFixedGender, IFixedNature, IFixedIVSet, ITrainerID32ReadOnly
{
public byte Generation => 8;
public EntityContext Context => EntityContext.Gen8b;
@@ -23,7 +25,9 @@ public sealed record EncounterTrade8b : IEncounterable, IEncounterMatch, IFixedT
private readonly ReadOnlyMemory Nicknames;
public required Nature Nature { get; init; }
- public required ushort ID32 { get; init; }
+ public required ushort TID16 { get; init; }
+ public ushort SID16 => 0;
+ public uint ID32 => TID16 | (uint)(SID16 << 16);
public required AbilityPermission Ability { get; init; }
public required byte Gender { get; init; }
public required byte OTGender { get; init; }
diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterTrade9.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterTrade9.cs
index 2ea38e6aa..0317e445d 100644
--- a/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterTrade9.cs
+++ b/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterTrade9.cs
@@ -5,8 +5,8 @@ namespace PKHeX.Core;
///
/// Generation 9 Trade Encounter
///
-public sealed record EncounterTrade9
- : IEncounterable, IEncounterMatch, IFixedTrainer, IFixedNickname, IEncounterConvertible, IGemType, IFixedGender, IFixedNature, IRibbonPartner, IMoveset, IFixedIVSet
+public sealed record EncounterTrade9 : IEncounterable, IEncounterMatch, IEncounterConvertible,
+ IFixedTrainer, IFixedNickname, IGemType, IFixedGender, IFixedNature, IRibbonPartner, IMoveset, IFixedIVSet, ITrainerID32ReadOnly
{
public byte Generation => 9;
public EntityContext Context => EntityContext.Gen9;
@@ -25,6 +25,8 @@ public sealed record EncounterTrade9
public required Nature Nature { get; init; }
public required uint ID32 { get; init; }
+ public ushort TID16 => (ushort)ID32;
+ public ushort SID16 => (ushort)(ID32 >> 16);
public required AbilityPermission Ability { get; init; }
public byte Gender { get; init; }
public required byte OTGender { get; init; }
diff --git a/PKHeX.Core/Legality/Formatting/LegalityCheckStrings.cs b/PKHeX.Core/Legality/Formatting/LegalityCheckStrings.cs
index b71a42be8..2f215266d 100644
--- a/PKHeX.Core/Legality/Formatting/LegalityCheckStrings.cs
+++ b/PKHeX.Core/Legality/Formatting/LegalityCheckStrings.cs
@@ -480,6 +480,8 @@ public static class LegalityCheckStrings
public static string LTradeNotAvailable { get; set; } = "Encounter cannot be traded to the active trainer.";
+ public static string LTrainerIDNoSeed { get; set; } = "Trainer ID is not obtainable from any RNG seed.";
+
public static string LTransferBad { get; set; } = "Incorrectly transferred from previous generation.";
public static string LTransferCurrentHandlerInvalid { get; set; } = "Invalid Current handler value, trainer details for save file expected another value.";
diff --git a/PKHeX.Core/Legality/RNG/CXD/MethodCXD.cs b/PKHeX.Core/Legality/RNG/CXD/MethodCXD.cs
index 7f3022c10..13756e09d 100644
--- a/PKHeX.Core/Legality/RNG/CXD/MethodCXD.cs
+++ b/PKHeX.Core/Legality/RNG/CXD/MethodCXD.cs
@@ -95,6 +95,27 @@ public static bool SetFromIVsCXD(TEntity pk, EncounterCriteria criteria
// Espeon:
// Repeat above
+ ///
+ /// Get the first possible starting seed that generates the given trainer ID and secret ID.
+ ///
+ /// Generation 3 Trainer ID
+ /// Generation 3 Secret ID
+ /// Possible starting seed
+ /// True if a seed was found, false if no seed was found
+ public static bool TryGetSeedTrainerID(ushort tid, ushort sid, out uint seed)
+ {
+ Span seeds = stackalloc uint[XDRNG.MaxCountSeedsPID];
+ var count = XDRNG.GetSeeds(seeds, (uint)tid << 16, (uint)sid << 16);
+
+ if (count == 0)
+ {
+ seed = 0;
+ return false;
+ }
+ seed = seeds[0];
+ return true;
+ }
+
///
/// Tries to set a valid PID/IV for the requested criteria for a Colosseum starter (Umbreon and Espeon), preferring to match Trainer IDs.
///
diff --git a/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/MethodH.cs b/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/MethodH.cs
index 82dfbdce0..e4aa4319b 100644
--- a/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/MethodH.cs
+++ b/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/MethodH.cs
@@ -2,6 +2,7 @@
using static PKHeX.Core.MethodHCondition;
using static PKHeX.Core.LeadRequired;
using static PKHeX.Core.SlotType3;
+using System;
namespace PKHeX.Core;
@@ -675,4 +676,25 @@ is Old_Rod
or Good_Rod
or Super_Rod
or SwarmFish50;
+
+ ///
+ /// Get the first possible starting seed that generates the given trainer ID and secret ID.
+ ///
+ /// Generation 3 Trainer ID
+ /// Generation 3 Secret ID
+ /// Possible starting seed
+ /// True if a seed was found, false if no seed was found
+ public static bool TryGetSeedTrainerID(ushort tid, ushort sid, out uint seed)
+ {
+ Span seeds = stackalloc uint[LCRNG.MaxCountSeedsPID];
+ var count = LCRNGReversal.GetSeeds(seeds, (uint)sid << 16, (uint)tid << 16);
+
+ if (count == 0)
+ {
+ seed = 0;
+ return false;
+ }
+ seed = seeds[0];
+ return true;
+ }
}
diff --git a/PKHeX.Core/Legality/Verifiers/FormVerifier.cs b/PKHeX.Core/Legality/Verifiers/FormVerifier.cs
index 0ea53ba3b..2adc1ac3d 100644
--- a/PKHeX.Core/Legality/Verifiers/FormVerifier.cs
+++ b/PKHeX.Core/Legality/Verifiers/FormVerifier.cs
@@ -38,12 +38,12 @@ private CheckResult VerifyForm(LegalityAnalysis data)
var enc = data.EncounterMatch;
var Info = data.Info;
- if (!pi.IsFormWithinRange(form) && !FormInfo.IsValidOutOfBoundsForm(species, form, Info.Generation))
+ if (!pi.IsFormWithinRange(form) && !FormInfo.IsValidOutOfBoundsForm(species, form, enc.Generation))
return GetInvalid(string.Format(LFormInvalidRange, count - 1, form));
switch ((Species)species)
{
- case Pikachu when Info.Generation == 6: // Cosplay
+ case Pikachu when enc.Generation == 6: // Cosplay
if (enc is not EncounterStatic6 s6)
{
if (form == 0)
@@ -61,7 +61,7 @@ private CheckResult VerifyForm(LegalityAnalysis data)
case Eevee when form is not 0 && ParseSettings.ActiveTrainer is SAV7b {Version:GameVersion.GP}:
return GetInvalid(LFormBattle);
- case Pikachu when Info.Generation >= 7: // Cap
+ case Pikachu when enc.Generation >= 7: // Cap
var expectForm = enc is EncounterInvalid or EncounterEgg ? 0 : enc.Form;
if (form != expectForm)
{
@@ -70,9 +70,9 @@ private CheckResult VerifyForm(LegalityAnalysis data)
return GetInvalid(msg);
}
break;
- case Unown when Info.Generation == 2 && form >= 26:
+ case Unown when enc.Generation == 2 && form >= 26:
return GetInvalid(string.Format(LFormInvalidRange, "Z", form == 26 ? "!" : "?"));
- case Unown when Info.Generation == 3 && form != EntityPID.GetUnownForm3(pk.EncryptionConstant):
+ case Unown when enc.Generation == 3 && form != EntityPID.GetUnownForm3(pk.EncryptionConstant):
return GetInvalid(string.Format(LFormInvalidExpect_0, EntityPID.GetUnownForm3(pk.EncryptionConstant)));
case Dialga or Palkia or Giratina or Arceus when form > 0 && pk is PA8: // can change forms with key items
break;
diff --git a/PKHeX.Core/Legality/Verifiers/NicknameVerifier.cs b/PKHeX.Core/Legality/Verifiers/NicknameVerifier.cs
index fca18c843..2952c7007 100644
--- a/PKHeX.Core/Legality/Verifiers/NicknameVerifier.cs
+++ b/PKHeX.Core/Legality/Verifiers/NicknameVerifier.cs
@@ -61,7 +61,7 @@ public override void Verify(LegalityAnalysis data)
return;
}
- if (VerifyUnNicknamedEncounter(data, pk, nickname))
+ if (VerifyUnNicknamedEncounter(data, pk, nickname, enc))
return;
// Non-nicknamed strings have already been checked.
@@ -70,7 +70,7 @@ public override void Verify(LegalityAnalysis data)
var mostRecentNicknameContext = pk.Format >= 8 ? pk.Context : enc.Context;
if (WordFilter.IsFiltered(nickname, out var badPattern, pk.Context, mostRecentNicknameContext))
data.AddLine(GetInvalid($"Word Filter: {badPattern}"));
- if (TrainerNameVerifier.ContainsTooManyNumbers(nickname, data.Info.Generation))
+ if (TrainerNameVerifier.ContainsTooManyNumbers(nickname, enc.Generation))
data.AddLine(GetInvalid("Word Filter: Too many numbers."));
}
}
@@ -151,11 +151,11 @@ private void VerifyHomeGiftNickname(LegalityAnalysis data, IEncounterTemplate en
data.AddLine(GetInvalid(LNickMatchLanguageFlag));
}
- private bool VerifyUnNicknamedEncounter(LegalityAnalysis data, PKM pk, ReadOnlySpan nickname)
+ private bool VerifyUnNicknamedEncounter(LegalityAnalysis data, PKM pk, ReadOnlySpan nickname, IEncounterTemplate enc)
{
if (pk.IsNicknamed)
{
- if (data.Info.Generation >= 8 && CanNicknameForeign8Plus(data, pk))
+ if (enc.Generation >= 8 && CanNicknameForeign8Plus(data, pk))
{
// Can only nickname if it matches your language.
// Setting the nickname to the same as the species name does not set the Nickname flag (equals unmodified, no flag)
@@ -176,9 +176,9 @@ private bool VerifyUnNicknamedEncounter(LegalityAnalysis data, PKM pk, ReadOnlyS
data.AddLine(GetInvalid(LNickInvalidChar));
return true;
}
- if (nickname.Length > Legal.GetMaxLengthNickname(data.Info.Generation, (LanguageID)pk.Language))
+ if (nickname.Length > Legal.GetMaxLengthNickname(enc.Generation, (LanguageID)pk.Language))
{
- int length = GetForeignNicknameLength(pk, data.Info.EncounterOriginal, data.Info.Generation);
+ int length = GetForeignNicknameLength(pk, enc, enc.Generation);
var severe = (length != 0 && nickname.Length <= length) ? Severity.Fishy : Severity.Invalid;
data.AddLine(Get(LNickLengthLong, severe));
return true;
diff --git a/PKHeX.Core/Legality/Verifiers/TrainerIDVerifier.cs b/PKHeX.Core/Legality/Verifiers/TrainerIDVerifier.cs
index 04f7319c3..2834fc5ed 100644
--- a/PKHeX.Core/Legality/Verifiers/TrainerIDVerifier.cs
+++ b/PKHeX.Core/Legality/Verifiers/TrainerIDVerifier.cs
@@ -26,6 +26,20 @@ public override void Verify(LegalityAnalysis data)
return;
}
}
+ else if (pk.Version == GameVersion.CXD)
+ {
+ var enc = data.EncounterMatch;
+ if (enc is EncounterShadow3Colo or EncounterShadow3XD or EncounterSlot3XD)
+ VerifyTrainerID_CXD(data, pk);
+ }
+ else if (pk.Version is GameVersion.R or GameVersion.S)
+ {
+ var enc = data.EncounterMatch;
+ // If the trainer ID is that of the player, verify it is possible
+ // For eggs, the version does not update on hatch, so it truly is from R/S.
+ if (enc is not ITrainerID16ReadOnly) // all are 32-bit locked anyway
+ VerifyTrainerID_RS(data, pk);
+ }
else if (pk.VC)
{
// Only TID is used for Gen 1/2 VC
@@ -55,6 +69,18 @@ public override void Verify(LegalityAnalysis data)
data.AddLine(Get(LOTSuspicious, Severity.Fishy));
}
+ public static void VerifyTrainerID_CXD(LegalityAnalysis data, T tr) where T : ITrainerID32
+ {
+ if (!MethodCXD.TryGetSeedTrainerID(tr.TID16, tr.SID16, out _))
+ data.AddLine(GetInvalid(LTrainerIDNoSeed, CheckIdentifier.Trainer));
+ }
+
+ public static void VerifyTrainerID_RS(LegalityAnalysis data, T tr) where T : ITrainerID32
+ {
+ if (!MethodH.TryGetSeedTrainerID(tr.TID16, tr.SID16, out _))
+ data.AddLine(GetInvalid(LTrainerIDNoSeed, CheckIdentifier.Trainer));
+ }
+
public static bool IsOTIDSuspicious(ushort tid16, ushort sid16) => (tid16, sid16) switch
{
(12345, 54321) => true,
diff --git a/PKHeX.Core/Legality/Verifiers/TrainerNameVerifier.cs b/PKHeX.Core/Legality/Verifiers/TrainerNameVerifier.cs
index b0473d7c7..a6a623319 100644
--- a/PKHeX.Core/Legality/Verifiers/TrainerNameVerifier.cs
+++ b/PKHeX.Core/Legality/Verifiers/TrainerNameVerifier.cs
@@ -19,7 +19,7 @@ public sealed class TrainerNameVerifier : Verifier
public override void Verify(LegalityAnalysis data)
{
var pk = data.Entity;
- var enc = data.EncounterMatch;
+ var enc = data.EncounterOriginal;
if (!IsPlayerOriginalTrainer(enc))
return; // already verified
@@ -46,9 +46,9 @@ public override void Verify(LegalityAnalysis data)
{
VerifyOTGB(data);
}
- else if (trainer.Length > Legal.GetMaxLengthOT(data.Info.Generation, (LanguageID)pk.Language))
+ else if (trainer.Length > Legal.GetMaxLengthOT(enc.Generation, (LanguageID)pk.Language))
{
- if (!IsEdgeCaseLength(pk, data.EncounterOriginal, trainer))
+ if (!IsEdgeCaseLength(pk, enc, trainer))
data.AddLine(Get(LOTLong, Severity.Invalid));
}
@@ -56,7 +56,7 @@ public override void Verify(LegalityAnalysis data)
{
if (WordFilter.IsFiltered(trainer, out var badPattern, pk.Context, enc.Context))
data.AddLine(GetInvalid($"Word Filter: {badPattern}"));
- if (ContainsTooManyNumbers(trainer, data.Info.Generation))
+ if (ContainsTooManyNumbers(trainer, enc.Generation))
data.AddLine(GetInvalid("Word Filter: Too many numbers."));
Span ht = stackalloc char[pk.TrashCharCountTrainer];
@@ -175,7 +175,7 @@ private static bool IsOTNameSuspicious(ReadOnlySpan name)
return false;
}
- public static bool ContainsTooManyNumbers(ReadOnlySpan str, int originalGeneration)
+ public static bool ContainsTooManyNumbers(ReadOnlySpan str, byte originalGeneration)
{
if (originalGeneration <= 3)
return false; // no limit from these generations
diff --git a/PKHeX.Core/PKM/Interfaces/ITrainerID32.cs b/PKHeX.Core/PKM/Interfaces/ITrainerID32.cs
index 1f512a23f..8e5046a5c 100644
--- a/PKHeX.Core/PKM/Interfaces/ITrainerID32.cs
+++ b/PKHeX.Core/PKM/Interfaces/ITrainerID32.cs
@@ -5,25 +5,46 @@ namespace PKHeX.Core;
///
/// Object stores a numerical trainer ID.
///
-public interface ITrainerID32 : ITrainerID16
+public interface ITrainerID32 : ITrainerID16, ITrainerID32ReadOnly
{
///
/// 32-bit Trainer ID (0-4294967295)
///
- uint ID32 { get; set; }
+ new uint ID32 { get; set; }
///
/// 16-bit Secret ID (0-65535)
///
- ushort SID16 { get; set; }
+ new ushort SID16 { get; set; }
}
-public interface ITrainerID16 : ITrainerID
+public interface ITrainerID16 : ITrainerID, ITrainerID16ReadOnly
{
///
/// 16-bit Trainer ID (0-65535)
///
- ushort TID16 { get; set; }
+ new ushort TID16 { get; set; }
+}
+
+public interface ITrainerID16ReadOnly
+{
+ ///
+ /// 16-bit Trainer ID (0-65535)
+ ///
+ ushort TID16 { get; }
+}
+
+public interface ITrainerID32ReadOnly : ITrainerID16ReadOnly
+{
+ ///
+ /// 32-bit Trainer ID (0-4294967295)
+ ///
+ uint ID32 { get; }
+
+ ///
+ /// 16-bit Secret ID (0-65535)
+ ///
+ ushort SID16 { get; }
}
public static class ITrainerID32Extensions