Newer
Older
Qwilight / Qwilight / Note / LongNote.cs
@Taehui Taehui 14 days ago 9 KB v1.16.42
using Microsoft.Graphics.Canvas;
using Qwilight.Compute;
using Qwilight.Utilities;

namespace Qwilight.Note
{
    public sealed class LongNote : InputNote
    {
        /// <summary>
        /// 위
        /// </summary>
        public const int LongNoteTail = 1;
        public const int LongNoteContents = 2;
        /// <summary>
        /// 아래
        /// </summary>
        public const int LongNoteFront = 3;

        public const int LongNoteBefore = 0;
        public const int LongNoteHandling = 1;
        public const int LongNoteFailed = 2;

        public override int LogicalLayer => 2;

        public LongNote(double logicalY, double wait, ICollection<AudioNote> audioNotes, int input, double longWait, double longHeight) : base(logicalY, wait, audioNotes, input)
        {
            LongWait = longWait;
            LongHeight = longHeight;
        }

        public override JudgedNoteData? Judge(int input, double wait, ModeComponent modeComponent, double judgmentStage, Component.JudgmentModeDate judgmentModeDate, Component.JudgmentMapDate judgmentMapDate, Component.LongNoteAssistDate longNoteAssistDate, Component.TrapNoteJudgmentDate trapNoteJudgmentDate, bool isAutoLongNote)
        {
            if (input > 0)
            {
                if (Judged == Component.Judged.Not)
                {
                    var judgmentMeter = (wait - Wait) / modeComponent.AudioMultiplier;
                    var judged = Component.GetJudged(judgmentMeter, modeComponent, judgmentStage, judgmentModeDate, judgmentMapDate, longNoteAssistDate);
                    if (judged != Component.Judged.Not)
                    {
                        return new JudgedNoteData
                        {
                            IDValue = JudgedNoteData.ID.LevyLongNoteJudgment,
                            JudgmentMeter = judgmentMeter,
                            Judged = judged
                        };
                    }
                }
            }
            else if (Judged != Component.Judged.Not)
            {
                var longJudgmentMeter = (wait - (Wait + LongWait)) / modeComponent.AudioMultiplier;
                if ((isAutoLongNote && modeComponent.LongNoteModeValue != ModeComponent.LongNoteMode.Input) || modeComponent.LongNoteModeValue == ModeComponent.LongNoteMode.Auto)
                {
                    if (Component.GetIsJudgment(longJudgmentMeter, Component.Judged.Lower, modeComponent, judgmentStage, judgmentModeDate, judgmentMapDate, longNoteAssistDate, Component.JudgmentAssist.LongNoteUp))
                    {
                        return new JudgedNoteData
                        {
                            IDValue = JudgedNoteData.ID.AutoLongNoteJudgment,
                            JudgmentMeter = longJudgmentMeter,
                            Judged = Judged
                        };
                    }
                    return new JudgedNoteData
                    {
                        IDValue = JudgedNoteData.ID.FailedLongNoteJudgment
                    };
                }
                else
                {
                    var judged = Component.GetJudged(longJudgmentMeter, modeComponent, judgmentStage, judgmentModeDate, judgmentMapDate, longNoteAssistDate, Component.JudgmentAssist.LongNoteUp);
                    if (judged != Component.Judged.Not)
                    {
                        return new JudgedNoteData
                        {
                            IDValue = JudgedNoteData.ID.QuitLongNoteJudgment,
                            JudgmentMeter = longJudgmentMeter,
                            Judged = judged
                        };
                    }
                    return new JudgedNoteData
                    {
                        IDValue = JudgedNoteData.ID.FailedLongNoteJudgment,
                        Judged = judged
                    };
                }
            }
            return null;
        }

        public override bool IsTooLong(double wait, ModeComponent modeComponent, double judgmentStage, Component.JudgmentModeDate judgmentModeDate, Component.JudgmentMapDate judgmentMapDate, Component.LongNoteAssistDate longNoteAssistDate) => (wait - (Wait + LongWait)) / modeComponent.AudioMultiplier > Component.GetJudgmentMillis(Component.Judged.Lower, modeComponent, judgmentStage, judgmentModeDate, judgmentMapDate, longNoteAssistDate, 1, Component.JudgmentAssist.LongNoteUp);

        public override void Paint(CanvasDrawingSession targetSession, bool isValidNetDrawings, DefaultCompute defaultComputer, ref Bound r)
        {
            var modeComponent = defaultComputer.ModeComponentValue;
            var multiplier = GetMultiplierAsNoteMobility(modeComponent, defaultComputer.NoteMobilityCosine, defaultComputer.NoteMobilityValue);
            var drawingComponentValue = defaultComputer.DrawingComponentValue;
            var judgmentMainPosition = drawingComponentValue.judgmentMainPosition;
            var y = GetY(defaultComputer, multiplier);
            var pointHeight = LongHeight * multiplier;
            var longNoteFrontEdgeHeight = drawingComponentValue.longNoteFrontEdgeHeights[TargetInput];
            var longNoteTailEdgeHeight = drawingComponentValue.longNoteTailEdgeHeights[TargetInput];
            var longNoteFrontEdgePosition = drawingComponentValue.longNoteFrontEdgePositions[TargetInput];
            var longNoteTailEdgePosition = drawingComponentValue.longNoteTailEdgePositions[TargetInput];
            var noteLength = GetNoteLength(defaultComputer);
            var notePosition = GetPosition(defaultComputer);
            var faint = GetFaint(modeComponent, judgmentMainPosition, defaultComputer.FaintCosine);
            var longNoteTailContentsHeight = drawingComponentValue.longNoteTailContentsHeights[TargetInput];
            var longNoteFrontContentsHeight = drawingComponentValue.longNoteFrontContentsHeights[TargetInput];
            var longNoteContentsHeight = pointHeight + longNoteTailContentsHeight + longNoteFrontContentsHeight;
            var longNoteDrawings = UI.Instance.NoteDrawings[(int)defaultComputer.InputMode][TargetInput][defaultComputer.NoteFrame];
            if (!IsFailed && Judged != Component.Judged.Not)
            {
                var noteWait = Configure.Instance.UIConfigureValue.NoteWait;
                var longHeight = longNoteContentsHeight + judgmentMainPosition + noteWait - y;
                if (longHeight > 0.0)
                {
                    r.Set(notePosition, y - pointHeight - longNoteTailContentsHeight, noteLength, longHeight);
                    PaintLongNoteContents(ref r, LongNoteHandling);

                    r.Set(notePosition, y - pointHeight - Math.Max(0.0, longNoteTailEdgeHeight) - longNoteTailEdgePosition, noteLength, Math.Abs(longNoteTailEdgeHeight));
                    PaintLongNoteTail(ref r);
                }
                if (UI.Instance.MaintainLongNoteFrontEdge)
                {
                    r.Set(notePosition, judgmentMainPosition - Math.Max(0.0, -longNoteFrontEdgeHeight) + longNoteFrontEdgePosition + noteWait, noteLength, Math.Abs(longNoteFrontEdgeHeight));
                    PaintLongNoteFront(ref r);
                }
            }
            else
            {
                if (IsFailed)
                {
                    faint /= 2;
                }
                if (longNoteContentsHeight > 0.0)
                {
                    r.Set(notePosition, y - pointHeight - longNoteTailContentsHeight, noteLength, longNoteContentsHeight);
                    PaintLongNoteContents(ref r, IsFailed ? LongNoteFailed : LongNoteBefore);

                    r.Set(notePosition, y - pointHeight - Math.Max(0.0, longNoteTailEdgeHeight) - longNoteTailEdgePosition, noteLength, Math.Abs(longNoteTailEdgeHeight));
                    PaintLongNoteTail(ref r);
                }
                r.Set(notePosition, y - Math.Max(0.0, -longNoteFrontEdgeHeight) + longNoteFrontEdgePosition, noteLength, Math.Abs(longNoteFrontEdgeHeight));
                PaintLongNoteFront(ref r);
            }

            void PaintLongNoteContents(ref Bound r, int longNoteStatus)
            {
                if (r.Position1 + r.Height > 0.0)
                {
                    var longNoteDrawing = longNoteDrawings?[LongNoteContents]?[longNoteStatus];
                    if (longNoteDrawing.HasValue)
                    {
                        targetSession.PaintDrawing(ref r, longNoteDrawing, faint);
                        defaultComputer.NewNetDrawing(isValidNetDrawings, Event.Types.NetDrawing.Types.Variety.Note, longNoteDrawing.Value.AverageColor, r.Position0 - drawingComponentValue.mainPosition, r.Position1, r.Length, r.Height * longNoteDrawing.Value.AverageHeight);
                    }
                }
            }

            void PaintLongNoteTail(ref Bound r)
            {
                if (r.Position1 + r.Height > 0.0)
                {
                    targetSession.PaintDrawing(ref r, longNoteDrawings?[LongNoteTail]?[IsFailed ? LongNoteFailed : LongNoteBefore], faint);
                }
            }

            void PaintLongNoteFront(ref Bound r)
            {
                if (r.Position1 + r.Height > 0.0)
                {
                    targetSession.PaintDrawing(ref r, longNoteDrawings?[LongNoteFront]?[IsFailed ? LongNoteFailed : LongNoteBefore], faint);
                }
            }
        }
    }
}