Esempio n. 1
0
    public static bool TryApplyFromSeed(PKM pk, EncounterCriteria criteria, Shiny shiny, int flawless, XorShift128 xors, AbilityPermission ability)
    {
        // Encryption Constant
        pk.EncryptionConstant = xors.NextUInt();

        // PID
        var fakeTID = xors.NextUInt(); // fakeTID
        var pid     = xors.NextUInt();

        pid = GetRevisedPID(fakeTID, pid, pk);
        if (shiny == Shiny.Never)
        {
            if (GetIsShiny(pk.TID, pk.SID, pid))
            {
                return(false);
            }
        }
        else if (shiny != Shiny.Random)
        {
            if (!GetIsShiny(pk.TID, pk.SID, pid))
            {
                return(false);
            }

            if (shiny == Shiny.AlwaysSquare && pk.ShinyXor != 0)
            {
                return(false);
            }
            if (shiny == Shiny.AlwaysStar && pk.ShinyXor == 0)
            {
                return(false);
            }
        }
        pk.PID = pid;

        // Check IVs: Create flawless IVs at random indexes, then the random IVs for not flawless.
        Span <int> ivs        = stackalloc[] { UNSET, UNSET, UNSET, UNSET, UNSET, UNSET };
        const int  MAX        = 31;
        var        determined = 0;

        while (determined < flawless)
        {
            var idx = (int)xors.NextUInt(6);
            if (ivs[idx] != UNSET)
            {
                continue;
            }
            ivs[idx] = 31;
            determined++;
        }

        for (var i = 0; i < ivs.Length; i++)
        {
            if (ivs[i] == UNSET)
            {
                ivs[i] = xors.NextInt(0, MAX + 1);
            }
        }

        if (!criteria.IsIVsCompatible(ivs, 8))
        {
            return(false);
        }

        pk.IV_HP  = ivs[0];
        pk.IV_ATK = ivs[1];
        pk.IV_DEF = ivs[2];
        pk.IV_SPA = ivs[3];
        pk.IV_SPD = ivs[4];
        pk.IV_SPE = ivs[5];

        // Ability
        var n = ability switch
        {
            AbilityPermission.Any12 => (int)xors.NextUInt(2),
            AbilityPermission.Any12H => (int)xors.NextUInt(3),
            _ => (int)ability >> 1,
        };

        pk.SetAbilityIndex(n);

        // Gender (skip this if gender is fixed)
        var genderRatio = PersonalTable.BDSP.GetFormEntry(pk.Species, pk.Form).Gender;

        if (genderRatio == PersonalInfo.RatioMagicGenderless)
        {
            pk.Gender = 2;
        }
        else if (genderRatio == PersonalInfo.RatioMagicMale)
        {
            pk.Gender = 0;
        }
        else if (genderRatio == PersonalInfo.RatioMagicFemale)
        {
            pk.Gender = 1;
        }
        else
        {
            var next = (((int)xors.NextUInt(253) + 1 < genderRatio) ? 1 : 0);
            if (criteria.Gender is 0 or 1 && next != criteria.Gender)
            {
                return(false);
            }
            pk.Gender = next;
        }

        if (criteria.Nature is Nature.Random)
        {
            pk.Nature = (int)xors.NextUInt(25);
        }
        else // Skip nature, assuming Synchronize
        {
            pk.Nature = (int)criteria.Nature;
        }
        pk.StatNature = pk.Nature;

        // Remainder
        var scale = (IScaledSize)pk;

        scale.HeightScalar = (byte)((int)xors.NextUInt(0x81) + (int)xors.NextUInt(0x80));
        scale.WeightScalar = (byte)((int)xors.NextUInt(0x81) + (int)xors.NextUInt(0x80));

        // Item, don't care
        return(true);
    }
Esempio n. 2
0
        private static bool TryApplyFromSeed(PKM pk, EncounterCriteria criteria, Shiny shiny, int flawless, uint seed)
        {
            var xoro = new Xoroshiro128Plus(seed);

            // Encryption Constant
            pk.EncryptionConstant = (uint)xoro.NextInt(uint.MaxValue);

            // PID
            var pid = (uint)xoro.NextInt(uint.MaxValue);

            if (shiny == Shiny.Never)
            {
                if (GetIsShiny(pk.TID, pk.SID, pid))
                {
                    pid ^= 0x1000_0000;
                }
            }
            else if (shiny != Shiny.Random)
            {
                if (!GetIsShiny(pk.TID, pk.SID, pid))
                {
                    pid = GetShinyPID(pk.TID, pk.SID, pid, 0);
                }

                if (shiny == Shiny.AlwaysSquare && pk.ShinyXor != 0)
                {
                    return(false);
                }
                if (shiny == Shiny.AlwaysStar && pk.ShinyXor == 0)
                {
                    return(false);
                }
            }

            pk.PID = pid;

            // IVs
            var       ivs = new[] { UNSET, UNSET, UNSET, UNSET, UNSET, UNSET };
            const int MAX = 31;

            for (int i = 0; i < flawless; i++)
            {
                int index;
                do
                {
                    index = (int)xoro.NextInt(6);
                }while (ivs[index] != UNSET);

                ivs[index] = MAX;
            }

            for (int i = 0; i < ivs.Length; i++)
            {
                if (ivs[i] == UNSET)
                {
                    ivs[i] = (int)xoro.NextInt(32);
                }
            }

            if (!criteria.IsIVsCompatible(ivs, 8))
            {
                return(false);
            }

            pk.IV_HP  = ivs[0];
            pk.IV_ATK = ivs[1];
            pk.IV_DEF = ivs[2];
            pk.IV_SPA = ivs[3];
            pk.IV_SPD = ivs[4];
            pk.IV_SPE = ivs[5];

            // Remainder
            var scale = (IScaledSize)pk;

            scale.HeightScalar = (int)xoro.NextInt(0x81) + (int)xoro.NextInt(0x80);
            scale.WeightScalar = (int)xoro.NextInt(0x81) + (int)xoro.NextInt(0x80);

            return(true);
        }
Esempio n. 3
0
    private static bool TryApplyFromSeed(PKM pk, EncounterCriteria criteria, Shiny shiny, int flawless, uint seed)
    {
        var xoro = new Xoroshiro128Plus8b(seed);

        // Encryption Constant
        pk.EncryptionConstant = seed;

        // PID
        var fakeTID = xoro.NextUInt(); // fakeTID
        var pid     = xoro.NextUInt();

        pid = GetRevisedPID(fakeTID, pid, pk);
        if (shiny == Shiny.Never)
        {
            if (GetIsShiny(pk.TID, pk.SID, pid))
            {
                return(false);
            }
        }
        else if (shiny != Shiny.Random)
        {
            if (!GetIsShiny(pk.TID, pk.SID, pid))
            {
                return(false);
            }

            if (shiny == Shiny.AlwaysSquare && pk.ShinyXor != 0)
            {
                return(false);
            }
            if (shiny == Shiny.AlwaysStar && pk.ShinyXor == 0)
            {
                return(false);
            }
        }
        pk.PID = pid;

        // Check IVs: Create flawless IVs at random indexes, then the random IVs for not flawless.
        Span <int> ivs        = stackalloc [] { UNSET, UNSET, UNSET, UNSET, UNSET, UNSET };
        const int  MAX        = 31;
        var        determined = 0;

        while (determined < flawless)
        {
            var idx = (int)xoro.NextUInt(6);
            if (ivs[idx] != UNSET)
            {
                continue;
            }
            ivs[idx] = 31;
            determined++;
        }

        for (var i = 0; i < ivs.Length; i++)
        {
            if (ivs[i] == UNSET)
            {
                ivs[i] = (int)xoro.NextUInt(MAX + 1);
            }
        }

        if (!criteria.IsIVsCompatible(ivs, 8))
        {
            return(false);
        }

        pk.IV_HP  = ivs[0];
        pk.IV_ATK = ivs[1];
        pk.IV_DEF = ivs[2];
        pk.IV_SPA = ivs[3];
        pk.IV_SPD = ivs[4];
        pk.IV_SPE = ivs[5];

        // Ability
        pk.SetAbilityIndex((int)xoro.NextUInt(2));

        // Remainder
        var scale = (IScaledSize)pk;

        scale.HeightScalar = (byte)((int)xoro.NextUInt(0x81) + (int)xoro.NextUInt(0x80));
        scale.WeightScalar = (byte)((int)xoro.NextUInt(0x81) + (int)xoro.NextUInt(0x80));

        return(true);
    }