Пример #1
0
        public override bool ExUpdate(float currentTime, float bpm, ref bool[] button, ref bool[] released,
                                      MarkResults results, bool auto, ref int soundType, MarkManager.EvaluateEffectHandler effectCallback)
        {
            if (fixedBPM >= 0)
            {
                bpm = fixedBPM;
            }
            bool ret = false;

            lastTime = currentTime;
            if (!auto)
            {
                if (exState == ExState.Waiting)
                {
                    if (ProcessPressedButton(button))
                    {
                        var pressEval = EvaluateImpl(Time, currentTime - adjustGapTime);
                        if (pressEval > EffectType.Worst)
                        {
                            UnsetPressedButton(button);
                        }
                        switch (pressEval)
                        {
                        // if more than safe,ok
                        case EffectType.Cool:
                            OnPrcessEvaluate(false, false, EffectType.Cool, effectCallback);
                            results.Add(EffectType.Cool);
                            exState = ExState.Pressed;
                            break;

                        case EffectType.Fine:
                            OnPrcessEvaluate(false, false, EffectType.Fine, effectCallback);
                            results.Add(EffectType.Fine);
                            exState = ExState.Pressed;
                            break;

                        case EffectType.Safe:
                            OnPrcessEvaluate(false, false, EffectType.Safe, effectCallback);
                            results.Add(EffectType.Safe);
                            state   = State.Safe;
                            exState = ExState.Pressed;
                            ret     = true;
                            break;

                        case EffectType.Sad:
                            OnPrcessEvaluate(false, false, EffectType.Sad, effectCallback);
                            results.Add(EffectType.Sad);
                            state   = State.Sad;
                            exState = ExState.Pressed;
                            ret     = true;
                            break;

                        case EffectType.Worst:
                            OnPrcessEvaluate(false, false, EffectType.Worst, effectCallback);
                            results.Add(EffectType.Worst);
                            state   = State.Worst;
                            exState = ExState.Pressed;
                            ret     = true;
                            break;

                        case 0:
                            break;
                        }
                        if (pressEval != EffectType.None)
                        {
                            Hidden      = false;
                            ColorHidden = false;
                            Array.Clear(colorMarkInfo.Pos1, 0, colorMarkInfo.Pos1.Length);
                            Array.Clear(colorMarkInfo.Pos2, 0, colorMarkInfo.Pos2.Length);
                            colorMarkInfo.VerticesCount = 0;
                        }
                        if (results[EffectType.Cool] || results[EffectType.Fine])
                        {
                            state  = State.Cool;
                            Hidden = true;
                        }
                    }
                }
                else if (exState == ExState.Pressed)
                {
                    if (released[(int)usedButton])
                    {
                        results.Add(EffectType.PressReleased);
                        ret = true;
                    }
                    else
                    {
                        results.Add(EffectType.Pressing);
                    }
                }
                if (exState == ExState.Waiting)
                {
                    if (currentTime - Time >= eval[3])
                    {
                        OnPrcessEvaluate(false, false, EffectType.Worst, null);
                        results.Add(EffectType.Worst);
                        ret = true;
                    }
                }
            }
            else
            {
                //when auto
                if (exState == ExState.Waiting)
                {
                    if (currentTime - Time >= -AutoWidth)
                    {
                        OnPrcessEvaluate(false, false, EffectType.Cool, effectCallback);
                        results.Add(EffectType.Cool);
                        exState   = ExState.Pressed;
                        soundType = (int)ButtonType;
                        state     = State.Cool;
                        Hidden    = true;
                        Array.Clear(colorMarkInfo.Pos1, 0, colorMarkInfo.Pos1.Length);
                        Array.Clear(colorMarkInfo.Pos2, 0, colorMarkInfo.Pos2.Length);
                        colorMarkInfo.VerticesCount = 0;
                    }
                }
                else if (exState == ExState.Pressed)
                {
                    results.Add(EffectType.Pressing);
                }
            }
            float scale = (float)bpm / DefaultBpm;

            if (state < State.Cool)
            {
                if (state == State.Moving && currentTime - Time >= 0)
                {
                    state = State.Disappering;
                }
                if (state == State.Disappering)
                {
                    mark.Scale = axis.Scale = colorMarkInfo.ColorMark.Scale = new Vector2((eval[3] + Time - currentTime) / eval[3]);
                    if (mark.Scale.X <= 0)
                    {
                        mark.Scale = axis.Scale = colorMarkInfo.Scale = Vector2.Zero;
                    }
                }
                if (Hidden)
                {
                    if (Time - currentTime <= 0.5f / scale)
                    {
                        if (displayState == DisplayState.Sudden)
                        {
                            Hidden      = false;
                            ColorHidden = false;
                            OnPrcessEvaluate(false, false, EffectType.Appear, effectCallback);
                            Array.Clear(colorMarkInfo.Pos1, 0, colorMarkInfo.Pos1.Length);
                            Array.Clear(colorMarkInfo.Pos2, 0, colorMarkInfo.Pos2.Length);
                            colorMarkInfo.VerticesCount = 0;
                        }
                    }
                    else if (Time - currentTime <= 2 / scale)
                    {
                        if (displayState == DisplayState.Normal || displayState == DisplayState.Hidden || displayState == DisplayState.HiddenColor || displayState == DisplayState.SuddenColor)
                        {
                            Hidden      = false;
                            ColorHidden = false;
                            OnPrcessEvaluate(false, false, EffectType.Appear, effectCallback);
                            ColorHidden |= displayState == DisplayState.SuddenColor;
                        }
                    }
                }
                else
                {
                    if (Time - currentTime <= 0.25f / scale)
                    {
                        if (displayState == DisplayState.Hidden)
                        {
                            displayState = (DisplayState)(-1);
                            Hidden       = true;
                        }
                        else
                        {
                            ColorHidden |= (exState == ExState.Waiting && displayState == DisplayState.HiddenColor);
                        }
                    }
                    else if (Time - currentTime <= 0.5f / scale)
                    {
                        if (ColorHidden && displayState == DisplayState.SuddenColor)
                        {
                            Array.Clear(colorMarkInfo.Pos1, 0, colorMarkInfo.Pos1.Length);
                            Array.Clear(colorMarkInfo.Pos2, 0, colorMarkInfo.Pos2.Length);
                            colorMarkInfo.VerticesCount = 0;
                            ColorHidden = false;
                        }
                    }
                }
                if (state == State.Appearing && !Hidden)
                {
                    float sx = mark.Scale.X + 0.05f;
                    mark.Scale = new Vector2(sx, sx);
                    if (mark.Scale.X > 1.2f)
                    {
                        mark.Scale = Vector2.One;
                        state      = State.Moving;
                    }
                }
                UpdateColorPosition(currentTime, bpm);
                axis.Rotation = -1 * (float)Math.PI * (Time - currentTime) * scale;
                if (axis.Rotation >= 0)
                {
                    axis.Rotation = 0;
                }
            }
            colorMarkInfo.DrawTrace        = (state == State.Moving || state == State.Appearing) && exState == ExState.Waiting;
            mark.Hidden                    = axis.Hidden = !(state < State.Cool);
            colorMarkInfo.ColorMark.Hidden = ColorHidden || !(state < State.Cool);
            colorMarkInfo.Hidden           = ColorHidden;
            return(ret);
        }
Пример #2
0
        public void Update(float time, bool[] b, bool[] released)
        {
            if (!initialized)
            {
                return;
            }
            ReadPpdData(time, SpeedScale * EventManager.BPM);
            ReadExternalPpdData(time);
            Logger.Instance.AddLog("Time:{0}, pressed:{1}, released:{2}", time, String.Join(",", b.Select(v => v ? "1" : "0").ToArray()),
                                   String.Join(",", released.Select(v => v ? "1" : "0").ToArray()));
            foreach (Mark mk in MarkLayer.Children.Reverse())
            {
                if (removeMarks.Contains(mk))
                {
                    continue;
                }
                var  exmk      = mk as ExMarkBase;
                var  results   = new MarkResults();
                int  soundType = -1;
                bool remove    = false;
                var  isAuto    = false;
                switch (AutoMode)
                {
                case AutoMode.All:
                    isAuto = true;
                    break;

                case AutoMode.ExceptSlide:
                    isAuto = !mk.IsScratch;
                    break;
                }
                if (exmk != null)
                {
                    remove = exmk.ExUpdate(EventManager.GetCorrectTime(time, mk.Time),
                                           SpeedScale * EventManager.BPM,
                                           ref b, ref released, results,
                                           isAuto, ref soundType,
                                           CreateEffect
                                           );
                    if (isAuto)
                    {
                        if (soundType >= 0 && soundType < 10)
                        {
                            var index = randomChangeManager.Invert(soundType);
                            if (PlaySound != null)
                            {
                                PlaySound.Invoke(index, true);
                            }
                        }
                        else if (soundType >= 10)
                        {
                            var index = randomChangeManager.Invert(soundType - 10);
                            if (StopSound != null)
                            {
                                StopSound.Invoke(index, false);
                            }
                            if (EventManager.GetReleaseSound(index) && PlaySound != null)
                            {
                                PlaySound.Invoke(index, false);
                            }
                        }
                    }
                    else
                    {
                        //manual
                        if (exmk.IsScratch && exmk.IsLong && soundType >= 0 && soundType < 10)
                        {
                            var index = randomChangeManager.Invert(soundType);
                            if (PlaySound != null)
                            {
                                PlaySound.Invoke(index, false);
                            }
                        }
                        else
                        {
                            var index = randomChangeManager.Invert(soundType);
                            if (EventManager.GetReleaseSound(index) && PlaySound != null)
                            {
                                PlaySound.Invoke(index, false);
                            }
                        }
                    }
                }
                else
                {
                    remove = mk.Update(EventManager.GetCorrectTime(time, mk.Time),
                                       SpeedScale * EventManager.BPM,
                                       ref b, results, isAuto,
                                       ref soundType,
                                       CreateEffect
                                       );
                    if (isAuto)
                    {
                        if (soundType != -1)
                        {
                            var index = randomChangeManager.Invert(soundType);
                            if (PlaySound != null)
                            {
                                PlaySound.Invoke(index, false);
                            }
                        }
                    }
                }
                if (results[EffectType.Cool] || results[EffectType.Fine])
                {
                    if (ACPressing[(int)mk.ButtonType] != null)
                    {
                        OnPressingButton(mk.ButtonType, false);
                        for (int i = 0; i < ACPressing.Length; i++)
                        {
                            if (ACPressing[i] != null)
                            {
                                AddToRemove(ACPressing[i]);
                            }
                        }
                        Array.Clear(ACPressing, 0, ACPressing.Length);
                    }
                    if (ChangeCombo != null)
                    {
                        ChangeCombo.Invoke(true, mk.Position);
                    }
                }
                if (results[EffectType.Pressing])
                {
                    // 同時にHoldが始まったときに2個目ので1個目のを消す
                    if (ACPressing[(int)mk.ButtonType] != null && ACPressing[(int)mk.ButtonType] != mk)
                    {
                        OnPressingButton(mk.ButtonType, false);
                        for (int i = 0; i < ACPressing.Length; i++)
                        {
                            if (ACPressing[i] != null)
                            {
                                AddToRemove(ACPressing[i]);
                            }
                        }
                        Array.Clear(ACPressing, 0, ACPressing.Length);
                    }
                    if (OnPressingButton(mk.ButtonType, true))
                    {
                        for (int i = 0; i < ACPressing.Length; i++)
                        {
                            if (ACPressing[i] != null)
                            {
                                AddToRemove(ACPressing[i]);
                            }
                        }
                        Array.Clear(ACPressing, 0, ACPressing.Length);
                    }
                    ACPressing[(int)mk.ButtonType] = exmk;
                    RemoveFromConnection(exmk);
                }
                if (results[EffectType.PressReleased])
                {
                    OnPressingButton(mk.ButtonType, false);
                    for (int i = 0; i < ACPressing.Length; i++)
                    {
                        if (ACPressing[i] != null)
                        {
                            AddToRemove(ACPressing[i]);
                        }
                    }
                    Array.Clear(ACPressing, 0, ACPressing.Length);
                }
                if (results[EffectType.Slide])
                {
                    var slideExMark = exmk as SlideExMark;
                    for (var i = slideExMark.ProcessedPressingFrames; i < slideExMark.PressingFrames; i++)
                    {
                        var position = slideExMark.GetPressedSlidePosition(i + 1);
                        if (slideExMark.IsMaxSlide && (i + 1) == slideExMark.ExCount)
                        {
                            // do nothing for max slide
                        }
                        else
                        {
                            var score = 10 * (i + 1);
                            Slide?.Invoke(slideExMark, position, score, exmk.IsRight);
                        }
                    }
                    slideExMark.ProcessedPressingFrames = slideExMark.PressingFrames;
                }
                if (results[EffectType.Safe] || results[EffectType.Sad] || results[EffectType.Worst])
                {
                    if (ChangeCombo != null)
                    {
                        ChangeCombo.Invoke(false, mk.Position);
                    }
                }
                if (results[EffectType.Cool] || results[EffectType.Fine] || results[EffectType.Safe] || results[EffectType.Sad] ||
                    results[EffectType.Worst])
                {
                    if (EvaluateCount != null)
                    {
                        EvaluateCount.Invoke(results.First, false);
                    }
                }
                if (remove)
                {
                    if (exmk is SlideExMark && ((SlideExMark)exmk).IsMaxSlide)
                    {
                        var slideExMark = ((SlideExMark)exmk);
                        var score       = 1000 + 10 * slideExMark.ExCount;
                        var position    = slideExMark.GetPressedSlidePosition(slideExMark.ExCount);
                        MaxSlide?.Invoke(slideExMark, position, score, exmk.IsRight);
                    }
                    AddToRemove(mk);
                }
            }
            foreach (Mark mk in removeMarks)
            {
                MarkLayer.RemoveChild(mk);
                mk.Dispose();
            }
            if (MarkLayer.ChildrenCount > 0 && AutoMode == AutoMode.None)
            {
                for (int i = 0; i < 10; i++)
                {
                    int iter = MarkLayer.ChildrenCount - 1;
                    while (b[i] && iter >= 0)
                    {
                        var mk = MarkLayer[iter] as Mark;
                        if (mk is ExMarkBase exmk && exmk.ExMarkState != ExMarkBase.ExState.Waiting)
                        {
                            iter--;
                            continue;
                        }
                        var eval = mk.Evaluate(time);
                        if (eval == EffectType.None)
                        {
                            iter--;
                            continue;
                        }
                        Action proc = () =>
                        {
                            b[i] = false;
                            ChangeCombo?.Invoke(false, mk.Position);
                            EvaluateCount.Invoke(eval, true);
                            mk_ChangeMarkEvaluate(mk, eval, true, false, mk.Position);
                            MarkLayer.RemoveChild(mk);
                            RemoveFromConnection(mk);
                            mk.Dispose();
                        };
                        if (scriptManager.ProcessMissPressManager.Process(mk, (MarkType)i, out bool isMissPress))
                        {
                            if (isMissPress)
                            {
                                proc();
                                break;
                            }
                        }
                        else if (mk.NoteType == NoteType.AC || (mk.NoteType == NoteType.ACFT && !mk.IsScratch))
                        {
                            proc();
                            break;
                        }
                        iter--;
                    }
                }
            }
            removeMarks.Clear();
            Update();
        }
Пример #3
0
 public abstract bool ExUpdate(float currentTime, float bpm, ref bool[] button, ref bool[] released,
                               MarkResults results, bool auto, ref int soundType, MarkManager.EvaluateEffectHandler effectCallback);
Пример #4
0
        public override bool ExUpdate(float currentTime, float bpm, ref bool[] button, ref bool[] released,
                                      MarkResults results, bool auto, ref int soundType, MarkManager.EvaluateEffectHandler effectCallback)
        {
            if (fixedBPM >= 0)
            {
                bpm = fixedBPM;
            }
            bool ret = false;

            lastTime = currentTime;
            if (!auto)
            {
                if (exState == ExState.Waiting)
                {
                    if (ProcessPressedButton(button))
                    {
                        var pressEval = EvaluateImpl(Time, currentTime - adjustGapTime);
                        if (pressEval > EffectType.Worst)
                        {
                            UnsetPressedButton(button);
                        }
                        switch (pressEval)
                        {
                        // if more than safe,ok
                        case EffectType.Cool:
                            OnPrcessEvaluate(false, false, EffectType.Cool, effectCallback);
                            results.Add(EffectType.Cool);
                            exState         = ExState.Pressed;
                            lastPressedTime = currentTime;
                            break;

                        case EffectType.Fine:
                            OnPrcessEvaluate(false, false, EffectType.Fine, effectCallback);
                            results.Add(EffectType.Fine);
                            exState         = ExState.Pressed;
                            lastPressedTime = currentTime;
                            break;

                        case EffectType.Safe:
                            OnPrcessEvaluate(false, false, EffectType.Safe, effectCallback);
                            results.Add(EffectType.Safe);
                            state           = State.Safe;
                            exState         = ExState.Pressed;
                            lastPressedTime = currentTime;
                            ret             = true;
                            break;

                        case EffectType.Sad:
                            OnPrcessEvaluate(false, false, EffectType.Sad, effectCallback);
                            results.Add(EffectType.Sad);
                            state           = State.Sad;
                            exState         = ExState.Pressed;
                            lastPressedTime = currentTime;
                            ret             = true;
                            break;

                        case EffectType.Worst:
                            OnPrcessEvaluate(false, false, EffectType.Worst, effectCallback);
                            results.Add(EffectType.Worst);
                            state           = State.Worst;
                            exState         = ExState.Pressed;
                            lastPressedTime = currentTime;
                            ret             = true;
                            break;

                        case 0:
                            break;
                        }
                        if (pressEval != EffectType.None)
                        {
                            Hidden      = false;
                            ColorHidden = false;
                            Array.Clear(colorMarkInfo.Pos1, 0, colorMarkInfo.Pos1.Length);
                            Array.Clear(colorMarkInfo.Pos2, 0, colorMarkInfo.Pos2.Length);
                            colorMarkInfo.VerticesCount = 0;
                        }
                        if (!ret && exState == ExState.Pressed)
                        {
                            OnPrcessEvaluate(false, false, EffectType.SlideStart, effectCallback, FirstSlideColorMarkInfo.BasePosition + Position);
                        }
                    }
                }
                else if (exState == ExState.Pressed)
                {
                    if (ProcessReleasedButton(released))
                    {
                        var last = colorExMarkInfos.LastOrDefault(c => c.IsSlided);
                        OnPrcessEvaluate(false, false, EffectType.SlideEnd, effectCallback, (last ?? FirstSlideColorMarkInfo).BasePosition + Position);
                        UnsetReleasedButton(button);
                        ret = true;
                    }
                    if (!ret)
                    {
                        if (currentTime - endTime >= 0)
                        {
                            OnPrcessEvaluate(false, false, EffectType.SlideEnd, effectCallback, LastSlideColorMarkInfo.BasePosition + Position);
                            results.Add(EffectType.Slide);
                            exState     = ExState.Released;
                            soundType   = (int)ButtonType;
                            Hidden      = false;
                            ColorHidden = false;
                            ret         = true;
                        }
                    }
                }
                if (exState == ExState.Waiting)
                {
                    if (currentTime - Time >= eval[3])
                    {
                        OnPrcessEvaluate(false, false, EffectType.Worst, null);
                        results.Add(EffectType.Worst);
                        ret = true;
                    }
                }
            }
            else
            {
                //when auto
                if (exState == ExState.Waiting)
                {
                    if (currentTime - Time >= -AutoWidth)
                    {
                        OnPrcessEvaluate(false, false, EffectType.Cool, effectCallback);
                        OnPrcessEvaluate(false, false, EffectType.SlideStart, effectCallback, FirstSlideColorMarkInfo.BasePosition + Position);
                        results.Add(EffectType.Cool);
                        exState         = ExState.Pressed;
                        lastPressedTime = currentTime;
                        soundType       = (int)ButtonType;
                        Hidden          = false;
                        ColorHidden     = false;
                        Array.Clear(colorMarkInfo.Pos1, 0, colorMarkInfo.Pos1.Length);
                        Array.Clear(colorMarkInfo.Pos2, 0, colorMarkInfo.Pos2.Length);
                        colorMarkInfo.VerticesCount = 0;
                    }
                }
                else if (exState == ExState.Pressed)
                {
                    if (currentTime - endTime >= 0)
                    {
                        OnPrcessEvaluate(false, false, EffectType.SlideEnd, effectCallback, LastSlideColorMarkInfo.BasePosition + Position);
                        results.Add(EffectType.Slide);
                        exState     = ExState.Released;
                        soundType   = (int)ButtonType;
                        Hidden      = false;
                        ColorHidden = false;
                        ret         = true;
                    }
                }
            }
            float scale = (float)bpm / DefaultBpm;

            if (state < State.Cool)
            {
                if (state == State.Moving && currentTime - Time >= 0)
                {
                    state = State.Disappering;
                }
                if (state == State.Disappering)
                {
                    mark.Scale = axis.Scale = colorMarkInfo.ColorMark.Scale = new Vector2((eval[3] + Time - currentTime) / eval[3]);
                    if (mark.Scale.X <= 0)
                    {
                        mark.Scale = axis.Scale = colorMarkInfo.Scale = Vector2.Zero;
                    }
                }
                if (Hidden)
                {
                    if (Time - currentTime <= 0.5f / scale)
                    {
                        if (displayState == DisplayState.Sudden)
                        {
                            Hidden      = false;
                            ColorHidden = false;
                            OnPrcessEvaluate(false, false, EffectType.Appear, effectCallback);
                            Array.Clear(colorMarkInfo.Pos1, 0, colorMarkInfo.Pos1.Length);
                            Array.Clear(colorMarkInfo.Pos2, 0, colorMarkInfo.Pos2.Length);
                            colorMarkInfo.VerticesCount = 0;
                        }
                    }
                    else if (Time - currentTime <= 2 / scale)
                    {
                        if (displayState == DisplayState.Normal || displayState == DisplayState.Hidden || displayState == DisplayState.HiddenColor || displayState == DisplayState.SuddenColor)
                        {
                            Hidden      = false;
                            ColorHidden = false;
                            OnPrcessEvaluate(false, false, EffectType.Appear, effectCallback);
                            ColorHidden |= displayState == DisplayState.SuddenColor;
                        }
                    }
                }
                else
                {
                    if (Time - currentTime <= 0.25f / scale)
                    {
                        if (displayState == DisplayState.Hidden)
                        {
                            displayState = (DisplayState)(-1);
                            Hidden       = true;
                        }
                        else
                        {
                            ColorHidden |= (exState == ExState.Waiting && displayState == DisplayState.HiddenColor);
                        }
                    }
                    else if (Time - currentTime <= 0.5f / scale)
                    {
                        if (ColorHidden && displayState == DisplayState.SuddenColor)
                        {
                            Array.Clear(colorMarkInfo.Pos1, 0, colorMarkInfo.Pos1.Length);
                            Array.Clear(colorMarkInfo.Pos2, 0, colorMarkInfo.Pos2.Length);
                            colorMarkInfo.VerticesCount = 0;
                            ColorHidden = false;
                        }
                    }
                }
                if (state == State.Appearing && !Hidden)
                {
                    float sx = mark.Scale.X + 0.05f;
                    mark.Scale = new Vector2(sx, sx);
                    if (mark.Scale.X > 1.2f)
                    {
                        mark.Scale = Vector2.One;
                        state      = State.Moving;
                    }
                }
                UpdateColorPosition(currentTime, bpm);
                axis.Rotation = -1 * (float)Math.PI * (Time - currentTime) * scale;
                if (axis.Rotation >= 0)
                {
                    axis.Rotation = 0;
                }
            }
            for (int i = 0; i < colorExMarkInfos.Length; i++)
            {
                switch (colorExMarkInfos[i].ShowState)
                {
                case SlideColorMarkInfo.State.None:

                    if (colorExMarkInfos[i].MarkTime - currentTime <= 0.5f / scale)
                    {
                        if (displayState == DisplayState.Sudden)
                        {
                            colorExMarkInfos[i].ShowState = SlideColorMarkInfo.State.Appearing;
                            OnPrcessEvaluate(false, false, EffectType.Appear, effectCallback, colorExMarkInfos[i].BasePosition + Position);
                        }
                    }
                    if (colorExMarkInfos[i].MarkTime - currentTime <= 2 / scale)
                    {
                        if (displayState == DisplayState.Normal || displayState == DisplayState.Hidden || displayState == DisplayState.HiddenColor || displayState == DisplayState.SuddenColor)
                        {
                            colorExMarkInfos[i].ShowState = SlideColorMarkInfo.State.Appearing;
                            OnPrcessEvaluate(false, false, EffectType.Appear, effectCallback, colorExMarkInfos[i].BasePosition + Position);
                        }
                    }
                    break;

                case SlideColorMarkInfo.State.Appearing:
                    float sx = exMarks[i].Scale.X + 0.05f;
                    exMarks[i].Scale = new Vector2(sx, sx);
                    if (exMarks[i].Scale.X > 1.2f)
                    {
                        exMarks[i].Scale = Vector2.One;
                        colorExMarkInfos[i].ShowState = SlideColorMarkInfo.State.Moving;
                    }
                    break;

                case SlideColorMarkInfo.State.Moving:
                    if (currentTime - colorExMarkInfos[i].MarkTime >= 0)
                    {
                        colorExMarkInfos[i].ShowState = SlideColorMarkInfo.State.Disappearing;
                    }
                    break;

                case SlideColorMarkInfo.State.Disappearing:
                    colorExMarkInfos[i].ColorMark.Scale = exMarks[i].Scale = new Vector2((eval[3] + colorExMarkInfos[i].MarkTime - currentTime) / eval[3]);
                    if (exMarks[i].Scale.X <= 0)
                    {
                        colorExMarkInfos[i].ColorMark.Scale = exMarks[i].Scale = Vector2.Zero;
                    }
                    break;
                }
                var vec = CalculateColorPosition(colorExMarkInfos[i], colorExMarkInfos[i].SlideMarkInfo, colorExMarkInfos[i].MarkTime, currentTime, bpm);
                UpdateColorMarkInfo(colorExMarkInfos[i], colorExMarkInfos[i].SlideMarkInfo, colorExMarkInfos[i].MarkTime, currentTime, bpm, vec);
                var prevVisible = !colorExMarkInfos[i].ColorMark.Hidden;
                colorExMarkInfos[i].DrawTrace        = exState < ExState.Pressed || currentTime < colorExMarkInfos[i].MarkTime;
                colorExMarkInfos[i].ColorMark.Hidden = exMarks[i].Hidden = !colorExMarkInfos[i].DrawTrace;
                var currentVisible = !colorExMarkInfos[i].ColorMark.Hidden;
                if (prevVisible != currentVisible)
                {
                    if ((exState == ExState.Pressed || (results[EffectType.Slide] && ret)) && !colorExMarkInfos[i].IsSlided)
                    {
                        PressingFrames++;
                        OnPrcessEvaluate(false, false, EffectType.Slide, effectCallback, colorExMarkInfos[i].BasePosition + Position);
                        colorExMarkInfos[i].IsSlided = true;
                        if (i < colorExMarkInfos.Length - 1)
                        {
                            results.Add(EffectType.Slide);
                        }
                    }
                }
            }
            if (exState == ExState.Pressed)
            {
                if (currentTime - lastPressedTime >= ExFrameSec)
                {
                    lastPressedTime += ExFrameSec;
                    soundType        = (int)ButtonType;
                }
            }
            if (ret && IsMaxSlide)
            {
                OnPrcessEvaluate(false, false, EffectType.MaxSlide, effectCallback, LastSlideColorMarkInfo.BasePosition + Position);
            }

            axis.Hidden = mark.Hidden = state >= State.Cool || exState >= ExState.Pressed;
            colorMarkInfo.ColorMark.Hidden = ColorHidden || state >= State.Cool || exState >= ExState.Pressed;
            colorMarkInfo.DrawTrace        = (state == State.Moving || state == State.Appearing) && exState == ExState.Waiting;
            for (var i = 0; i < exMarks.Length; i++)
            {
                exMarks[i].Hidden |= colorExMarkInfos[i].ShowState == SlideColorMarkInfo.State.None || !(state < State.Cool);
            }
            for (var i = 0; i < colorExMarkInfos.Length; i++)
            {
                colorExMarkInfos[i].Hidden            = Hidden || ColorHidden;
                colorExMarkInfos[i].ColorMark.Hidden |= Hidden || ColorHidden;
            }
            colorMarkInfo.Hidden = Hidden || ColorHidden;
            return(ret);
        }
Пример #5
0
        public virtual bool Update(float currentTime, float bpm, ref bool[] button, MarkResults results, bool auto, ref int soundType, MarkManager.EvaluateEffectHandler effectCallback)
        {
            if (fixedBPM >= 0)
            {
                bpm = fixedBPM;
            }
            bool ret = false;

            if (!auto)
            {
                if (ProcessPressedButton(button) && state < State.Cool)
                {
                    Logger.Instance.AddLog("Update:{0}, {1}, {2}", Time, currentTime, adjustGapTime);
                    var pressEval = EvaluateImpl(Time, currentTime - adjustGapTime);
                    Logger.Instance.AddLog("Evaluate:{0}", pressEval);
                    if (pressEval > EffectType.Worst)
                    {
                        UnsetPressedButton(button);
                    }
                    switch (pressEval)
                    {
                    case EffectType.Cool:
                        state = State.Cool;
                        OnPrcessEvaluate(false, false, EffectType.Cool, effectCallback);
                        results.Add(EffectType.Cool);
                        ret = true;
                        break;

                    case EffectType.Fine:
                        state = State.Fine;
                        OnPrcessEvaluate(false, false, EffectType.Fine, effectCallback);
                        results.Add(EffectType.Fine);
                        ret = true;
                        break;

                    case EffectType.Safe:
                        state = State.Safe;
                        OnPrcessEvaluate(false, false, EffectType.Safe, effectCallback);
                        results.Add(EffectType.Safe);
                        ret = true;
                        break;

                    case EffectType.Sad:
                        state = State.Sad;
                        OnPrcessEvaluate(false, false, EffectType.Sad, effectCallback);
                        results.Add(EffectType.Sad);
                        ret = true;
                        break;

                    case EffectType.Worst:
                        state = State.Worst;
                        OnPrcessEvaluate(false, false, EffectType.Worst, null);
                        results.Add(EffectType.Worst);
                        ret = true;
                        break;

                    case 0:
                        break;
                    }
                }
            }
            else
            {
                //when auto
                if (currentTime - Time >= -AutoWidth && state < State.Cool)
                {
                    state = State.Cool;
                    OnPrcessEvaluate(false, false, EffectType.Cool, effectCallback);
                    soundType = (int)ButtonType;
                    results.Add(EffectType.Cool);
                    ret         = true;
                    Hidden      = false;
                    ColorHidden = false;
                }
            }
            if (currentTime - Time >= eval[3] && state < State.Cool)
            {
                OnPrcessEvaluate(false, false, EffectType.Worst, null);
                results.Add(EffectType.Worst);
                ret = true;
            }
            if (state < State.Cool)
            {
                if (state == State.Moving && currentTime - Time >= 0)
                {
                    state = State.Disappering;
                }
                if (state == State.Disappering)
                {
                    mark.Scale = axis.Scale = colorMarkInfo.ColorMark.Scale = new Vector2((eval[3] + Time - currentTime) / eval[3]);
                    if (mark.Scale.X <= 0)
                    {
                        mark.Scale = axis.Scale = colorMarkInfo.Scale = Vector2.Zero;
                    }
                }
                float scale = (float)bpm / DefaultBpm;
                if (Hidden)
                {
                    if (Time - currentTime <= 0.5f / scale)
                    {
                        if (displayState == DisplayState.Sudden)
                        {
                            Hidden      = false;
                            ColorHidden = false;
                            OnPrcessEvaluate(false, false, EffectType.Appear, effectCallback);
                            Array.Clear(colorMarkInfo.Pos1, 0, colorMarkInfo.Pos1.Length);
                            Array.Clear(colorMarkInfo.Pos2, 0, colorMarkInfo.Pos2.Length);
                            colorMarkInfo.VerticesCount = 0;
                        }
                    }
                    else if (Time - currentTime <= 2 / scale)
                    {
                        if (displayState == DisplayState.Normal || displayState == DisplayState.Hidden || displayState == DisplayState.HiddenColor || displayState == DisplayState.SuddenColor)
                        {
                            Hidden      = false;
                            ColorHidden = false;
                            OnPrcessEvaluate(false, false, EffectType.Appear, effectCallback);
                            ColorHidden |= displayState == DisplayState.SuddenColor;
                        }
                    }
                }
                else
                {
                    if (Time - currentTime <= 0.25f / scale)
                    {
                        if (displayState == DisplayState.Hidden)
                        {
                            displayState = (DisplayState)(-1);
                            Hidden       = true;
                        }
                        else
                        {
                            ColorHidden |= displayState == DisplayState.HiddenColor;
                        }
                    }
                    else if (Time - currentTime <= 0.5f / scale)
                    {
                        if (ColorHidden && displayState == DisplayState.SuddenColor)
                        {
                            Array.Clear(colorMarkInfo.Pos1, 0, colorMarkInfo.Pos1.Length);
                            Array.Clear(colorMarkInfo.Pos2, 0, colorMarkInfo.Pos2.Length);
                            colorMarkInfo.VerticesCount = 0;
                            ColorHidden = false;
                        }
                    }
                }
                if (state == State.Appearing && !Hidden)
                {
                    float sx = mark.Scale.X + 0.05f;
                    mark.Scale = new Vector2(sx, sx);
                    //uzu.Scale = new Vector2(sx / 4f, sx / 4f);
                    if (mark.Scale.X > 1.2f)
                    {
                        mark.Scale = Vector2.One;
                        state      = State.Moving;
                    }
                }
                UpdateColorPosition(currentTime, bpm);
                axis.Rotation = -1 * (float)Math.PI * (Time - currentTime) * scale;
                if (axis.Rotation >= 0)
                {
                    axis.Rotation = 0;
                }
            }
            colorMarkInfo.DrawTrace        = state == State.Moving || state == State.Appearing;
            mark.Hidden                    = axis.Hidden = !(state < State.Cool);
            colorMarkInfo.ColorMark.Hidden = ColorHidden || !(state < State.Cool);
            colorMarkInfo.Hidden           = ColorHidden;
            return(ret);
        }