diff --git a/Assets/Cryville/Crtr/Judge.cs b/Assets/Cryville/Crtr/Judge.cs index 0a4e92a..e00b86c 100644 --- a/Assets/Cryville/Crtr/Judge.cs +++ b/Assets/Cryville/Crtr/Judge.cs @@ -8,13 +8,22 @@ namespace Cryville.Crtr { readonly PdtRuleset _rs; readonly Dictionary ct = new Dictionary(); - readonly Dictionary> evs - = new Dictionary>(); + readonly Dictionary> evs + = new Dictionary>(); + readonly Dictionary> activeEvs + = new Dictionary>(); struct JudgeEvent { - public float EndTime; + public float StartTime { get; set; } + public float EndTime { get; set; } public JudgeDefinition Definition { get; set; } public ContainerState State { get; set; } } + static IComparer _stcmp = new JudgeEventStartTimeComparer(); + class JudgeEventStartTimeComparer : IComparer { + public int Compare(JudgeEvent x, JudgeEvent y) { + return x.StartTime.CompareTo(y.StartTime); + } + } public Judge(PdtRuleset rs) { _rs = rs; foreach (var s in rs.scores) { @@ -23,13 +32,22 @@ namespace Cryville.Crtr { scores.Add(name, s.Value.init); } } - public void Prepare(float time, Identifier input, JudgeDefinition def, ContainerState container) { - Dictionary list; + public void Prepare(float st, float et, Identifier input, JudgeDefinition def, ContainerState container) { + List list; if (!evs.TryGetValue(input, out list)) { ct.Add(input, 0); - evs.Add(input, list = new Dictionary()); + evs.Add(input, list = new List()); + activeEvs.Add(input, new List()); } - list.Add(time + def.clip[0], new JudgeEvent { EndTime = time + def.clip[1], Definition = def, State = container }); + var ev = new JudgeEvent { + StartTime = st + def.clip[0], + EndTime = et + def.clip[1], + Definition = def, + State = container, + }; + var index = list.BinarySearch(ev, _stcmp); + if (index < 0) index = ~index; + list.Insert(index, ev); } public void Feed(string target, float ft, float tt) { Logger.Log("main", 0, "Judge", "Feed {0}: {1}->{2}", target, ft, tt); diff --git a/Assets/Cryville/Crtr/NoteHandler.cs b/Assets/Cryville/Crtr/NoteHandler.cs index 2854198..696b5ce 100644 --- a/Assets/Cryville/Crtr/NoteHandler.cs +++ b/Assets/Cryville/Crtr/NoteHandler.cs @@ -99,7 +99,7 @@ namespace Cryville.Crtr { ChartPlayer.etor.ContextEvent = tev; ChartPlayer.etor.ContextState = s; ChartPlayer.etor.Evaluate(new PropOp.Identifier(v => name = new Identifier(v)), ruleset.judges[tev.Id].input); - judge.Prepare(ps.Time, name, ruleset.judges[tev.Id], cs); + judge.Prepare(ev.Time, ev.Time + ev.Duration, name, ruleset.judges[tev.Id], cs); ChartPlayer.etor.ContextState = null; ChartPlayer.etor.ContextEvent = null; }