コード例 #1
0
        private uint GeneratePID(BWRng rng)
        {
            uint pid = rng.GetNext32BitNumber();

            if (Genderless)
            {
                return(pid);
            }
            // clear out the lower byte
            pid &= 0xFFFFFF00;
            switch (GenderThreashold)
            {
            // all male
            case 0:
                pid += rng.GetNext32BitNumber(0xF6) + 8;
                break;

            // all female
            case 254:
                pid += rng.GetNext32BitNumber(0x8) + 1;
                break;

            default:
                if (Male)
                {
                    pid += rng.GetNext32BitNumber(0xFE - GenderThreashold) + GenderThreashold;
                }
                else
                {
                    pid += rng.GetNext32BitNumber(GenderThreashold - 1) + 1;
                }
                break;
            }
            return(pid);
        }
コード例 #2
0
 private void Advance(BWRng pidrng, MersenneTwister ivrng, List <DreamRadarFrame.Spin> spins)
 {
     // first PIDRNG advance = spin
     spins.Add((DreamRadarFrame.Spin)pidrng.GetNext32BitNumber(8));
     pidrng.GetNext64BitNumber();
     ivrng.Next();
     ivrng.Next();
 }
コード例 #3
0
        private uint[] FillRNGArray(uint startingFrame, ulong seed)
        {
            var rng = new BWRng(seed);

            for (uint i = 1; i < startingFrame; ++i)
            {
                rng.GetNext64BitNumber();
            }
            // max of 4 calls per hollow
            var rngArray = new uint[MaxAdvances + OpenHollows * 4];

            for (int i = 0; i < rngArray.Length; ++i)
            {
                rngArray[i] = rng.GetNext32BitNumber();
            }
            return(rngArray);
        }
コード例 #4
0
        private DreamRadarFrame GeneratePokemon(BWRng pidrng2, MersenneTwister ivrng2)
        {
            var pidrng = new BWRng(pidrng2.Seed);
            var ivrng  = new MersenneTwister(ivrng2);
            var frame  = new DreamRadarFrame();

            frame.Pid = GeneratePID(pidrng);
            // two unknown advances
            pidrng.GetNext64BitNumber();
            pidrng.GetNext64BitNumber();
            frame.Nature = pidrng.GetNext32BitNumber(25);
            // IVs
            frame.Hp  = ivrng.Next() >> 27;
            frame.Atk = ivrng.Next() >> 27;
            frame.Def = ivrng.Next() >> 27;
            frame.Spa = ivrng.Next() >> 27;
            frame.Spd = ivrng.Next() >> 27;
            frame.Spe = ivrng.Next() >> 27;

            return(frame);
        }
コード例 #5
0
ファイル: Responses.cs プロジェクト: Slashmolder/RNGReporter
        public static string ChatotResponses64(ulong seed, Profile profile)
        {
            string responses = "";

            var rng = new BWRng(seed);
            uint initialFrame = Functions.initialPIDRNG(seed, profile);

            for (uint cnt = 1; cnt < initialFrame; cnt++)
            {
                rng.Next();
            }

            for (uint cnt = 0; cnt < 20; cnt++)
            {
                responses += ChatotResponse64Short(rng.GetNext32BitNumber());
                // skip last item
                if (cnt != 19)
                {
                    responses += ", ";
                }
            }

            return responses;
        }
コード例 #6
0
        public static string ChatotResponses64(ulong seed, Profile profile)
        {
            string responses = "";

            var  rng          = new BWRng(seed);
            uint initialFrame = Functions.initialPIDRNG(seed, profile);

            for (uint cnt = 1; cnt < initialFrame; cnt++)
            {
                rng.Next();
            }

            for (uint cnt = 0; cnt < 20; cnt++)
            {
                responses += ChatotResponse64Short(rng.GetNext32BitNumber());
                // skip last item
                if (cnt != 19)
                {
                    responses += ", ";
                }
            }

            return(responses);
        }
コード例 #7
0
        private void Search(DateTime date, uint vcountMin, uint vcountMax,
                            uint timer0Min, uint timer0Max, uint vframeMin, uint vframeMax, uint gxstatMin,
                            uint gxstatMax, bool minmaxgxstat, int secondsMin, int secondsMax, bool softreset,
                            Version version, Language language,
                            DSType dstype, bool memorylink, ulong macaddress, uint buttons, uint[] pattern)
        {
            var array = new uint[80];

            array[6] = (uint)(macaddress & 0xFFFF);
            if (softreset)
            {
                array[6] = array[6] ^ 0x01000000;
            }
            Array.Copy(Nazos.Nazo(version, language, dstype), array, 5);

            array[10] = 0x00000000;
            array[11] = 0x00000000;
            array[13] = 0x80000000;
            array[14] = 0x00000000;
            array[15] = 0x000001A0;

            array[12] = buttons;

            string yearMonth  = String.Format("{0:00}", date.Year % 2000) + String.Format("{0:00}", date.Month);
            string dateString = String.Format("{0:00}", (int)date.DayOfWeek);

            dateString = String.Format("{0:00}", date.Day) + dateString;
            dateString = yearMonth + dateString;
            array[8]   = uint.Parse(dateString, NumberStyles.HexNumber);
            array[9]   = 0x0;
            //uint[] alpha = Functions.alphaSHA1(array, 8);

            var upperMAC = (uint)(macaddress >> 16);

            for (uint vcount = vcountMin; vcount <= vcountMax; ++vcount)
            {
                for (uint timer0 = timer0Min; timer0 <= timer0Max; ++timer0)
                {
                    array[5] = (vcount << 16) + timer0;
                    array[5] = Functions.Reorder(array[5]);

                    for (uint vframe = vframeMin; vframe <= vframeMax; ++vframe)
                    {
                        for (uint gxstat = gxstatMin; gxstat <= gxstatMax; ++gxstat)
                        {
                            array[7] = (upperMAC ^ (vframe * 0x1000000) ^ gxstat);
                            uint[] alpha = Functions.alphaSHA1(array);

                            array[16] = Functions.RotateLeft(array[13] ^ array[8] ^ array[2] ^ array[0], 1);
                            array[18] = Functions.RotateLeft(array[15] ^ array[10] ^ array[4] ^ array[2], 1);
                            array[19] = Functions.RotateLeft(array[16] ^ array[11] ^ array[5] ^ array[3], 1);
                            array[21] = Functions.RotateLeft(array[18] ^ array[13] ^ array[7] ^ array[5], 1);
                            array[22] = Functions.RotateLeft(array[19] ^ array[14] ^ array[8] ^ array[6], 1);
                            array[24] = Functions.RotateLeft(array[21] ^ array[16] ^ array[10] ^ array[8], 1);
                            array[27] = Functions.RotateLeft(array[24] ^ array[19] ^ array[13] ^ array[11], 1);

                            for (int second = secondsMin; second <= secondsMax; ++second)
                            {
                                array[9] = Functions.seedSecond(second) | Functions.seedMinute(date.Minute) |
                                           Functions.seedHour(date.Hour, dstype);
                                ulong seed = Functions.EncryptSeed(array, alpha, 9);
                                // it appears to have the same initial seed as in the main game
                                // pressing Unova link does the same probability table calls
                                uint initial = Functions.initialPIDRNG(seed, version, memorylink);
                                var  rng     = new BWRng(seed);
                                for (uint i = 0; i < initial; ++i)
                                {
                                    rng.GetNext64BitNumber();
                                }
                                bool found = true;
                                for (uint i = 0; i < pattern.Length; ++i)
                                {
                                    if (pattern[i] != rng.GetNext32BitNumber(8))
                                    {
                                        found = false;
                                        break;
                                    }
                                    // there's another RNG call here unreleated to the spinner
                                    rng.GetNext64BitNumber();
                                }
                                progressSearched++;
                                if (found)
                                {
                                    var parameter = new DSParameterCapture
                                    {
                                        ActualSeconds = second,
                                        GxStat        = gxstat,
                                        Seed          = seed,
                                        Timer0        = timer0,
                                        VCount        = vcount,
                                        VFrame        = vframe
                                    };
                                    dsParameters.Add(parameter);
                                    refreshQueue = true;
                                    progressFound++;
                                }
                            }


                            if (minmaxgxstat && gxstatMax > gxstatMin)
                            {
                                gxstat = gxstatMax - 1;
                            }
                        }
                    }
                }
            }
        }
コード例 #8
0
 private uint[] FillRNGArray(uint startingFrame, ulong seed)
 {
     var rng = new BWRng(seed);
     for (uint i = 1; i < startingFrame; ++i)
     {
         rng.GetNext64BitNumber();
     }
     // max of 4 calls per hollow
     var rngArray = new uint[MaxAdvances + OpenHollows*4];
     for (int i = 0; i < rngArray.Length; ++i)
     {
         rngArray[i] = rng.GetNext32BitNumber();
     }
     return rngArray;
 }
コード例 #9
0
        private DreamRadarFrame GeneratePokemon(BWRng pidrng2, MersenneTwister ivrng2)
        {
            var pidrng = new BWRng(pidrng2.Seed);
            var ivrng = new MersenneTwister(ivrng2);
            var frame = new DreamRadarFrame();

            frame.Pid = GeneratePID(pidrng);
            // two unknown advances
            pidrng.GetNext64BitNumber();
            pidrng.GetNext64BitNumber();
            frame.Nature = pidrng.GetNext32BitNumber(25);
            // IVs
            frame.Hp = ivrng.Next() >> 27;
            frame.Atk = ivrng.Next() >> 27;
            frame.Def = ivrng.Next() >> 27;
            frame.Spa = ivrng.Next() >> 27;
            frame.Spd = ivrng.Next() >> 27;
            frame.Spe = ivrng.Next() >> 27;

            return frame;
        }
コード例 #10
0
 private uint GeneratePID(BWRng rng)
 {
     uint pid = rng.GetNext32BitNumber();
     if (Genderless) return pid;
     // clear out the lower byte
     pid &= 0xFFFFFF00;
     switch (GenderThreashold)
     {
             // all male
         case 0:
             pid += rng.GetNext32BitNumber(0xF6) + 8;
             break;
             // all female
         case 254:
             pid += rng.GetNext32BitNumber(0x8) + 1;
             break;
         default:
             if (Male)
                 pid += rng.GetNext32BitNumber(0xFE - GenderThreashold) + GenderThreashold;
             else
                 pid += rng.GetNext32BitNumber(GenderThreashold - 1) + 1;
             break;
     }
     return pid;
 }
コード例 #11
0
 private void Advance(BWRng pidrng, MersenneTwister ivrng, List<DreamRadarFrame.Spin> spins)
 {
     // first PIDRNG advance = spin
     spins.Add((DreamRadarFrame.Spin) pidrng.GetNext32BitNumber(8));
     pidrng.GetNext64BitNumber();
     ivrng.Next();
     ivrng.Next();
 }