Esempio n. 1
0
 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;
 }
Esempio n. 2
0
        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));
        }