示例#1
0
 public int GetClosestValidIndex(int index)
 {
     return((Frames.LastOrDefault(x => index > x.Index)
             ?? Frames.FirstOrDefault())
            ?.Index
            ?? -1);
 }
示例#2
0
        public AnimationRouteFrameSlider GetFrameSlider(TimeSpan currentStopperTime)
        {
            AnimationRouteFrameSlider slider = new AnimationRouteFrameSlider();
            //if(currentStopperTime < AnimationStartTime)
            //{
            //    if(Frames != null && Frames.Count > 0)
            //        slider.NextFrame = Frames[0];
            //    return slider;
            //}

            TimeSpan time    = currentStopperTime;// - AnimationStartTime;//lub odwrotnie
            bool     breaked = false;

            for (int i = 0; i < Frames.Count; i++)
            {
                var frame = Frames[i];
                if (time < frame.FrameTime)
                {
                    if (i - 1 >= 0)
                    {
                        slider.PreviousFrame = Frames[i - 1];
                    }
                    slider.CurrentFrame = frame;
                    if (i + 1 < Frames.Count)
                    {
                        slider.NextFrame = Frames[i + 1];
                    }

                    breaked = true;
                    break;
                }
                else
                {
                    time -= frame.FrameTime;
                }
            }

            if (!breaked)
            {
                slider.PreviousFrame = Frames.LastOrDefault();
            }

            return(slider);
        }
        /// <summary>
        /// 判断某时刻指针是否在某物件上
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="time"></param>
        /// <returns></returns>
        public bool Contains(OsuHitObject obj, double time, double?judgement_radius = null)
        {
            if (obj.StartTime == 10752)
            {
            }

            var frame = Frames.LastOrDefault(f => time >= f.Time);

            if (frame == null)
            {
                frame = Frames.First().PreviousFrame;
            }

            var next_frame = frame?.NextFrame;

            if (next_frame == null)
            {
                return(false);
            }

            //插值计算
            var cur_timestramp = (time - frame.Time) / (next_frame.Time - frame.Time);//归一化
            var temp_offset    = (next_frame.Position - frame.Position) * (float)cur_timestramp;

            //指针位置
            var cur_position = frame.Position + temp_offset;

            cur_position = Vector2.Clamp(
                cur_position,
                frame.Position,
                next_frame.Position
                );

            var dist = Vector2.Distance(obj.Position, cur_position);

            return(dist <= (judgement_radius ?? obj.Radius));
        }
示例#4
0
        private void Search7_AroundTarget()
        {
            SFMT sfmt   = new SFMT(Seed.Value);
            int  start  = (int)Frame_min.Value;
            int  target = (int)TargetFrame.Value;
            int  min    = target - 100;
            int  max    = target + 100;

            if (start > min)
            {
                start = min;
            }

            // Blinkflag
            FuncUtil.getblinkflaglist(min, max, sfmt, Modelnum);

            // Prepare
            int  i         = 0;
            byte blinkflag = 0;

            for (; i < start; i++)
            {
                sfmt.Next();
            }
            ModelStatus status = new ModelStatus(Modelnum, sfmt);
            ModelStatus stmp   = new ModelStatus(Modelnum, sfmt);

            status.raining = stmp.raining = Raining.Checked;
            getsetting(sfmt);
            int frameadvance = 0;
            int realtime     = 0;
            int frametime    = 0;

            // Calc frames around target
            for (; i <= max;)
            {
                for (; frameadvance == 0; frameadvance = status.NextState())
                {
                    realtime++;
                }
                for (; frameadvance > 0; frameadvance--, i++)
                {
                    if (min <= i && i <= max)
                    {
                        RNGPool.CopyStatus(stmp);
                        var result = RNGPool.Generate7();
                        blinkflag = FuncUtil.blinkflaglist[i - min];
                        Frames.Add(new Frame(result, frame: i, time: frametime * 2, blink: blinkflag));
                    }
                    RNGPool.AddNext(sfmt);
                }

                // Backup current status
                status.CopyTo(stmp);
                frametime = realtime;
            }

            // Get all possible results by EC matching
            // Can't identify MainRNGEggs by EC
            if (Method < 3)
            {
                Frames = Frames.OrderBy(f => f.FrameNum + (f.rt as Result7).FrameDelayUsed).ToList();

                var EClist = Frames.Select(f => f.rt.EC).ToArray();

                // Another Buffer
                sfmt = new SFMT(Seed.Value);
                int starting = Frames[0].FrameNum + (Frames[0].rt as Result7).FrameDelayUsed;
                for (i = 0; i < starting; i++)
                {
                    sfmt.Next();
                }
                RNGPool.CreateBuffer(sfmt);

                // Skip Delay
                RNGPool.Considerdelay = false;
                if (RNGPool.igenerator is Stationary7 st7)
                {
                    st7.AssumeSynced = Nature.CheckBoxItems[SyncNature.SelectedIndex].Checked;
                }

                uint  EC;
                uint  EClast = EClist.Last();
                int   Nframe = -1;
                ulong rand   = 0;
                do
                {
                    RNGPool.modelnumber = Modelnum;
                    RNGPool.ResetModelStatus();
                    var result = RNGPool.Generate7() as Result7;
                    EC = result.EC;
                    RNGPool.AddNext(sfmt);
                    if (EClist.Contains(EC))
                    {
                        var framenow = Frames.LastOrDefault(f => f.EC == EC);
                        Nframe    = framenow.FrameNum;
                        frametime = framenow.realtime;
                        rand      = framenow.Rand64;
                        continue;
                    }
                    else if (Nframe > -1)
                    {
                        result.RandNum = rand;
                        Frames.Add(new Frame(result, frame: Nframe, time: frametime, blink: 4));
                    }
                }while (EC != EClast);
            }

            // Filters
            RNGResult.IsPokemon = true;
            Frames = Frames.Where(f => filter.CheckResult(f.rt))
                     .OrderBy(f => f.FrameNum)
                     .ToList();
        }