示例#1
0
        public static string[] GetIVPID(uint nature, int hiddenpower, bool XD = false, IVPIDMethod method = IVPIDMethod.None)
        {
            if (method == IVPIDMethod.BACD_R)
            {
                return(GenerateWishmkr(nature));
            }
            var generator = new FrameGenerator();

            if (XD || method == IVPIDMethod.XD)
            {
                generator = new FrameGenerator {
                    FrameType = FrameType.ColoXD
                }
            }
            ;
            if (method == IVPIDMethod.M2)
            {
                generator = new FrameGenerator {
                    FrameType = FrameType.Method2
                }
            }
            ;
            var frameCompare = new FrameCompare(Hptofilter(hiddenpower), nature);
            var frames       = generator.Generate(frameCompare, 0, 0);

            return(new[] { frames[0].Pid.ToString("X"), frames[0].Hp.ToString(), frames[0].Atk.ToString(), frames[0].Def.ToString(), frames[0].Spa.ToString(), frames[0].Spd.ToString(), frames[0].Spe.ToString() });
        }
    }
示例#2
0
        // by declaring these only once you get a huge performance boost

        // This method ensures that an RNG is only created once,
        // and not every time a Generate function is called

        public List <Frame> Generate(
            FrameCompare frameCompare,
            uint id,
            uint sid)
        {
            frames = new List <Frame>();

            if (FrameType == FrameType.ColoXD)
            {
                var rng = new XdRng((uint)InitialSeed);
                rngList = new List <uint>();

                for (uint cnt = 1; cnt < InitialFrame; cnt++)
                {
                    rng.GetNext32BitNumber();
                }

                for (uint cnt = 0; cnt < 12; cnt++)
                {
                    rngList.Add(rng.GetNext16BitNumber());
                }

                for (uint cnt = 0; cnt < maxResults; cnt++, rngList.RemoveAt(0), rngList.Add(rng.GetNext16BitNumber()))
                {
                    switch (FrameType)
                    {
                    case FrameType.ColoXD:
                        frame = Frame.GenerateFrame(
                            0,
                            FrameType.ColoXD,
                            cnt + InitialFrame,
                            rngList[0],
                            rngList[4],
                            rngList[3],
                            rngList[0],
                            rngList[1],
                            id, sid);

                        break;

                    case FrameType.Channel:
                        frame = Frame.GenerateFrame(
                            0,
                            FrameType.Channel,
                            cnt + InitialFrame,
                            rngList[0],
                            rngList[1],
                            rngList[2],
                            (rngList[6]) >> 11,
                            (rngList[7]) >> 11,
                            (rngList[8]) >> 11,
                            (rngList[10]) >> 11,
                            (rngList[11]) >> 11,
                            (rngList[9]) >> 11,
                            40122, rngList[0]);

                        break;
                    }

                    if (frameCompare.Compare(frame))
                    {
                        frames.Add(frame); break;
                    }
                }
            }
            else
            {
                //  We are going to grab our initial set of rngs here and
                //  then start our loop so that we can iterate as many
                //  times as we have to.
                var rng = new PokeRng((uint)InitialSeed);
                rngList = new List <uint>();

                for (uint cnt = 1; cnt < InitialFrame; cnt++)
                {
                    rng.GetNext32BitNumber();
                }

                for (uint cnt = 0; cnt < 20; cnt++)
                {
                    rngList.Add(rng.GetNext16BitNumber());
                }

                lastseed = rng.Seed;

                for (uint cnt = 0; cnt < maxResults; cnt++, rngList.RemoveAt(0), rngList.Add(rng.GetNext16BitNumber()))
                {
                    switch (FrameType)
                    {
                    case FrameType.Method1:
                        frame =
                            Frame.GenerateFrame(
                                0,
                                FrameType.Method1,
                                cnt + InitialFrame,
                                rngList[0],
                                rngList[0],
                                rngList[1],
                                rngList[2],
                                rngList[3],
                                id, sid, cnt);

                        break;

                    case FrameType.Method1Reverse:
                        frame =
                            Frame.GenerateFrame(
                                0,
                                FrameType.Method1Reverse,
                                cnt + InitialFrame,
                                rngList[0],
                                rngList[1],
                                rngList[0],
                                rngList[2],
                                rngList[3],
                                id, sid, cnt);

                        break;

                    case FrameType.Method2:
                        frame =
                            Frame.GenerateFrame(
                                0,
                                FrameType.Method2,
                                cnt + InitialFrame,
                                rngList[0],
                                rngList[0],
                                rngList[1],
                                rngList[3],
                                rngList[4],
                                id, sid, cnt);

                        break;

                    case FrameType.Method4:
                        frame =
                            Frame.GenerateFrame(
                                0,
                                FrameType.Method4,
                                cnt + InitialFrame,
                                rngList[0],
                                rngList[0],
                                rngList[1],
                                rngList[2],
                                rngList[4],
                                id, sid, cnt);

                        break;
                    }

                    //  Now we need to filter and decide if we are going
                    //  to add this to our collection for display to the
                    //  user.

                    if (frameCompare.Compare(frame))
                    {
                        frames.Add(frame); break;
                    }
                }
            }

            return(frames);
        }
示例#3
0
        private void buttonSeedGenerate_Click(object sender, EventArgs e)
        {
            if (!ParametersInputCheck())
            {
                return;
            }

            #region Initialize

            if (comboBoxNature.Text == "Any")
            {
                MessageBox.Show("Please select a specific list of natures.");
                return;
            }
            List <uint> natures =
                (from t in comboBoxNature.CheckBoxItems where t.Checked select(uint) ((Nature)t.ComboBoxItem).Number).
                ToList();

            var  profile     = (Profile)comboBoxProfiles.SelectedItem;
            uint mac_partial = (uint)profile.MAC_Address & 0xFFFFFF;

            uint minFrame = uint.Parse(maskedTextBoxCapMinOffset.Text);
            uint maxFrame = uint.Parse(maskedTextBoxCapMaxOffset.Text);

            uint groupSize = uint.Parse(maskedTextBoxGroupSize.Text);

            uint seedCGear = uint.Parse(textBoxSeed.Text, NumberStyles.HexNumber);

            int generateYear = int.Parse(maskedTextBoxYear.Text);

            if (generateYear < 2000 || generateYear > 2099)
            {
                MessageBox.Show("Year must be a value between 2000 and 2099, inclusive.");
                return;
            }

            uint frameCGear = uint.Parse(maskedTextBoxCGearFrame.Text);
            //generate the CGear Seed Times
            uint ab   = seedCGear - mac_partial >> 24;
            uint cd   = (seedCGear - mac_partial & 0x00FF0000) >> 16;
            uint efgh = seedCGear - mac_partial & 0x0000FFFF;

            //  Get Delay
            uint delay = efgh + (uint)(2000 - generateYear);

            //  Get Calibration
            uint calibration = uint.Parse(maskedTextBoxDelayCalibration.Text);

            //  Store the Calibrated Delay and offset
            uint calibratedDelay = delay + calibration;

            long offset = -calibratedDelay / 60;

            //  Get Hour
            var hour = (int)cd;

            //  We need to check here, as a user could have entered a seed
            //  that is not possible (invalid hour) to lets warn and exit
            //  on it.
            if (hour > 23)
            {
                MessageBox.Show("This seed is invalid, please verify that you have entered it correctly and try again.",
                                "Invalid Seed", MessageBoxButtons.OK);

                return;
            }

            maskedTextBoxDelay.Text = delay.ToString(CultureInfo.InvariantCulture);

            List <List <ButtonComboType> > keypresses = GetKeypresses();

            iframes = new List <IFrameCapture>();
            var generator = new FrameGenerator
            {
                InitialSeed  = seedCGear,
                FrameType    = FrameType.Method5CGear,
                InitialFrame = frameCGear,
                MaxResults   = 1
            };

            GenderFilter genderFilter = checkBoxGenderless.Checked
                                            ? new GenderFilter("Genderless", 0xFF, GenderCriteria.DontCareGenderless)
                                            : new GenderFilter("Gendered", 0, GenderCriteria.DontCareGenderless);

            var possibleDates = new List <DateTime>();
            //  Loop through all months
            for (int month = 1; month <= 12; month++)
            {
                int daysInMonth = DateTime.DaysInMonth(generateYear, month);

                //  Loop through all days
                for (int day = 1; day <= daysInMonth; day++)
                {
                    //  Loop through all minutes
                    for (int minute = 0; minute <= 59; minute++)
                    {
                        //  Loop through all seconds
                        for (int second = 0; second <= 59; second++)
                        {
                            if (ab != ((month * day + minute + second) % 0x100))
                            {
                                continue;
                            }
                            var dateTime = new DateTime(generateYear, month, day, hour, minute, second);

                            // Standard seed time will be the C-Gear seed time, minus the delay
                            // We'll skip seeds that cross over into the next day and cause unwanted advances
                            // Added calibration to the delay to account for the fact that people aren't perfectly fast
                            DateTime possibleDate = dateTime.AddSeconds(offset);
                            if (dateTime.Day == possibleDate.Day)
                            {
                                possibleDates.Add(possibleDate);
                            }
                        }
                    }
                }
            }

            // Generate the IVs for the corresponding C-Gear seed first

            var rngIVs = new uint[6];

            frameCompare = new FrameCompare(
                0, CompareType.None,
                0, CompareType.None,
                0, CompareType.None,
                0, CompareType.None,
                0, CompareType.None,
                0, CompareType.None,
                null,
                -1,
                false,
                false,
                false,
                null,
                new NoGenderFilter());

            List <Frame> IVs = generator.Generate(frameCompare, 0, 0);
            if (IVs.Count > 0)
            {
                rngIVs[0] = IVs[0].Hp;
                rngIVs[1] = IVs[0].Atk;
                rngIVs[2] = IVs[0].Def;
                rngIVs[3] = IVs[0].Spa;
                rngIVs[4] = IVs[0].Spd;
                rngIVs[5] = IVs[0].Spe;
            }

            // Now that each combo box item is a custom object containing the FrameType reference
            // We can simply retrieve the FrameType from the selected item
            generator.FrameType     = FrameType.Method5Natures;
            generator.EncounterType = EncounterType.Entralink;
            generator.RNGIVs        = rngIVs;

            generator.InitialFrame = minFrame;
            generator.MaxResults   = maxFrame - minFrame + 1;

            frameCompare = new FrameCompare(
                0, CompareType.None,
                0, CompareType.None,
                0, CompareType.None,
                0, CompareType.None,
                0, CompareType.None,
                0, CompareType.None,
                null,
                -1,
                false,
                false,
                false,
                null,
                new NoGenderFilter());

            frameCompare = new FrameCompare(
                0, CompareType.None,
                0, CompareType.None,
                0, CompareType.None,
                0, CompareType.None,
                0, CompareType.None,
                0, CompareType.None,
                natures,
                -1,
                false,
                false,
                false,
                null,
                genderFilter);

            #endregion

            waitHandle = new EventWaitHandle(true, EventResetMode.ManualReset);

            jobs = new Thread[cpus];
            //divide the possible times into even groups
            int split = possibleDates.Count / cpus;
            for (int i = 0; i < cpus; ++i)
            {
                List <DateTime> dates = i < cpus - 1
                                           ? possibleDates.GetRange(i * split, split)
                                           : possibleDates.GetRange(i * split, split + possibleDates.Count % cpus);
                //if the last i make sure we add the remainder as well
                // technically supposed to copy profile and send in a copy because now the threads are
                // using a reference to the same profile but that's fine because the profile isn't getting
                // mutated anyway
                jobs[i] =
                    new Thread(
                        () =>
                        Generate(generator.Clone(), dates, minFrame, maxFrame,
                                 profile, groupSize, calibratedDelay));
                jobs[i].Start();
            }

            listBindingCap = new BindingSource {
                DataSource = iframes
            };
            dataGridViewCapValues.DataSource = listBindingCap;


            progressTotal =
                (ulong)
                (maxFrame - minFrame + 1) * (profile.Timer0Max - profile.Timer0Min + 1) * (ulong)keypresses.Count *
                (ulong)possibleDates.Count;
            var progressJob =
                new Thread(() => ManageProgress(listBindingCap, dataGridViewCapValues, generator.FrameType, 0));
            progressJob.Start();
            progressJob.Priority = ThreadPriority.Lowest;

            buttonSeedGenerate.Enabled = false;
        }
示例#4
0
        private void Generate()
        {
            var  profile  = (Profile)comboBoxProfiles.SelectedItem;
            uint minFrame = uint.Parse(maskedTextBoxCapMinOffset.Text);
            uint maxFrame = uint.Parse(maskedTextBoxCapMaxOffset.Text);

            DateTime seedTime = datePicker.Value;

            iframes = new List <IFrameCapture>();

            generator = new FrameGenerator
            {
                FrameType     = (FrameType)((ComboBoxItem)comboBoxMethod.SelectedItem).Reference,
                EncounterType =
                    (EncounterType)((ComboBoxItem)comboBoxEncounterType.SelectedItem).Reference,
                EncounterMod = (EncounterMod)((ComboBoxItem)comboBoxLead.SelectedItem).Reference,
                SynchNature  = -2,
                InitialFrame = minFrame + (profile.IsBW2() ? 2u : 0),
                MaxResults   = maxFrame - minFrame + 1
            };

            // Now that each combo box item is a custom object containing the FrameType reference
            // We can simply retrieve the FrameType from the selected item


            frameCompare = new FrameCompare(
                0, CompareType.None,
                0, CompareType.None,
                0, CompareType.None,
                0, CompareType.None,
                0, CompareType.None,
                0, CompareType.None,
                null,
                -1,
                false,
                false,
                false,
                null,
                new NoGenderFilter());

            switch (generator.FrameType)
            {
            case FrameType.Method5Standard:
                CapSeed.DefaultCellStyle.Format = "X16";
                EncounterSlot.Visible           = false;
                PID.Visible     = false;
                Shiny.Visible   = false;
                Nature.Visible  = false;
                Ability.Visible = false;
                CapHP.Visible   = true;
                CapAtk.Visible  = true;
                CapDef.Visible  = true;
                CapSpA.Visible  = true;
                CapSpD.Visible  = true;
                CapSpe.Visible  = true;
                f25.Visible     = false;
                f50.Visible     = false;
                f75.Visible     = false;
                f125.Visible    = false;
                break;

            case FrameType.Method5Natures:

                CapSeed.DefaultCellStyle.Format = "X16";
                if (generator.EncounterType != EncounterType.Stationary &&
                    generator.EncounterType != EncounterType.Gift &&
                    generator.EncounterType != EncounterType.Roamer &&
                    generator.EncounterType != EncounterType.LarvestaEgg)
                {
                    EncounterSlot.Visible = true;
                }
                else
                {
                    EncounterSlot.Visible = false;
                }
                PID.Visible     = true;
                Shiny.Visible   = true;
                Nature.Visible  = true;
                Ability.Visible = true;
                CapHP.Visible   = false;
                CapAtk.Visible  = false;
                CapDef.Visible  = false;
                CapSpA.Visible  = false;
                CapSpD.Visible  = false;
                CapSpe.Visible  = false;
                f25.Visible     = true;
                f50.Visible     = true;
                f75.Visible     = true;
                f125.Visible    = true;
                break;

            case FrameType.BWBred:
                generator.FrameType    = FrameType.Method5Standard;
                generator.InitialFrame = 14;
                generator.MaxResults   = 7;

                CapSeed.DefaultCellStyle.Format = "X16";
                EncounterSlot.Visible           = false;
                PID.Visible     = false;
                Shiny.Visible   = false;
                Nature.Visible  = false;
                Ability.Visible = false;
                CapHP.Visible   = true;
                CapAtk.Visible  = true;
                CapDef.Visible  = true;
                CapSpA.Visible  = true;
                CapSpD.Visible  = true;
                CapSpe.Visible  = true;
                f25.Visible     = false;
                f50.Visible     = false;
                f75.Visible     = false;
                f125.Visible    = false;
                break;

            case FrameType.Wondercard5thGen:
            case FrameType.Wondercard5thGenFixed:
                CapSeed.DefaultCellStyle.Format = "X16";
                EncounterSlot.Visible           = false;
                PID.Visible     = false;
                Shiny.Visible   = false;
                Nature.Visible  = true;
                Ability.Visible = false;
                CapHP.Visible   = true;
                CapAtk.Visible  = true;
                CapDef.Visible  = true;
                CapSpA.Visible  = true;
                CapSpD.Visible  = true;
                CapSpe.Visible  = true;
                f25.Visible     = false;
                f50.Visible     = false;
                f75.Visible     = false;
                f125.Visible    = false;
                break;
            }

            for (int seconds = (int)numericUpDownSeconds.Value * -1; seconds <= numericUpDownSeconds.Value; seconds++)
            {
                for (uint timer0 = profile.Timer0Min - 1; timer0 <= profile.Timer0Max + 1; timer0++)
                {
                    ulong seed = Functions.EncryptSeed(seedTime.AddSeconds(seconds), profile.MAC_Address,
                                                       profile.Version, profile.Language,
                                                       profile.DSType, profile.SoftReset, profile.VCount, timer0,
                                                       profile.GxStat,
                                                       profile.VFrame, buttonValue());

                    if (seconds == 0 && timer0 == profile.Timer0Min)
                    {
                        seedMatch = seed;
                    }

                    switch (generator.FrameType)
                    {
                    case FrameType.Method5Standard:
                        generator.InitialSeed = seed >> 32;
                        break;

                    case FrameType.Method5Natures:
                    case FrameType.Wondercard5thGen:
                    case FrameType.Wondercard5thGenFixed:
                        generator.InitialSeed  = seed;
                        generator.InitialFrame = Functions.initialPIDRNG(seed, profile) + minFrame;
                        break;
                    }

                    List <Frame> frames = generator.Generate(frameCompare, profile.ID, profile.SID);

                    foreach (Frame frame in frames)
                    {
                        var iframe = new IFrameCapture();

                        frame.DisplayPrep();
                        iframe.Offset = frame.Number;
                        iframe.Seed   = seed;
                        iframe.Frame  = frame;

                        iframe.TimeDate = seedTime.AddSeconds(seconds);
                        iframe.Timer0   = timer0;

                        iframes.Add(iframe);
                    }
                }
            }

            listBindingCap = new BindingSource {
                DataSource = iframes
            };
            dataGridViewCapValues.DataSource = listBindingCap;


            foreach (DataGridViewRow row in dataGridViewCapValues.Rows)
            {
                if ((ulong)row.Cells[0].Value == seedMatch)
                {
                    dataGridViewCapValues.CurrentCell = row.Cells[0];
                    dataGridViewCapValues.FirstDisplayedScrollingRowIndex = row.Index;
                    break;
                }
            }

            dataGridViewCapValues.Focus();
        }