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;
        }
Example #2
0
        //--------------------------------------------------------------------------------------------------
        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;
        }
Example #4
0
        //  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();
        }
Example #5
0
        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();
        }
Example #6
0
        //--------------------------------------------------------------------------------------------------
        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);
 }
Example #8
0
        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;
        }
Example #9
0
        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;
        }
Example #10
0
        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;
        }
Example #11
0
        private void Generate()
        {
            var profile = (Profile) comboBoxProfiles.SelectedItem;
            uint minFrame = uint.Parse(maskedTextBoxCapMinOffset.Text);
            uint maxFrame = uint.Parse(maskedTextBoxCapMaxOffset.Text);

            DateTime seedTime = datePicker.Value;
            iframes = new List<IFrameCapture>();

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

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

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

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

                    CapSeed.DefaultCellStyle.Format = "X16";
                    if (generator.EncounterType != EncounterType.Stationary &&
                        generator.EncounterType != EncounterType.Gift &&
                        generator.EncounterType != EncounterType.Roamer &&
                        generator.EncounterType != EncounterType.LarvestaEgg)
                        EncounterSlot.Visible = true;
                    else
                        EncounterSlot.Visible = false;
                    PID.Visible = true;
                    Shiny.Visible = true;
                    Nature.Visible = true;
                    Ability.Visible = true;
                    CapHP.Visible = false;
                    CapAtk.Visible = false;
                    CapDef.Visible = false;
                    CapSpA.Visible = false;
                    CapSpD.Visible = false;
                    CapSpe.Visible = false;
                    f25.Visible = true;
                    f50.Visible = true;
                    f75.Visible = true;
                    f125.Visible = true;
                    break;
                case FrameType.BWBred:
                    generator.FrameType = FrameType.Method5Standard;
                    generator.InitialFrame = 14;
                    generator.MaxResults = 7;

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

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

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

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

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

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

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

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

                        iframes.Add(iframe);
                    }
                }
            }

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

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

            dataGridViewCapValues.Focus();
        }
Example #12
0
 public void Remove(FrameCompare comparer)
 {
     comparers.Remove(comparer);
 }
Example #13
0
 public void Add(FrameCompare comparer)
 {
     comparers.Add(comparer);
 }
 public void Remove(FrameCompare comparer)
 {
     comparers.Remove(comparer);
 }
Example #15
0
        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;
        }
Example #16
0
        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;
        }
Example #17
0
        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;
        }
Example #18
0
        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;
            }
        }
Example #19
0
        //  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;
        }