From c31c16792c6e080ad9f6a355381d3b7bb705d93c Mon Sep 17 00:00:00 2001 From: PopSlime Date: Mon, 14 Nov 2022 13:55:10 +0800 Subject: [PATCH] Add judge priority. --- Assets/Cryville/Crtr/Judge.cs | 38 ++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/Assets/Cryville/Crtr/Judge.cs b/Assets/Cryville/Crtr/Judge.cs index c0e3875..6071d3e 100644 --- a/Assets/Cryville/Crtr/Judge.cs +++ b/Assets/Cryville/Crtr/Judge.cs @@ -16,19 +16,15 @@ namespace Cryville.Crtr { struct JudgeEvent { public float StartTime { get; set; } public float EndTime { get; set; } + public float StartClip { get; set; } + public float EndClip { get; set; } public JudgeDefinition Definition { get; set; } public ContainerState State { get; set; } } static readonly IComparer _stcmp = new JudgeEventStartTimeComparer(); class JudgeEventStartTimeComparer : IComparer { public int Compare(JudgeEvent x, JudgeEvent y) { - return x.StartTime.CompareTo(y.StartTime); - } - } - static readonly IComparer _etcmp = new JudgeEventEndTimeComparer(); - class JudgeEventEndTimeComparer : IComparer { - public int Compare(JudgeEvent x, JudgeEvent y) { - return x.EndTime.CompareTo(y.EndTime); + return x.StartClip.CompareTo(y.StartClip); } } public Judge(PdtRuleset rs) { @@ -48,8 +44,10 @@ namespace Cryville.Crtr { activeEvs.Add(input, new List()); } var ev = new JudgeEvent { - StartTime = st + def.clip[0], - EndTime = et + def.clip[1], + StartTime = st, + EndTime = et, + StartClip = st + def.clip[0], + EndClip = et + def.clip[1], Definition = def, State = container, }; @@ -57,6 +55,20 @@ namespace Cryville.Crtr { if (index < 0) index = ~index; list.Insert(index, ev); } + // Adopted from System.Collections.Generic.ArraySortHelper.InternalBinarySearch(T[] array, int index, int length, T value, IComparer comparer) + int BinarySearch(List list, float time, int stack) { + int num = 0; + int num2 = list.Count - 1; + while (num <= num2) { + int num3 = num + (num2 - num >> 1); + int num4 = -list[num3].Definition.stack.CompareTo(stack); + if (num4 == 0) num4 = list[num3].StartClip.CompareTo(time); + if (num4 == 0) return num3; + else if (num4 < 0) num = num3 + 1; + else num2 = num3 - 1; + } + return ~num; + } public void Feed(Identifier target, float ft, float tt) { Forward(target, tt); var actlist = activeEvs[target]; @@ -69,7 +81,7 @@ namespace Cryville.Crtr { var actlist = activeEvs[target]; for (int i = actlist.Count - 1; i >= 0; i--) { JudgeEvent ev = actlist[i]; - if (tt > ev.EndTime) { + if (tt > ev.EndClip) { actlist.RemoveAt(i); // TODO miss ev } @@ -79,9 +91,9 @@ namespace Cryville.Crtr { var list = evs[target]; var actlist = activeEvs[target]; JudgeEvent ev; - while (list.Count > 0 && (ev = list[0]).StartTime <= tt) { + while (list.Count > 0 && (ev = list[0]).StartClip <= tt) { list.RemoveAt(0); - var index = actlist.BinarySearch(ev, _etcmp); + var index = BinarySearch(actlist, ev.StartClip, ev.Definition.stack); if (index < 0) index = ~index; actlist.Insert(index, ev); // TODO priority? @@ -122,6 +134,8 @@ namespace Cryville.Crtr { public Identifier[] pass; public Identifier miss; public Dictionary scores; + public int stack; + public int prop = -1; } public class ScoreOperation { public Identifier name;