From 6e48856bec307b63122a3f2a0dac9e8b3afae134 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sun, 1 Mar 2026 22:42:15 -0600 Subject: [PATCH] Handle initial OT trash bytes for enc3->pk3 --- .../Encounters/Templates/Gen3/EncounterEgg3.cs | 6 +++++- .../Encounters/Templates/Gen3/EncounterSlot3.cs | 6 +++++- .../Encounters/Templates/Gen3/EncounterStatic3.cs | 12 ++++++++---- PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierG3.cs | 4 ++++ 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen3/EncounterEgg3.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen3/EncounterEgg3.cs index 59f25e374..2699b8e00 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen3/EncounterEgg3.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen3/EncounterEgg3.cs @@ -58,12 +58,16 @@ public PK3 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) // Force Hatch Language = language, - OriginalTrainerName = tr.OT, Nickname = SpeciesName.GetSpeciesNameGeneration(Species, language, Generation), OriginalTrainerFriendship = 120, MetLevel = 0, MetLocation = Location, }; + // Copy from SaveFile's OT name. Trash bytes here should be pure, but our OT name might not always source from a PK3/SAV3. + // Condition the buffer as if it came from a correct SAV3 named after the OT. + var ot = pk.OriginalTrainerTrash; + ot[..(language == 1 ? 6 : 7)].Fill(0xFF); + pk.OriginalTrainerName = EncounterUtil.GetTrainerName(tr, language); SetEncounterMoves(pk); diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen3/EncounterSlot3.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen3/EncounterSlot3.cs index e7b849770..9a291143d 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen3/EncounterSlot3.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen3/EncounterSlot3.cs @@ -64,11 +64,15 @@ public PK3 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) Ball = (byte)GetRequiredBall(Ball.Poke), Language = language, - OriginalTrainerName = tr.OT, OriginalTrainerGender = tr.Gender, ID32 = tr.ID32, Nickname = SpeciesName.GetSpeciesNameGeneration(Species, language, Generation), }; + // Copy from SaveFile's OT name. Trash bytes here should be pure, but our OT name might not always source from a PK3/SAV3. + // Condition the buffer as if it came from a correct SAV3 named after the OT. + var ot = pk.OriginalTrainerTrash; + ot[..(language == 1 ? 6 : 7)].Fill(0xFF); + pk.OriginalTrainerName = EncounterUtil.GetTrainerName(tr, language); SetPINGA(pk, criteria, pi); SetEncounterMoves(pk); diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen3/EncounterStatic3.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen3/EncounterStatic3.cs index 4b7ec7dcd..9dbe7e428 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen3/EncounterStatic3.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen3/EncounterStatic3.cs @@ -41,7 +41,7 @@ public sealed record EncounterStatic3(ushort Species, byte Level, GameVersion Ve public PK3 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) { - int lang = GetTemplateLanguage(tr); + int language = GetTemplateLanguage(tr); var version = this.GetCompatibleVersion(tr.Version); var pi = PersonalTable.E[Species]; var pk = new PK3 @@ -56,12 +56,16 @@ public PK3 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) Ball = (byte)(FixedBall != Ball.None ? FixedBall : Ball.Poke), FatefulEncounter = FatefulEncounter, - Language = lang, - OriginalTrainerName = EncounterUtil.GetTrainerName(tr, lang), + Language = language, OriginalTrainerGender = tr.Gender, ID32 = tr.ID32, - Nickname = SpeciesName.GetSpeciesNameGeneration(Species, lang, Generation), + Nickname = SpeciesName.GetSpeciesNameGeneration(Species, language, Generation), }; + // Copy from SaveFile's OT name. Trash bytes here should be pure, but our OT name might not always source from a PK3/SAV3. + // Condition the buffer as if it came from a correct SAV3 named after the OT. + var ot = pk.OriginalTrainerTrash; + ot[..(language == 1 ? 6 : 7)].Fill(0xFF); + pk.OriginalTrainerName = EncounterUtil.GetTrainerName(tr, language); if (IsEgg) { diff --git a/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierG3.cs b/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierG3.cs index 281726dee..2495a0f8a 100644 --- a/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierG3.cs +++ b/PKHeX.Core/Legality/Verifiers/Misc/MiscVerifierG3.cs @@ -19,6 +19,10 @@ internal void Verify(LegalityAnalysis data, G3PKM pk) if (ParseSettings.AllowGBACrossTransferRSE(pk)) return; + // Notes: + // Nicknamed by player: all FF'd trash. + // In-game trade: clean 00'd with a single FF on each. + // Only FR/LG are released. Only can originate from FR/LG. if (pk.Version is not (GameVersion.FR or GameVersion.LG)) data.AddLine(GetInvalid(TradeNotAvailable));