Exemplo n.º 1
0
        public static void ApplyDetails(PKM pk, EncounterCriteria criteria, Shiny shiny = Shiny.FixedValue, int flawless = -1)
        {
            if (shiny == Shiny.FixedValue)
            {
                shiny = criteria.Shiny is Shiny.Random or Shiny.Never ? Shiny.Never : Shiny.Always;
            }
            if (flawless == -1)
            {
                flawless = 0;
            }

            int       ctr         = 0;
            const int maxAttempts = 50_000;
            var       rnd         = Util.Rand;

            do
            {
                ulong s0   = Util.Rand32(rnd) | (ulong)Util.Rand32(rnd) << 32;
                ulong s1   = Util.Rand32(rnd) | (ulong)Util.Rand32(rnd) << 32;
                var   xors = new XorShift128(s0, s1);
                if (TryApplyFromSeed(pk, criteria, shiny, flawless, xors))
                {
                    return;
                }
            } while (++ctr != maxAttempts);

            {
                ulong s0   = Util.Rand32(rnd) | (ulong)Util.Rand32(rnd) << 32;
                ulong s1   = Util.Rand32(rnd) | (ulong)Util.Rand32(rnd) << 32;
                var   xors = new XorShift128(s0, s1);
                TryApplyFromSeed(pk, EncounterCriteria.Unrestricted, shiny, flawless, xors);
            }
        }
Exemplo n.º 2
0
    void SetRandomType(RandomType next)
    {
        _randomType = next;
        for (int i = 0; i < ThreadCount; i++)
        {
            switch (_randomType)
            {
            case RandomType.XorShift128: _randoms[i] = new XorShift128(i); break;

            case RandomType.XorShift64: _randoms[i] = new XorShift64(i); break;

            case RandomType.XorShift32: _randoms[i] = new XorShift32(i); break;

            case RandomType.Mwc32: _randoms[i] = new Mwc32(i); break;

            case RandomType.Mwc64: _randoms[i] = new Mwc64(i); break;

            case RandomType.Standard: _randoms[i] = new Standard(i); break;

            case RandomType.BadLcg: _randoms[i] = new BadLcg(i); break;

            case RandomType.PopularLcg: _randoms[i] = new PopularLcg(i); break;

            case RandomType.MinStd: _randoms[i] = new MinStd(i); break;
            }
        }
    }
Exemplo n.º 3
0
 /// <summary>
 /// コンストラクター
 /// </summary>
 private RandXorShift()
 {
     for (int i = 0; i < rndArray.Length; ++i) {
                     rndArray [i] = new XorShift128 (1);
             }
             Seed (1);
             Enable (true);
 }
Exemplo n.º 4
0
 /// <summary>
 /// コンストラクター
 /// </summary>
 private RandXorShift()
 {
     for (int i = 0; i < rndArray.Length; ++i)
     {
         rndArray [i] = new XorShift128(1);
     }
     Seed(1);
     Enable(true);
 }
Exemplo n.º 5
0
    private static int GetFramesForward(ulong s0, ulong s1, ulong n0, ulong n1, int loop)
    {
        var rand = new XorShift128(s0, s1);

        for (int i = 0; i < loop; i++)
        {
            _ = rand.Next();
            if (rand.GetState64() == (n0, n1))
            {
                return(i);
            }
        }
        return(-1);
    }
Exemplo n.º 6
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);
        }
        } // = default();

        public PerlinNoise(int seed)
        {
            this.rand = new XorShift128((uint)seed);
            SetSeed((uint)seed);
        }
 /* Constructor */
 public PerlinNoise()
 {
     this.rand = new XorShift128();
     SetSeed(rand.Next());
 } // = default();