private void generateAdjacentToolStripMenuItem_Click(object sender, EventArgs e) { var initialiframe = (IFrameBreeding) dataGridViewEggIVValues.SelectedRows[0].DataBoundItem; // We need to display a dialog that is going to let the user // decide which adjacent spreads that we want to show here. var adjacent = new PlatinumTimeAdjacent(initialiframe.Seed, initialiframe.Offset, DateTime.Now.Year); if (adjacent.ShowDialog() == DialogResult.OK) { // Instantiate our Generator and a dummy frame compare record // one time here so we can re-use it for all of our later work var adjacentGenerator = new FrameGenerator(); var parentA = new uint[6]; var parentB = new uint[6]; uint.TryParse(maskedTextBoxHPA.Text, out parentA[0]); uint.TryParse(maskedTextBoxAtkA.Text, out parentA[1]); uint.TryParse(maskedTextBoxDefA.Text, out parentA[2]); uint.TryParse(maskedTextBoxSpAA.Text, out parentA[3]); uint.TryParse(maskedTextBoxSpDA.Text, out parentA[4]); uint.TryParse(maskedTextBoxSpeA.Text, out parentA[5]); uint.TryParse(maskedTextBoxHPB.Text, out parentB[0]); uint.TryParse(maskedTextBoxAtkB.Text, out parentB[1]); uint.TryParse(maskedTextBoxDefB.Text, out parentB[2]); uint.TryParse(maskedTextBoxSpAB.Text, out parentB[3]); uint.TryParse(maskedTextBoxSpDB.Text, out parentB[4]); uint.TryParse(maskedTextBoxSpeB.Text, out parentB[5]); adjacentGenerator.ParentA = parentA; adjacentGenerator.ParentB = parentB; var adjacentFrameCompare = 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()); var adjacentFrames = new List<IFrameBreeding>(); int matchCount = 0; // Now we need to get the values back from this and run a special generation // with just these variables. We want it to be sorted by date (with delay) // and for items to be put in offset order. foreach (DateTime adjacentTime in adjacent.AdjacentTimeList) { for (uint rdelay = adjacent.ReturnMinDelay; rdelay <= adjacent.ReturnMaxDelay; rdelay++) { // Get the information (year, month, date from the frame) and build // our initial seed to feed to the Frame Generator so that we can uint seed = ((((uint) adjacentTime.Month* (uint) adjacentTime.Day + (uint) adjacentTime.Minute + (uint) adjacentTime.Second)%0x100) << 24) + ((uint) adjacentTime.Hour << 16) + ((uint) adjacentTime.Year - 2000 + rdelay); // Call a generator with a dummy compare object and go // up to the max delay and after this iterate through // the results to include min-max in a new list of frames // to show on the grid. adjacentGenerator.InitialFrame = adjacent.ReturnMinOffset; adjacentGenerator.MaxResults = adjacent.ReturnMaxOffset - adjacent.ReturnMinOffset + 1; adjacentGenerator.InitialSeed = seed; adjacentGenerator.FrameType = initialiframe.FrameType; List<Frame> frames = adjacentGenerator.Generate(adjacentFrameCompare, 0, 0); foreach (Frame frame in frames) { // Create our PlatinumIFrame and then add this to the // master collection that we are going to display to // the user. var iframe = new IFrameBreeding { Seed = seed, Offset = frame.Number, Delay = rdelay, Hp = frame.DisplayHpAlt, Atk = frame.DisplayAtkAlt, Def = frame.DisplayDefAlt, Spa = frame.DisplaySpaAlt, Spd = frame.DisplaySpdAlt, Spe = frame.DisplaySpeAlt, DisplayHpInh = frame.DisplayHp, DisplayAtkInh = frame.DisplayAtk, DisplayDefInh = frame.DisplayDef, DisplaySpaInh = frame.DisplaySpa, DisplaySpdInh = frame.DisplaySpd, DisplaySpeInh = frame.DisplaySpe, SeedTime = adjacentTime, FrameType = adjacentGenerator.FrameType }; if (initialiframe.Seed == iframe.Seed) { if (targetFrameIndex != 0) { if (initialiframe.Offset == iframe.Offset) targetFrameIndex = matchCount; } else targetFrameIndex = matchCount; } adjacentFrames.Add(iframe); matchCount++; } } } Date.Visible = true; dataGridViewEggIVValues.DataSource = adjacentFrames; returnToResultsToolStripMenuItem.Visible = true; // Select the row of the initial frame that was // selected when the adjacent command was run dataGridViewEggIVValues.FirstDisplayedScrollingRowIndex = targetFrameIndex; dataGridViewEggIVValues.Rows[targetFrameIndex].Selected = true; } }
private void buttonGenerateXD_Click(object sender, EventArgs e) { if (maskedTextBoxMinHP.Text == "") { maskedTextBoxMinHP.Focus(); maskedTextBoxMinHP.SelectAll(); return; } if (maskedTextBoxMinAtk.Text == "") { maskedTextBoxMinAtk.Focus(); maskedTextBoxMinAtk.SelectAll(); return; } if (maskedTextBoxMinDef.Text == "") { maskedTextBoxMinDef.Focus(); maskedTextBoxMinDef.SelectAll(); return; } if (maskedTextBoxMinSpA.Text == "") { maskedTextBoxMinSpA.Focus(); maskedTextBoxMinSpA.SelectAll(); return; } if (maskedTextBoxMinSpD.Text == "") { maskedTextBoxMinSpD.Focus(); maskedTextBoxMinSpD.SelectAll(); return; } if (maskedTextBoxMinSpe.Text == "") { maskedTextBoxMinSpe.Focus(); maskedTextBoxMinSpe.SelectAll(); return; } if (maskedTextBoxMaxHP.Text == "") { maskedTextBoxMaxHP.Focus(); maskedTextBoxMaxHP.SelectAll(); return; } if (maskedTextBoxMaxAtk.Text == "") { maskedTextBoxMaxAtk.Focus(); maskedTextBoxMaxAtk.SelectAll(); return; } if (maskedTextBoxMaxDef.Text == "") { maskedTextBoxMaxDef.Focus(); maskedTextBoxMaxDef.SelectAll(); return; } if (maskedTextBoxMaxSpA.Text == "") { maskedTextBoxMaxSpA.Focus(); maskedTextBoxMaxSpA.SelectAll(); return; } if (maskedTextBoxMaxSpD.Text == "") { maskedTextBoxMaxSpD.Focus(); maskedTextBoxMaxSpD.SelectAll(); return; } if (maskedTextBoxMaxSpe.Text == "") { maskedTextBoxMaxSpe.Focus(); maskedTextBoxMaxSpe.SelectAll(); return; } uint minhp = uint.Parse(maskedTextBoxMinHP.Text); uint minatk = uint.Parse(maskedTextBoxMinAtk.Text); uint mindef = uint.Parse(maskedTextBoxMinDef.Text); uint minspa = uint.Parse(maskedTextBoxMinSpA.Text); uint minspd = uint.Parse(maskedTextBoxMinSpD.Text); uint minspe = uint.Parse(maskedTextBoxMinSpe.Text); uint maxhp = uint.Parse(maskedTextBoxMaxHP.Text); uint maxatk = uint.Parse(maskedTextBoxMaxAtk.Text); uint maxdef = uint.Parse(maskedTextBoxMaxDef.Text); uint maxspa = uint.Parse(maskedTextBoxMaxSpA.Text); uint maxspd = uint.Parse(maskedTextBoxMaxSpD.Text); uint maxspe = uint.Parse(maskedTextBoxMaxSpe.Text); var nature = (uint) comboBoxNatureXD.SelectedIndex; var XDGenerator = new FrameGenerator(); List<Frame> frames = XDGenerator.Generate(minhp, maxhp, minatk, maxatk, mindef, maxdef, minspa, maxspa, minspd, maxspd, minspe, maxspe, nature); var iframes = new List<IFrameCaptureXD>(); foreach (Frame frame in frames) { var iframe = new IFrameCaptureXD {Frame = frame}; // We're calibrating only with shadow Pokémon that are generated first in the party. // There are 375451 frames between the initial seed generation and Pokémon generation, // so we need to reverse the RNG that many frames var reverseRNG = new XdRngR(frame.Seed); for (int i = 0; i < 375450; i++) { reverseRNG.GetNext32BitNumber(); } iframe.Seed = reverseRNG.GetNext32BitNumber(); //iframe.Seed = frame.Seed; iframes.Add(iframe); } dataGridViewXDCalibration.DataSource = iframes; }
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(); }
private void Generate() { // We want to force an early garbage collection // Because the frame lists get very big, very fast if (frames != null) { frames.Clear(); frames = null; } // Nuke the target frame when we generate a new list. This may // end up being controversial need to be revisted, but we can // do this at a later time after we get a complaint. :) SetTargetFrame(-1); // = 0; // Set up generator settings var generator = new FrameGenerator { FrameType = (FrameType) ((ComboBoxItem) comboBoxMethod.SelectedItem).Reference, EncounterMod = currentMod }; var offset = (uint) (checkBoxBW2.Visible && checkBoxBW2.Checked && generator.FrameType != FrameType.Method5Natures && generator.FrameType != FrameType.BWBred && generator.FrameType != FrameType.BWBredInternational ? 2 : 0); if (generator.FrameType == FrameType.BWBred && checkBoxBW2.Checked) generator.FrameType = FrameType.BW2Bred; if (generator.FrameType == FrameType.BWBredInternational && checkBoxBW2.Checked) generator.FrameType = FrameType.BW2BredInternational; if (currentMod == EncounterMod.Synchronize && comboBoxSynchNatures.SelectedIndex == 0) { generator.EncounterMod = EncounterMod.None; } if (currentMod == EncounterMod.CuteCharm) generator.SynchNature = (int) ((ComboBoxItem) comboBoxSynchNatures.SelectedItem).Reference; else generator.SynchNature = ((Nature) comboBoxSynchNatures.SelectedItem).Number; generator.EncounterType = EncounterTypeCalc.EncounterString(comboBoxEncounterType.Text); generator.DittoUsed = checkBoxDittoParent.Checked; generator.MaleOnlySpecies = cbNidoBeat.Checked; generator.ShinyCharm = cbShinyCharm.Checked; // this is for PIDRNG encounter slots generator.isBW2 = checkBoxBW2.Visible && checkBoxBW2.Checked; if (generator.EncounterType == EncounterType.SafariZone || generator.EncounterType == EncounterType.BugCatchingContest && !szWarned) { var warning = new WarningSZ(); warning.ShowDialog(); szWarned = true; } // Build up a FrameComparer List<int> encounterSlots = null; if (comboBoxEncounterSlot.Text != "Any" && comboBoxEncounterSlot.CheckBoxItems.Count > 0) { encounterSlots = new List<int>(); for (int i = 0; i < comboBoxEncounterSlot.CheckBoxItems.Count; i++) { if (comboBoxEncounterSlot.CheckBoxItems[i].Checked) // We have to subtract 1 because this custom control contains a hidden item for text display encounterSlots.Add(i - 1); } } List<uint> natures = null; if (comboBoxNature.Text != "Any" && comboBoxNature.CheckBoxItems.Count > 0) { natures = (from t in comboBoxNature.CheckBoxItems where t.Checked select (uint) ((Nature) t.ComboBoxItem).Number).ToList(); } generator.ParentA = parentA; generator.ParentB = parentB; generator.RNGIVs = rngIVs; FrameCompare frameCompare; // Create separate FrameCompares for methods that don't produce natures or IVs if (generator.FrameType == FrameType.Method5Standard || generator.FrameType == FrameType.Method5CGear || (generator.FrameType == FrameType.WondercardIVs && generator.EncounterType != EncounterType.Manaphy) || generator.FrameType == FrameType.Bred || generator.FrameType == FrameType.BredAlternate || generator.FrameType == FrameType.BredSplit || generator.FrameType == FrameType.RSBredUpper || generator.FrameType == FrameType.RSBredUpperAlt || generator.FrameType == FrameType.RSBredUpperSplit || generator.FrameType == FrameType.DPPtBred || generator.FrameType == FrameType.HGSSBred) { frameCompare = new FrameCompare( ivFilters.IVFilter, null, -1, false, false, false, null, new NoGenderFilter()); } else if (generator.FrameType == FrameType.Method5Natures) { frameCompare = new FrameCompare( 0, CompareType.None, 0, CompareType.None, 0, CompareType.None, 0, CompareType.None, 0, CompareType.None, 0, CompareType.None, natures, (int) ((ComboBoxItem) comboBoxAbility.SelectedItem).Reference, checkBoxShinyOnly.Checked, checkBoxSynchOnly.Checked, false, encounterSlots, (GenderFilter) (comboBoxGender.SelectedItem)); generator.RNGIVs = rngIVs; } else if (generator.FrameType == FrameType.Gen4Normal || generator.FrameType == FrameType.Gen4International) { frameCompare = new FrameCompare( 0, CompareType.None, 0, CompareType.None, 0, CompareType.None, 0, CompareType.None, 0, CompareType.None, 0, CompareType.None, natures, (int) ((ComboBoxItem) comboBoxAbility.SelectedItem).Reference, checkBoxShinyOnly.Checked, false, false, null, (GenderFilter) (comboBoxGender.SelectedItem)); } else if (generator.FrameType == FrameType.Method1 || generator.FrameType == FrameType.Method2 || generator.FrameType == FrameType.Method3 || generator.FrameType == FrameType.Method4 || generator.FrameType == FrameType.ChainedShiny || generator.FrameType == FrameType.ColoXD || generator.FrameType == FrameType.WondercardIVs) { frameCompare = new FrameCompare( ivFilters.IVFilter, natures, (int) ((ComboBoxItem) comboBoxAbility.SelectedItem).Reference, checkBoxShinyOnly.Checked, false, false, null, (GenderFilter) (comboBoxGender.SelectedItem)); } else if (generator.FrameType == FrameType.Wondercard5thGen || generator.FrameType == FrameType.Wondercard5thGenFixed) { frameCompare = new FrameCompare( ivFilters.IVFilter, natures, (int) ((ComboBoxItem) comboBoxAbility.SelectedItem).Reference, checkBoxShinyOnly.Checked, false, false, null, new NoGenderFilter()); } else if (generator.FrameType == FrameType.BWBred || generator.FrameType == FrameType.BWBredInternational || generator.FrameType == FrameType.BW2Bred || generator.FrameType == FrameType.BW2BredInternational) { if (parentA != null && parentB != null && rngIVs != null) { frameCompare = new FrameCompare( ivFilters.IVFilter, natures, (int) ((ComboBoxItem) comboBoxAbility.SelectedItem).Reference, checkBoxShinyOnly.Checked, checkBoxSynchOnly.Checked, checkBoxDreamWorld.Checked, null, (GenderFilter) (comboBoxGender.SelectedItem)); } else { frameCompare = new FrameCompare( 0, CompareType.None, 0, CompareType.None, 0, CompareType.None, 0, CompareType.None, 0, CompareType.None, 0, CompareType.None, natures, (int) ((ComboBoxItem) comboBoxAbility.SelectedItem).Reference, checkBoxShinyOnly.Checked, checkBoxSynchOnly.Checked, checkBoxDreamWorld.Checked, null, (GenderFilter) (comboBoxGender.SelectedItem)); } } else { frameCompare = new FrameCompare( ivFilters.IVFilter, natures, (int) ((ComboBoxItem) comboBoxAbility.SelectedItem).Reference, checkBoxShinyOnly.Checked, checkBoxSynchOnly.Checked, false, encounterSlots, (GenderFilter) (comboBoxGender.SelectedItem)); } ulong seed = 0; if (textBoxSeed.Text != "") { if ((generator.FrameType == FrameType.BWBred || generator.FrameType == FrameType.BWBredInternational || generator.FrameType == FrameType.BW2Bred || generator.FrameType == FrameType.BW2BredInternational || generator.FrameType == FrameType.Method5Natures) && textBoxSeed.Text.Length == 8) { MessageBox.Show("This method requires you to copy the Full Seed from the Time Finder window."); seed = ulong.Parse(textBoxSeed.Text, NumberStyles.HexNumber); } else if (generator.FrameType == FrameType.Method5Standard && textBoxSeed.Text.Length > 8) { seed = ulong.Parse(textBoxSeed.Text.Substring(0, textBoxSeed.Text.Length - 8), NumberStyles.HexNumber); } else { seed = ulong.Parse(textBoxSeed.Text, NumberStyles.HexNumber); } } generator.InitialSeed = seed; // Handle add seed finding activities labelFlipsForSeed.Text = CoinFlips.GetFlips((uint) seed, 10); // Handle all of the roaming Pokemon here uint rRoute = 0; uint eRoute = 0; uint lRoute = 0; // need to tryparse out all of the route values if (maskedTextBoxRRoute.Text != "") rRoute = uint.Parse(maskedTextBoxRRoute.Text); if (maskedTextBoxERoute.Text != "") eRoute = uint.Parse(maskedTextBoxERoute.Text); if (maskedTextBoxLRoute.Text != "") lRoute = uint.Parse(maskedTextBoxLRoute.Text); // We need to know two things, forced advancement and the // starting route of each of the roamers the user has // shown interest in -- HgSsRoamerInformation information = HgSsRoamers.GetHgSsRoamerInformation( (uint) seed, checkBoxRPresent.Checked, checkBoxEPresent.Checked, checkBoxLPresent.Checked, rRoute, eRoute, lRoute); // Build our roaming monster string //labelRoamerRoutes.Text = ""; string labelRoamerRoutesText = ""; bool firstDisplay = true; if (checkBoxRPresent.Checked) { labelRoamerRoutesText += "R: " + information.RCurrentRoute; firstDisplay = false; } if (checkBoxEPresent.Checked) { if (!firstDisplay) labelRoamerRoutesText += " "; labelRoamerRoutesText += "E: " + information.ECurrentRoute; firstDisplay = false; } if (checkBoxLPresent.Checked) { if (!firstDisplay) labelRoamerRoutesText += " "; labelRoamerRoutesText += "L: " + information.LCurrentRoute; firstDisplay = false; } if (!firstDisplay) { labelRoamerRoutesText += " --- "; labelRoamerRoutesText += "Frame(s) Advanced: " + information.RngCalls; } labelRoamerRoutes.Text = labelRoamerRoutesText; // Handle elm here, letting it know the foced advancement labelElmForSeed.Text = Responses.ElmResponses((uint) seed, 10, information.RngCalls); if (maskedTextBoxStartingFrame.Text != "") { ulong startingFrame; ulong.TryParse(maskedTextBoxStartingFrame.Text, out startingFrame); if (startingFrame > uint.MaxValue) startingFrame = uint.MaxValue - offset; generator.InitialFrame = (uint) startingFrame; generator.InitialFrame += offset; } if (maskedTextBoxMaxFrames.Text != "") { ulong maxFrames; ulong.TryParse(maskedTextBoxMaxFrames.Text, out maxFrames); if (maxFrames > uint.MaxValue) maxFrames = uint.MaxValue; generator.MaxResults = (uint) maxFrames; } // Figure out if we have something good to pass in // for the ID and Secret ID to do shiny calculations. ushort id; ushort sid; ushort.TryParse(maskedTextBoxID.Text, out id); ushort.TryParse(maskedTextBoxSID.Text, out sid); // This is where we actually go ahead and call our // generator for a list of IVs based on parameters // that have been passed in. frames = generator.Generate(frameCompare, id, sid); foreach (Frame frame in frames) { frame.DisplayPrep(); } Frame.DataPropertyName = generator.FrameType == FrameType.BredSplit ? "Name" : "Number"; HP.DataPropertyName = "DisplayHp"; Atk.DataPropertyName = "DisplayAtk"; Def.DataPropertyName = "DisplayDef"; SpA.DataPropertyName = "DisplaySpa"; SpD.DataPropertyName = "DisplaySpd"; Spe.DataPropertyName = "DisplaySpe"; Characteristic.Visible = false; PossibleShakingSpot.Visible = false; if (parentA != null && parentB != null && rngIVs != null) { if (generator.FrameType == FrameType.Bred || generator.FrameType == FrameType.BredSplit || generator.FrameType == FrameType.BredAlternate || generator.FrameType == FrameType.RSBredUpper || generator.FrameType == FrameType.RSBredUpperAlt || generator.FrameType == FrameType.RSBredUpperSplit || generator.FrameType == FrameType.DPPtBred || generator.FrameType == FrameType.HGSSBred) { foreach (Frame frame in frames) { frame.DisplayHpAlt = (frame.DisplayHp == "A" || frame.DisplayHp == "B") ? (frame.DisplayHp == "A" ? Functions.NullIV(parentA[0], "A") : Functions.NullIV(parentB[0], "B")) : frame.DisplayHp; frame.DisplayAtkAlt = (frame.DisplayAtk == "A" || frame.DisplayAtk == "B") ? (frame.DisplayAtk == "A" ? Functions.NullIV(parentA[1], "A") : Functions.NullIV(parentB[1], "B")) : frame.DisplayAtk; frame.DisplayDefAlt = (frame.DisplayDef == "A" || frame.DisplayDef == "B") ? (frame.DisplayDef == "A" ? Functions.NullIV(parentA[2], "A") : Functions.NullIV(parentB[2], "B")) : frame.DisplayDef; frame.DisplaySpaAlt = (frame.DisplaySpa == "A" || frame.DisplaySpa == "B") ? (frame.DisplaySpa == "A" ? Functions.NullIV(parentA[3], "A") : Functions.NullIV(parentB[3], "B")) : frame.DisplaySpa; frame.DisplaySpdAlt = (frame.DisplaySpd == "A" || frame.DisplaySpd == "B") ? (frame.DisplaySpd == "A" ? Functions.NullIV(parentA[4], "A") : Functions.NullIV(parentB[4], "B")) : frame.DisplaySpd; frame.DisplaySpeAlt = (frame.DisplaySpe == "A" || frame.DisplaySpe == "B") ? (frame.DisplaySpe == "A" ? Functions.NullIV(parentA[5], "A") : Functions.NullIV(parentB[5], "B")) : frame.DisplaySpe; } HP.DataPropertyName = "DisplayHpAlt"; Atk.DataPropertyName = "DisplayAtkAlt"; Def.DataPropertyName = "DisplayDefAlt"; SpA.DataPropertyName = "DisplaySpaAlt"; SpD.DataPropertyName = "DisplaySpdAlt"; Spe.DataPropertyName = "DisplaySpeAlt"; } if (generator.FrameType == FrameType.BWBred || generator.FrameType == FrameType.BWBredInternational || generator.FrameType == FrameType.BWBred || generator.FrameType == FrameType.BWBredInternational) { foreach (Frame frame in frames) { frame.DisplayHpAlt = string.IsNullOrEmpty(frame.DisplayHp) ? Functions.NullIV(rngIVs[0]) : (frame.DisplayHp == "Fe" ? Functions.NullIV(parentA[0], "Fe") : Functions.NullIV(parentB[0], "Ma")); frame.DisplayAtkAlt = string.IsNullOrEmpty(frame.DisplayAtk) ? Functions.NullIV(rngIVs[1]) : (frame.DisplayAtk == "Fe" ? Functions.NullIV(parentA[1], "Fe") : Functions.NullIV(parentB[1], "Ma")); frame.DisplayDefAlt = string.IsNullOrEmpty(frame.DisplayDef) ? Functions.NullIV(rngIVs[2]) : (frame.DisplayDef == "Fe" ? Functions.NullIV(parentA[2], "Fe") : Functions.NullIV(parentB[2], "Ma")); frame.DisplaySpaAlt = string.IsNullOrEmpty(frame.DisplaySpa) ? Functions.NullIV(rngIVs[3]) : (frame.DisplaySpa == "Fe" ? Functions.NullIV(parentA[3], "Fe") : Functions.NullIV(parentB[3], "Ma")); frame.DisplaySpdAlt = string.IsNullOrEmpty(frame.DisplaySpd) ? Functions.NullIV(rngIVs[4]) : (frame.DisplaySpd == "Fe" ? Functions.NullIV(parentA[4], "Fe") : Functions.NullIV(parentB[4], "Ma")); frame.DisplaySpeAlt = string.IsNullOrEmpty(frame.DisplaySpe) ? Functions.NullIV(rngIVs[5]) : (frame.DisplaySpe == "Fe" ? Functions.NullIV(parentA[5], "Fe") : Functions.NullIV(parentB[5], "Ma")); if (completeIVs) { var DisplayIVs = new[] { uint.Parse(frame.DisplayHpAlt), uint.Parse(frame.DisplayAtkAlt), uint.Parse(frame.DisplayDefAlt), uint.Parse(frame.DisplaySpeAlt), uint.Parse(frame.DisplaySpaAlt), uint.Parse(frame.DisplaySpdAlt) }; frame.CharacteristicIVs = DisplayIVs; } HP.DataPropertyName = "DisplayHpAlt"; Atk.DataPropertyName = "DisplayAtkAlt"; Def.DataPropertyName = "DisplayDefAlt"; SpA.DataPropertyName = "DisplaySpaAlt"; SpD.DataPropertyName = "DisplaySpdAlt"; Spe.DataPropertyName = "DisplaySpeAlt"; } Characteristic.Visible = completeIVs; } if (generator.FrameType == FrameType.Method5Natures && rngIVsOnly) { // make the characteristic IVs, we need to clone the array because the function moves them uint[] characteristicIVs = Functions.moveSpeFromBack(rngIVs); foreach (Frame frame in frames) { frame.CharacteristicIVs = characteristicIVs; } Characteristic.Visible = true; } } // Hide some columns based on output type if (generator.FrameType == FrameType.RSBredLower) { Frame.Visible = true; Offset.Visible = false; EncounterSlot.Visible = false; ItemCalc.Visible = false; PID.Visible = true; Time.Visible = true; Time.DataPropertyName = "Time"; Shiny.Visible = false; Nature.Visible = false; Ability.Visible = true; Dream.Visible = false; Coin.Visible = false; Elm.Visible = false; Chatot.Visible = false; CaveSpot.Visible = false; HP.Visible = false; Atk.Visible = false; Def.Visible = false; SpA.Visible = false; SpD.Visible = false; Spe.Visible = false; HiddenPower.Visible = false; HiddenPowerPower.Visible = false; f50.Visible = false; f125.Visible = false; f25.Visible = false; f75.Visible = false; PossibleShakingSpot.Visible = false; MaleOnlySpecies.Visible = false; } // Hide some columns based on output type if (generator.FrameType == FrameType.RSBredUpper || generator.FrameType == FrameType.RSBredUpperSplit) { Frame.Visible = true; Offset.Visible = false; EncounterSlot.Visible = false; ItemCalc.Visible = false; PID.Visible = true; Time.Visible = true; Time.DataPropertyName = "Time"; Shiny.Visible = true; Nature.Visible = true; Ability.Visible = true; Dream.Visible = false; Coin.Visible = false; Elm.Visible = false; Chatot.Visible = false; CaveSpot.Visible = false; HP.Visible = true; Atk.Visible = true; Def.Visible = true; SpA.Visible = true; SpD.Visible = true; Spe.Visible = true; HiddenPower.Visible = false; HiddenPowerPower.Visible = false; f50.Visible = true; f125.Visible = true; f25.Visible = true; f75.Visible = true; PossibleShakingSpot.Visible = false; MaleOnlySpecies.Visible = false; } // Hide some columns based on output type if (generator.FrameType == FrameType.Bred || generator.FrameType == FrameType.BredSplit || generator.FrameType == FrameType.BredAlternate || generator.FrameType == FrameType.RSBredUpper || generator.FrameType == FrameType.RSBredUpperAlt || generator.FrameType == FrameType.RSBredUpperSplit) { Frame.Visible = true; Offset.Visible = false; EncounterSlot.Visible = false; ItemCalc.Visible = false; PID.Visible = false; Time.Visible = true; Time.DataPropertyName = "Time"; Shiny.Visible = false; Nature.Visible = false; Ability.Visible = false; Dream.Visible = false; Coin.Visible = false; Elm.Visible = false; Chatot.Visible = false; CaveSpot.Visible = false; HP.Visible = true; Atk.Visible = true; Def.Visible = true; SpA.Visible = true; SpD.Visible = true; Spe.Visible = true; HiddenPower.Visible = false; HiddenPowerPower.Visible = false; f50.Visible = false; f125.Visible = false; f25.Visible = false; f75.Visible = false; PossibleShakingSpot.Visible = false; MaleOnlySpecies.Visible = false; } // Hide some columns based on output type if (generator.FrameType == FrameType.Method5Standard || generator.FrameType == FrameType.Method5CGear) { Frame.Visible = true; Offset.Visible = false; EncounterSlot.Visible = false; ItemCalc.Visible = false; PID.Visible = false; Time.Visible = false; Shiny.Visible = false; Nature.Visible = false; Ability.Visible = false; Dream.Visible = false; Coin.Visible = false; Elm.Visible = false; Chatot.Visible = false; CaveSpot.Visible = false; HP.Visible = true; Atk.Visible = true; Def.Visible = true; SpA.Visible = true; SpD.Visible = true; Spe.Visible = true; HiddenPower.Visible = true; HiddenPowerPower.Visible = true; f50.Visible = false; f125.Visible = false; f25.Visible = false; f75.Visible = false; PossibleShakingSpot.Visible = false; MaleOnlySpecies.Visible = false; } else if (generator.FrameType == FrameType.DPPtBred) { Frame.Visible = true; Offset.Visible = false; EncounterSlot.Visible = false; ItemCalc.Visible = false; PID.Visible = false; Time.Visible = false; Shiny.Visible = false; Nature.Visible = false; Ability.Visible = false; Dream.Visible = false; Coin.Visible = false; Elm.Visible = false; Chatot.Visible = true; Chatot.DataPropertyName = "Chatot"; CaveSpot.Visible = false; HP.Visible = true; Atk.Visible = true; Def.Visible = true; SpA.Visible = true; SpD.Visible = true; Spe.Visible = true; HiddenPower.Visible = false; HiddenPowerPower.Visible = false; f50.Visible = false; f125.Visible = false; f25.Visible = false; f75.Visible = false; PossibleShakingSpot.Visible = false; MaleOnlySpecies.Visible = false; } if (generator.FrameType == FrameType.Method5Natures) { Frame.Visible = true; Offset.Visible = false; if (generator.EncounterType != EncounterType.Stationary && generator.EncounterType != EncounterType.Gift && generator.EncounterType != EncounterType.Roamer && generator.EncounterType != EncounterType.LarvestaEgg && generator.EncounterType != EncounterType.Entralink && generator.EncounterType != EncounterType.HiddenGrotto) EncounterSlot.Visible = true; else EncounterSlot.Visible = false; ItemCalc.Visible = false; PID.Visible = true; if (generator.EncounterType == EncounterType.Entralink) { Time.Visible = true; Time.DataPropertyName = "EntralinkTime"; } else { Time.Visible = false; Time.DataPropertyName = "Time"; } Shiny.Visible = true; Nature.Visible = true; Ability.Visible = true; Dream.Visible = false; Coin.Visible = false; Elm.Visible = false; Chatot.Visible = true; Chatot.DataPropertyName = "Chatot64"; if (generator.EncounterType == EncounterType.WildCaveSpot || generator.EncounterType == EncounterType.WildWaterSpot || generator.EncounterType == EncounterType.WildShakerGrass) { CaveSpot.Visible = true; if (generator.EncounterType == EncounterType.WildCaveSpot) CaveSpot.HeaderText = "Cave Spot"; else if (generator.EncounterType == EncounterType.WildWaterSpot) CaveSpot.HeaderText = "Bubble Spot"; else CaveSpot.HeaderText = "Shaking Grass"; } else { CaveSpot.Visible = false; } HP.Visible = false; Atk.Visible = false; Def.Visible = false; SpA.Visible = false; SpD.Visible = false; Spe.Visible = false; HiddenPower.Visible = false; HiddenPowerPower.Visible = false; f50.Visible = true; f125.Visible = true; f25.Visible = true; f75.Visible = true; PossibleShakingSpot.Visible = false; MaleOnlySpecies.Visible = false; } // Hide some columns based on output type if (generator.FrameType == FrameType.HGSSBred) { Frame.Visible = true; Offset.Visible = false; EncounterSlot.Visible = false; ItemCalc.Visible = false; PID.Visible = false; Time.Visible = false; Shiny.Visible = false; Nature.Visible = false; Ability.Visible = false; Dream.Visible = false; Coin.Visible = false; Elm.Visible = true; Chatot.Visible = true; Chatot.DataPropertyName = "Chatot"; CaveSpot.Visible = false; HP.Visible = true; Atk.Visible = true; Def.Visible = true; SpA.Visible = true; SpD.Visible = true; Spe.Visible = true; HiddenPower.Visible = false; HiddenPowerPower.Visible = false; f50.Visible = false; f125.Visible = false; f25.Visible = false; f75.Visible = false; PossibleShakingSpot.Visible = false; MaleOnlySpecies.Visible = false; } // Hide some columns based on output type if (generator.FrameType == FrameType.WondercardIVs) { if (generator.EncounterType == EncounterType.Manaphy) { PID.Visible = true; Nature.Visible = true; } else { PID.Visible = false; Nature.Visible = false; } Frame.Visible = true; Offset.Visible = false; EncounterSlot.Visible = false; ItemCalc.Visible = false; Time.Visible = false; Shiny.Visible = false; Ability.Visible = false; Dream.Visible = false; Coin.Visible = false; Elm.Visible = true; Chatot.Visible = true; Chatot.DataPropertyName = "Chatot"; CaveSpot.Visible = false; HP.Visible = true; Atk.Visible = true; Def.Visible = true; SpA.Visible = true; SpD.Visible = true; Spe.Visible = true; HiddenPower.Visible = true; HiddenPowerPower.Visible = true; f50.Visible = false; f125.Visible = false; f25.Visible = false; f75.Visible = false; PossibleShakingSpot.Visible = false; MaleOnlySpecies.Visible = false; } if (generator.FrameType == FrameType.Gen4Normal || generator.FrameType == FrameType.Gen4International) { // Hide IV columns Frame.Visible = true; Offset.Visible = false; EncounterSlot.Visible = false; ItemCalc.Visible = false; PID.Visible = true; Time.Visible = false; Shiny.Visible = true; Nature.Visible = true; Ability.Visible = true; Dream.Visible = false; Coin.Visible = true; Elm.Visible = false; Chatot.Visible = false; CaveSpot.Visible = false; HP.Visible = false; Atk.Visible = false; Def.Visible = false; SpA.Visible = false; SpD.Visible = false; Spe.Visible = false; HiddenPower.Visible = false; HiddenPowerPower.Visible = false; f50.Visible = true; f125.Visible = true; f25.Visible = true; f75.Visible = true; PossibleShakingSpot.Visible = false; MaleOnlySpecies.Visible = false; } if (generator.FrameType == FrameType.Method1) { // Show ALL columns Frame.Visible = true; Offset.Visible = false; EncounterSlot.Visible = false; ItemCalc.Visible = false; PID.Visible = true; Time.Visible = true; Time.DataPropertyName = "Time"; Shiny.Visible = true; Nature.Visible = true; Ability.Visible = true; Dream.Visible = false; Coin.Visible = false; Elm.Visible = true; Chatot.Visible = true; Chatot.DataPropertyName = "Chatot"; CaveSpot.Visible = false; HP.Visible = true; Atk.Visible = true; Def.Visible = true; SpA.Visible = true; SpD.Visible = true; Spe.Visible = true; HiddenPower.Visible = true; HiddenPowerPower.Visible = true; f50.Visible = true; f125.Visible = true; f25.Visible = true; f75.Visible = true; PossibleShakingSpot.Visible = false; MaleOnlySpecies.Visible = false; } if (generator.FrameType == FrameType.Method2 || generator.FrameType == FrameType.Method3 || generator.FrameType == FrameType.Method4 || generator.FrameType == FrameType.ColoXD) { // Show ALL columns Frame.Visible = true; Offset.Visible = false; EncounterSlot.Visible = false; ItemCalc.Visible = false; PID.Visible = true; if (generator.FrameType != FrameType.ColoXD) { Time.Visible = true; Time.DataPropertyName = "Time"; } else { Time.Visible = false; } Shiny.Visible = true; Nature.Visible = true; Ability.Visible = true; Dream.Visible = false; Coin.Visible = false; Elm.Visible = false; Chatot.Visible = false; CaveSpot.Visible = false; HP.Visible = true; Atk.Visible = true; Def.Visible = true; SpA.Visible = true; SpD.Visible = true; Spe.Visible = true; HiddenPower.Visible = true; HiddenPowerPower.Visible = true; f50.Visible = true; f125.Visible = true; f25.Visible = true; f75.Visible = true; PossibleShakingSpot.Visible = false; MaleOnlySpecies.Visible = false; } if (generator.FrameType == FrameType.MethodJ || generator.FrameType == FrameType.ChainedShiny) { // Show ALL columns Frame.Visible = true; Offset.Visible = true; EncounterSlot.Visible = generator.EncounterType != EncounterType.Stationary; ItemCalc.Visible = false; PID.Visible = true; Time.Visible = false; Shiny.Visible = true; Nature.Visible = true; Ability.Visible = true; Dream.Visible = false; Coin.Visible = false; Elm.Visible = false; Chatot.Visible = true; Chatot.DataPropertyName = "Chatot"; CaveSpot.Visible = false; HP.Visible = true; Atk.Visible = true; Def.Visible = true; SpA.Visible = true; SpD.Visible = true; Spe.Visible = true; HiddenPower.Visible = true; HiddenPowerPower.Visible = true; f50.Visible = true; f125.Visible = true; f25.Visible = true; f75.Visible = true; PossibleShakingSpot.Visible = false; MaleOnlySpecies.Visible = false; if (generator.FrameType == FrameType.ChainedShiny) { Offset.Visible = false; EncounterSlot.Visible = false; } } if (generator.FrameType == FrameType.MethodK) { Frame.Visible = true; Offset.Visible = true; Elm.Visible = true; EncounterSlot.Visible = generator.EncounterType != EncounterType.Stationary; ItemCalc.Visible = false; PID.Visible = true; Time.Visible = false; Shiny.Visible = true; Nature.Visible = true; Ability.Visible = true; Dream.Visible = false; Coin.Visible = false; Chatot.Visible = true; Chatot.DataPropertyName = "Chatot"; CaveSpot.Visible = false; HP.Visible = true; Atk.Visible = true; Def.Visible = true; SpA.Visible = true; SpD.Visible = true; Spe.Visible = true; HiddenPower.Visible = true; HiddenPowerPower.Visible = true; f50.Visible = true; f125.Visible = true; f25.Visible = true; f75.Visible = true; PossibleShakingSpot.Visible = false; MaleOnlySpecies.Visible = false; } if (generator.FrameType == FrameType.MethodH1 || generator.FrameType == FrameType.MethodH2 || generator.FrameType == FrameType.MethodH4) { Frame.Visible = true; Offset.Visible = true; EncounterSlot.Visible = true; ItemCalc.Visible = false; PID.Visible = true; Time.Visible = true; Time.DataPropertyName = "Time"; Shiny.Visible = true; Nature.Visible = true; Ability.Visible = true; Dream.Visible = false; Coin.Visible = false; Elm.Visible = false; Chatot.Visible = false; CaveSpot.Visible = false; HP.Visible = true; Atk.Visible = true; Def.Visible = true; SpA.Visible = true; SpD.Visible = true; Spe.Visible = true; HiddenPower.Visible = true; HiddenPowerPower.Visible = true; f50.Visible = true; f125.Visible = true; f25.Visible = true; f75.Visible = true; PossibleShakingSpot.Visible = false; MaleOnlySpecies.Visible = false; } if (generator.FrameType == FrameType.Wondercard5thGen || generator.FrameType == FrameType.Wondercard5thGenFixed) { Frame.Visible = true; Offset.Visible = false; EncounterSlot.Visible = false; ItemCalc.Visible = false; PID.Visible = false; Time.Visible = false; Shiny.Visible = false; Nature.Visible = true; Ability.Visible = false; Dream.Visible = false; Coin.Visible = false; Elm.Visible = false; Chatot.Visible = true; Chatot.DataPropertyName = "Chatot64"; CaveSpot.Visible = false; HP.Visible = true; Atk.Visible = true; Def.Visible = true; SpA.Visible = true; SpD.Visible = true; Spe.Visible = true; HiddenPower.Visible = true; HiddenPowerPower.Visible = true; f50.Visible = true; f125.Visible = true; f25.Visible = true; f75.Visible = true; PossibleShakingSpot.Visible = false; MaleOnlySpecies.Visible = false; } if (generator.FrameType == FrameType.BWBred || generator.FrameType == FrameType.BWBredInternational || generator.FrameType == FrameType.BW2Bred || generator.FrameType == FrameType.BW2BredInternational) { // Show ALL columns Frame.Visible = true; Offset.Visible = false; EncounterSlot.Visible = false; ItemCalc.Visible = false; PID.Visible = true; Time.Visible = false; Shiny.Visible = true; Nature.Visible = true; Ability.Visible = true; Dream.Visible = true; Coin.Visible = false; Elm.Visible = false; Chatot.Visible = true; Chatot.DataPropertyName = "Chatot64"; CaveSpot.Visible = false; HP.Visible = true; Atk.Visible = true; Def.Visible = true; SpA.Visible = true; SpD.Visible = true; Spe.Visible = true; HiddenPower.Visible = false; HiddenPowerPower.Visible = false; f50.Visible = true; f125.Visible = true; f25.Visible = true; f75.Visible = true; PossibleShakingSpot.Visible = false; MaleOnlySpecies.Visible = true; } if (generator.FrameType == FrameType.BWBred || generator.FrameType == FrameType.BWBredInternational || generator.FrameType == FrameType.BW2Bred || generator.FrameType == FrameType.BW2BredInternational || generator.FrameType == FrameType.DPPtBred || generator.FrameType == FrameType.HGSSBred || generator.FrameType == FrameType.Bred || generator.FrameType == FrameType.BredSplit || generator.FrameType == FrameType.BredAlternate || generator.FrameType == FrameType.RSBredUpper || generator.FrameType == FrameType.RSBredUpperAlt || generator.FrameType == FrameType.RSBredUpperSplit || generator.FrameType == FrameType.Method5Natures) { displayParentsInSearchToolStripMenuItem.Enabled = true; if (generator.FrameType == FrameType.Method5Natures) { displayParentsInSearchToolStripMenuItem.Text = "Display Characteristics in Search..."; resetParentsToolStripMenuItem.Text = "Reset Characteristics"; } else { displayParentsInSearchToolStripMenuItem.Text = "Display Parents in Search..."; resetParentsToolStripMenuItem.Text = "Reset Parents"; } } else { displayParentsInSearchToolStripMenuItem.Enabled = false; } // update frame number for bw2 if (offset > 0) { foreach (Frame frame in frames) { frame.Number -= offset; } } // Bind our returned list of frames to the grid dataGridViewValues.DataSource = frames; }
private void Generate(FrameGenerator generator, IEnumerable<DateTime> possibleDates, uint minFrame, uint maxFrame, Profile profile, uint groupSize, uint calibratedDelay) { const uint incrementFound = 1; List<List<ButtonComboType>> keypresses = profile.GetKeypresses(); foreach (DateTime seedTime in possibleDates) { waitHandle.WaitOne(); foreach (var combo in keypresses) { for (uint timer0 = profile.Timer0Min; timer0 <= profile.Timer0Max; timer0++) { ulong seed = Functions.EncryptSeed(seedTime, profile, timer0, Functions.buttonMashed(combo)); generator.InitialSeed = seed; generator.InitialFrame = Functions.initialPIDRNG(seed, profile) + minFrame; generator.MaxResults = maxFrame - minFrame + 1; List<Frame> frames = generator.Generate(frameCompare, 0, 0); IFrameCapture previous = null; bool previouslyAdded = false; var frameGroup = new List<IFrameCapture>(); // quick check and if it's impossible that this is a match don't waste our time loop // breaks search progress so that needs to get fixed if (frames.Count < groupSize) continue; foreach (Frame frame in frames) { var iframe = new IFrameCapture { Offset = frame.Number, Seed = seed, Frame = frame, TimeDate = seedTime, Timer0 = timer0, Delay = calibratedDelay, KeyPresses = combo }; // Calibrated delay instead of the real delay for correct CGear Times if (previous != null && (iframe.Offset == previous.Offset + 1 || iframe.Offset == previous.Offset + 2)) { if (!previouslyAdded) frameGroup.Add(previous); frameGroup.Add(iframe); previouslyAdded = true; } else { if (frameGroup.Count >= groupSize) { lock (threadLock) { foreach (IFrameCapture t in frameGroup) t.Frame.Synchable = grey; iframes.AddRange(frameGroup); grey = !grey; } refreshQueue = true; progressFound += incrementFound; } frameGroup = new List<IFrameCapture>(); previouslyAdded = false; } previous = iframe; } progressSearched += (uint) frames.Count; if (frameGroup.Count >= groupSize) { lock (threadLock) { for (int i = 0; i < frameGroup.Count; ++i) frameGroup[i].Frame.Synchable = grey; iframes.AddRange(frameGroup); grey = !grey; } refreshQueue = true; progressFound += incrementFound; } } } } }
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; }