private int shiny_in(ulong seed) { int i = -1; ulong new_seed = seed; bool shiny = false; do { i++; XOROSHIRO rng = new XOROSHIRO(new_seed); new_seed = rng.next(); uint SIDTID = (uint)rng.nextInt(0xFFFFFFFF); uint PID = (uint)rng.nextInt(0xFFFFFFFF); shiny = (get_SV(SIDTID) ^ get_SV(PID)) == 0x0; } while (!shiny); return i; }
public RaidPKM ConvertToPKM(ulong seed, uint tid, uint sid) { XOROSHIRO rng = new XOROSHIRO(seed); uint EC = (uint)rng.NextInt(0xFFFFFFFF); uint SIDTID = (uint)rng.NextInt(0xFFFFFFFF); uint PID = (uint)rng.NextInt(0xFFFFFFFF); var shinytype = RandUtil.GetShinyType(PID, SIDTID); if (ShinyType == 2 && shinytype == 0) { shinytype = 2; } if (ShinyType == 1) { shinytype = 3; } uint tsv = RandUtil.GetShinyValue((sid << 16) | tid); PID = GetFinalPID(tid, sid, PID, SIDTID, tsv, ShinyType); int[] ivs = { -1, -1, -1, -1, -1, -1 }; for (int i = 0; i < 6; i++) { ivs[i] = FixedIV[i]; } int deviation = -FlawlessIVs; for (int i = 0; i < FlawlessIVs; i++) { int idx; do { do { idx = (int)rng.Next() & 7; deviation++; } while (idx >= 6); } while (ivs[idx] != -1); ivs[idx] = 31; } for (int i = 0; i < 6; i++) { if (ivs[i] == -1) { ivs[i] = (int)rng.NextInt(32); } } int ability = 0; int abilityIdx = 0; IReadOnlyList <int> abilities = PersonalTable.SWSH.GetFormEntry(Species, AltForm).Abilities; if (Ability < 3) { abilityIdx = Ability; } if (Ability == 3) { abilityIdx = (int)rng.NextInt(2); } else if (Ability == 4) { abilityIdx = (int)rng.NextInt(3); } ability = abilities[abilityIdx]; // gender int gt = PersonalTable.SWSH[Species].Gender; var gender = gt switch { 255 => 2, // Genderless 254 => 1, // Female-Only 0 => 0, // Male-Only _ => ((int)rng.NextInt(253) + 1 < gt ? 1 : 0) }; int nature; if (Nature == 25) { if (Species == (int)PKHeX.Core.Species.Toxtricity) { var table = AltForm == 0 ? ToxtricityAmplifiedNatures : ToxtricityLowKeyNatures; nature = table[rng.NextInt((uint)table.Length)]; } else { nature = (int)rng.NextInt(25); } } else { nature = Nature; } return(new RaidPKM(Species, AltForm, EC, PID, ivs, ability, abilityIdx, gender, nature, deviation, shinytype, IsGigantamax, ShinyType)); }
public Pkmn GetPkmnFromDetails(ulong seed, Entry pkmn) { XOROSHIRO rng = new XOROSHIRO(seed); uint EC = (uint)rng.nextInt(0xFFFFFFFF); uint SIDTID = (uint)rng.nextInt(0xFFFFFFFF); uint PID = (uint)rng.nextInt(0xFFFFFFFF); int shinytype = GetShinyType(PID, SIDTID); uint tsv = get_SV((this.sid << 16) | this.tid); uint psv = get_SV(PID); if (shinytype == 0 && psv == tsv) // ensure no shiny { PID ^= 0x10000000; } else if (shinytype > 0) { if (psv != tsv) { if (shinytype == 1) { PID = (PID & 0xFFFF) | (this.tid ^ this.sid ^ PID ^ 1) << 16; } else { PID ^= (PID & 0xFFFF) | (this.tid ^ this.sid ^ PID ^ 0) << 16; } } } int[] ivs = { -1, -1, -1, -1, -1, -1 }; for (int i = 0; i < pkmn.FlawlessIVs; i++) { int idx; do { idx = (int)rng.nextInt(6); } while (ivs[idx] != -1); ivs[idx] = 31; } for (int i = 0; i < 6; i++) { if (ivs[i] == -1) { ivs[i] = (int)rng.nextInt(32); } } int ability = 0; int[] abilities = PersonalTable.SWSH.GetAbilities(pkmn.Species, pkmn.AltForm); if (pkmn.Ability == 3) { ability = abilities[(uint)rng.nextInt(2)]; } else if (pkmn.Ability == 4) { ability = abilities[(uint)rng.nextInt(3)]; } // gender int gender = 0; // 0 = male, 1 = female, 2 = genderless int gt = PersonalTable.SWSH[pkmn.Species].Gender; switch (gt) { case 255: gender = 2; // Genderless break; case 254: gender = 1; // Female-Only break; case 0: gender = 0; // Male-Only break; default: gender = (int)rng.nextInt(253) + 1 < gt ? 1 : 0; break; } int nature; if (pkmn.Species == (int)Species.Toxtricity) { if (pkmn.AltForm == 0) { nature = ToxtricityAmplifiedNatures[(uint)rng.nextInt((uint)ToxtricityAmplifiedNatures.Length)]; } else { nature = ToxtricityAmplifiedNatures[(uint)rng.nextInt((uint)ToxtricityLowKeyNatures.Length)]; } } else { nature = (int)rng.nextInt(25); } return(new Pkmn(pkmn.Species, pkmn.AltForm, EC, PID, ivs, ability, gender, nature, shinytype, pkmn.IsGigantamax)); }