Handle initial OT trash bytes for enc3->pk3

This commit is contained in:
Kurt 2026-03-01 22:42:15 -06:00
parent 51a012ff78
commit 6e48856bec
4 changed files with 22 additions and 6 deletions

View File

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

View File

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

View File

@ -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)
{

View File

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