Пример #1
0
        public IEnumerator Process(LanotaliumContext context)
        {
            if (!context.IsProjectLoaded)
            {
                yield break;
            }

            if (context.OperationManager.SelectedTapNote.Count != 2)
            {
                if (context.OperationManager.SelectedTapNote.Count > 2)
                {
                    context.MessageBox.ShowMessage("More then 2 Tap note selected");
                }
                else
                {
                    context.MessageBox.ShowMessage("Please Select 2 Click / Catch note");
                }

                yield break;
            }

            Request <AskCatchRail> r = new Request <AskCatchRail>();

            yield return(context.UserRequest.Request(r, "Create Catch Rail (Advanced)"));

            if (r.Succeed)
            {
                var p    = r.Object;
                var o    = context.OperationManager;
                var rand = new System.Random();

                LanotaTapNote first = null, last = null;

                if (o.SelectedTapNote.First().Time < o.SelectedTapNote.Last().Time)
                {
                    first = o.SelectedTapNote.First();
                    last  = o.SelectedTapNote.Last();
                }
                else
                {
                    last  = o.SelectedTapNote.First();
                    first = o.SelectedTapNote.Last();
                }

                var count = p.Count;
                if (count == 0)
                {
                    var bpms = o.InspectorManager.ComponentBpm;
                    bpms.EnableBeatline = true;

                    var firstIdx = o.FindNearestBeatlineIndexByTime(first.Time);
                    var lastIdx  = o.FindNearestBeatlineIndexByTime(last.Time);

                    count = lastIdx - firstIdx - 1;

                    if (count > 99999)
                    {
                        context.MessageBox.ShowMessage("Infinite Loop Detected!\nTry again");
                        yield break;
                    }

                    /*
                     * var beat = first.Time;
                     * while (beat < last.Time)
                     * {
                     *  if(count > 99999)
                     *  {
                     *      context.MessageBox.ShowMessage("Infinite Loop Detected!\nTry again");
                     *      yield break;
                     *  }
                     *
                     *  beat = o.InspectorManager.ComponentBpm.FindPrevOrNextBeatline(beat, true);
                     *  count++;
                     * }
                     * count--;
                     */
                }

                if (count <= 0)
                {
                    context.MessageBox.ShowMessage("There is no Beatline Between Two Selected note");
                    yield break;
                }

                var deltaTime   = (last.Time - first.Time) / (count + 1);
                var firstDegMod = first.Degree % 360.0f;
                var lastDegMod  = last.Degree % 360.0f;

                var firstDegAbs = firstDegMod > 0.0f ? firstDegMod : 360 - (-firstDegMod);
                var lastDegAbs  = lastDegMod > 0.0f ? lastDegMod : 360 - (-lastDegMod);
                var deltaDegree = (lastDegAbs) - (firstDegAbs);

                //Clockwise but delta is Anti-clockwise
                if (p.Clockwise && deltaDegree > 0.0f)
                {
                    deltaDegree = 360.0f - deltaDegree;
                }
                //Anti-clockwise but delta is Clockwise
                else if (!p.Clockwise && deltaDegree < 0.0f)
                {
                    deltaDegree = 360.0f + deltaDegree;
                }

                if (p.Revolution > 0)
                {
                    if (p.Clockwise)
                    {
                        deltaDegree -= p.Revolution * 360.0f;
                    }

                    else
                    {
                        deltaDegree += p.Revolution * 360.0f;
                    }
                }

                var sizePattern = new IntPattern(ValidSizeAndTypePattern);
                var typePattern = new IntPattern(ValidSizeAndTypePattern);
                if (sizePattern.ReadPattern(p.SizePattern) && typePattern.ReadPattern(p.TypePattern))
                {
                    for (int i = 0; i < count; i++)
                    {
                        var percent = (float)(i + 1) / (float)(count + 1);
                        var note    = new LanotaTapNote()
                        {
                            Time   = first.Time + (deltaTime * (i + 1)),
                            Degree = first.Degree + deltaDegree * Ease.CalculateEase(percent, p.Ease),
                            @Type  = ConvertNoteType(typePattern.GetValue(i)),
                            Size   = sizePattern.GetValue(i),
                        };
                        if (p.Random != 0.0f)
                        {
                            var randDegree = ((float)rand.NextDouble() - 0.5f) * 2.0f * p.Random;
                            note.Degree += randDegree;
                        }
                        o.AddTapNote(note);
                    }
                }
                else
                {
                    context.MessageBox.ShowMessage("Error in Pattern String!");
                }
            }
        }