Standardize IGenerateSeed32 API for gen9 raid encounters (#4497)

This commit is contained in:
Manu
2025-05-21 05:53:32 +02:00
committed by GitHub
parent 09f654fd34
commit e72995e898
4 changed files with 51 additions and 28 deletions

View File

@@ -5,8 +5,7 @@
namespace PKHeX.Core;
public sealed record EncounterDist9
: IEncounterable, IEncounterMatch, IEncounterConvertible<PK9>, ITeraRaid9, IMoveset, IFlawlessIVCount, IFixedGender, IFixedNature
public sealed record EncounterDist9 : ITeraRaid9, IFixedNature
{
public byte Generation => 9;
ushort ILocation.Location => Location;
@@ -235,14 +234,12 @@ private static EncounterDist9 ReadEncounter(ReadOnlySpan<byte> data) => new()
};
#region Generating
PKM IEncounterConvertible.ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) => ConvertToPKM(tr, criteria);
PKM IEncounterConvertible.ConvertToPKM(ITrainerInfo tr) => ConvertToPKM(tr);
public PK9 ConvertToPKM(ITrainerInfo tr) => ConvertToPKM(tr, EncounterCriteria.Unrestricted);
public PK9 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria)
{
int language = (int)Language.GetSafeLanguage(Generation, (LanguageID)tr.Language);
var version = this.GetCompatibleVersion(tr.Version);
var pi = PersonalTable.SV[Species, Form];
var pi = GetPersonal();
var pk = new PK9
{
Language = language,
@@ -269,19 +266,33 @@ public PK9 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria)
return pk;
}
private PersonalInfo9SV GetPersonal() => PersonalTable.SV[Species, Form];
private void SetPINGA(PK9 pk, EncounterCriteria criteria, PersonalInfo9SV pi)
{
const byte rollCount = 1;
const byte undefinedSize = 0;
var param = new GenerateParam9(Species, pi.Gender, FlawlessIVCount, rollCount,
undefinedSize, undefinedSize, ScaleType, Scale,
Ability, Shiny, Nature, IVs: IVs);
var param = GetParam(pi);
var init = Util.Rand.Rand64();
var success = this.TryApply32(pk, init, param, criteria);
if (!success && !this.TryApply32(pk, init, param, criteria.WithoutIVs()))
this.TryApply32(pk, init, param, EncounterCriteria.Unrestricted);
}
private GenerateParam9 GetParam(PersonalInfo9SV pi)
{
const byte rollCount = 1;
const byte undefinedSize = 0;
return new GenerateParam9(Species, pi.Gender, FlawlessIVCount, rollCount,
undefinedSize, undefinedSize, ScaleType, Scale,
Ability, Shiny, Nature, IVs: IVs);
}
public bool GenerateSeed32(PKM pk, uint seed)
{
var pk9 = (PK9)pk;
var param = GetParam(GetPersonal());
Encounter9RNG.GenerateData(pk9, param, EncounterCriteria.Unrestricted, seed);
return true;
}
#endregion
#region Matching

View File

@@ -3,8 +3,7 @@
namespace PKHeX.Core;
public sealed record EncounterMight9
: IEncounterable, IEncounterMatch, IEncounterConvertible<PK9>, ITeraRaid9, IMoveset, IFlawlessIVCount, IFixedGender, IFixedNature
public sealed record EncounterMight9 : ITeraRaid9, IFixedNature
{
public byte Generation => 9;
ushort ILocation.Location => Location;
@@ -249,8 +248,6 @@ private static EncounterMight9 ReadEncounter(ReadOnlySpan<byte> data) => new()
};
#region Generating
PKM IEncounterConvertible.ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) => ConvertToPKM(tr, criteria);
PKM IEncounterConvertible.ConvertToPKM(ITrainerInfo tr) => ConvertToPKM(tr);
public PK9 ConvertToPKM(ITrainerInfo tr) => ConvertToPKM(tr, EncounterCriteria.Unrestricted);
public PK9 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria)
{
@@ -285,20 +282,34 @@ public PK9 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria)
return pk;
}
private PersonalInfo9SV GetPersonal() => PersonalTable.SV[Species, Form];
private void SetPINGA(PK9 pk, EncounterCriteria criteria, PersonalInfo9SV pi)
{
const byte rollCount = 1;
const byte undefinedSize = 0;
byte gender = GetGender(pi);
var param = new GenerateParam9(Species, gender, FlawlessIVCount, rollCount,
undefinedSize, undefinedSize, ScaleType, Scale,
Ability, Shiny, Nature, IVs);
var param = GetParam(pi);
var init = Util.Rand.Rand64();
var success = this.TryApply32(pk, init, param, criteria);
if (!success && !this.TryApply32(pk, init, param, criteria.WithoutIVs()))
this.TryApply32(pk, init, param, EncounterCriteria.Unrestricted);
}
private GenerateParam9 GetParam(PersonalInfo9SV pi)
{
const byte rollCount = 1;
const byte undefinedSize = 0;
byte gender = GetGender(pi);
return new GenerateParam9(Species, gender, FlawlessIVCount, rollCount,
undefinedSize, undefinedSize, ScaleType, Scale,
Ability, Shiny, Nature, IVs);
}
public bool GenerateSeed32(PKM pk, uint seed)
{
var pk9 = (PK9)pk;
var param = GetParam(GetPersonal());
Encounter9RNG.GenerateData(pk9, param, EncounterCriteria.Unrestricted, seed);
return true;
}
#endregion
#region Matching

View File

@@ -7,9 +7,7 @@ namespace PKHeX.Core;
/// <summary>
/// Generation 9 Tera Raid Encounter
/// </summary>
public sealed record EncounterTera9
: IEncounterable, IEncounterMatch, IEncounterConvertible<PK9>, IGenerateSeed32,
ITeraRaid9, IMoveset, IFlawlessIVCount, IFixedGender, IEncounterFormRandom
public sealed record EncounterTera9 : ITeraRaid9, IEncounterFormRandom
{
public byte Generation => 9;
public EntityContext Context => EntityContext.Gen9;
@@ -173,8 +171,6 @@ private static EncounterTera9 ReadEncounter(ReadOnlySpan<byte> data, TeraRaidMap
};
#region Generating
PKM IEncounterConvertible.ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) => ConvertToPKM(tr, criteria);
PKM IEncounterConvertible.ConvertToPKM(ITrainerInfo tr) => ConvertToPKM(tr);
public PK9 ConvertToPKM(ITrainerInfo tr) => ConvertToPKM(tr, EncounterCriteria.Unrestricted);
public PK9 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria)
{

View File

@@ -3,7 +3,7 @@ namespace PKHeX.Core;
/// <summary>
/// Properties shared for all Tera Crystal raids.
/// </summary>
public interface ITeraRaid9 : IGemType
public interface ITeraRaid9 : IEncounterable, IEncounterMatch, IGemType, IGenerateSeed32, IMoveset, IFixedGender, IFlawlessIVCount, IEncounterConvertible<PK9>
{
/// <summary>
/// Is a BCAT raid.
@@ -29,4 +29,9 @@ public interface ITeraRaid9 : IGemType
/// Checks if the provided <see cref="seed"/> will pick this object by random choice.
/// </summary>
bool CanBeEncountered(uint seed);
PKM IEncounterConvertible.ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) => ConvertToPKM(tr, criteria);
PKM IEncounterConvertible.ConvertToPKM(ITrainerInfo tr) => ConvertToPKM(tr);
new PK9 ConvertToPKM(ITrainerInfo tr);
new PK9 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria);
}