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