namespace PKHeX.Core
{
public class FrameGenerator
{
public uint Nature;
public readonly bool Gendered;
public readonly int GenderHigh;
public readonly int GenderLow;
public readonly bool DPPt;
public readonly bool AllowLeads;
public readonly FrameType FrameType = FrameType.None;
public readonly RNG RNG;
public readonly bool Safari3;
public Frame GetFrame(uint seed, LeadRequired lead) => new Frame(seed, FrameType, RNG, lead);
public Frame GetFrame(uint seed, LeadRequired lead, uint esv, uint origin) => GetFrame(seed, lead, esv, esv, origin);
public Frame GetFrame(uint seed, LeadRequired lead, uint esv, uint lvl, uint origin) => new Frame(seed, FrameType, RNG, lead)
{
RandESV = esv,
RandLevel = lvl,
OriginSeed = origin,
};
///
/// Gets the Search Criteria parameters necessary for generating and objects.
///
/// Info used to determine the .
/// object containing various accessible information required for the encounter.
/// Object containing search criteria to be passed by reference to search/filter methods.
public FrameGenerator(PIDIV pidiv, PKM pk)
{
var ver = (GameVersion)pk.Version;
switch (ver)
{
// Method H
case GameVersion.R:
case GameVersion.S:
case GameVersion.FR:
case GameVersion.LG:
case GameVersion.E:
DPPt = false;
FrameType = FrameType.MethodH;
RNG = pidiv.RNG;
Safari3 = pk.Ball == 5 && !pk.FRLG;
if (ver != GameVersion.E)
return;
AllowLeads = true;
// Cute Charm waits for gender too!
var gender = pk.Gender;
bool gendered = gender != 2;
if (!gendered)
return;
var gr = pk.PersonalInfo.Gender;
Gendered = true;
GenderLow = GetGenderMinMax(gender, gr, false);
GenderHigh = GetGenderMinMax(gender, gr, true);
return;
// Method J
case GameVersion.D:
case GameVersion.P:
case GameVersion.Pt:
DPPt = true;
AllowLeads = true;
FrameType = FrameType.MethodJ;
RNG = pidiv.RNG;
return;
// Method K
case GameVersion.HG:
case GameVersion.SS:
DPPt = false;
AllowLeads = true;
FrameType = FrameType.MethodK;
RNG = pidiv.RNG;
return;
}
}
///
/// Gets the span of values for a given Gender
///
/// Gender
/// Gender Ratio
/// Return Max (or Min)
/// Returns the maximum or minimum gender value that corresponds to the input gender ratio.
private static int GetGenderMinMax(int gender, int ratio, bool max)
{
if (ratio == 0 || ratio == 0xFE || ratio == 0xFF)
gender = 2;
switch (gender)
{
case 0: return max ? 255 : ratio; // male
case 1: return max ? ratio - 1 : 0; // female
default: return max ? 255 : 0; // fixed/genderless
}
}
}
}