public List<Frame> Generate( FrameCompare frameCompare, uint id, uint sid) { frames = new List<Frame>(); // The first thing we need to do is check for // whether we are using the LCRNG or MTRNG if (frameType == FrameType.Gen4Normal || frameType == FrameType.Gen4International) { mt.Reseed((uint) InitialSeed); frame = null; for (uint cnt = 1; cnt < InitialFrame + maxResults; cnt++) { if (cnt < InitialFrame) { mt.Nextuint(); continue; } switch (frameType) { case FrameType.Gen4Normal: uint mtResult = mt.Nextuint(); frame = Frame.GenerateFrame( FrameType.Gen4Normal, cnt, mtResult, mtResult, id, sid); break; case FrameType.Gen4International: // We want to get our random number // first and then go through and check // to see if it is shiny. uint pid = mt.Nextuint(); for (int n = 0; n <= 3; n++) { uint tid = (id & 0xffff) | ((sid & 0xffff) << 16); uint a = pid ^ tid; uint b = a & 0xffff; uint c = (a >> 16) & 0xffff; uint d = b ^ c; if (d < 8) { break; } // ARNG pid = pid*0x6c078965 + 1; } frame = Frame.GenerateFrame( FrameType.Gen4International, cnt, pid, pid, id, sid); break; } if (frameCompare.Compare(frame)) { frames.Add(frame); } } } else if (frameType == FrameType.Method5Standard) { mt.Reseed((uint) InitialSeed); for (uint cnt = 1; cnt < InitialFrame; cnt++) { mt.Nextuint(); } for (int i = 0; i < (maxResults + 6); i++) { rngArray[i] = mt.Nextuint() >> 27; } for (uint cnt = 0; cnt < maxResults; cnt++) { if (EncounterType == EncounterType.Roamer) { if (!frameCompare.CompareIV(0, rngArray[cnt + 1])) continue; if (!frameCompare.CompareIV(1, rngArray[cnt + 2])) continue; if (!frameCompare.CompareIV(2, rngArray[cnt + 3])) continue; if (!frameCompare.CompareIV(3, rngArray[cnt + 6])) continue; if (!frameCompare.CompareIV(4, rngArray[cnt + 4])) continue; if (!frameCompare.CompareIV(5, rngArray[cnt + 5])) continue; frame = Frame.GenerateFrame( FrameType.Method5Standard, cnt + InitialFrame, (uint) InitialSeed, rngArray[cnt + 1], rngArray[cnt + 2], rngArray[cnt + 3], rngArray[cnt + 6], rngArray[cnt + 4], rngArray[cnt + 5]); } else { if (!frameCompare.CompareIV(0, rngArray[cnt])) continue; if (!frameCompare.CompareIV(1, rngArray[cnt + 1])) continue; if (!frameCompare.CompareIV(2, rngArray[cnt + 2])) continue; if (!frameCompare.CompareIV(3, rngArray[cnt + 3])) continue; if (!frameCompare.CompareIV(4, rngArray[cnt + 4])) continue; if (!frameCompare.CompareIV(5, rngArray[cnt + 5])) continue; frame = Frame.GenerateFrame( FrameType.Method5Standard, cnt + InitialFrame, (uint) InitialSeed, rngArray[cnt], rngArray[cnt + 1], rngArray[cnt + 2], rngArray[cnt + 3], rngArray[cnt + 4], rngArray[cnt + 5]); } frames.Add(frame); } } else if (frameType == FrameType.Method5CGear) { mt.Reseed((uint) InitialSeed); // first two frames are skipped mt.Nextuint(); mt.Nextuint(); for (uint cnt = 1; cnt < InitialFrame; cnt++) { mt.Nextuint(); } for (int i = 0; i < (maxResults + 8); i++) { rngArray[i] = mt.Nextuint() >> 27; } for (uint cnt = 0; cnt < maxResults; cnt++) { frame = null; if (EncounterType == EncounterType.Roamer) { if (!frameCompare.CompareIV(0, rngArray[cnt + 1])) continue; if (!frameCompare.CompareIV(1, rngArray[cnt + 2])) continue; if (!frameCompare.CompareIV(2, rngArray[cnt + 3])) continue; if (!frameCompare.CompareIV(3, rngArray[cnt + 6])) continue; if (!frameCompare.CompareIV(4, rngArray[cnt + 4])) continue; if (!frameCompare.CompareIV(5, rngArray[cnt + 5])) continue; frame = Frame.GenerateFrame( FrameType.Method5CGear, cnt + InitialFrame, (uint) InitialSeed, rngArray[cnt + 1], rngArray[cnt + 2], rngArray[cnt + 3], rngArray[cnt + 6], rngArray[cnt + 4], rngArray[cnt + 5]); } else { if (!frameCompare.CompareIV(0, rngArray[cnt])) continue; if (!frameCompare.CompareIV(1, rngArray[cnt + 1])) continue; if (!frameCompare.CompareIV(2, rngArray[cnt + 2])) continue; if (!frameCompare.CompareIV(3, rngArray[cnt + 3])) continue; if (!frameCompare.CompareIV(4, rngArray[cnt + 4])) continue; if (!frameCompare.CompareIV(5, rngArray[cnt + 5])) continue; frame = Frame.GenerateFrame( FrameType.Method5CGear, cnt + InitialFrame, (uint) InitialSeed, rngArray[cnt], rngArray[cnt + 1], rngArray[cnt + 2], rngArray[cnt + 3], rngArray[cnt + 4], rngArray[cnt + 5]); } frames.Add(frame); } } else if (frameType == FrameType.Method5Natures) { rng64.Seed = InitialSeed; int encounterSlot = 0; const uint item = 0; var mod = EncounterMod.None; uint idLower = (id & 1) ^ (sid & 1); for (uint cnt = 1; cnt < InitialFrame; cnt++) { rng64.GetNext64BitNumber(); } for (int cnt = 0; cnt < maxResults + 7; cnt++) { rngArray[cnt] = rng64.GetNext32BitNumber(); } var entreeTimer = new CGearTimer(); for (uint cnt = 0; cnt < maxResults; cnt++) { uint nature; uint pid; bool synchable; if (EncounterType == EncounterType.Gift || EncounterType == EncounterType.Roamer) { nature = (uint) (((ulong) rngArray[1 + cnt]*25) >> 32); synchable = false; pid = rngArray[0 + cnt]; if (EncounterType != EncounterType.Roamer) pid = pid ^ 0x10000; } else { uint idTest; if (EncounterType == EncounterType.Wild || EncounterType == EncounterType.WildSurfing || EncounterType == EncounterType.WildWaterSpot) { encounterSlot = EncounterSlotCalc.encounterSlot(rngArray[1 + cnt], frameType, EncounterType, isBW2); if (EncounterMod == EncounterMod.Synchronize) { synchable = (rngArray[0 + cnt] >> 31) == 1; if (synchable) nature = (uint) SynchNature; else nature = (uint) (((ulong) rngArray[4 + cnt]*25) >> 32); pid = rngArray[3 + cnt]; pid = pid ^ 0x10000; } else if (EncounterMod == EncounterMod.CuteCharm) { pid = rngArray[3 + cnt]; pid = pid ^ 0x10000; // not a synch, but the CC check -- need to relabel (unfinished) synchable = ((((ulong) rngArray[0 + cnt]*0xFFFF) >> 32)/656) < 67; // failed CC check if (!synchable) { // leave it as-is nature = (uint) (((ulong) rngArray[4 + cnt]*25) >> 32); } else { pid = Functions.GenderModPID(pid, rngArray[4 + cnt], SynchNature); nature = (uint) (((ulong) rngArray[5 + cnt]*25) >> 32); } synchable = false; } else if (EncounterMod == EncounterMod.Compoundeyes || EncounterMod == EncounterMod.SuctionCups) { synchable = false; encounterSlot = EncounterSlotCalc.encounterSlot(rngArray[0 + cnt], frameType, EncounterType); nature = (uint) (((ulong) rngArray[3 + cnt]*25) >> 32); pid = rngArray[2 + cnt]; pid = pid ^ 0x10000; } else if (EncounterMod == EncounterMod.Search) { pid = rngArray[3 + cnt]; pid = pid ^ 0x10000; // not a synch, but the CC check -- need to relabel (unfinished) synchable = ((((ulong) rngArray[0 + cnt]*0xFFFF) >> 32)/656) < 67; // passed CC check if (synchable) { // Add all the Cute Charm possibilities nature = (uint) (((ulong) rngArray[5 + cnt]*25) >> 32); for (int i = -4; i < 5; i++) { if (i == 0) continue; uint tempPid = Functions.GenderModPID(pid, rngArray[4 + cnt], i); idTest = (idLower ^ (tempPid & 1) ^ (tempPid >> 31)); if (idTest == 1) tempPid = (tempPid ^ 0x80000000); frame = Frame.GenerateFrame( FrameType.Method5Natures, EncounterType, cnt + InitialFrame, rngArray[0 + cnt], tempPid, id, sid, nature, false, encounterSlot, item); switch (i) { case 1: frame.EncounterMod = EncounterMod.CuteCharm50M; break; case 2: frame.EncounterMod = EncounterMod.CuteCharm75M; break; case 3: frame.EncounterMod = EncounterMod.CuteCharm25M; break; case 4: frame.EncounterMod = EncounterMod.CuteCharm875M; break; case -1: frame.EncounterMod = EncounterMod.CuteCharm50F; break; case -2: frame.EncounterMod = EncounterMod.CuteCharm75F; break; case -3: frame.EncounterMod = EncounterMod.CuteCharm25F; break; case -4: frame.EncounterMod = EncounterMod.CuteCharm125F; break; } if (frameCompare.Compare(frame)) { frames.Add(frame); } } } synchable = (rngArray[0 + cnt] >> 31) == 1; nature = (uint) (((ulong) rngArray[4 + cnt]*25) >> 32); if (synchable && !frameCompare.CompareNature(nature)) mod = EncounterMod.Synchronize; else mod = EncounterMod.None; } else { pid = rngArray[3 + cnt]; pid = pid ^ 0x10000; synchable = (rngArray[0 + cnt] >> 31) == 1; nature = (uint) (((ulong) rngArray[4 + cnt]*25) >> 32); } idTest = (idLower ^ (pid & 1) ^ (pid >> 31)); if (idTest == 1) pid = (pid ^ 0x80000000); } else if (EncounterType == EncounterType.WildCaveSpot) { if (((ulong) rngArray[0 + cnt]*1000 >> 32) < 400) { encounterSlot = EncounterSlotCalc.encounterSlot(rngArray[2 + cnt], frameType, EncounterType); } else { uint calc = ((ulong) rngArray[1 + cnt]*1000 >> 32) < 100 ? 1000u : 1700u; uint result = (uint) ((ulong) rngArray[2 + cnt]*calc >> 32)/100; if (calc == 1000) encounterSlot = (int) result + 13; else encounterSlot = (int) result + 23; } if (EncounterMod == EncounterMod.Synchronize) { synchable = (rngArray[1 + cnt] >> 31) == 1; if (synchable) nature = (uint) SynchNature; else nature = (uint) (((ulong) rngArray[5 + cnt]*25) >> 32); pid = rngArray[4 + cnt]; pid = pid ^ 0x10000; } else if (EncounterMod == EncounterMod.CuteCharm) { pid = rngArray[4 + cnt]; pid = pid ^ 0x10000; // not a synch, but the CC check -- need to relabel (unfinished) synchable = ((((ulong) rngArray[1 + cnt]*0xFFFF) >> 32)/656) < 67; // failed CC check if (!synchable) { // leave it as-is nature = (uint) (((ulong) rngArray[5 + cnt]*25) >> 32); } else { pid = Functions.GenderModPID(pid, rngArray[5 + cnt], SynchNature); nature = (uint) (((ulong) rngArray[6 + cnt]*25) >> 32); } synchable = false; } else if (EncounterMod == EncounterMod.Compoundeyes || EncounterMod == EncounterMod.SuctionCups) { synchable = false; encounterSlot = EncounterSlotCalc.encounterSlot(rngArray[1 + cnt], frameType, EncounterType); nature = (uint) (((ulong) rngArray[4 + cnt]*25) >> 32); pid = rngArray[3 + cnt]; pid = pid ^ 0x10000; } else if (EncounterMod == EncounterMod.Search) { // Check for item or battle if (((ulong) rngArray[0 + cnt]*1000 >> 32) < 400) { encounterSlot = EncounterSlotCalc.encounterSlot(rngArray[1 + cnt], frameType, EncounterType); } else continue; // Let's do Suction Cups since it affects the hittable frames pid = rngArray[3 + cnt]; pid = pid ^ 0x10000; nature = (uint) (((ulong) rngArray[4 + cnt]*25) >> 32); frame = Frame.GenerateFrame( FrameType.Method5Natures, EncounterType, cnt + InitialFrame, rngArray[0 + cnt], pid, id, sid, nature, false, encounterSlot, item); if (frameCompare.Compare(frame)) { frame.EncounterMod = EncounterMod.SuctionCups; frames.Add(frame); } // Now for regular\Synchronize\Cute Charm encounters pid = rngArray[4 + cnt]; pid = pid ^ 0x10000; // not a synch, but the CC check -- need to relabel (unfinished) synchable = ((((ulong) rngArray[1 + cnt]*0xFFFF) >> 32)/656) < 67; // passed CC check if (synchable) { // Add all the Cute Charm possibilities nature = (uint) (((ulong) rngArray[6 + cnt]*25) >> 32); for (int i = -4; i < 5; i++) { if (i == 0) continue; uint tempPid = Functions.GenderModPID(pid, rngArray[5 + cnt], i); idTest = (idLower ^ (tempPid & 1) ^ (tempPid >> 31)); if (idTest == 1) tempPid = (tempPid ^ 0x80000000); frame = Frame.GenerateFrame( FrameType.Method5Natures, EncounterType, cnt + InitialFrame, rngArray[0 + cnt], tempPid, id, sid, nature, false, encounterSlot, item); switch (i) { case 1: frame.EncounterMod = EncounterMod.CuteCharm50M; break; case 2: frame.EncounterMod = EncounterMod.CuteCharm75M; break; case 3: frame.EncounterMod = EncounterMod.CuteCharm25M; break; case 4: frame.EncounterMod = EncounterMod.CuteCharm875M; break; case -1: frame.EncounterMod = EncounterMod.CuteCharm50F; break; case -2: frame.EncounterMod = EncounterMod.CuteCharm75F; break; case -3: frame.EncounterMod = EncounterMod.CuteCharm25F; break; case -4: frame.EncounterMod = EncounterMod.CuteCharm125F; break; } if (frameCompare.Compare(frame)) { frames.Add(frame); } } } idTest = (idLower ^ (pid & 1) ^ (pid >> 31)); if (idTest == 1) pid = (pid ^ 0x80000000); synchable = (rngArray[1 + cnt] >> 31) == 1; nature = (uint) (((ulong) rngArray[5 + cnt]*25) >> 32); if (synchable && !frameCompare.CompareNature(nature)) mod = EncounterMod.Synchronize; else mod = EncounterMod.None; } else { pid = rngArray[4 + cnt]; pid = pid ^ 0x10000; synchable = (rngArray[1 + cnt] >> 31) == 1; nature = (uint) (((ulong) rngArray[5 + cnt]*25) >> 32); } idTest = (idLower ^ (pid & 1) ^ (pid >> 31)); if (idTest == 1) pid = (pid ^ 0x80000000); } else if (EncounterType == EncounterType.WildSwarm) { bool swarm = (((ulong) rngArray[1 + cnt]*0xFFFF/0x290) >> 32) < 40; if (swarm) // we'll use non-existent slot 12 to denote a swarm encounterSlot = 12; else encounterSlot = EncounterSlotCalc.encounterSlot(rngArray[2 + cnt], frameType, EncounterType); if (EncounterMod == EncounterMod.Synchronize) { synchable = (rngArray[0 + cnt] >> 31) == 1; if (synchable) nature = (uint) SynchNature; else nature = (uint) (((ulong) rngArray[5 + cnt]*25) >> 32); pid = rngArray[4 + cnt]; pid = pid ^ 0x10000; } else if (EncounterMod == EncounterMod.CuteCharm) { // not a synch, but the CC check -- need to relabel (unfinished) synchable = ((((ulong) rngArray[0 + cnt]*0xFFFF) >> 32)/656) < 67; pid = rngArray[4 + cnt]; pid = pid ^ 0x10000; // failed CC check if (!synchable) { // leave it as-is nature = (uint) (((ulong) rngArray[5 + cnt]*25) >> 32); } else { pid = Functions.GenderModPID(pid, rngArray[5 + cnt], SynchNature); nature = (uint) (((ulong) rngArray[6 + cnt]*25) >> 32); } synchable = false; } else if (EncounterMod == EncounterMod.Compoundeyes) { swarm = (((ulong) rngArray[0 + cnt]*0xFFFF/0x290) >> 32) < 40; if (swarm) // we'll use non-existent slot 12 to denote a swarm encounterSlot = 12; else encounterSlot = EncounterSlotCalc.encounterSlot(rngArray[1 + cnt], frameType, EncounterType); synchable = false; nature = (uint) (((ulong) rngArray[4 + cnt]*25) >> 32); pid = rngArray[3 + cnt]; pid = pid ^ 0x10000; } else if (EncounterMod == EncounterMod.Search) { pid = rngArray[4 + cnt]; pid = pid ^ 0x10000; // not a synch, but the CC check -- need to relabel (unfinished) // also never used synchable = ((((ulong) rngArray[0 + cnt]*0xFFFF) >> 32)/656) < 67; // Add all the Cute Charm possibilities nature = (uint) (((ulong) rngArray[6 + cnt]*25) >> 32); for (int i = -4; i < 5; i++) { if (i == 0) continue; uint tempPid = Functions.GenderModPID(pid, rngArray[5 + cnt], i); idTest = (idLower ^ (tempPid & 1) ^ (tempPid >> 31)); if (idTest == 1) tempPid = (tempPid ^ 0x80000000); frame = Frame.GenerateFrame( FrameType.Method5Natures, EncounterType, cnt + InitialFrame, rngArray[0 + cnt], tempPid, id, sid, nature, false, encounterSlot, item); switch (i) { case 1: frame.EncounterMod = EncounterMod.CuteCharm50M; break; case 2: frame.EncounterMod = EncounterMod.CuteCharm75M; break; case 3: frame.EncounterMod = EncounterMod.CuteCharm25M; break; case 4: frame.EncounterMod = EncounterMod.CuteCharm875M; break; case -1: frame.EncounterMod = EncounterMod.CuteCharm50F; break; case -2: frame.EncounterMod = EncounterMod.CuteCharm75F; break; case -3: frame.EncounterMod = EncounterMod.CuteCharm25F; break; case -4: frame.EncounterMod = EncounterMod.CuteCharm125F; break; } if (frameCompare.Compare(frame)) { frames.Add(frame); } } idTest = (idLower ^ (pid & 1) ^ (pid >> 31)); if (idTest == 1) pid = (pid ^ 0x80000000); synchable = (rngArray[0 + cnt] >> 31) == 1; nature = (uint) (((ulong) rngArray[5 + cnt]*25) >> 32); if (synchable && !frameCompare.CompareNature(nature)) mod = EncounterMod.Synchronize; else mod = EncounterMod.None; } else { synchable = (rngArray[0 + cnt] >> 31) == 1; nature = (uint) (((ulong) rngArray[5 + cnt]*25) >> 32); pid = rngArray[4 + cnt]; pid = pid ^ 0x10000; } idTest = (idLower ^ (pid & 1) ^ (pid >> 31)); if (idTest == 1) pid = (pid ^ 0x80000000); } else if (EncounterType == EncounterType.Stationary) { if (EncounterMod == EncounterMod.Synchronize) { synchable = (rngArray[0 + cnt] >> 31) == 1; if (synchable) nature = (uint) SynchNature; else nature = (uint) (((ulong) rngArray[2 + cnt]*25) >> 32); pid = rngArray[1 + cnt]; pid = pid ^ 0x10000; } else if (EncounterMod == EncounterMod.CuteCharm) { // not a synch, but the CC check -- need to relabel (unfinished) synchable = ((((ulong) rngArray[0 + cnt]*0xFFFF) >> 32)/656) < 67; pid = rngArray[1 + cnt]; pid = pid ^ 0x10000; // failed CC check if (!synchable) { // leave it as-is nature = (uint) (((ulong) rngArray[2 + cnt]*25) >> 32); } else { pid = Functions.GenderModPID(pid, rngArray[2 + cnt], SynchNature); nature = (uint) (((ulong) rngArray[3 + cnt]*25) >> 32); } synchable = false; } else if (EncounterMod == EncounterMod.Compoundeyes) { synchable = false; nature = (uint) (((ulong) rngArray[1 + cnt]*25) >> 32); pid = rngArray[0 + cnt]; pid = pid ^ 0x10000; } else if (EncounterMod == EncounterMod.Search) { pid = rngArray[1 + cnt]; pid = pid ^ 0x10000; // not a synch, but the CC check -- need to relabel (unfinished) synchable = ((((ulong) rngArray[0 + cnt]*0xFFFF) >> 32)/656) < 67; // CC check if (synchable) { // Add only 50% Cute Charm possibilities because the only applicable // stationaries have a 50\50 male-female ratio. nature = (uint) (((ulong) rngArray[3 + cnt]*25) >> 32); for (int i = -1; i < 2; i++) { if (i == 0) continue; uint tempPid = Functions.GenderModPID(pid, rngArray[2 + cnt], i); idTest = (idLower ^ (tempPid & 1) ^ (tempPid >> 31)); if (idTest == 1) tempPid = (tempPid ^ 0x80000000); frame = Frame.GenerateFrame( FrameType.Method5Natures, EncounterType, cnt + InitialFrame, rngArray[0 + cnt], tempPid, id, sid, nature, false, encounterSlot, item); switch (i) { case 1: frame.EncounterMod = EncounterMod.CuteCharm50M; break; case -1: frame.EncounterMod = EncounterMod.CuteCharm50F; break; } if (frameCompare.Compare(frame)) { frames.Add(frame); } } } synchable = (rngArray[0 + cnt] >> 31) == 1; nature = (uint) (((ulong) rngArray[2 + cnt]*25) >> 32); if (synchable && !frameCompare.CompareNature(nature)) mod = EncounterMod.Synchronize; else mod = EncounterMod.None; } else { synchable = (rngArray[0 + cnt] >> 31) == 1; nature = (uint) (((ulong) rngArray[2 + cnt]*25) >> 32); pid = rngArray[1 + cnt]; pid = pid ^ 0x10000; } idTest = (idLower ^ (pid & 1) ^ (pid >> 31)); if (idTest == 1) pid = (pid ^ 0x80000000); } else if (EncounterType == EncounterType.AllEncounterShiny) { // used for Time Finder searches only pid = rngArray[3 + cnt]; pid = pid ^ 0x10000; nature = (uint) (((ulong) rngArray[4 + cnt]*25) >> 32); synchable = ((rngArray[0 + cnt] >> 31) == 1) && ((rngArray[2 + cnt] >> 31) == 1); idTest = (idLower ^ (pid & 1) ^ (pid >> 31)); if (idTest == 1) { // not the actual PID, but guaranteed to be non-shiny so it won't show up in search results pid = id << 16 | sid ^ 0x100; } } else if (EncounterType == EncounterType.LarvestaEgg) { pid = rngArray[0 + cnt]; nature = (uint) (((ulong) rngArray[2 + cnt]*25) >> 32); synchable = false; } else if (EncounterType == EncounterType.Entralink) { pid = rngArray[0 + cnt]; synchable = false; // genderless if (frameCompare.GenderFilter.GenderValue == 0xFF) { // leave it as-is nature = (uint) (((ulong) rngArray[4 + cnt]*25) >> 32); } // always female else if (frameCompare.GenderFilter.GenderValue == 0xFE) { var genderAdjustment = (uint) ((0x8*(ulong) rngArray[1 + cnt]) >> 32); pid = (pid & 0xFFFFFF00) | (genderAdjustment + 1); nature = (uint) (((ulong) rngArray[5 + cnt]*25) >> 32); } // always male else if (frameCompare.GenderFilter.GenderValue == 0x0) { var genderAdjustment = (uint) ((0xF6*(ulong) rngArray[1 + cnt]) >> 32); pid = (pid & 0xFFFFFF00) | (genderAdjustment + 8); nature = (uint) (((ulong) rngArray[5 + cnt]*25) >> 32); } else { if (frameCompare.GenderFilter.GenderCriteria == GenderCriteria.Male) { var genderAdjustment = (uint) (((0xFE - frameCompare.GenderFilter.GenderValue)*(ulong) rngArray[1 + cnt]) >> 32); pid = (pid & 0xFFFFFF00) | (genderAdjustment + frameCompare.GenderFilter.GenderValue); } else if (frameCompare.GenderFilter.GenderCriteria == GenderCriteria.Female) { var genderAdjustment = (uint) (((frameCompare.GenderFilter.GenderValue - 1)*(ulong) rngArray[1 + cnt]) >> 32); pid = (pid & 0xFFFFFF00) | (genderAdjustment + 1); } nature = (uint) (((ulong) rngArray[5 + cnt]*25) >> 32); } if ((pid & 0x10000) == 0x10000) pid = pid ^ 0x10000; //note: might be wrong pid ^= 0x10000000; } else if (EncounterType == EncounterType.HiddenGrotto) { // unknown call at 0 synchable = (rngArray[1 + cnt] >> 31) == 1; pid = rngArray[2 + cnt]; // genderless if (frameCompare.GenderFilter.GenderValue == 0xFF) { // leave it as-is nature = (uint) (((ulong) rngArray[3 + cnt]*25) >> 32); } // always female else if (frameCompare.GenderFilter.GenderValue == 0xFE) { var genderAdjustment = (uint) ((0x8*(ulong) rngArray[3 + cnt]) >> 32); pid = (pid & 0xFFFFFF00) | (genderAdjustment + 1); nature = (uint) (((ulong) rngArray[4 + cnt]*25) >> 32); } // always male else if (frameCompare.GenderFilter.GenderValue == 0x0) { var genderAdjustment = (uint) ((0xF6*(ulong) rngArray[3 + cnt]) >> 32); pid = (pid & 0xFFFFFF00) | (genderAdjustment + 8); nature = (uint) (((ulong) rngArray[4 + cnt]*25) >> 32); } else { if (frameCompare.GenderFilter.GenderCriteria == GenderCriteria.Male) { var genderAdjustment = (uint) (((0xFE - frameCompare.GenderFilter.GenderValue)*(ulong) rngArray[3 + cnt]) >> 32); pid = (pid & 0xFFFFFF00) | (genderAdjustment + frameCompare.GenderFilter.GenderValue); } else if (frameCompare.GenderFilter.GenderCriteria == GenderCriteria.Female) { var genderAdjustment = (uint) (((frameCompare.GenderFilter.GenderValue - 1)*(ulong) rngArray[3 + cnt]) >> 32); pid = (pid & 0xFFFFFF00) | (genderAdjustment + 1); } nature = (uint) (((ulong) rngArray[4 + cnt]*25) >> 32); } if (synchable && EncounterMod == EncounterMod.Synchronize) nature = (uint) SynchNature; pid = pid ^ 0x10000; } else { // Fishing, Shaking Grass Spots // check for Fishing nibble if (EncounterMod == EncounterMod.SuctionCups && EncounterType == EncounterType.WildSuperRod) { encounterSlot = EncounterSlotCalc.encounterSlot(rngArray[1 + cnt], frameType, EncounterType); synchable = false; nature = (uint) (((ulong) rngArray[4 + cnt]*25) >> 32); pid = rngArray[3 + cnt]; pid = pid ^ 0x10000; } else { if (EncounterType == EncounterType.WildSuperRod && (rngArray[1 + cnt] >> 16)/656 >= 50) continue; encounterSlot = EncounterSlotCalc.encounterSlot(rngArray[2 + cnt], frameType, EncounterType); if (EncounterMod == EncounterMod.Synchronize) { synchable = (rngArray[0 + cnt] >> 31) == 1; if (synchable) nature = (uint) SynchNature; else nature = (uint) (((ulong) rngArray[5 + cnt]*25) >> 32); pid = rngArray[4 + cnt]; pid = pid ^ 0x10000; } else if (EncounterMod == EncounterMod.CuteCharm) { // not a synch, but the CC check -- need to relabel (unfinished) synchable = ((((ulong) rngArray[0 + cnt]*0xFFFF) >> 32)/656) < 67; pid = rngArray[4 + cnt]; pid = pid ^ 0x10000; // failed CC check if (!synchable) { // leave it as-is nature = (uint) (((ulong) rngArray[5 + cnt]*25) >> 32); } else { pid = Functions.GenderModPID(pid, rngArray[5 + cnt], SynchNature); nature = (uint) (((ulong) rngArray[6 + cnt]*25) >> 32); } synchable = false; } else if (EncounterMod == EncounterMod.Compoundeyes) { if (EncounterType == EncounterType.WildSuperRod && (rngArray[0 + cnt] >> 16)/656 >= 50) continue; synchable = false; encounterSlot = EncounterSlotCalc.encounterSlot(rngArray[1 + cnt], frameType, EncounterType); nature = (uint) (((ulong) rngArray[4 + cnt]*25) >> 32); pid = rngArray[3 + cnt]; pid = pid ^ 0x10000; } else if (EncounterMod == EncounterMod.SuctionCups) { synchable = false; encounterSlot = EncounterSlotCalc.encounterSlot(rngArray[1 + cnt], frameType, EncounterType); nature = (uint) (((ulong) rngArray[4 + cnt]*25) >> 32); pid = rngArray[3 + cnt]; pid = pid ^ 0x10000; } else if (EncounterMod == EncounterMod.Search) { if (EncounterType == EncounterType.WildSuperRod) { // Do the Suction Cups check for fishing frames encounterSlot = EncounterSlotCalc.encounterSlot(rngArray[1 + cnt], frameType, EncounterType); nature = (uint) (((ulong) rngArray[4 + cnt]*25) >> 32); pid = rngArray[3 + cnt]; pid = pid ^ 0x10000; idTest = (idLower ^ (pid & 1) ^ (pid >> 31)); if (idTest == 1) pid = (pid ^ 0x80000000); frame = Frame.GenerateFrame( FrameType.Method5Natures, EncounterType, cnt + InitialFrame, rngArray[0 + cnt], pid, id, sid, nature, false, encounterSlot, item); if (frameCompare.Compare(frame)) { frame.EncounterMod = EncounterMod.SuctionCups; frames.Add(frame); } } pid = rngArray[4 + cnt]; pid = pid ^ 0x10000; // not a synch, but the CC check -- need to relabel (unfinished) synchable = ((((ulong) rngArray[0 + cnt]*0xFFFF) >> 32)/656) < 67; // passed CC check if (synchable) { // Add all the Cute Charm possibilities nature = (uint) (((ulong) rngArray[6 + cnt]*25) >> 32); for (int i = -4; i < 5; i++) { if (i == 0) continue; uint tempPid = Functions.GenderModPID(pid, rngArray[5 + cnt], i); idTest = (idLower ^ (tempPid & 1) ^ (tempPid >> 31)); if (idTest == 1) tempPid = (tempPid ^ 0x80000000); frame = Frame.GenerateFrame( FrameType.Method5Natures, EncounterType, cnt + InitialFrame, rngArray[0 + cnt], tempPid, id, sid, nature, false, encounterSlot, item); switch (i) { case 1: frame.EncounterMod = EncounterMod.CuteCharm50M; break; case 2: frame.EncounterMod = EncounterMod.CuteCharm75M; break; case 3: frame.EncounterMod = EncounterMod.CuteCharm25M; break; case 4: frame.EncounterMod = EncounterMod.CuteCharm875M; break; case -1: frame.EncounterMod = EncounterMod.CuteCharm50F; break; case -2: frame.EncounterMod = EncounterMod.CuteCharm75F; break; case -3: frame.EncounterMod = EncounterMod.CuteCharm25F; break; case -4: frame.EncounterMod = EncounterMod.CuteCharm125F; break; } if (frameCompare.Compare(frame)) { frames.Add(frame); } } } pid = rngArray[4 + cnt]; pid = pid ^ 0x10000; synchable = (rngArray[0 + cnt] >> 31) == 1; nature = (uint) (((ulong) rngArray[5 + cnt]*25) >> 32); if (synchable && !frameCompare.CompareNature(nature)) mod = EncounterMod.Synchronize; else mod = EncounterMod.None; } else { synchable = (rngArray[0 + cnt] >> 31) == 1; nature = (uint) (((ulong) rngArray[5 + cnt]*25) >> 32); pid = rngArray[4 + cnt]; pid = pid ^ 0x10000; } } idTest = idLower ^ (pid & 1) ^ (pid >> 31); if (idTest == 1) { pid = (pid ^ 0x80000000); } } } // worthless calculation int ability = (int) (pid >> 16) & 1; if (RNGIVs != null) { frame = Frame.GenerateFrame( FrameType.Method5Natures, EncounterType, cnt + InitialFrame, rngArray[0 + cnt], pid, id, sid, nature, synchable, encounterSlot, item, RNGIVs); } else { frame = Frame.GenerateFrame( FrameType.Method5Natures, EncounterType, cnt + InitialFrame, rngArray[0 + cnt], pid, id, sid, nature, synchable, encounterSlot, item); } frame.EncounterMod = mod; frame.CGearTime = entreeTimer.GetTime(rngArray[0 + cnt]); if (frameCompare.Compare(frame)) { frames.Add(frame); } } } else if (frameType == FrameType.BWBred) { rng64.Seed = InitialSeed; var rngQueue = new Queue<uint>(); uint rngResult; for (uint cnt = 0; cnt < InitialFrame - 1; cnt++) { rng64.GetNext64BitNumber(); } for (uint cnt = 0; cnt < maxResults + 50; cnt++) { rngResult = rng64.GetNext32BitNumber(); rngQueue.Enqueue(rngResult); } rngArray = rngQueue.ToArray(); for (uint cnt = 0; cnt < maxResults; cnt++) { frame = null; // there's two extra rng calls before the eggs are generated int index = 2; uint nature; bool dream; bool everstone = false; // for Nidoran\Volbeat\Illumise determination // if 0, get Nidoran-F\Volbeat // if 1, get Nidoran-M\Illumise var speciesSpecial = (int) (rngArray[index + cnt] >> 31); // Everstone activation calc //int off = MaleOnlySpecies ? 1 : 0; if (MaleOnlySpecies) index++; //index = 1 nature = (uint) ((ulong) (rngArray[index++ + cnt])*25 >> 32); if (SynchNature > -1) { if ((rngArray[index++ + cnt] >> 31) == 1) { nature = (uint) SynchNature; everstone = true; } } // it appears to only actually use this for dream world otherwise it's ignored /*uint test = Functions.RNGRange(rngArray[index++ + cnt], 0x64); switch (MotherAbility) { case 0: ability = test > 0x50 ? 1u : 0; break; case 1: ability = test > 0x14 ? 1u : 0; break; case 2: if (test < 0x14) ability = 0; else ability = test >= 0x28 ? 2u : 1; break; default: ability = test > 0x50 ? 1u : 0; break; } // again a worthless calculation if (DittoUsed) ability = Functions.RNGRange(rngArray[index++ + cnt], 2);*/ dream = Functions.RNGRange(rngArray[index++ + cnt], 0x64) >= 0x28 && !DittoUsed; if (DittoUsed) ++index; // IV Inheritance calc // Uses every two RNG calls, first to determine IV, second to determine which parent // If an IV is repeated it skips two RNG calls and checks the next uint inh = Functions.RNGRange(rngArray[index + cnt], 6); uint inh1 = inh; uint par1 = rngArray[index + 1 + cnt] >> 31; uint maxSkips = 0; index = index + 2; inh = Functions.RNGRange(rngArray[index + cnt], 6); while (inh == inh1) { maxSkips += 2; index = index + 2; inh = Functions.RNGRange(rngArray[index + cnt], 6); if (index + cnt >= rngArray.Length - 3) { for (int refill = 0; refill < 50; refill++) { rngResult = rng64.GetNext32BitNumber(); rngQueue.Enqueue(rngResult); } rngArray = rngQueue.ToArray(); } } uint inh2 = inh; uint par2 = rngArray[index + 1 + cnt] >> 31; index = index + 2; inh = Functions.RNGRange(rngArray[index + cnt], 6); while (inh == inh1 || inh == inh2) { maxSkips += 2; index = index + 2; inh = Functions.RNGRange(rngArray[index + cnt], 6); if (index + cnt >= rngArray.Length - 3) { for (int refill = 0; refill < 50; refill++) { rngResult = rng64.GetNext32BitNumber(); rngQueue.Enqueue(rngResult); } rngArray = rngQueue.ToArray(); } } uint inh3 = inh; uint par3 = rngArray[index + 1 + cnt] >> 31; uint pid = Functions.RNGRange(rngArray[index + 2 + cnt], 0xFFFFFFFF); if (ParentA != null & ParentB != null && RNGIVs != null) { frame = Frame.GenerateFrame( FrameType.BWBred, cnt + InitialFrame, rngArray[cnt], speciesSpecial, inh1, inh2, inh3, par1, par2, par3, ParentA, ParentB, RNGIVs, pid, id, sid, dream, everstone, nature, maxSkips); } else { frame = Frame.GenerateFrame( FrameType.BWBred, cnt + InitialFrame, rngArray[cnt], speciesSpecial, inh1, inh2, inh3, par1, par2, par3, pid, id, sid, dream, everstone, nature, maxSkips); } if (frameCompare.Compare(frame)) { frames.Add(frame); } } } else if (frameType == FrameType.BWBredInternational) { rng64.Seed = InitialSeed; var rngQueue = new Queue<uint>(); uint rngResult; for (uint cnt = 0; cnt < InitialFrame - 1; cnt++) { rng64.GetNext64BitNumber(); } for (uint cnt = 0; cnt < InitialFrame + maxResults + 50; cnt++) { rngResult = rng64.GetNext32BitNumber(); rngQueue.Enqueue(rngResult); } rngArray = rngQueue.ToArray(); for (uint cnt = 0; cnt < maxResults; cnt++) { frame = null; int index = 1; uint nature; bool dream; bool everstone = false; // for Nidoran\Volbeat\Illumise determination // if 0, get Nidoran-F\Volbeat // if 1, get Nidoran-M\Illumise var speciesSpecial = (int) (rngArray[index + cnt] >> 31); // Everstone activation calc //int off = MaleOnlySpecies ? 1 : 0; if (MaleOnlySpecies) index++; //index = 1 if (SynchNature > -1) { nature = (uint) ((ulong) (rngArray[index++ + cnt])*25 >> 32); if ((rngArray[index++ + cnt] >> 31) == 1) { nature = (uint) SynchNature; everstone = true; } // Dream World ability calc dream = !DittoUsed && (uint) ((ulong) (rngArray[index++ + cnt])*5 >> 32) > 1; } else { nature = (uint) ((ulong) (rngArray[index++ + cnt])*25 >> 32); // Dream World ability calc dream = !DittoUsed && (uint) ((ulong) (rngArray[index++ + cnt])*5 >> 32) > 1; } if (DittoUsed) index = index + 2; // IV Inheritance calc // Uses every two RNG calls, first to determine IV, second to determine which parent // If an IV is repeated it skips two RNG calls and checks the next uint inh = Functions.RNGRange(rngArray[index + cnt], 6); uint inh1 = inh; uint par1 = rngArray[index + 1 + cnt] >> 31; uint maxSkips = 0; index = index + 2; inh = Functions.RNGRange(rngArray[index + cnt], 6); while (inh == inh1) { maxSkips += 2; index = index + 2; inh = Functions.RNGRange(rngArray[index + cnt], 6); if (index + cnt >= rngArray.Length - 3) { for (int refill = 0; refill < 50; refill++) { rngResult = rng64.GetNext32BitNumber(); rngQueue.Enqueue(rngResult); } rngArray = rngQueue.ToArray(); } } uint inh2 = inh; uint par2 = rngArray[index + 1 + cnt] >> 31; index = index + 2; inh = Functions.RNGRange(rngArray[index + cnt], 6); while (inh == inh1 || inh == inh2) { maxSkips += 2; index = index + 2; inh = Functions.RNGRange(rngArray[index + cnt], 6); if (index + cnt >= rngArray.Length - 3) { for (int refill = 0; refill < 50; refill++) { rngResult = rng64.GetNext32BitNumber(); rngQueue.Enqueue(rngResult); } rngArray = rngQueue.ToArray(); } } uint inh3 = inh; uint par3 = rngArray[index + 1 + cnt] >> 31; uint pid = rngArray[index + 2 + cnt] - 1; const int masuda = 6; for (int n = 0; n < masuda; n++) { pid = rngArray[index + n + 2 + cnt] - 1; uint tid = (id & 0xffff) | ((sid & 0xffff) << 16); uint a = pid ^ tid; uint b = a & 0xffff; uint c = (a >> 16) & 0xffff; uint d = b ^ c; if (d < 8) { break; } } if (ParentA != null & ParentB != null && RNGIVs != null) { frame = Frame.GenerateFrame( FrameType.BWBred, cnt + InitialFrame, rngArray[0 + cnt], speciesSpecial, inh1, inh2, inh3, par1, par2, par3, ParentA, ParentB, RNGIVs, pid, id, sid, dream, everstone, nature, maxSkips); } else { frame = Frame.GenerateFrame( FrameType.BWBred, cnt + InitialFrame, rngArray[0 + cnt], speciesSpecial, inh1, inh2, inh3, par1, par2, par3, pid, id, sid, dream, everstone, nature, maxSkips); } if (frameCompare.Compare(frame)) { frames.Add(frame); } } } else if (frameType == FrameType.BW2BredInternational) { rng64.Seed = InitialSeed; var rngQueue = new Queue<uint>(); var inhQueue = new Queue<uint>(); uint rngResult; int callCount = 13; if (SynchNature > -1) { callCount++; // Everstone consumes extra RNG call } if (DittoUsed) { callCount++; // Ditto consumes extra RNG call } for (uint cnt = 0; cnt < InitialFrame - 1; cnt++) { rng64.GetNext64BitNumber(); } for (uint cnt = 0; cnt < InitialFrame + maxResults + 50; cnt++) { rngResult = rng64.GetNext32BitNumber(); rngQueue.Enqueue(rngResult); inhQueue.Enqueue((uint) ((ulong) (rngResult)*6 >> 32)); } rngArray = rngQueue.ToArray(); uint[] inhArray = inhQueue.ToArray(); for (uint cnt = 0; cnt < maxResults; cnt++) { frame = null; int index = 1; uint nature; bool dream; bool everstone = false; // for Nidoran\Volbeat\Illumise determination // if 0, get Nidoran-F\Volbeat // if 1, get Nidoran-M\Illumise var speciesSpecial = (int) (rngArray[index + cnt] >> 31); // Everstone activation calc //int off = MaleOnlySpecies ? 1 : 0; if (MaleOnlySpecies) index++; //index = 1 if (SynchNature > -1) { nature = (uint) ((ulong) (rngArray[index++ + cnt])*25 >> 32); if ((rngArray[index++ + cnt] >> 31) == 1) { nature = (uint) SynchNature; everstone = true; } // Dream World ability calc dream = !DittoUsed && (uint) ((ulong) (rngArray[index++ + cnt])*5 >> 32) > 1; } else { nature = (uint) ((ulong) (rngArray[index++ + cnt])*25 >> 32); // Dream World ability calc dream = !DittoUsed && (uint) ((ulong) (rngArray[index++ + cnt])*5 >> 32) > 1; } // IV Inheritance calc // Uses every two RNG calls, first to determine IV, second to determine which parent // If an IV is repeated it skips two RNG calls and checks the next uint inh = inhArray[index + cnt]; uint inh1 = inh; uint par1 = rngArray[index + 1 + cnt] >> 31; uint maxSkips = 0; index = index + 2; inh = inhArray[index + cnt]; while (inh == inh1) { maxSkips += 2; index = index + 2; inh = inhArray[index + cnt]; if (index + cnt >= rngArray.Length - 3) { for (int refill = 0; refill < 50; refill++) { rngResult = rng64.GetNext32BitNumber(); rngQueue.Enqueue(rngResult); inhQueue.Enqueue((uint) ((ulong) (rngResult)*6 >> 32)); } rngArray = rngQueue.ToArray(); inhArray = inhQueue.ToArray(); } } uint inh2 = inh; uint par2 = rngArray[index + 1 + cnt] >> 31; index = index + 2; inh = inhArray[index + cnt]; while (inh == inh1 || inh == inh2) { maxSkips += 2; index = index + 2; inh = inhArray[index + cnt]; if (index + cnt >= rngArray.Length - 3) { for (int refill = 0; refill < 50; refill++) { rngResult = rng64.GetNext32BitNumber(); rngQueue.Enqueue(rngResult); inhQueue.Enqueue((uint) ((ulong) (rngResult)*6 >> 32)); } rngArray = rngQueue.ToArray(); inhArray = inhQueue.ToArray(); } } uint inh3 = inh; uint par3 = rngArray[index + 1 + cnt] >> 31; uint pid = rngArray[index + 2 + cnt] - 1; int masuda = ShinyCharm ? 8 : 6; for (int n = 0; n < masuda; n++) { pid = rngArray[index + n + 2 + cnt] - 1; uint tid = (id & 0xffff) | ((sid & 0xffff) << 16); uint a = pid ^ tid; uint b = a & 0xffff; uint c = (a >> 16) & 0xffff; uint d = b ^ c; if (d < 8) { break; } } if (ParentA != null & ParentB != null && RNGIVs != null) { frame = Frame.GenerateFrame( FrameType.BWBred, cnt + InitialFrame, rngArray[0 + cnt], speciesSpecial, inh1, inh2, inh3, par1, par2, par3, ParentA, ParentB, RNGIVs, pid, id, sid, dream, everstone, nature, maxSkips); } else { frame = Frame.GenerateFrame( FrameType.BWBred, cnt + InitialFrame, rngArray[0 + cnt], speciesSpecial, inh1, inh2, inh3, par1, par2, par3, pid, id, sid, dream, everstone, nature, maxSkips); } if (frameCompare.Compare(frame)) { frames.Add(frame); } } } else if (frameType == FrameType.Wondercard5thGen) { rng64.Seed = InitialSeed; if (maxResults < 1000) { rngArray = new uint[maxResults + 33]; for (uint cnt = 0; cnt < InitialFrame - 1; cnt++) { rng64.GetNext64BitNumber(); } for (int cnt = 0; cnt < maxResults + 33; cnt++) { rngArray[cnt] = rng64.GetNext32BitNumber(); } for (uint cnt = 0; cnt < maxResults; cnt++) { Frame frame = Frame.GenerateFrame( FrameType.Wondercard5thGen, id, sid, cnt + InitialFrame, rngArray[0 + cnt], rngArray[22 + cnt] >> 27, rngArray[23 + cnt] >> 27, rngArray[24 + cnt] >> 27, rngArray[25 + cnt] >> 27, rngArray[26 + cnt] >> 27, rngArray[27 + cnt] >> 27, rngArray[32 + cnt], rngArray[30 + cnt]); if (frameCompare.Compare(frame)) { frames.Add(frame); } } } else { rngQueue = new Queue<uint>(); for (uint cnt = 0; cnt < InitialFrame - 1; cnt++) { rng64.GetNext64BitNumber(); } for (int cnt = 0; cnt < 33; cnt++) { rngQueue.Enqueue(rng64.GetNext32BitNumber()); } for (uint cnt = InitialFrame; cnt < InitialFrame + maxResults; cnt++) { rngArray = rngQueue.ToArray(); Frame frame = Frame.GenerateFrame( FrameType.Wondercard5thGen, id, sid, cnt, rngArray[0], rngArray[22] >> 27, rngArray[23] >> 27, rngArray[24] >> 27, rngArray[25] >> 27, rngArray[26] >> 27, rngArray[27] >> 27, rngArray[32], rngArray[30]); if (frameCompare.Compare(frame)) { frames.Add(frame); } rngQueue.Dequeue(); rngQueue.Enqueue(rng64.GetNext32BitNumber()); } } } else if (frameType == FrameType.Wondercard5thGenFixed) { rng64.Seed = InitialSeed; if (maxResults < 1000) { rngArray = new uint[maxResults + 36]; for (uint cnt = 0; cnt < InitialFrame - 1; cnt++) { rng64.GetNext64BitNumber(); } for (int cnt = 0; cnt < maxResults + 36; cnt++) { rngArray[cnt] = rng64.GetNext32BitNumber(); } for (uint cnt = 0; cnt < maxResults; cnt++) { //note: pid field is unused look into later uint pid = Functions.GenderModPID(rngArray[30 + cnt], rngArray[31 + cnt], 0); Frame frame = Frame.GenerateFrame( FrameType.Wondercard5thGenFixed, id, sid, cnt + InitialFrame, rngArray[0 + cnt], rngArray[24 + cnt] >> 27, rngArray[25 + cnt] >> 27, rngArray[26 + cnt] >> 27, rngArray[27 + cnt] >> 27, rngArray[28 + cnt] >> 27, rngArray[29 + cnt] >> 27, rngArray[35 + cnt], rngArray[30 + cnt]); if (frameCompare.Compare(frame)) { frames.Add(frame); } } } else { rngQueue = new Queue<uint>(); for (int i = 0; i < InitialFrame - 1; ++i) { rng64.GetNext64BitNumber(); } for (int cnt = 0; cnt < 36; cnt++) { rngQueue.Enqueue(rng64.GetNext32BitNumber()); } for (uint cnt = InitialFrame; cnt < InitialFrame + maxResults; cnt++) { rngArray = rngQueue.ToArray(); Frame frame = Frame.GenerateFrame( FrameType.Wondercard5thGenFixed, id, sid, cnt, rngArray[0], rngArray[24] >> 27, rngArray[25] >> 27, rngArray[26] >> 27, rngArray[27] >> 27, rngArray[28] >> 27, rngArray[29] >> 27, rngArray[35], rngArray[30]); if (frameCompare.Compare(frame)) { frames.Add(frame); } rngQueue.Dequeue(); rngQueue.Enqueue(rng64.GetNext32BitNumber()); } } } else if (frameType == FrameType.MethodH1 || frameType == FrameType.MethodH2 || frameType == FrameType.MethodH4) { // Instantiate our hunt RNG and fail RNG var huntRng = new PokeRng(0); // Instantiate our regular RNG var rng1 = new PokeRng((uint) InitialSeed); var rng2 = new PokeRng(0); for (uint cnt = 1; cnt < InitialFrame; cnt++) { rng1.Next(); } for (ulong cnt = InitialFrame; cnt < maxResults + InitialFrame; cnt++) { // Get our first RNG call. If we are using a // syncher this will determine whether we are // going to honor it. uint seed = rng1.Seed; // skip the level and battle calcs rng1.GetNext16BitNumber(); // Basically save our RNG state here // so that we only advance rng1 once // per monster. rng2.Seed = rng1.Seed; // if it's safari zone it's one before // note: this should all be done inside the encounter slot calc uint encounterCall = EncounterType == EncounterType.SafariZone ? seed : rng2.Seed; int encounterSlot = EncounterSlotCalc.encounterSlot(encounterCall, frameType, EncounterType); rng2.GetNext16BitNumber(); uint firstRng = rng2.GetNext16BitNumber(); uint nature = 0; ulong offset = cnt + 3; Compare CuteCheck = x => true; if (EncounterMod != EncounterMod.Synchronize && EncounterMod != EncounterMod.CuteCharm) { // Dont want to synch at all, just use the // RNG call to get our hunt nature, nature = firstRng%25; } else if (EncounterMod == EncounterMod.Synchronize) { // Check for even/odd on the high order bit. if ((firstRng & 1) == 0) { // Set the hunt to the nature of our syncher nature = (uint) SynchNature; } else { // Ok, we wanted to synch, but missed it so lets // get the next RNG call and then go ahead and // use that for the nature. nature = (uint) rng2.GetNext16BitNumber()%25; offset++; } } else if (EncounterMod == EncounterMod.CuteCharm) { // Check for even/odd on the high order bit. if ((firstRng%3) > 0) { switch (SynchNature) { case -1: CuteCheck = x => (x & 0xFF) < 127; break; case 1: CuteCheck = x => (x & 0xFF) >= 127; break; case -2: CuteCheck = x => (x & 0xFF) < 191; break; case 2: CuteCheck = x => (x & 0xFF) >= 63; break; case -3: CuteCheck = x => (x & 0xFF) < 63; break; case 3: CuteCheck = x => (x & 0xFF) >= 191; break; case -4: CuteCheck = x => (x & 0xFF) < 31; break; case 4: CuteCheck = x => (x & 0xFF) >= 31; break; default: CuteCheck = x => true; break; } } // either way, eat up a frame for the Cute Charm check and determine nature nature = (uint) rng2.GetNext16BitNumber()%25; offset++; } // Seed the hunt rng huntRng.Seed = rng2.Seed; bool found = false; // Now we are going to have to hunt for the next // matching method 1 spread that we can display // to the user. while (!found) { uint pid1 = huntRng.GetNext16BitNumber(); uint pid2 = huntRng.GetNext16BitNumber(); uint pid = (pid2 << 16) + pid1; if (pid%25 == nature && CuteCheck(pid)) { // Wild Pokémon IVs are generally generated by Methods 2 and 4 uint iv1; if (frameType == FrameType.MethodH2) { huntRng.GetNext32BitNumber(); iv1 = huntRng.GetNext16BitNumber(); } else if (frameType == FrameType.MethodH4) { iv1 = huntRng.GetNext16BitNumber(); huntRng.GetNext32BitNumber(); } else { // Use Method 1, which is what usually happens for stationary Pokémon // Emphasis on "usually". iv1 = huntRng.GetNext16BitNumber(); } uint iv2 = huntRng.GetNext16BitNumber(); // We found a match, we need to buid the frame // as usual now based on the next few RNG calls frame = Frame.GenerateFrame( seed, frameType, EncounterType, (uint) cnt, firstRng, pid1, pid2, iv1, iv2, id, sid, (uint) offset, encounterSlot); if (frameCompare.Compare(frame)) { frames.Add(frame); } found = true; } offset += 2; } } } else if (frameType == FrameType.MethodJ) { // Instantiate our hunt RNG and fail RNG var huntRng = new PokeRng(0); // Instantiate our regular RNG var rng1 = new PokeRng((uint) InitialSeed); var rng2 = new PokeRng(0); for (uint cnt = 1; cnt < InitialFrame; cnt++) { rng1.Next(); } for (uint cnt = InitialFrame; cnt < maxResults + InitialFrame; cnt++) { // Get our first RNG call. If we are using a // syncher this will determine whether we are // going to honor it. uint seed = rng1.Seed; uint firstRng = rng1.GetNext16BitNumber(); uint rngResult = firstRng; // Basically save our RNG state here // so that we only advance rng1 once // per monster. rng2.Seed = rng1.Seed; uint offset = cnt + 1; int encounterSlot = 0; if (EncounterType == EncounterType.Wild) { encounterSlot = EncounterSlotCalc.encounterSlot(rng2.Seed, frameType, EncounterType); firstRng = rng2.GetNext16BitNumber(); offset++; } else if (EncounterType == EncounterType.WildSurfing) { encounterSlot = EncounterSlotCalc.encounterSlot(rng2.Seed, frameType, EncounterType); firstRng = rng2.GetNext16BitNumber(); firstRng = rng2.GetNext16BitNumber(); offset += 2; } else if (EncounterType == EncounterType.WildOldRod || EncounterType == EncounterType.WildGoodRod || EncounterType == EncounterType.WildSuperRod) { uint threshold; if (EncounterType == EncounterType.WildOldRod) { threshold = EncounterMod == EncounterMod.SuctionCups ? 48u : 24u; } else if (EncounterType == EncounterType.WildGoodRod) { threshold = EncounterMod == EncounterMod.SuctionCups ? 98u : 49u; } else { threshold = EncounterMod == EncounterMod.SuctionCups ? 100u : 74u; } // Skip this call if it an encounter cannot be made if (firstRng/656 > threshold) continue; encounterSlot = EncounterSlotCalc.encounterSlot(rng2.GetNext32BitNumber(), frameType, EncounterType); // one of these is item calc, another is level firstRng = rng2.GetNext16BitNumber(); firstRng = rng2.GetNext16BitNumber(); offset += 3; } uint nature; if (EncounterMod == EncounterMod.Synchronize) { // Check for even/odd on the high order bit. if (firstRng >> 15 == 0) { // Set the hunt to the nature our our syncher nature = (uint) SynchNature; } else { // Ok, we wanted to synch, but missed it so lets // get the next RNG call and then go ahead and // use that for the nature. nature = (uint) rng2.GetNext16BitNumber()/0xA3E; offset++; } } else if (EncounterMod == EncounterMod.CuteCharm) { nature = (uint) rng2.GetNext16BitNumber()/0xA3E; } else { // Dont want to synch at all, just use the // RNG call to get our hunt nature, nature = firstRng/0xA3E; } if (EncounterMod == EncounterMod.CuteCharm && firstRng/0x5556 != 0) { uint buffer = 0; if (SynchNature > -1) { switch (SynchNature) { case 1: buffer = 0x96; break; case 2: buffer = 0x4B; break; case 3: buffer = 0xC8; break; case 4: buffer = 0x32; break; default: buffer = 0; break; } } // We found a match, we need to buid the frame // as usual now based on the next few RNG calls frame = Frame.GenerateFrame( seed, FrameType.MethodJ, EncounterType, cnt, rngResult, nature + buffer, 0, rng2.GetNext16BitNumber(), rng2.GetNext16BitNumber(), id, sid, offset - 2, encounterSlot); if (frameCompare.Compare(frame)) { frames.Add(frame); } } else { // Seed the hunt rng huntRng.Seed = rng2.Seed; bool found = false; // Now we are going to have to hunt for the next // matching method 1 spread that we can display // to the user. while (!found) { uint pid1 = huntRng.GetNext16BitNumber(); uint pid2 = huntRng.GetNext16BitNumber(); uint pid = (pid2 << 16) + pid1; if (pid%25 == nature) { // We found a match, we need to buid the frame // as usual now based on the next few RNG calls frame = Frame.GenerateFrame( seed, FrameType.MethodJ, EncounterType, cnt, rngResult, pid1, pid2, huntRng.GetNext16BitNumber(), huntRng.GetNext16BitNumber(), id, sid, offset, encounterSlot); if (frameCompare.Compare(frame)) { frames.Add(frame); } found = true; } offset += 2; } } } } else if (frameType == FrameType.MethodK) { // Instantiate our hunt RNG and fail RNG var huntRng = new PokeRng(0); // Instantiate our regular RNG var rng1 = new PokeRng((uint) InitialSeed); var rng2 = new PokeRng(0); for (uint cnt = 1; cnt < InitialFrame; cnt++) { rng1.Next(); } for (uint cnt = InitialFrame; cnt < maxResults + InitialFrame; cnt++) { // Get our first RNG call. If we are using a // syncher this will determine whether we are // going to honor it. uint seed = rng1.Seed; uint firstRng = rng1.GetNext16BitNumber(); uint rngResult = firstRng; // Basically save our RNG state here // so that we only advance rng1 once // per monster. rng2.Seed = rng1.Seed; uint offset = cnt + 1; int encounterSlot = 0; if (EncounterType == EncounterType.Wild || EncounterType == EncounterType.SafariZone) { encounterSlot = EncounterSlotCalc.encounterSlot(rng2.Seed, frameType, EncounterType); firstRng = rng2.GetNext16BitNumber(); offset++; } else if (EncounterType == EncounterType.WildSurfing || EncounterType == EncounterType.Headbutt || EncounterType == EncounterType.BugCatchingContest) { encounterSlot = EncounterSlotCalc.encounterSlot(rng2.Seed, frameType, EncounterType); firstRng = rng2.GetNext16BitNumber(); firstRng = rng2.GetNext16BitNumber(); offset += 2; } else if (EncounterType == EncounterType.WildOldRod || EncounterType == EncounterType.WildGoodRod || EncounterType == EncounterType.WildSuperRod) { uint threshold; if (EncounterType == EncounterType.WildOldRod) { threshold = EncounterMod == EncounterMod.SuctionCups ? 48u : 24u; } else if (EncounterType == EncounterType.WildGoodRod) { threshold = EncounterMod == EncounterMod.SuctionCups ? 98u : 49u; } else { threshold = EncounterMod == EncounterMod.SuctionCups ? 100u : 74u; } // Skip this call if it an encounter cannot be made if (firstRng%100 > threshold) continue; encounterSlot = EncounterSlotCalc.encounterSlot(rng2.GetNext32BitNumber(), frameType, EncounterType); // one of these is item calc, another is level firstRng = rng2.GetNext16BitNumber(); firstRng = rng2.GetNext16BitNumber(); offset += 3; } uint nature; if (EncounterMod == EncounterMod.Synchronize) { // Check for even/odd on the low order bit if ((firstRng & 1) == 0) { // Set the hunt to the nature our our syncher nature = (uint) SynchNature; } else { // Ok, we wanted to synch, but missed it so lets // get the next RNG call and then go ahead and // use that for the nature. nature = (uint) rng2.GetNext16BitNumber()%25; offset++; } } else if (EncounterMod == EncounterMod.CuteCharm) { nature = (uint) rng2.GetNext16BitNumber()%25; } else { // Dont want to synch at all, just use the // RNG call to get our hunt nature, nature = firstRng%25; } if (EncounterMod == EncounterMod.CuteCharm && firstRng%3 != 0) { uint buffer = 0; if (SynchNature > -1) { switch (SynchNature) { case 1: buffer = 0x96; break; case 2: buffer = 0x4B; break; case 3: buffer = 0xC8; break; case 4: buffer = 0x32; break; default: buffer = 0; break; } } // We found a match, we need to buid the frame // as usual now based on the next few RNG calls frame = Frame.GenerateFrame( seed, FrameType.MethodK, EncounterType, cnt, rngResult, nature + buffer, 0, rng2.GetNext16BitNumber(), rng2.GetNext16BitNumber(), id, sid, offset - 2, encounterSlot); if (EncounterType == EncounterType.BugCatchingContest || EncounterType == EncounterType.SafariZone) frame.Synchable = true; if (frameCompare.Compare(frame)) { frames.Add(frame); } } else { // Seed the hunt rng huntRng.Seed = rng2.Seed; bool found = false; // Now we are going to have to hunt for the next // matching method 1 spread that we can display // to the user. while (!found) { uint pid1 = huntRng.GetNext16BitNumber(); uint pid2 = huntRng.GetNext16BitNumber(); uint pid = (pid2 << 16) + pid1; if (pid%25 == nature) { // We found a match, we need to buid the frame // as usual now based on the next few RNG calls frame = Frame.GenerateFrame( seed, FrameType.MethodK, EncounterType, cnt, rngResult, pid1, pid2, huntRng.GetNext16BitNumber(), huntRng.GetNext16BitNumber(), id, sid, offset, encounterSlot); if (frameCompare.Compare(frame)) { frames.Add(frame); } found = true; } offset += 2; } } } } else if (frameType == FrameType.ColoXD) { var rng = new XdRng((uint) InitialSeed); for (uint cnt = 1; cnt < InitialFrame - 1; cnt++) rng.GetNext32BitNumber(); rngArray = new uint[maxResults + 5]; for (uint cnt = 0; cnt < maxResults; cnt++) rngArray[cnt] = rng.GetNext16BitNumber(); for (uint cnt = 0; cnt < maxResults; cnt++) { frame = Frame.GenerateFrame( 0, FrameType.ColoXD, cnt + InitialFrame, rngArray[0 + cnt], rngArray[4 + cnt], rngArray[3 + cnt], rngArray[0 + cnt], rngArray[1 + cnt], id, sid); if (frameCompare.Compare(frame)) { frames.Add(frame); } } } 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); for (uint cnt = 1; cnt < InitialFrame; cnt++) rng.GetNext32BitNumber(); rngArray = new uint[maxResults + 20]; for (uint cnt = 0; cnt < maxResults + 20; cnt++) rngArray[cnt] = rng.GetNext16BitNumber(); lastseed = rng.Seed; for (uint cnt = 0; cnt < maxResults; cnt++) { Frame frameSplit = null; switch (frameType) { case FrameType.Method1: frame = Frame.GenerateFrame( 0, FrameType.Method1, cnt + InitialFrame, rngArray[0 + cnt], rngArray[0 + cnt], rngArray[1 + cnt], rngArray[2 + cnt], rngArray[3 + cnt], 0, 0, 0, 0, 0, 0, id, sid, cnt); break; case FrameType.Method2: frame = Frame.GenerateFrame( 0, FrameType.Method2, cnt + InitialFrame, rngArray[0 + cnt], rngArray[0 + cnt], rngArray[1 + cnt], rngArray[3 + cnt], rngArray[4 + cnt], 0, 0, 0, 0, 0, 0, id, sid, cnt); break; case FrameType.Method3: frame = Frame.GenerateFrame( 0, FrameType.Method3, cnt + InitialFrame, rngArray[0 + cnt], rngArray[0 + cnt], rngArray[2 + cnt], rngArray[3 + cnt], rngArray[4 + cnt], 0, 0, 0, 0, 0, 0, id, sid, cnt); break; case FrameType.Method4: frame = Frame.GenerateFrame( 0, FrameType.Method4, cnt + InitialFrame, rngArray[0 + cnt], rngArray[0 + cnt], rngArray[1 + cnt], rngArray[2 + cnt], rngArray[4 + cnt], 0, 0, 0, 0, 0, 0, id, sid, cnt); break; case FrameType.ChainedShiny: uint chainedPIDLower = Functions.ChainedPIDLower( rngArray[1 + cnt], rngArray[15 + cnt], rngArray[14 + cnt], rngArray[13 + cnt], rngArray[12 + cnt], rngArray[11 + cnt], rngArray[10 + cnt], rngArray[9 + cnt], rngArray[8 + cnt], rngArray[7 + cnt], rngArray[6 + cnt], rngArray[5 + cnt], rngArray[4 + cnt], rngArray[3 + cnt]); frame = Frame.GenerateFrame( 0, FrameType.ChainedShiny, cnt + InitialFrame, rngArray[0 + cnt], chainedPIDLower, Functions.ChainedPIDUpper(rngArray[2 + cnt], chainedPIDLower, id, sid), rngArray[16 + cnt], rngArray[17 + cnt], 0, 0, 0, 0, 0, 0, id, sid, cnt); break; case FrameType.EBredPID: uint total; uint pid = GetEPid(cnt, out total); if (pid == 0) { continue; } //generate frame with bogus RNG result frame = Frame.GenerateFrame(FrameType.EBredPID, cnt + InitialFrame, 0, pid, id, sid); frame.Advances = total; //new Frame {FrameType = FrameType.EBredPID, Number = cnt + InitialFrame, Pid = pid}; break; case FrameType.RSBredLower: frame = Frame.GenerateFrame( FrameType.RSBredLower, cnt + InitialFrame, rngArray[0 + cnt], rngArray[1 + cnt], Compatibility ); break; case FrameType.RSBredUpper: frame = Frame.GenerateFrame( FrameType.RSBredUpper, cnt + InitialFrame, rngArray[0 + cnt], StaticPID, rngArray[1 + cnt], rngArray[2 + cnt], rngArray[3 + cnt], // vblank rngArray[5 + cnt], rngArray[6 + cnt], rngArray[7 + cnt], rngArray[8 + cnt], rngArray[9 + cnt], rngArray[10 + cnt], ParentA, ParentB, id, sid); break; case FrameType.RSBredUpperSplit: frame = frame = Frame.GenerateFrame( FrameType.RSBredUpperSplit, cnt + InitialFrame, rngArray[0 + cnt], StaticPID, // vblank rngArray[2 + cnt], rngArray[3 + cnt], rngArray[4 + cnt], // another vblank rngArray[6 + cnt], rngArray[7 + cnt], rngArray[8 + cnt], rngArray[9 + cnt], rngArray[10 + cnt], rngArray[11 + cnt], ParentA, ParentB, id, sid); break; // untested needs further research case FrameType.RSBredUpperAlt: frame = Frame.GenerateFrame( FrameType.RSBredUpperAlt, cnt + InitialFrame, rngArray[0 + cnt], StaticPID, // vblank rngArray[2 + cnt], rngArray[3 + cnt], // vblank rngArray[5 + cnt], // vblank rngArray[5 + cnt], rngArray[6 + cnt], rngArray[7 + cnt], rngArray[8 + cnt], rngArray[9 + cnt], rngArray[10 + cnt], ParentA, ParentB, id, sid); break; case FrameType.Bred: frame = Frame.GenerateFrame( FrameType.Bred, cnt + InitialFrame, rngArray[0 + cnt], StaticPID, rngArray[0 + cnt], rngArray[1 + cnt], rngArray[3 + cnt], rngArray[4 + cnt], rngArray[5 + cnt], rngArray[6 + cnt], rngArray[7 + cnt], rngArray[8 + cnt], ParentA, ParentB, id, sid, cnt); break; case FrameType.BredSplit: // This is going to add both of the frames and // the logic below will decide whether to add // it to the output. frame = Frame.GenerateFrame( FrameType.Bred, cnt + InitialFrame, rngArray[0 + cnt], StaticPID, rngArray[0 + cnt], rngArray[1 + cnt], // Garbage rngArray[3 + cnt], rngArray[4 + cnt], rngArray[5 + cnt], rngArray[6 + cnt], rngArray[7 + cnt], rngArray[8 + cnt], ParentA, ParentB, id, sid, cnt); frameSplit = Frame.GenerateFrame( FrameType.BredSplit, cnt + InitialFrame, rngArray[0 + cnt], StaticPID, rngArray[0 + cnt], rngArray[2 + cnt], // Garbage rngArray[4 + cnt], rngArray[5 + cnt], rngArray[6 + cnt], rngArray[7 + cnt], rngArray[8 + cnt], rngArray[9 + cnt], ParentA, ParentB, id, sid, cnt); break; case FrameType.BredAlternate: frame = Frame.GenerateFrame( FrameType.Bred, cnt + InitialFrame, rngArray[0 + cnt], StaticPID, rngArray[0 + cnt], rngArray[1 + cnt], rngArray[4 + cnt], rngArray[5 + cnt], rngArray[6 + cnt], rngArray[7 + cnt], rngArray[8 + cnt], rngArray[9 + cnt], ParentA, ParentB, id, sid, cnt); break; case FrameType.DPPtBred: frame = Frame.GenerateFrame( FrameType.DPPtBred, cnt + InitialFrame, rngArray[0 + cnt], rngArray[0 + cnt], rngArray[1 + cnt], rngArray[2 + cnt], rngArray[3 + cnt], rngArray[4 + cnt], rngArray[5 + cnt], rngArray[6 + cnt], rngArray[7 + cnt], ParentA, ParentB, id, sid, cnt); break; case FrameType.HGSSBred: frame = Frame.GenerateFrame( FrameType.HGSSBred, cnt + InitialFrame, rngArray[0 + cnt], rngArray[0 + cnt], rngArray[1 + cnt], rngArray[2 + cnt], rngArray[3 + cnt], rngArray[4 + cnt], rngArray[5 + cnt], rngArray[6 + cnt], rngArray[7 + cnt], ParentA, ParentB, id, sid, cnt); break; case FrameType.WondercardIVs: if (EncounterType == EncounterType.Manaphy) { uint pid1 = rngArray[0 + cnt]; uint pid2 = rngArray[1 + cnt]; while ((pid1 ^ pid2 ^ id ^ sid) < 8) { uint testPID = pid1 | (pid2 << 16); // Call the ARNG to change the PID testPID = testPID*0x6c078965 + 1; pid1 = testPID & 0xFFFF; pid2 = testPID >> 16; } frame = Frame.GenerateFrame( 0, FrameType.WondercardIVs, cnt + InitialFrame, rngArray[0 + cnt], pid1, pid2, rngArray[2 + cnt], rngArray[3 + cnt], 0, 0, 0, 0, 0, 0, id, sid, cnt); } else { frame = Frame.GenerateFrame( 0, FrameType.WondercardIVs, cnt + InitialFrame, rngArray[0 + cnt], 0, 0, rngArray[0 + cnt], rngArray[1 + cnt], rngArray[2 + cnt], rngArray[3 + cnt], rngArray[4 + cnt], rngArray[5 + cnt], rngArray[6 + cnt], rngArray[7 + cnt], 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); } if (frameType == FrameType.BredSplit) { if (frameCompare.Compare(frameSplit)) { frames.Add(frameSplit); } } } } return frames; }
//-------------------------------------------------------------------------------------------------- private void buttonShinyGenerate_Click(object sender, EventArgs e) { //the main function for the shiny Time finder //check to make sure the user hasn't filled the text //boxes with exception-throwing garbage validateShinyInput(); //ShinyFinder stores TimeData structs in a list in order to pass them to //its adjacents window, so one is used to store all the variables in this function //read the user input from the form int year = Convert.ToInt32(maskedTextBoxShinyYear.Text); uint minDelay = Convert.ToUInt32(maskedTextBoxShinyMinDelay.Text); uint maxDelay = Convert.ToUInt32(maskedTextBoxShinyMaxDelay.Text); var minEfgh = (uint) (minDelay + year - 2000); var maxEfgh = (uint) (maxDelay + year - 2000); if (!uint.TryParse(maskedTextBoxShinyID.Text, out id)) { id = 0; } if (!uint.TryParse(maskedTextBoxShinySecretID.Text, out sid)) { sid = 0; } List<uint> nature = null; if (comboBoxShinyNature.SelectedIndex != 0) nature = new List<uint> {(uint) ((Nature) comboBoxShinyNature.SelectedItem).Number}; //List<IFrameEggPID> iframesEgg = new List<IFrameEggPID>(); generator = new FrameGenerator(); iframesEggShiny = new List<IFrameEggPID>(); frameCompare = new FrameCompare(0, CompareType.None, 0, CompareType.None, 0, CompareType.None, 0, CompareType.None, 0, CompareType.None, 0, CompareType.None, nature, (int) ((ComboBoxItem) comboBoxShinyAbility.SelectedItem).Reference, checkBoxShinyShinyOnly.Checked, false, false, null, (GenderFilter) (comboBoxShinyGender.SelectedItem)); listBindingShiny = new BindingSource {DataSource = iframesEggShiny}; dataGridViewShinyResults.DataSource = listBindingShiny; uint maxTaps = Convert.ToUInt32(maskedTextBoxMaxTaps.Text); if (radioButtonDPPt.Checked && !checkBoxIntlParents.Checked) { generator.FrameType = FrameType.Gen4Normal; if (checkBoxNoHappiness.Checked) { generator.InitialFrame = 11; generator.MaxResults = 11; } else { generator.InitialFrame = 23; generator.MaxResults = 11 + maxTaps*12; } } else if (radioButtonDPPt.Checked && checkBoxIntlParents.Checked) { generator.FrameType = FrameType.Gen4International; if (checkBoxNoHappiness.Checked) { generator.InitialFrame = 11; generator.MaxResults = 11; } else { generator.InitialFrame = 23; generator.MaxResults = 11 + maxTaps*12; } } else if (radioButtonHGSS.Checked && !checkBoxIntlParents.Checked) { generator.FrameType = FrameType.Gen4Normal; generator.InitialFrame = 1; generator.MaxResults = 14; } else if (radioButtonHGSS.Checked && checkBoxIntlParents.Checked) { generator.FrameType = FrameType.Gen4International; generator.InitialFrame = 1; generator.MaxResults = 14; } progressSearched = 0; progressFound = 0; progressTotal = (255*24*(maxEfgh - minEfgh + 1)*generator.MaxResults); waitHandle = new EventWaitHandle(true, EventResetMode.ManualReset); jobs = new Thread[1]; jobs[0] = new Thread(() => Generate4thGenEggPIDJob(minEfgh, maxEfgh)); jobs[0].Start(); Thread.Sleep(200); var progressJob = new Thread(() => ManageProgress(listBindingShiny, dataGridViewShinyResults, generator.FrameType, 0)); progressJob.Start(); progressJob.Priority = ThreadPriority.Lowest; buttonCapGenerate.Enabled = false; buttonShinyGenerate.Enabled = false; buttonEggGenerate.Enabled = false; // Here is where we should have a collection that we can // bind to the grid and display information to the user if (radioButtonHGSS.Checked) { EggSeed.DefaultCellStyle.Format = "X8"; ShinyTaps.Visible = false; ShinyFlipSequence.Visible = false; ShinyFlips.Visible = false; ShinyOffset.Visible = true; } else if (radioButtonDPPt.Checked) { EggSeed.DefaultCellStyle.Format = "X8"; ShinyTaps.Visible = !checkBoxNoHappiness.Checked; ShinyFlipSequence.Visible = true; ShinyFlips.Visible = true; ShinyOffset.Visible = false; } dataGridViewShinyResults.Focus(); }
// This generates a single frame, using IVs recalled from a stored hashtable public List<Frame> Generate(FrameCompare frameCompare, uint seed, uint IVHash, uint frameNumber) { frames = new List<Frame>(); frame = Frame.GenerateFrame( FrameType.Method5Standard, frameNumber, seed, (IVHash & 0x1F), (IVHash & 0x3E0) >> 5, (IVHash & 0x7C00) >> 10, ((IVHash >> 16) & 0x3E0) >> 5, ((IVHash >> 16) & 0x7C00) >> 10, ((IVHash >> 16) & 0x1F)); if (frameCompare.Compare(frame)) { frames.Add(frame); } return frames; }
// Capture code begins here -- This is all of the good stuff for // captured Pokemon. private void buttonCapGenerate_Click(object sender, EventArgs e) { if (!uint.TryParse(maskedTextBoxID.Text, out id)) { id = 0; } if (!uint.TryParse(maskedTextBoxSID.Text, out sid)) { sid = 0; } iframes = new List<IFrameCapture>(); listBindingCap = new BindingSource {DataSource = iframes}; dataGridViewCapValues.DataSource = listBindingCap; waitHandle = new EventWaitHandle(true, EventResetMode.ManualReset); // We want to get our year and offset ranges here so // that we can have some values for our looping. // Default these to this value, but save to // the registry so we can not have to redo. uint maxDelay = 610; if (maskedTextBoxCapMaxDelay.Text != "") maxDelay = uint.Parse(maskedTextBoxCapMaxDelay.Text); uint minDelay = 600; if (maskedTextBoxCapMinDelay.Text != "") minDelay = uint.Parse(maskedTextBoxCapMinDelay.Text); var year = (uint) DateTime.Now.Year; if (maskedTextBoxCapYear.Text != "") { year = uint.Parse(maskedTextBoxCapYear.Text); // Need to validate the year here if (year < 2000) { MessageBox.Show("You must enter a year greater than 1999.", "Please Enter a Valid Year", MessageBoxButtons.OK); return; } } uint maxOffset = 1000; if (maskedTextBoxCapMaxOffset.Text != "") { maxOffset = uint.Parse(maskedTextBoxCapMaxOffset.Text); } else { maskedTextBoxCapMaxOffset.Text = "1000"; } uint minOffset = 1; if (maskedTextBoxCapMinOffset.Text != "") { minOffset = uint.Parse(maskedTextBoxCapMinOffset.Text); } else { maskedTextBoxCapMinOffset.Text = "1"; } if (minOffset > maxOffset) { maskedTextBoxCapMinOffset.Focus(); maskedTextBoxCapMinOffset.SelectAll(); return; } generator = new FrameGenerator { FrameType = (FrameType) ((ComboBoxItem) comboBoxMethod.SelectedItem).Reference, EncounterType = EncounterTypeCalc.EncounterString(comboBoxEncounterType.Text), EncounterMod = Objects.EncounterMod.Search, InitialFrame = minOffset, MaxResults = maxOffset }; // Now that each combo box item is a custom object containing the FrameType reference // We can simply retrieve the FrameType from the selected item uint minEfgh = (year - 2000) + minDelay; uint maxEfgh = (year - 2000) + maxDelay; // Build up a FrameComparer IVFilter ivfilter = ivFiltersCapture.IVFilter; 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 = new List<uint>(); for (int i = 0; i < comboBoxNature.CheckBoxItems.Count; i++) { if (comboBoxNature.CheckBoxItems[i].Checked) natures.Add((uint) (((Nature) comboBoxNature.CheckBoxItems[i].ComboBoxItem).Number)); } } if (((ComboBoxItem) comboBoxMethod.SelectedItem).Reference.Equals(FrameType.Method1) || ((ComboBoxItem) comboBoxMethod.SelectedItem).Reference.Equals(FrameType.ChainedShiny)) { Hour.Visible = true; EncounterMod.Visible = false; EncounterSlot.Visible = false; PID.Visible = true; Shiny.Visible = true; Nature.Visible = true; Ability.Visible = true; CapHP.Visible = true; CapAtk.Visible = true; CapDef.Visible = true; CapSpA.Visible = true; CapSpD.Visible = true; CapSpe.Visible = true; HiddenPower.Visible = true; HiddenPowerPower.Visible = true; f25.Visible = true; f50.Visible = true; f75.Visible = true; f125.Visible = true; frameCompare = new FrameCompare( ivfilter, natures, (int) ((ComboBoxItem) comboBoxAbility.SelectedItem).Reference, checkBoxShinyOnly.Checked, false, false, null, constructGenderFilter(comboBoxCapGender)); } if (((ComboBoxItem) comboBoxMethod.SelectedItem).Reference.Equals(FrameType.MethodJ) || ((ComboBoxItem) comboBoxMethod.SelectedItem).Reference.Equals(FrameType.MethodK)) { Hour.Visible = true; EncounterMod.Visible = true; EncounterSlot.Visible = generator.EncounterType != EncounterType.Stationary; PID.Visible = true; Shiny.Visible = true; Nature.Visible = true; Ability.Visible = true; CapHP.Visible = true; CapAtk.Visible = true; CapDef.Visible = true; CapSpA.Visible = true; CapSpD.Visible = true; CapSpe.Visible = true; HiddenPower.Visible = true; HiddenPowerPower.Visible = true; f25.Visible = true; f50.Visible = true; f75.Visible = true; f125.Visible = true; frameCompare = new FrameCompare( ivFiltersCapture.IVFilter, natures, (int) ((ComboBoxItem) comboBoxAbility.SelectedItem).Reference, checkBoxShinyOnly.Checked, false, false, encounterSlots, constructGenderFilter(comboBoxCapGender)); } if (((ComboBoxItem) comboBoxMethod.SelectedItem).Reference.Equals(FrameType.WondercardIVs)) { Hour.Visible = true; EncounterMod.Visible = false; 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; HiddenPower.Visible = true; HiddenPowerPower.Visible = true; f25.Visible = false; f50.Visible = false; f75.Visible = false; f125.Visible = false; frameCompare = new FrameCompare( ivfilter, null, -1, false, false, false, null, new NoGenderFilter()); } jobs = new Thread[1]; var hpList = new List<uint>(); var atkList = new List<uint>(); var defList = new List<uint>(); var spaList = new List<uint>(); var spdList = new List<uint>(); var speList = new List<uint>(); for (uint iv = 0; iv <= 31; iv++) { if (frameCompare.CompareIV(ivfilter.hpCompare, iv, ivfilter.hpValue)) hpList.Add(iv); if (frameCompare.CompareIV(ivfilter.atkCompare, iv, ivfilter.atkValue)) atkList.Add(iv); if (frameCompare.CompareIV(ivfilter.defCompare, iv, ivfilter.defValue)) defList.Add(iv); if (frameCompare.CompareIV(ivfilter.spaCompare, iv, ivfilter.spaValue)) spaList.Add(iv); if (frameCompare.CompareIV(ivfilter.spdCompare, iv, ivfilter.spdValue)) spdList.Add(iv); if (frameCompare.CompareIV(ivfilter.speCompare, iv, ivfilter.speValue)) speList.Add(iv); } if (natures == null) { natures = new List<uint>(); for (uint i = 0; i < 25; i++) natures.Add(i); } jobs[0] = new Thread(() => Generate4thGenCapJob(hpList, atkList, defList, spaList, spdList, speList, natures, minEfgh, maxEfgh)); jobs[0].Start(); progressTotal = (ulong) (hpList.Count*atkList.Count*defList.Count*spaList.Count*spdList.Count*speList.Count*natures.Count); var progressJob = new Thread(() => ManageProgress(listBindingCap, dataGridViewCapValues, generator.FrameType, 0)); progressJob.Start(); progressJob.Priority = ThreadPriority.Lowest; buttonCapGenerate.Enabled = false; dataGridViewCapValues.Focus(); }
private void buttonGenerate_Click(object sender, EventArgs e) { int year = DateTime.Now.Year; if (maskedTextBoxYear.Text != "") { year = int.Parse(maskedTextBoxYear.Text); // Need to validate the year here if (year < 2000) { MessageBox.Show("You must enter a year greater than 1999.", "Please Enter a Valid Year", MessageBoxButtons.OK); return; } } // We are going to need to make sure that // this matches the offset that we show // on the main frame screen so that people // will be able to see. // Default to 5, some users might want lower // so we should save this in the registry if (maskedTextBoxMinOffset.Text != "") { maskedTextBoxMaxOffset.Focus(); maskedTextBoxMinOffset.SelectAll(); } uint minOffset = uint.Parse(maskedTextBoxMinOffset.Text); //now with min and max to avoid annoying manual searching //default to single value search though if (maskedTextBoxMaxOffset.Text != "") { maskedTextBoxMaxOffset.Focus(); maskedTextBoxMinOffset.SelectAll(); } uint maxOffset = uint.Parse(maskedTextBoxMaxOffset.Text); if (minOffset > maxOffset) { maskedTextBoxMinOffset.Focus(); maskedTextBoxMinOffset.SelectAll(); return; } // Default these to this value, but save to // the registry so we can not have to redo. uint highdelay = 610; if (maskedTextBoxMaxDelay.Text != "") highdelay = uint.Parse(maskedTextBoxMaxDelay.Text); uint lowdelay = 600; if (maskedTextBoxMinDelay.Text != "") lowdelay = uint.Parse(maskedTextBoxMinDelay.Text); generator = new FrameGenerator(); var parentA = new uint[6]; var parentB = new uint[6]; if (maskedTextBoxHPA.Text == "") maskedTextBoxHPA.Text = "0"; if (maskedTextBoxAtkA.Text == "") maskedTextBoxAtkA.Text = "0"; if (maskedTextBoxDefA.Text == "") maskedTextBoxDefA.Text = "0"; if (maskedTextBoxSpAA.Text == "") maskedTextBoxSpAA.Text = "0"; if (maskedTextBoxSpDA.Text == "") maskedTextBoxSpDA.Text = "0"; if (maskedTextBoxSpeA.Text == "") maskedTextBoxSpeA.Text = "0"; if (maskedTextBoxHPB.Text == "") maskedTextBoxHPB.Text = "0"; if (maskedTextBoxAtkB.Text == "") maskedTextBoxAtkB.Text = "0"; if (maskedTextBoxDefB.Text == "") maskedTextBoxDefB.Text = "0"; if (maskedTextBoxSpAB.Text == "") maskedTextBoxSpAB.Text = "0"; if (maskedTextBoxSpDB.Text == "") maskedTextBoxSpDB.Text = "0"; if (maskedTextBoxSpeB.Text == "") maskedTextBoxSpeB.Text = "0"; 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]); frameCompare = new FrameCompare( parentA[0], parentA[1], parentA[2], parentA[3], parentA[4], parentA[5], parentB[0], parentB[1], parentB[2], parentB[3], parentB[4], parentB[5], ivFiltersEgg.IVFilter, null, -1, false, true, new NoGenderFilter()); generator.ParentA = parentA; generator.ParentB = parentB; // Toggled based on the users selection if (radioButtonEggDPPt.Checked) { generator.FrameType = FrameType.DPPtBred; Flips.HeaderText = "Flip Sequence"; Flips.DataPropertyName = "Flips"; } else { generator.FrameType = FrameType.HGSSBred; Flips.HeaderText = "Elm Sequence"; Flips.DataPropertyName = "ElmResponses"; } Date.Visible = false; generator.InitialFrame = minOffset; generator.MaxResults = ((maxOffset - minOffset) + 1U); iframesEggIVs = new List<IFrameBreeding>(); listBindingEgg = new BindingSource {DataSource = iframesEggIVs}; dataGridViewEggIVValues.DataSource = listBindingEgg; progressSearched = 0; progressFound = 0; progressTotal = (255*24*(highdelay - lowdelay + 1)*generator.MaxResults); waitHandle = new EventWaitHandle(true, EventResetMode.ManualReset); jobs = new Thread[1]; jobs[0] = new Thread(() => Generate4thGenEggIVsJob(lowdelay, highdelay, (uint) year)); jobs[0].Start(); Thread.Sleep(200); var progressJob = new Thread(() => ManageProgress(listBindingEgg, dataGridViewEggIVValues, generator.FrameType, 0)); progressJob.Start(); progressJob.Priority = ThreadPriority.Lowest; buttonCapGenerate.Enabled = false; buttonShinyGenerate.Enabled = false; buttonEggGenerate.Enabled = false; returnToResultsToolStripMenuItem.Visible = false; dataGridViewEggIVValues.Focus(); }
//-------------------------------------------------------------------------------------------------- private void buttonShinyGenerate_Click(object sender, EventArgs e) { //the main function for the shiny Time finder //check to make sure the user hasn't filled the text //boxes with exception-throwing garbage validateShinyInput(); if (checkBoxShinyDreamWorld.Checked && checkBoxShinyDittoParent.Checked) { MessageBox.Show("Unable to have Ditto parent and Dream World ability at the same time."); checkBoxShinyDittoParent.Focus(); return; } //read the user input from the form int year = Convert.ToInt32(maskedTextBoxShinyYear.Text); if (year < 2000 || year > 2099) { MessageBox.Show("Year must be between 2000 and 2099."); maskedTextBoxShinyYear.Focus(); return; } var months = new List<int>(); for (int month = 1; month <= 12; month++) { if (comboBoxShinyMonth.CheckBoxItems[month].Checked) months.Add(month); } if (months.Count == 0) { comboBoxShinyMonth.Focus(); return; } List<uint> nature = null; if (comboBoxShinyNature.SelectedIndex != 0) nature = new List<uint> {(uint) ((Nature) comboBoxShinyNature.SelectedItem).Number}; // Don't proceed without all DS Parameters if (!DSParametersInputCheck()) return; if (maskedTextBoxShinyMinFrame.Text == "") { maskedTextBoxShinyMinFrame.Focus(); maskedTextBoxShinyMinFrame.SelectAll(); return; } if (maskedTextBoxShinyMaxFrame.Text == "") { maskedTextBoxShinyMaxFrame.Focus(); maskedTextBoxShinyMaxFrame.SelectAll(); return; } var parentA = new uint[6]; var parentB = new uint[6]; uint.TryParse(maskedTextBoxShinyHPParentA.Text, out parentA[0]); uint.TryParse(maskedTextBoxShinyAtkParentA.Text, out parentA[1]); uint.TryParse(maskedTextBoxShinyDefParentA.Text, out parentA[2]); uint.TryParse(maskedTextBoxShinySpAParentA.Text, out parentA[3]); uint.TryParse(maskedTextBoxShinySpDParentA.Text, out parentA[4]); uint.TryParse(maskedTextBoxShinySpeParentA.Text, out parentA[5]); uint.TryParse(maskedTextBoxShinyHPParentB.Text, out parentB[0]); uint.TryParse(maskedTextBoxShinyAtkParentB.Text, out parentB[1]); uint.TryParse(maskedTextBoxShinyDefParentB.Text, out parentB[2]); uint.TryParse(maskedTextBoxShinySpAParentB.Text, out parentB[3]); uint.TryParse(maskedTextBoxShinySpDParentB.Text, out parentB[4]); uint.TryParse(maskedTextBoxShinySpeParentB.Text, out parentB[5]); uint minFrame; uint maxFrame; uint.TryParse(maskedTextBoxShinyMinFrame.Text, out minFrame); uint.TryParse(maskedTextBoxShinyMaxFrame.Text, out maxFrame); if (minFrame > maxFrame) { maskedTextBoxShinyMinFrame.Focus(); maskedTextBoxShinyMinFrame.SelectAll(); return; } generator = new FrameGenerator {FrameType = FrameType.Method5Standard, InitialFrame = 8, MaxResults = 1}; shinygenerator = new FrameGenerator { FrameType = !checkBoxIntlParents.Checked ? FrameType.BWBred : FrameType.BWBredInternational, ParentA = parentA, ParentB = parentB, SynchNature = ((Nature) comboBoxShinyEverstoneNature.SelectedItem).Number, InitialFrame = minFrame, MaxResults = maxFrame - minFrame + 1, DittoUsed = checkBoxShinyDittoParent.Checked, MaleOnlySpecies = cbNidoBeat.Checked, ShinyCharm = cbShinyCharm.Visible && cbShinyCharm.Checked }; frameCompare = new FrameCompare( null, null, -1, false, false, false, null, new NoGenderFilter()); subFrameCompare = new FrameCompare( ivFiltersEggs.IVFilter, nature, (int) ((ComboBoxItem) comboBoxShinyAbility.SelectedItem).Reference, checkBoxShinyShinyOnly.Checked, false, checkBoxShinyDreamWorld.Checked, null, (GenderFilter) (comboBoxShinyGender.SelectedItem)); // Here we check the parent IVs // To make sure they even have a chance of producing the desired spread int parentPassCount = 0; for (int i = 0; i < 6; i++) { if (subFrameCompare.CompareIV(i, parentA[i]) || subFrameCompare.CompareIV(i, parentB[i])) { parentPassCount++; } } if (parentPassCount < 3) { MessageBox.Show("The parent IVs you have listed cannot produce your desired search results."); return; } iframesEgg = new List<IFrameCapture>(); listBindingEgg = new BindingSource {DataSource = iframesEgg}; dataGridViewShinyResults.DataSource = listBindingEgg; var profile = (Profile) comboBoxProfiles.SelectedItem; List<List<ButtonComboType>> keypresses = profile.GetKeypresses(); bool fastSearch = FastEggFilters() && eggSeeds != null && eggSeeds.Count > 0; // && FastEggFrames() int dayTotal = months.Sum(month => DateTime.DaysInMonth(year, month)); progressTotal = (ulong) (dayTotal*86400*keypresses.Count*(profile.Timer0Max - profile.Timer0Min + 1)*(maxFrame - minFrame + 1)); float interval = ((float) 24/cpus + (float) 0.05); var hourMin = new int[cpus]; var hourMax = new int[cpus]; jobs = new Thread[cpus]; generators = new FrameGenerator[cpus]; shinygenerators = new FrameGenerator[cpus]; waitHandle = new EventWaitHandle(true, EventResetMode.ManualReset); for (int i = 0; i < jobs.Length; i++) { hourMin[i] = (int) (interval*i); hourMax[i] = (int) (interval*(i + 1) - 1); if (hourMax[i] > 23) { hourMax[i] = 23; } } for (int i = 0; i < jobs.Length; i++) { generators[i] = generator.Clone(); if (shinygenerator != null) { shinygenerators[i] = shinygenerator.Clone(); } //copy to prevent issues with i being incremented before the call int i1 = i; jobs[i] = new Thread( () => GenerateShinyJob((uint) year, months, hourMin[i1], hourMax[i1], profile, keypresses, fastSearch, i1)); jobs[i].Start(); // for some reason not making the thread sleep causes issues with updating dayMin\Max Thread.Sleep(200); } var progressJob = new Thread( () => ManageProgress(listBindingEgg, dataGridViewShinyResults, shinygenerator.FrameType, 2000)); progressJob.Start(); progressJob.Priority = ThreadPriority.Lowest; buttonCapGenerate.Enabled = false; buttonShinyGenerate.Enabled = false; dataGridViewShinyResults.Focus(); }
public void Add(FrameCompare comparer) { comparers.Add(comparer); }
private void buttonGenerateEIVs_Click(object sender, EventArgs e) { const uint seed = 0x0; var parentA = new uint[6]; var parentB = new uint[6]; uint.TryParse(textEIVParentA_HP.Text, out parentA[0]); uint.TryParse(textEIVParentA_Atk.Text, out parentA[1]); uint.TryParse(textEIVParentA_Def.Text, out parentA[2]); uint.TryParse(textEIVParentA_SpA.Text, out parentA[3]); uint.TryParse(textEIVParentA_SpD.Text, out parentA[4]); uint.TryParse(textEIVParentA_Spe.Text, out parentA[5]); uint.TryParse(textEIVParentB_HP.Text, out parentB[0]); uint.TryParse(textEIVParentB_Atk.Text, out parentB[1]); uint.TryParse(textEIVParentB_Def.Text, out parentB[2]); uint.TryParse(textEIVParentB_SpA.Text, out parentB[3]); uint.TryParse(textEIVParentB_SpD.Text, out parentB[4]); uint.TryParse(textEIVParentB_Spe.Text, out parentB[5]); uint maxPickupFrame; uint minPickupFrame; if (!ParseInputD(textEIVMinFrame, out minPickupFrame) || !ParseInputD(textEIVMaxFrame, out maxPickupFrame)) return; if (minPickupFrame > maxPickupFrame) { textEIVMinFrame.Focus(); textEIVMinFrame.SelectAll(); return; } ivGenerator = new FrameGenerator(); if (radioButtonEIVSplit.Checked) ivGenerator.FrameType = FrameType.BredSplit; else if (radioButtonEIVAlternate.Checked) ivGenerator.FrameType = FrameType.BredAlternate; else ivGenerator.FrameType = FrameType.Bred; ivGenerator.InitialFrame = minPickupFrame; ivGenerator.MaxResults = maxPickupFrame - minPickupFrame + 1; ivGenerator.InitialSeed = seed; ivGenerator.ParentA = parentA; ivGenerator.ParentB = parentB; subFrameCompare = new FrameCompare( parentA[0], parentA[1], parentA[2], parentA[3], parentA[4], parentA[5], parentB[0], parentB[1], parentB[2], parentB[3], parentB[4], parentB[5], ivFiltersEEgg.IVFilter, null, -1, false, true, new NoGenderFilter()); // Here we check the parent IVs // To make sure they even have a chance of producing the desired spread int parentPassCount = 0; for (int i = 0; i < 6; i++) { if (subFrameCompare.CompareIV(i, parentA[i]) || subFrameCompare.CompareIV(i, parentB[i])) { parentPassCount++; } } if (parentPassCount < 3) { MessageBox.Show("The parent IVs you have listed cannot produce your desired search results."); return; } iframesEEggIV = new List<IFrameEEggPID>(); listBindingEggEIV = new BindingSource {DataSource = iframesEEggIV}; dataGridViewEIVs.DataSource = listBindingEggEIV; progressSearched = 0; progressFound = 0; progressTotal = 0; waitHandle = new EventWaitHandle(true, EventResetMode.ManualReset); jobs = new Thread[1]; jobs[0] = new Thread(Generate3rdGenEIVJob); jobs[0].Start(); Thread.Sleep(200); var progressJob = new Thread( () => ManageProgress(listBindingEggEIV, dataGridViewEIVs, ivGenerator.FrameType, 0)); progressJob.Start(); progressJob.Priority = ThreadPriority.Lowest; buttonShiny3rdGenerate.Enabled = false; }
private void buttonGenerateEPIDs_Click(object sender, EventArgs e) { const uint seed = 0x0; if (textEPIDID.Text != "") { ParseInputD(textEPIDID, out id); } if (textEPIDSID.Text != "") { ParseInputD(textEPIDSID, out sid); } uint maxHeldFrame; uint minHeldFrame; uint minRedraw; uint maxRedraw; uint calibration; if (!ParseInputD(textEPIDMinFrame, out minHeldFrame) || !ParseInputD(textEPIDMinFrame, out minHeldFrame) || !ParseInputD(textEPIDMaxFrame, out maxHeldFrame) || !ParseInputD(textEPIDMinRedraws, out minRedraw) || !ParseInputD(textEPIDMaxRedraws, out maxRedraw) || !ParseInputD(textEPIDCalibration, out calibration)) return; if (minHeldFrame > maxHeldFrame) { maskedTextBox3rdHeldMinFrame.Focus(); maskedTextBox3rdHeldMinFrame.SelectAll(); return; } lowerGenerator = new FrameGenerator(); switch (comboEPIDCompatibility.SelectedIndex) { case 1: lowerGenerator.Compatibility = 50; break; case 2: lowerGenerator.Compatibility = 70; break; default: lowerGenerator.Compatibility = 20; break; } lowerGenerator.FrameType = FrameType.EBredPID; lowerGenerator.InitialFrame = minHeldFrame; lowerGenerator.MaxResults = maxHeldFrame - minHeldFrame + 1 + 3*(maxRedraw - minRedraw); lowerGenerator.InitialSeed = seed; List<uint> natures = null; if (comboEPIDNature.Text != "Any" && comboEPIDNature.CheckBoxItems.Count > 0) { natures = new List<uint>(); for (int i = 0; i < comboEPIDNature.CheckBoxItems.Count; i++) { if (comboEPIDNature.CheckBoxItems[i].Checked) natures.Add((uint) ((Nature) comboEPIDNature.CheckBoxItems[i].ComboBoxItem).Number); } } if (comboEPIDEverstone.SelectedIndex != 0) { lowerGenerator.Everstone = true; lowerGenerator.SynchNature = ((Nature) comboEPIDEverstone.SelectedItem).Number; Advances.Visible = true; } else Advances.Visible = false; frameCompare = new FrameCompare( 0, CompareType.None, 0, CompareType.None, 0, CompareType.None, 0, CompareType.None, 0, CompareType.None, 0, CompareType.None, natures, (int) ((ComboBoxItem) comboEPIDAbility.SelectedItem).Reference, checkEPIDShiny.Checked, false, false, null, (GenderFilter) (comboEPIDGender.SelectedItem)); // Here we check the parent IVs // To make sure they even have a chance of producing the desired spread iframesEEgg = new List<IFrameEEggPID>(); listBindingEggEPID = new BindingSource {DataSource = iframesEEgg}; dataGridViewEPIDs.DataSource = listBindingEggEPID; progressSearched = 0; progressFound = 0; progressTotal = 0; waitHandle = new EventWaitHandle(true, EventResetMode.ManualReset); jobs = new Thread[1]; jobs[0] = new Thread(() => Generate3rdGenEPIDJob(calibration, minRedraw, maxRedraw)); jobs[0].Start(); Thread.Sleep(200); var progressJob = new Thread( () => ManageProgress(listBindingEggEPID, dataGridViewEPIDs, lowerGenerator.FrameType, 0)); progressJob.Start(); progressJob.Priority = ThreadPriority.Lowest; buttonShiny3rdGenerate.Enabled = false; }
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() { 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(); }
public void Remove(FrameCompare comparer) { comparers.Remove(comparer); }
public List<Frame> Generate( FrameCompare frameCompare, uint hp, uint atk, uint def, uint spa, uint spd, uint spe, List<uint> natures, uint minEfgh, uint maxEfgh, uint id, uint sid) { frames = new List<Frame>(); var candidates = new List<Frame>(); var rng = new PokeRngR(0); uint x_test = spe | (spa << 5) | (spd << 10); uint y_test = hp | (atk << 5) | (def << 10); #region // Experimentally derived // Any possible test seed will have at most // a difference of 0x31 from the target seed. // If it's close enough, we can then modify it // to match. /* for (uint cnt = 0xFFFF; cnt > 0xF2CC; cnt--) { uint seed = (x_test << 16) | cnt; // Do a quick search for matching seeds // with a lower 16-bits between 0xFFFF and 0xF2CD. // We'll take the closest matches and subtract 0xD33 // until it produces the correct seed (or doesn't). // Best we can do until we find a way to // calculate them directly. rng.Seed = seed; ushort rng1 = rng.GetNext16BitNumber(); // We don't have to worry about unsigned overflow // because y_test is never more than 0x7FFF if (y_test < 0x31) { if (rng1 <= (y_test - 0x31)) { while ((seed & 0xFFFF) > 0xD32 && (rng1 & 0x7FFF) < y_test) { seed = seed - 0xD33; rng.Seed = seed; rng1 = rng.GetNext16BitNumber(); } } } else { if (rng1 >= (y_test - 0x31)) { while ((seed & 0xFFFF) > 0xD32 && (rng1 & 0x7FFF) < y_test) { seed = seed - 0xD33; rng.Seed = seed; rng1 = rng.GetNext16BitNumber(); } } } */ #endregion for (uint cnt = 0x0; cnt < 0xFFFF; cnt++) { uint seed = (x_test << 16) | cnt; rng.Seed = seed; ushort rng1 = rng.GetNext16BitNumber(); // Check to see if the next frame yields // the HP, Attack, and Defense IVs we're searching for // If not, skip 'em. if ((rng1 & 0x7FFF) != y_test) continue; // We have a max of 5 total RNG calls // to make a pokemon and we already have // one so lets go ahead and get 4 more. uint seedWondercard = rng.GetNext32BitNumber(); var rng2 = (ushort) (seedWondercard >> 16); ushort rng3 = rng.GetNext16BitNumber(); ushort rng4 = rng.GetNext16BitNumber(); uint method1Seed = rng.Seed; // Instead of re-searching the entire space for seeds that are // basically identical except for the upper bit, we'll // just flip the upper seed bits instead. for (int upperBit = 0; upperBit < 2; upperBit++) { rng2 = (ushort) (rng2 ^ 0x8000); rng3 = (ushort) (rng3 ^ 0x8000); rng4 = (ushort) (rng4 ^ 0x8000); method1Seed = method1Seed ^ 0x80000000; rng.Seed = rng.Seed ^ 0x80000000; if (frameType == FrameType.WondercardIVs) { seedWondercard = seedWondercard ^ 0x80000000; frame = Frame.GenerateFrame(seedWondercard, frameType, EncounterType, 0, seedWondercard, 0, 0, rng1, x_test, id, sid, 0, 0); candidates.Add(frame); } foreach (uint nature in natures) { if (frameType == FrameType.ChainedShiny) { var testRng = new PokeRngR(rng.Seed); var rngCalls = new uint[15]; rngCalls[0] = rng2; rngCalls[1] = rng3; rngCalls[2] = rng4; for (int calls = 3; calls < 15; calls++) { rngCalls[calls] = testRng.GetNext16BitNumber(); } testRng.GetNext32BitNumber(); testRng.GetNext32BitNumber(); uint chainedPIDLower = Functions.ChainedPIDLower( rngCalls[14], rngCalls[0], rngCalls[1], rngCalls[2], rngCalls[3], rngCalls[4], rngCalls[5], rngCalls[6], rngCalls[7], rngCalls[8], rngCalls[9], rngCalls[10], rngCalls[11], rngCalls[12]); uint chainedPIDUpper = Functions.ChainedPIDUpper(rngCalls[13], chainedPIDLower, id, sid); if (IVtoSeed.CheckPID(chainedPIDUpper, chainedPIDLower, nature)) { frame = Frame.GenerateFrame(testRng.Seed, frameType, EncounterType, 0, testRng.Seed, chainedPIDLower, chainedPIDUpper, rng1, x_test, id, sid, 0, 0); candidates.Add(frame); } } if (frameType == FrameType.Method1) { // Check Method 1 // [PID] [PID] [IVs] [IVs] // [rng3] [rng2] [rng1] [START] if (IVtoSeed.CheckPID(rng2, rng3, nature)) { frame = Frame.GenerateFrame(method1Seed, frameType, EncounterType, 0, method1Seed, rng3, rng2, rng1, x_test, id, sid, 0, 0); candidates.Add(frame); } } if (frameType == FrameType.MethodJ) { // Check Method 1, then roll back to see if it is a hittable frame if (IVtoSeed.CheckPID(rng2, rng3, nature)) { var testRng = new PokeRngR(rng.Seed); uint testPid; uint nextRng = rng4; uint nextRng2 = testRng.GetNext32BitNumber(); uint slot = 0; // A spread is only made accessible if there are no other PIDs between // it and the calling frame that have the same nature as the spread. do { bool skipFrame = false; // Check to see if this is a valid non-Synch calling frame // If it is, we won't bother checking it with Synch because it works either way if (nextRng/0xA3E == nature) { uint testSeed = testRng.Seed; var encounterMod = EncounterMod.None; if (EncounterType != EncounterType.Stationary) { testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; slot = nextRng2; if (EncounterType == EncounterType.WildSurfing) { slot = testSeed; testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; } else if (EncounterType == EncounterType.WildOldRod) { slot = testSeed; testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; uint nibble = (testSeed >> 16)/656; if (nibble <= 48) { if (nibble > 24) { encounterMod = EncounterMod.SuctionCups; } testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; } else skipFrame = true; } else if (EncounterType == EncounterType.WildGoodRod) { slot = testSeed; testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; uint nibble = (testSeed >> 16)/656; if (nibble <= 98) { if (nibble > 49) { encounterMod = EncounterMod.SuctionCups; } testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; } else skipFrame = true; } else if (EncounterType == EncounterType.WildSuperRod) { slot = testSeed; testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; uint nibble = (testSeed >> 16)/656; if (nibble <= 99) { if (nibble > 74) { encounterMod = EncounterMod.SuctionCups; } testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; } else skipFrame = true; } } if (!skipFrame) { frame = Frame.GenerateFrame(testSeed, frameType, EncounterType, 0, testSeed, rng3, rng2, rng1, x_test, id, sid, 0, 0); frame.EncounterSlot = EncounterSlotCalc.encounterSlot(slot, frameType, EncounterType); frame.EncounterMod = encounterMod; candidates.Add(frame); } // Check if the frame appears as the result of a failed Synch if (nextRng2 >> 31 == 1) { if (EncounterType == EncounterType.WildOldRod) { uint nibble = (testSeed >> 16)/656; if (nibble > 24) { skipFrame = true; } } else if (EncounterType == EncounterType.WildGoodRod) { uint nibble = (testSeed >> 16)/656; if (nibble > 49) { skipFrame = true; } } else if (EncounterType == EncounterType.WildSuperRod) { uint nibble = (testSeed >> 16)/656; if (nibble > 74) { skipFrame = true; } } slot = slot*0xeeb9eb65 + 0xa3561a1; testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; if (!skipFrame) { frame = Frame.GenerateFrame(testSeed, frameType, EncounterType, 0, testSeed, rng3, rng2, rng1, x_test, id, sid, 0, 0); frame.EncounterSlot = EncounterSlotCalc.encounterSlot(slot, frameType, EncounterType); frame.EncounterMod = EncounterMod.Synchronize; candidates.Add(frame); } } } // Check to see if the spread is hittable with Synchronize else if (nextRng >> 15 == 0) { uint testSeed = testRng.Seed; if (EncounterType != EncounterType.Stationary) { testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; slot = nextRng2; if (EncounterType == EncounterType.WildSurfing) { slot = testSeed; testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; } else if (EncounterType == EncounterType.WildOldRod) { slot = testSeed; testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; uint nibble = (testSeed >> 16)/656; if (nibble > 24) { skipFrame = true; } else { testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; } } else if (EncounterType == EncounterType.WildGoodRod) { slot = testSeed; testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; uint nibble = (testSeed >> 16)/656; if (nibble > 49) { skipFrame = true; } else { testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; } } else if (EncounterType == EncounterType.WildSuperRod) { slot = testSeed; testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; uint nibble = (testSeed >> 16)/656; if (nibble > 74) { skipFrame = true; } else { testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; } } } if (!skipFrame) { frame = Frame.GenerateFrame(testSeed, frameType, EncounterType, 0, testSeed, rng3, rng2, rng1, x_test, id, sid, 0, 0); frame.Synchable = true; frame.EncounterMod = EncounterMod.Synchronize; frame.EncounterSlot = EncounterSlotCalc.encounterSlot(slot, frameType, EncounterType); candidates.Add(frame); } } testPid = (nextRng << 16) | nextRng2 >> 16; nextRng = testRng.GetNext16BitNumber(); nextRng2 = testRng.GetNext32BitNumber(); } while (testPid%25 != nature); } // Check DPPt Cute Charm (female) // [CC Check] [PID] [IVs] [IVs] // [rng3] [rng2] [rng1] [START] if (rng3/0x5556 != 0) { uint CCSeed; uint slot = 0; bool skipFrame = false; if (EncounterType == EncounterType.Stationary) CCSeed = method1Seed; else { CCSeed = method1Seed*0xeeb9eb65 + 0xa3561a1; slot = method1Seed; if (EncounterType == EncounterType.WildSurfing) { CCSeed = CCSeed*0xeeb9eb65 + 0xa3561a1; slot = slot*0xeeb9eb65 + 0xa3561a1; } else if (EncounterType == EncounterType.WildOldRod) { CCSeed = CCSeed*0xeeb9eb65 + 0xa3561a1; slot = slot*0xeeb9eb65 + 0xa3561a1; if ((CCSeed >> 16)/656 > 24) skipFrame = true; else CCSeed = CCSeed*0xeeb9eb65 + 0xa3561a1; } else if (EncounterType == EncounterType.WildGoodRod) { CCSeed = CCSeed*0xeeb9eb65 + 0xa3561a1; slot = slot*0xeeb9eb65 + 0xa3561a1; if ((CCSeed >> 16)/656 > 49) skipFrame = true; else CCSeed = CCSeed*0xeeb9eb65 + 0xa3561a1; } else if (EncounterType == EncounterType.WildSuperRod) { CCSeed = CCSeed*0xeeb9eb65 + 0xa3561a1; slot = slot*0xeeb9eb65 + 0xa3561a1; if ((CCSeed >> 16)/656 > 74) skipFrame = true; else CCSeed = CCSeed*0xeeb9eb65 + 0xa3561a1; } } // Each gender ratio has a different // unbiased (non-nature-affective) number that is // added to the PID var choppedPID = (ushort) (rng2/0xA3E); if (!skipFrame && IVtoSeed.CheckPID(0, choppedPID, nature)) { foreach (uint buffer in Functions.UnbiasedBuffer) { frame = Frame.GenerateFrame(CCSeed, frameType, EncounterType, 0, CCSeed, choppedPID + buffer, 0, rng1, x_test, id, sid, 0, 0); frame.EncounterSlot = EncounterSlotCalc.encounterSlot(slot, frameType, EncounterType); switch (buffer) { case 0x0: frame.EncounterMod = EncounterMod.CuteCharmFemale; break; case 0x96: frame.EncounterMod = EncounterMod.CuteCharm50M; break; case 0xC8: frame.EncounterMod = EncounterMod.CuteCharm25M; break; case 0x4B: frame.EncounterMod = EncounterMod.CuteCharm75M; break; case 0x32: frame.EncounterMod = EncounterMod.CuteCharm875M; break; default: frame.EncounterMod = EncounterMod.CuteCharm; break; } candidates.Add(frame); } } } } else if (frameType == FrameType.MethodK) { // Check Method 1, then roll back to see if it is a hittable frame if (IVtoSeed.CheckPID(rng2, rng3, nature)) { var testRng = new PokeRngR(rng.Seed); uint testPid; uint nextRng = rng4; uint nextRng2 = testRng.GetNext32BitNumber(); uint slot = 0; // A spread is only made accessible if there are no other PIDs between // it and the calling frame that have the same nature as the spread. do { bool skipFrame = false; // Check to see if this is a valid non-Synch calling frame // If it is, we won't bother checking it with Synch because it works either way if (nextRng%25 == nature) { uint testSeed = testRng.Seed; var encounterMod = EncounterMod.None; if (EncounterType != EncounterType.Stationary) { testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; slot = nextRng2; if (EncounterType == EncounterType.WildSurfing || EncounterType == EncounterType.BugCatchingContest || EncounterType == EncounterType.Headbutt) { slot = testSeed; testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; } else if (EncounterType == EncounterType.WildOldRod) { slot = testSeed; testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; uint nibble = (testSeed >> 16)%100; if (nibble <= 48) { if (nibble > 24) { encounterMod = EncounterMod.SuctionCups; } testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; } else skipFrame = true; } else if (EncounterType == EncounterType.WildGoodRod) { slot = testSeed; testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; uint nibble = (testSeed >> 16)%100; if (nibble <= 98) { if (nibble > 49) { encounterMod = EncounterMod.SuctionCups; } testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; } else skipFrame = true; } else if (EncounterType == EncounterType.WildSuperRod) { slot = testSeed; testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; uint nibble = (testSeed >> 16)%100; if (nibble <= 99) { if (nibble > 74) { encounterMod = EncounterMod.SuctionCups; } testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; } else skipFrame = true; } } if (!skipFrame) { frame = Frame.GenerateFrame(testSeed, frameType, EncounterType, 0, testSeed, rng3, rng2, rng1, x_test, id, sid, 0, 0); frame.EncounterSlot = EncounterSlotCalc.encounterSlot(slot, frameType, EncounterType); frame.EncounterMod = encounterMod; candidates.Add(frame); } // Check if the frame appears as the result of a failed Synch if (((nextRng2 >> 16) & 1) == 1) { if (EncounterType == EncounterType.WildOldRod) { uint nibble = (testSeed >> 16)%100; if (nibble > 24) { skipFrame = true; } } else if (EncounterType == EncounterType.WildGoodRod) { uint nibble = (testSeed >> 16)%100; if (nibble > 49) { skipFrame = true; } } else if (EncounterType == EncounterType.WildSuperRod) { uint nibble = (testSeed >> 16)%100; if (nibble > 74) { skipFrame = true; } } slot = slot*0xeeb9eb65 + 0xa3561a1; testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; if (!skipFrame) { frame = Frame.GenerateFrame(testSeed, frameType, EncounterType, 0, testSeed, rng3, rng2, rng1, x_test, id, sid, 0, 0); frame.EncounterSlot = EncounterSlotCalc.encounterSlot(slot, frameType, EncounterType); frame.EncounterMod = EncounterMod.Synchronize; candidates.Add(frame); } } } // Check to see if the spread is hittable with Synchronize else if ((nextRng & 1) == 0) { uint testSeed = testRng.Seed; if (EncounterType != EncounterType.Stationary) { testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; slot = nextRng2; if (EncounterType == EncounterType.WildSurfing || EncounterType == EncounterType.BugCatchingContest || EncounterType == EncounterType.Headbutt) { slot = testSeed; testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; } else if (EncounterType == EncounterType.WildOldRod) { slot = testSeed; testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; uint nibble = (testSeed >> 16)%100; if (nibble > 24) { skipFrame = true; } else { testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; } } else if (EncounterType == EncounterType.WildGoodRod) { slot = testSeed; testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; uint nibble = (testSeed >> 16)%100; if (nibble > 49) { skipFrame = true; } else { testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; } } else if (EncounterType == EncounterType.WildSuperRod) { slot = testSeed; testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; uint nibble = (testSeed >> 16)%100; if (nibble > 74) { skipFrame = true; } else { testSeed = testSeed*0xeeb9eb65 + 0xa3561a1; } } } if (!skipFrame) { frame = Frame.GenerateFrame(testSeed, frameType, EncounterType, 0, testSeed, rng3, rng2, rng1, x_test, id, sid, 0, 0); frame.Synchable = true; frame.EncounterMod = EncounterMod.Synchronize; frame.EncounterSlot = EncounterSlotCalc.encounterSlot(slot, frameType, EncounterType); candidates.Add(frame); } } testPid = (nextRng << 16) | nextRng2 >> 16; nextRng = testRng.GetNext16BitNumber(); nextRng2 = testRng.GetNext32BitNumber(); } while (testPid%25 != nature); } if (rng3%3 != 0) { uint CCSeed; uint slot = 0; bool skipFrame = false; if (EncounterType == EncounterType.Stationary) CCSeed = method1Seed; else { CCSeed = method1Seed*0xeeb9eb65 + 0xa3561a1; slot = method1Seed; if (EncounterType == EncounterType.WildSurfing || EncounterType == EncounterType.BugCatchingContest) { CCSeed = CCSeed*0xeeb9eb65 + 0xa3561a1; slot = slot*0xeeb9eb65 + 0xa3561a1; } else if (EncounterType == EncounterType.WildOldRod) { CCSeed = CCSeed*0xeeb9eb65 + 0xa3561a1; slot = slot*0xeeb9eb65 + 0xa3561a1; if ((CCSeed >> 16)%100 > 24) skipFrame = true; else CCSeed = CCSeed*0xeeb9eb65 + 0xa3561a1; } else if (EncounterType == EncounterType.WildGoodRod) { CCSeed = CCSeed*0xeeb9eb65 + 0xa3561a1; slot = slot*0xeeb9eb65 + 0xa3561a1; if ((CCSeed >> 16)%100 > 49) skipFrame = true; else CCSeed = CCSeed*0xeeb9eb65 + 0xa3561a1; } else if (EncounterType == EncounterType.WildSuperRod) { CCSeed = CCSeed*0xeeb9eb65 + 0xa3561a1; slot = slot*0xeeb9eb65 + 0xa3561a1; if ((CCSeed >> 16)%100 > 74) skipFrame = true; else CCSeed = CCSeed*0xeeb9eb65 + 0xa3561a1; } } // Check HGSS Cute Charm // [CC Check] [PID] [IVs] [IVs] // [rng3] [rng2] [rng1] [START] // Each gender ratio has a different // unbiased (non-nature-affective) number that is // added to the PID var choppedPID = (ushort) (rng2%25); if (!skipFrame && IVtoSeed.CheckPID(0, choppedPID, nature)) { foreach (uint buffer in Functions.UnbiasedBuffer) { frame = Frame.GenerateFrame(CCSeed, frameType, EncounterType, 0, CCSeed, choppedPID + buffer, 0, rng1, x_test, id, sid, 0, 0); frame.EncounterSlot = EncounterSlotCalc.encounterSlot(slot, frameType, EncounterType); switch (buffer) { case 0x0: frame.EncounterMod = EncounterMod.CuteCharmFemale; break; case 0x96: frame.EncounterMod = EncounterMod.CuteCharm50M; break; case 0xC8: frame.EncounterMod = EncounterMod.CuteCharm25M; break; case 0x4B: frame.EncounterMod = EncounterMod.CuteCharm75M; break; case 0x32: frame.EncounterMod = EncounterMod.CuteCharm875M; break; default: frame.EncounterMod = EncounterMod.CuteCharm; break; } candidates.Add(frame); } } } } } } } // Now that we have some possibilities for frames, // We'll filter out ones that don't meet user criteria // Then roll back the RNG for each of them to make sure // each is within the user-specified maximum frames // from a DPPtHGSS-style seed. foreach (Frame candidate in candidates) { if (frameCompare.Compare(candidate)) { // start backing up frames until the user-specified max rng.Seed = candidate.Seed; const uint start = 1; for (uint backCount = start; backCount <= MaxResults; backCount++) { uint testSeed = rng.Seed; //uint seedAB = testSeed >> 24; uint seedCD = (testSeed & 0x00FF0000) >> 16; uint seedEFGH = testSeed & 0x0000FFFF; // Check to see if seed follows ABCDEFGH format // And matches-user specified delay if (seedEFGH > minEfgh && seedEFGH < maxEfgh) { // CD must be between 0-23 if (seedCD < 23) { if (backCount >= InitialFrame) { Frame frameCopy = Frame.Clone(candidate); frameCopy.Seed = testSeed; frameCopy.Number = backCount; frames.Add(frameCopy); } } } rng.GetNext32BitNumber(); } } } return frames; }
private void buttonShiny3rdGenerate_Click(object sender, EventArgs e) { // seed used by all Ruby\Sapphire cartridges when the internal battery is dead const uint seed = 0x05A0; if (maskedTextBoxShiny3rdID.Text != "") { id = ushort.Parse(maskedTextBoxShiny3rdID.Text); } if (maskedTextBoxShiny3rdSID.Text != "") { sid = ushort.Parse(maskedTextBoxShiny3rdSID.Text); } var parentA = new uint[6]; var parentB = new uint[6]; uint.TryParse(maskedTextBoxShiny3rdParentA_HP.Text, out parentA[0]); uint.TryParse(maskedTextBoxShiny3rdParentA_Atk.Text, out parentA[1]); uint.TryParse(maskedTextBoxShiny3rdParentA_Def.Text, out parentA[2]); uint.TryParse(maskedTextBoxShiny3rdParentA_SpA.Text, out parentA[3]); uint.TryParse(maskedTextBoxShiny3rdParentA_SpD.Text, out parentA[4]); uint.TryParse(maskedTextBoxShiny3rdParentA_Spe.Text, out parentA[5]); uint.TryParse(maskedTextBoxShiny3rdParentB_HP.Text, out parentB[0]); uint.TryParse(maskedTextBoxShiny3rdParentB_Atk.Text, out parentB[1]); uint.TryParse(maskedTextBoxShiny3rdParentB_Def.Text, out parentB[2]); uint.TryParse(maskedTextBoxShiny3rdParentB_SpA.Text, out parentB[3]); uint.TryParse(maskedTextBoxShiny3rdParentB_SpD.Text, out parentB[4]); uint.TryParse(maskedTextBoxShiny3rdParentB_Spe.Text, out parentB[5]); uint maxHeldFrame; uint maxPickupFrame; uint minHeldFrame; uint minPickupFrame; if (!uint.TryParse(maskedTextBox3rdHeldMinFrame.Text, out minHeldFrame)) { maskedTextBox3rdHeldMinFrame.Focus(); maskedTextBox3rdHeldMinFrame.SelectAll(); return; } if (!uint.TryParse(maskedTextBox3rdPickupMinFrame.Text, out minPickupFrame)) { maskedTextBox3rdPickupMinFrame.Focus(); maskedTextBox3rdPickupMinFrame.SelectAll(); return; } if (!uint.TryParse(maskedTextBox3rdHeldMaxFrame.Text, out maxHeldFrame)) { maskedTextBox3rdHeldMaxFrame.Focus(); maskedTextBox3rdHeldMaxFrame.SelectAll(); return; } if (!uint.TryParse(maskedTextBox3rdPickupMaxFrame.Text, out maxPickupFrame)) { maskedTextBox3rdPickupMaxFrame.Focus(); maskedTextBox3rdPickupMaxFrame.SelectAll(); return; } if (minHeldFrame > maxHeldFrame) { maskedTextBox3rdHeldMinFrame.Focus(); maskedTextBox3rdHeldMinFrame.SelectAll(); return; } if (minPickupFrame > maxPickupFrame) { maskedTextBox3rdPickupMinFrame.Focus(); maskedTextBox3rdPickupMinFrame.SelectAll(); return; } lowerGenerator = new FrameGenerator(); ivGenerator = new FrameGenerator(); if (comboBoxParentCompatibility.SelectedIndex == 1) { lowerGenerator.Compatibility = 50; } else if (comboBoxParentCompatibility.SelectedIndex == 2) { lowerGenerator.Compatibility = 70; } else { lowerGenerator.Compatibility = 20; } lowerGenerator.FrameType = FrameType.RSBredLower; if (radioButtonSplitSpreads.Checked) ivGenerator.FrameType = FrameType.RSBredUpperSplit; else if (radioButtonAltSpreads.Checked) ivGenerator.FrameType = FrameType.RSBredUpperAlt; else ivGenerator.FrameType = FrameType.RSBredUpper; lowerGenerator.InitialFrame = minHeldFrame; ivGenerator.InitialFrame = minPickupFrame; lowerGenerator.MaxResults = maxHeldFrame - minHeldFrame + 1; ivGenerator.MaxResults = maxPickupFrame - minPickupFrame + 1; lowerGenerator.InitialSeed = seed; ivGenerator.InitialSeed = seed; ivGenerator.ParentA = parentA; ivGenerator.ParentB = parentB; List<uint> natures = null; if (comboBoxShiny3rdNature.Text != "Any" && comboBoxShiny3rdNature.CheckBoxItems.Count > 0) { natures = new List<uint>(); for (int i = 0; i < comboBoxShiny3rdNature.CheckBoxItems.Count; i++) { if (comboBoxShiny3rdNature.CheckBoxItems[i].Checked) natures.Add((uint) ((Nature) comboBoxShiny3rdNature.CheckBoxItems[i].ComboBoxItem).Number); } } 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, (GenderFilter) (comboBoxShiny3rdGender.SelectedItem)); subFrameCompare = new FrameCompare( parentA[0], parentA[1], parentA[2], parentA[3], parentA[4], parentA[5], parentB[0], parentB[1], parentB[2], parentB[3], parentB[4], parentB[5], ivFiltersRSEgg.IVFilter, natures, (int) ((ComboBoxItem) comboBoxShiny3rdAbility.SelectedItem).Reference, checkBoxShiny3rdShinyOnly.Checked, true, new NoGenderFilter()); // Here we check the parent IVs // To make sure they even have a chance of producing the desired spread int parentPassCount = 0; for (int i = 0; i < 6; i++) { if (subFrameCompare.CompareIV(i, parentA[i]) || subFrameCompare.CompareIV(i, parentB[i])) { parentPassCount++; } } if (parentPassCount < 3) { MessageBox.Show("The parent IVs you have listed cannot produce your desired search results."); return; } iframesRSEgg = new List<IFrameRSEggPID>(); listBindingEggRS = new BindingSource {DataSource = iframesRSEgg}; dataGridViewShinyRSResults.DataSource = listBindingEggRS; progressSearched = 0; progressFound = 0; progressTotal = 0; waitHandle = new EventWaitHandle(true, EventResetMode.ManualReset); jobs = new Thread[1]; jobs[0] = new Thread(Generate3rdGenRSJob); jobs[0].Start(); Thread.Sleep(200); var progressJob = new Thread( () => ManageProgress(listBindingEggRS, dataGridViewShinyRSResults, lowerGenerator.FrameType, 0)); progressJob.Start(); progressJob.Priority = ThreadPriority.Lowest; buttonShiny3rdGenerate.Enabled = false; }
public List<Frame> GenerateWonderCard( FrameCompare frameCompare, uint id, uint sid, int shiny) { frames = new List<Frame>(); if (frameType == FrameType.Wondercard5thGen) { rng64.Seed = InitialSeed; if (maxResults < 1000) { rngArray = new uint[maxResults + 33]; for (uint cnt = 0; cnt < InitialFrame - 1; cnt++) { rng64.GetNext64BitNumber(); } for (int cnt = 0; cnt < maxResults + 33; cnt++) { rngArray[cnt] = rng64.GetNext32BitNumber(); } for (uint cnt = 0; cnt < maxResults; cnt++) { uint pid = rngArray[30 + cnt]; switch (shiny) { case 0: pid = ForceNonShiny(pid, id, sid); break; case 2: pid = ForceShiny(pid, id, sid); break; } Frame frame = Frame.GenerateFrame( FrameType.Wondercard5thGen, id, sid, cnt + InitialFrame, rngArray[0 + cnt], rngArray[22 + cnt] >> 27, rngArray[23 + cnt] >> 27, rngArray[24 + cnt] >> 27, rngArray[25 + cnt] >> 27, rngArray[26 + cnt] >> 27, rngArray[27 + cnt] >> 27, rngArray[32 + cnt], pid); if (frameCompare.Compare(frame)) { frames.Add(frame); } } } else { rngQueue = new Queue<uint>(); for (uint cnt = 0; cnt < InitialFrame - 1; cnt++) { rng64.GetNext64BitNumber(); } for (int cnt = 0; cnt < 33; cnt++) { rngQueue.Enqueue(rng64.GetNext32BitNumber()); } for (uint cnt = InitialFrame; cnt < InitialFrame + maxResults; cnt++) { rngArray = rngQueue.ToArray(); uint pid = rngArray[30]; switch (shiny) { case 0: pid = ForceNonShiny(pid, id, sid); break; case 2: pid = ForceShiny(pid, id, sid); break; } Frame frame = Frame.GenerateFrame( FrameType.Wondercard5thGen, id, sid, cnt, rngArray[0], rngArray[22] >> 27, rngArray[23] >> 27, rngArray[24] >> 27, rngArray[25] >> 27, rngArray[26] >> 27, rngArray[27] >> 27, rngArray[32], pid); if (frameCompare.Compare(frame)) { frames.Add(frame); } rngQueue.Dequeue(); rngQueue.Enqueue(rng64.GetNext32BitNumber()); } } } else if (frameType == FrameType.Wondercard5thGenFixed) { rng64.Seed = InitialSeed; if (maxResults < 1000) { rngArray = new uint[maxResults + 36]; for (uint cnt = 0; cnt < InitialFrame - 1; cnt++) { rng64.GetNext64BitNumber(); } for (int cnt = 0; cnt < maxResults + 36; cnt++) { rngArray[cnt] = rng64.GetNext32BitNumber(); } for (uint cnt = 0; cnt < maxResults; cnt++) { uint pid = Functions.GenderModPID(rngArray[30 + cnt], rngArray[31 + cnt], 0); switch (shiny) { case 0: pid = ForceNonShiny(pid, id, sid); break; case 2: pid = ForceShiny(pid, id, sid); break; } Frame frame = Frame.GenerateFrame( FrameType.Wondercard5thGenFixed, cnt + InitialFrame, id, sid, rngArray[0 + cnt], rngArray[24 + cnt] >> 27, rngArray[25 + cnt] >> 27, rngArray[26 + cnt] >> 27, rngArray[27 + cnt] >> 27, rngArray[28 + cnt] >> 27, rngArray[29 + cnt] >> 27, rngArray[35 + cnt], pid); if (frameCompare.Compare(frame)) { frames.Add(frame); } } } else { for (uint cnt = 0; cnt < InitialFrame - 1; cnt++) { rng64.GetNext64BitNumber(); } rngQueue = new Queue<uint>(); for (int cnt = 0; cnt < 36; cnt++) { rngQueue.Enqueue(rng64.GetNext32BitNumber()); } for (uint cnt = InitialFrame; cnt < InitialFrame + maxResults; cnt++) { rngArray = rngQueue.ToArray(); uint pid = Functions.GenderModPID(rngArray[30], rngArray[31], 0); switch (shiny) { case 0: pid = ForceNonShiny(pid, id, sid); break; case 2: pid = ForceShiny(pid, id, sid); break; } frame = Frame.GenerateFrame( FrameType.Wondercard5thGenFixed, id, sid, cnt, rngArray[0], rngArray[24] >> 27, rngArray[25] >> 27, rngArray[26] >> 27, rngArray[27] >> 27, rngArray[28] >> 27, rngArray[29] >> 27, rngArray[35], pid); if (frameCompare.Compare(frame)) { frames.Add(frame); } rngQueue.Dequeue(); rngQueue.Enqueue(rng64.GetNext32BitNumber()); } } } return frames; }
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; } }
// Capture code begins here -- This is all of the good stuff for // captured Pokemon. private void buttonCapGenerate_Click(object sender, EventArgs e) { var profile = (Profile) comboBoxProfiles.SelectedItem; iframes = new List<IFrameCapture>(); listBindingCap = new BindingSource {DataSource = iframes}; dataGridViewCapValues.DataSource = listBindingCap; jobs = new Thread[cpus]; generators = new FrameGenerator[cpus]; shinygenerators = new FrameGenerator[cpus]; waitHandle = new EventWaitHandle(true, EventResetMode.ManualReset); var year = (uint) DateTime.Now.Year; if (maskedTextBoxCapYear.Text != "") { year = uint.Parse(maskedTextBoxCapYear.Text); // Need to validate the year here if (year < 2000) { MessageBox.Show("You must enter a year greater than 1999.", "Please Enter a Valid Year", MessageBoxButtons.OK); return; } } uint maxOffset = 1000; if (maskedTextBoxCapMaxOffset.Text != "") { maxOffset = uint.Parse(maskedTextBoxCapMaxOffset.Text); } else { maskedTextBoxCapMaxOffset.Text = "1000"; } uint minOffset = 1; if (maskedTextBoxCapMinOffset.Text != "") { minOffset = uint.Parse(maskedTextBoxCapMinOffset.Text); } else { maskedTextBoxCapMinOffset.Text = "1"; } if (minOffset > maxOffset) { maskedTextBoxCapMinOffset.Focus(); maskedTextBoxCapMinOffset.SelectAll(); return; } generator = new FrameGenerator { // Now that each combo box item is a custom object containing the FrameType reference // We can simply retrieve the FrameType from the selected item FrameType = (FrameType) ((ComboBoxItem) comboBoxMethod.SelectedItem).Reference, EncounterType = (EncounterType) ((ComboBoxItem) comboBoxEncounterType.SelectedItem).Reference, EncounterMod = Objects.EncounterMod.Search, InitialFrame = minOffset, MaxResults = maxOffset - minOffset + 1 }; if (generator.FrameType == FrameType.BWBred && profile.IsBW2()) generator.FrameType = FrameType.BW2Bred; if (generator.FrameType == FrameType.BWBredInternational && profile.IsBW2()) generator.FrameType = FrameType.BW2BredInternational; generator.isBW2 = profile.IsBW2(); // set up the hashtables containing precomputed MTRNG values // this saves time by reducing the search to a hashtable lookup // of MTRNG seeds that corresponds to common spreads //list = new Hashtable[6]; list = new Dictionary<uint, uint>[6]; bool fastSearch = FastCapFilters() && FastCapFrames(); // Build up a FrameComparer // Map the information from the IV box. Anything // that is blank is considered a zero. 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(); } uint shinyOffset = 0; if (checkBoxShinyOnly.Checked) { uint.TryParse(maskedTextBoxMaxShiny.Text, out shinyOffset); } if (generator.FrameType == FrameType.Method5CGear || generator.FrameType == FrameType.Method5Standard) { EncounterSlot.Visible = false; EncounterMod.Visible = false; PID.Visible = false; Shiny.Visible = false; NearestShiny.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; HiddenPower.Visible = true; HiddenPowerPower.Visible = true; f25.Visible = false; f50.Visible = false; f75.Visible = false; f125.Visible = false; if (generator.FrameType == FrameType.Method5Standard) { CapSeed.DefaultCellStyle.Format = "X16"; CapSeed.Width = seedColumnLong(true); CapDateTime.Visible = true; CapKeypress.Visible = true; CapTimer0.Visible = true; if (shinyOffset > 0) { shinygenerator = new FrameGenerator { FrameType = FrameType.Method5Natures, EncounterType = (EncounterType) ((ComboBoxItem) comboBoxEncounterType.SelectedItem).Reference, EncounterMod = Objects.EncounterMod.Search, InitialFrame = 1, MaxResults = shinyOffset, //ShinyCharm = cbCapShinyCharm.Checked }; subFrameCompare = new FrameCompare( ivFiltersCapture.IVFilter, natures, (int) ((ComboBoxItem) comboBoxAbility.SelectedItem).Reference, true, checkBoxSynchOnly.Checked, false, encounterSlots, constructGenderFilter()); NearestShiny.Visible = true; PID.Visible = false; if (shinygenerator.EncounterType != EncounterType.Gift && shinygenerator.EncounterType != EncounterType.Roamer && shinygenerator.EncounterType != EncounterType.LarvestaEgg && shinygenerator.EncounterType != EncounterType.AllEncounterShiny) EncounterMod.Visible = true; else EncounterMod.Visible = false; if (shinygenerator.EncounterType != EncounterType.Stationary && shinygenerator.EncounterType != EncounterType.Gift && shinygenerator.EncounterType != EncounterType.Roamer && shinygenerator.EncounterType != EncounterType.LarvestaEgg && shinygenerator.EncounterType != EncounterType.AllEncounterShiny) EncounterSlot.Visible = true; else EncounterSlot.Visible = false; Nature.Visible = true; Ability.Visible = true; DisplayGenderColumns(); } if (profile.IsBW2()) generator.InitialFrame += 2; } else { CapSeed.DefaultCellStyle.Format = "X8"; CapSeed.Width = seedColumnLong(false); CapDateTime.Visible = false; CapKeypress.Visible = false; CapTimer0.Visible = false; } frameCompare = new FrameCompare( ivFiltersCapture.IVFilter, null, -1, false, false, false, null, new NoGenderFilter()); } if (generator.FrameType == FrameType.Wondercard5thGen || generator.FrameType == FrameType.Wondercard5thGenFixed) { CapSeed.DefaultCellStyle.Format = "X16"; CapSeed.Width = seedColumnLong(true); EncounterMod.Visible = false; EncounterSlot.Visible = false; PID.Visible = true; Shiny.Visible = true; NearestShiny.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; HiddenPower.Visible = true; HiddenPowerPower.Visible = true; f25.Visible = false; f50.Visible = false; f75.Visible = false; f125.Visible = false; CapDateTime.Visible = true; CapKeypress.Visible = true; CapTimer0.Visible = true; // genders are unsupported for now, fix this later frameCompare = new FrameCompare( ivFiltersCapture.IVFilter, natures, -1, checkBoxShinyOnly.Checked, false, false, null, new NoGenderFilter()); } if (generator.FrameType == FrameType.Method5Natures) { CapSeed.DefaultCellStyle.Format = "X16"; CapSeed.Width = seedColumnLong(true); if (generator.EncounterType != EncounterType.Gift && generator.EncounterType != EncounterType.Roamer && generator.EncounterType != EncounterType.LarvestaEgg && generator.EncounterType != EncounterType.AllEncounterShiny) EncounterMod.Visible = true; else EncounterMod.Visible = false; 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; NearestShiny.Visible = false; Nature.Visible = true; Ability.Visible = true; CapHP.Visible = false; CapAtk.Visible = false; CapDef.Visible = false; CapSpA.Visible = false; CapSpD.Visible = false; CapSpe.Visible = false; HiddenPower.Visible = false; HiddenPowerPower.Visible = false; DisplayGenderColumns(); CapDateTime.Visible = true; CapKeypress.Visible = true; CapTimer0.Visible = true; //generator.ShinyCharm = cbCapShinyCharm.Checked; frameCompare = new FrameCompare( ivFiltersCapture.IVFilter, natures, (int) ((ComboBoxItem) comboBoxAbility.SelectedItem).Reference, checkBoxShinyOnly.Checked, checkBoxSynchOnly.Checked, false, encounterSlots, constructGenderFilter()); } if (generator.FrameType != FrameType.Method5CGear) { if (fastSearch) { Assembly thisExe = Assembly.GetExecutingAssembly(); Stream file; if (generator.EncounterType == EncounterType.Roamer) { file = thisExe.GetManifestResourceStream("RNGReporter.Resources.MTRNG-Frame1D-Roamer.txt"); list[0] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); file = thisExe.GetManifestResourceStream("RNGReporter.Resources.MTRNG-Frame2D-Roamer.txt"); list[1] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); file = thisExe.GetManifestResourceStream("RNGReporter.Resources.MTRNG-Frame3D-Roamer.txt"); list[2] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); file = thisExe.GetManifestResourceStream("RNGReporter.Resources.MTRNG-Frame4D-Roamer.txt"); list[3] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); file = thisExe.GetManifestResourceStream("RNGReporter.Resources.MTRNG-Frame5D-Roamer.txt"); list[4] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); file = thisExe.GetManifestResourceStream("RNGReporter.Resources.MTRNG-Frame6D-Roamer.txt"); list[5] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); foreach (var partialList in list) { if (partialList == null) MessageBox.Show("error in loading roamer tables"); } } else { if (profile.IsBW2()) { // entralink if (minOffset > 21) { file = thisExe.GetManifestResourceStream( "RNGReporter.Resources.MTRNG-Frame25-Entralink.txt"); list[0] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); file = thisExe.GetManifestResourceStream( "RNGReporter.Resources.MTRNG-Frame26-Entralink.txt"); list[1] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); file = thisExe.GetManifestResourceStream( "RNGReporter.Resources.MTRNG-Frame27-Entralink.txt"); list[2] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); file = thisExe.GetManifestResourceStream( "RNGReporter.Resources.MTRNG-Frame28-Entralink.txt"); list[3] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); file = thisExe.GetManifestResourceStream( "RNGReporter.Resources.MTRNG-Frame29-Entralink.txt"); list[4] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); file = thisExe.GetManifestResourceStream( "RNGReporter.Resources.MTRNG-Frame30-Entralink.txt"); list[5] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); } else { file = thisExe.GetManifestResourceStream("RNGReporter.Resources.MTRNG-Frame3D.txt"); list[0] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); file = thisExe.GetManifestResourceStream("RNGReporter.Resources.MTRNG-Frame4D.txt"); list[1] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); file = thisExe.GetManifestResourceStream("RNGReporter.Resources.MTRNG-Frame5D.txt"); list[2] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); file = thisExe.GetManifestResourceStream("RNGReporter.Resources.MTRNG-Frame6D.txt"); list[3] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); file = thisExe.GetManifestResourceStream("RNGReporter.Resources.MTRNG-Frame7D.txt"); list[4] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); file = thisExe.GetManifestResourceStream("RNGReporter.Resources.MTRNG-Frame8D.txt"); list[5] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); } } else { file = thisExe.GetManifestResourceStream("RNGReporter.Resources.MTRNG-Frame1D.txt"); list[0] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); file = thisExe.GetManifestResourceStream("RNGReporter.Resources.MTRNG-Frame2D.txt"); list[1] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); file = thisExe.GetManifestResourceStream("RNGReporter.Resources.MTRNG-Frame3D.txt"); list[2] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); file = thisExe.GetManifestResourceStream("RNGReporter.Resources.MTRNG-Frame4D.txt"); list[3] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); file = thisExe.GetManifestResourceStream("RNGReporter.Resources.MTRNG-Frame5D.txt"); list[4] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); file = thisExe.GetManifestResourceStream("RNGReporter.Resources.MTRNG-Frame6D.txt"); list[5] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); } foreach (var partialList in list) { if (partialList == null) MessageBox.Show("error in loading hashtables"); } } } generateTimesToolStripMenuItem.Visible = false; generateEntralinkNatureSeedsToolStripMenuItem.Visible = false; generateAdjacentSeedsToolStripMenuItem.Visible = true; var months = new List<int>(); for (int month = 1; month <= 12; month++) { if (comboBoxCapMonth.CheckBoxItems[month].Checked) months.Add(month); } if (months.Count == 0) { comboBoxCapMonth.Focus(); return; } if (!DSParametersInputCheck()) return; List<List<ButtonComboType>> keypresses = profile.GetKeypresses(); progressSearched = 0; progressFound = 0; int dayTotal = months.Sum(month => DateTime.DaysInMonth((int) year, month)); progressTotal = (ulong) (dayTotal*86400*(maxOffset - minOffset + 1)*keypresses.Count* (profile.Timer0Max - profile.Timer0Min + 1)); for (int i = 0; i < jobs.Length; i++) { generators[i] = generator.Clone(); if (shinygenerator != null) { shinygenerators[i] = shinygenerator.Clone(); } //copy to prevent issues with it being incremented before the actual thread really starts int i1 = i; //passing in a profile instead of the params would probably be more efficent if (generator.FrameType == FrameType.Wondercard5thGen || generator.FrameType == FrameType.Wondercard5thGenFixed) { int shiny = comboBoxShiny.SelectedIndex; jobs[i] = new Thread( () => GenerateWonderCardJob(year, months, 0, 23, profile, shinyOffset, fastSearch, i1, shiny)); } else { jobs[i] = new Thread( () => GenerateJob(year, months, 0, 23, profile, shinyOffset, fastSearch, i1)); } jobs[i].Start(); // for some reason not making the thread sleep causes issues with updating dayMin\Max Thread.Sleep(200); } var progressJob = new Thread(() => ManageProgress(listBindingCap, dataGridViewCapValues, generator.FrameType, 2000)); progressJob.Start(); progressJob.Priority = ThreadPriority.Lowest; buttonCapGenerate.Enabled = false; buttonShinyGenerate.Enabled = false; } else { // We want to get our year and offset ranges here so // that we can have some values for our looping. // Default these to this value, but save to // the registry so we can not have to redo. uint maxDelay = 610; if (maskedTextBoxCapMaxDelay.Text != "") maxDelay = uint.Parse(maskedTextBoxCapMaxDelay.Text); uint minDelay = 600; if (maskedTextBoxCapMinDelay.Text != "") minDelay = uint.Parse(maskedTextBoxCapMinDelay.Text); uint minEfgh = (year - 2000) + minDelay; uint maxEfgh = (year - 2000) + maxDelay; if (fastSearch) { Assembly thisExe = Assembly.GetExecutingAssembly(); Stream file = thisExe.GetManifestResourceStream("RNGReporter.Resources.MTRNG-Frame21-Entralink.txt"); list[0] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); file = thisExe.GetManifestResourceStream("RNGReporter.Resources.MTRNG-Frame22-Entralink.txt"); list[1] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); file = thisExe.GetManifestResourceStream("RNGReporter.Resources.MTRNG-Frame23-Entralink.txt"); list[2] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); file = thisExe.GetManifestResourceStream("RNGReporter.Resources.MTRNG-Frame24-Entralink.txt"); list[3] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); file = thisExe.GetManifestResourceStream("RNGReporter.Resources.MTRNG-Frame25-Entralink.txt"); list[4] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); file = thisExe.GetManifestResourceStream("RNGReporter.Resources.MTRNG-Frame26-Entralink.txt"); list[5] = (Dictionary<uint, uint>) new BinaryFormatter().Deserialize(file); foreach (var partialList in list) { if (partialList == null) MessageBox.Show("error in loading hashtables"); } } generateTimesToolStripMenuItem.Visible = true; generateEntralinkNatureSeedsToolStripMenuItem.Visible = true; generateAdjacentSeedsToolStripMenuItem.Visible = false; jobs = new Thread[1]; //todo: split this into multiple threads //jobs[0] = new Thread(() => GenerateCGearCapJob(profile, minEfgh, maxEfgh, fastSearch)); jobs[0] = new Thread( () => GenerateCGearCapJob(profile.MAC_Address, minEfgh, maxEfgh, fastSearch, profile.ID, profile.SID)); jobs[0].Start(); progressTotal = (255*24*(maxEfgh - minEfgh + 1)*generator.MaxResults); var progressJob = new Thread(() => ManageProgress(listBindingCap, dataGridViewCapValues, generator.FrameType, 0)); progressJob.Start(); progressJob.Priority = ThreadPriority.Lowest; buttonCapGenerate.Enabled = false; } dataGridViewCapValues.Focus(); }
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; }