using System;
namespace PKHeX.Core
{
public static class GenderApplicator
{
///
/// Sets the value, with special consideration for the values which derive the value.
///
/// Pokémon to modify.
/// Desired value to set.
/// Has special logic for an unspecified gender.
public static void SetSaneGender(this PKM pk, int gender)
{
int g = gender == -1 ? pk.GetSaneGender() : gender;
pk.SetGender(g);
}
///
/// Sets the value, with special consideration for the values which derive the value.
///
/// Pokémon to modify.
/// Desired value to set.
public static void SetGender(this PKM pk, int gender)
{
gender = Math.Min(2, Math.Max(0, gender));
if (pk.Gender == gender)
return;
if (pk.Format <= 2)
{
pk.SetAttackIVFromGender(gender);
}
else if (pk.Format <= 5)
{
pk.SetPIDGender(gender);
pk.Gender = gender;
}
else
{
pk.Gender = gender;
}
}
///
/// Sanity checks the provided value, and returns a sane value.
///
///
/// Most-legal value
public static int GetSaneGender(this PKM pk)
{
int gt = pk.PersonalInfo.Gender;
switch (gt)
{
case PersonalInfo.RatioMagicGenderless: return 2;
case PersonalInfo.RatioMagicFemale: return 1;
case PersonalInfo.RatioMagicMale: return 0;
}
if (!pk.IsGenderValid())
return PKX.GetGenderFromPIDAndRatio(pk.PID, gt);
return pk.Gender;
}
///
/// Updates the for a Generation 1/2 format .
///
/// Pokémon to modify.
/// Desired .
public static void SetAttackIVFromGender(this PKM pk, int gender)
{
var rnd = Util.Rand;
while (pk.Gender != gender)
pk.IV_ATK = rnd.Next(16);
}
}
}