Reuse EntityGender magic ratio values

This commit is contained in:
Kurt 2025-11-24 17:21:49 -08:00
parent 2da0e303a6
commit a437fecab8
7 changed files with 22 additions and 15 deletions

View File

@ -63,7 +63,7 @@ public IEnumerable<IEncounterable> GetEncounters(PKM pk, EvoCriteria[] chain, Le
bool emerald = pk.E;
byte gender = pk.Gender;
if (pk.Species is (int)Species.Marill or (int)Species.Azumarill)
gender = EntityGender.GetFromPIDAndRatio(pk.EncryptionConstant, 0x3F);
gender = EntityGender.GetFromPID(pk.EncryptionConstant, EntityGender.MM);
foreach (var enc in iterator)
{

View File

@ -158,7 +158,7 @@ private bool IsMatchGender(PKM pk)
// Azurill-F can change to M when evolving in Gen4 (but not in Gen5+) due to Gender Ratio differences.
if (pk.Species != Species && Species == (ushort)Core.Species.Azurill && Gender == 1)
return EntityGender.GetFromPIDAndRatio(pk.PID, 0xBF) == Gender;
return EntityGender.GetFromPID(pk.PID, EntityGender.MF) == Gender;
return true;
}

View File

@ -282,7 +282,7 @@ public static bool SetStarterFromTrainerID(XK3 pk, in EncounterCriteria criteria
uint pid = GetPID(s);
if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25)))
continue;
if (criteria.IsSpecifiedGender() && !criteria.IsSatisfiedGender(EntityGender.GetFromPIDAndRatio(pid, 0x1F)))
if (criteria.IsSpecifiedGender() && !criteria.IsSatisfiedGender(EntityGender.GetFromPID(pid, EntityGender.VM)))
continue;
var ivSeed = XDRNG.Next4(seed);
@ -359,7 +359,7 @@ public static void SetStarterRandom(XK3 pk, in EncounterCriteria criteria, uint
var pid = GetPIDRegular(ref seed);
if (criteria.IsSpecifiedNature() && !criteria.IsSatisfiedNature((Nature)(pid % 25)))
continue;
if (criteria.IsSpecifiedGender() && !criteria.IsSatisfiedGender(EntityGender.GetFromPIDAndRatio(pid, GenderRatioMale87_5)))
if (criteria.IsSpecifiedGender() && !criteria.IsSatisfiedGender(EntityGender.GetFromPID(pid, EntityGender.VM)))
continue;
var tid = XDRNG.Next16(ref start);
@ -515,9 +515,7 @@ private static uint GetColoStarterPID(ref uint seed, uint id32)
}
}
private const byte GenderRatioMale87_5 = 0x1F; // 87.5%
private static bool IsMaleEevee(uint pid) => (pid & 0xFF) >= GenderRatioMale87_5;
private static bool IsMaleEevee(uint pid) => (pid & 0xFF) >= EntityGender.VM;
private static bool IsValidStarterColo(uint id32, uint pid)
=> IsMaleEevee(pid) && !ShinyUtil.GetIsShiny3(id32, pid);

View File

@ -543,7 +543,7 @@ private static bool IsAzurillEdgeCaseM(PKM pk, uint nature, uint actualPID)
if (species is not ((int)Species.Marill or (int)Species.Azumarill))
return false;
const byte AzurillGenderRatio = 0xBF;
const byte AzurillGenderRatio = EntityGender.MF;
var gender = EntityGender.GetFromPIDAndRatio(actualPID, AzurillGenderRatio);
if (gender != 1)
return false;

View File

@ -612,11 +612,12 @@ public virtual bool IsGenderValid()
if (gv == PersonalInfo.RatioMagicMale)
return gender == 0;
var gen = Generation;
if (gen is not (3 or 4 or 5))
return gender == (gender & 1);
if (gender >= 2)
return false; // genderless would have returned above
if (!(Gen3 || Gen4 || Gen5))
return true; // not tied to PID
return gender == EntityGender.GetFromPIDAndRatio(PID, gv);
return gender == EntityGender.GetFromPID(PID, gv);
}
/// <summary>

View File

@ -58,9 +58,17 @@ public static byte GetFromPID(ushort species, uint pid)
PersonalInfo.RatioMagicGenderless => Genderless,
PersonalInfo.RatioMagicFemale => Female,
PersonalInfo.RatioMagicMale => Male,
_ => (pid & 0xFF) < gr ? Female : Male,
_ => GetFromPID(pid, gr),
};
/// <summary>
/// Gets the gender for bi-gender species based on the <see cref="pid"/> and <see cref="gr"/> values.
/// </summary>
/// <param name="pid">Personality ID.</param>
/// <param name="gr">Gender Ratio.</param>
/// <remarks>Assumes single-gender species are not relevant when called.</remarks>
public static byte GetFromPID(uint pid, byte gr) => (pid & 0xFF) < gr ? Female : Male;
/// <summary>
/// Checks if the species (base form) can be female.
/// </summary>

View File

@ -15,7 +15,7 @@ public static void TryGenerateShinyOutbreakZorua()
{
FlawlessIVs = 0, IsAlpha = false,
Shiny = Shiny.Random, RollCount = 30,
GenderRatio = 0x7F,
GenderRatio = EntityGender.HH,
};
var result = Overworld8aRNG.TryApplyFromSeed(test, EncounterCriteria.Unrestricted, param, s0);
@ -46,7 +46,7 @@ public static void TestMagby()
IsAlpha = true,
Shiny = Shiny.Random,
RollCount = 17,
GenderRatio = 0x7F,
GenderRatio = EntityGender.HH,
};
var xoro = new Xoroshiro128Plus(s0);