示例#1
0
        private void Search7_Normal()
        {
            SFMT sfmt = new SFMT(Seed.Value);
            int  min  = (int)Frame_min.Value;
            int  max  = (int)Frame_max.Value;

            if (AroundTarget.Checked)
            {
                min = (int)TargetFrame.Value - 100; max = (int)TargetFrame.Value + 100;
            }
            // Blinkflag
            FuncUtil.getblinkflaglist(min, max, sfmt, Modelnum);
            // Advance
            for (int i = 0; i < min; i++)
            {
                sfmt.Next();
            }
            // Prepare
            ModelStatus status = new ModelStatus(Modelnum, sfmt);
            ModelStatus stmp   = new ModelStatus(Modelnum, sfmt);

            getsetting(sfmt);
            int frameadvance;
            int realtime  = 0;
            int frametime = 0;

            // Start
            for (int i = min; i <= max;)
            {
                do
                {
                    frameadvance = status.NextState();
                    realtime++;
                }while (frameadvance == 0); // Keep the starting status of a longlife frame(for npc=0 case)
                do
                {
                    RNGPool.CopyStatus(stmp);
                    var result = RNGPool.Generate7() as Result7;

                    RNGPool.AddNext(sfmt);

                    frameadvance--;
                    i++;
                    if (i <= min || i > max + 1)
                    {
                        continue;
                    }
                    byte blinkflag = FuncUtil.blinkflaglist[i - min - 1];
                    if (BlinkFOnly.Checked && blinkflag < 4)
                    {
                        continue;
                    }
                    if (SafeFOnly.Checked && blinkflag >= 2)
                    {
                        continue;
                    }
                    if (!filter.CheckResult(result))
                    {
                        continue;
                    }
                    Frames.Add(new Frame(result, frame: i - 1, time: frametime * 2, blink: blinkflag));
                }while (frameadvance > 0);

                if (Frames.Count > 100000)
                {
                    return;
                }
                // Backup current status
                status.CopyTo(stmp);
                frametime = realtime;
            }
        }