Implement pausing.
This commit is contained in:
@@ -9,12 +9,15 @@ using System.Text.Formatting;
|
||||
namespace Cryville.Crtr {
|
||||
public class Judge {
|
||||
#region Data
|
||||
readonly ChartPlayer _sys;
|
||||
readonly PdtEvaluator _etor;
|
||||
readonly PdtRuleset _rs;
|
||||
readonly Dictionary<Identifier, List<JudgeEvent>> evs
|
||||
= new Dictionary<Identifier, List<JudgeEvent>>();
|
||||
readonly Dictionary<Identifier, List<JudgeEvent>> activeEvs
|
||||
= new Dictionary<Identifier, List<JudgeEvent>>();
|
||||
static readonly int _var_pause = IdentifierManager.SharedInstance.Request("pause");
|
||||
readonly JudgeDefinition _judgePause;
|
||||
public struct JudgeEvent {
|
||||
public double StartTime { get; set; }
|
||||
public double EndTime { get; set; }
|
||||
@@ -30,22 +33,33 @@ namespace Cryville.Crtr {
|
||||
return x.StartClip.CompareTo(y.StartClip);
|
||||
}
|
||||
}
|
||||
public Judge(PdtRuleset rs) {
|
||||
public Judge(ChartPlayer sys, PdtRuleset rs) {
|
||||
_sys = sys;
|
||||
_etor = ChartPlayer.etor;
|
||||
_rs = rs;
|
||||
_numsrc1 = new PropSrc.Float(() => _numbuf1);
|
||||
_numsrc2 = new PropSrc.Float(() => _numbuf2);
|
||||
_numsrc3 = new PropSrc.Float(() => _numbuf3);
|
||||
_numsrc4 = new PropSrc.Float(() => _numbuf4);
|
||||
_rs.judges.TryGetValue(new Identifier(_var_pause), out _judgePause);
|
||||
foreach (var i in rs.inputs.Keys) {
|
||||
evs.Add(i, new List<JudgeEvent>());
|
||||
var l = new List<JudgeEvent>();
|
||||
evs.Add(i, l);
|
||||
activeEvs.Add(i, new List<JudgeEvent>());
|
||||
if (_judgePause != null && i.Key == _var_pause) {
|
||||
l.Add(new JudgeEvent {
|
||||
StartTime = double.NegativeInfinity, EndTime = double.PositiveInfinity,
|
||||
StartClip = double.NegativeInfinity, EndClip = double.PositiveInfinity,
|
||||
Definition = _judgePause,
|
||||
});
|
||||
}
|
||||
}
|
||||
InitJudges();
|
||||
InitScores();
|
||||
}
|
||||
public void Prepare(StampedEvent sev, NoteHandler handler) {
|
||||
var tev = (Chart.Judge)sev.Unstamped;
|
||||
if (tev.Id.Key == _var_pause) throw new InvalidOperationException("Cannot assign the special judge \"pause\" to notes");
|
||||
Identifier input = default(Identifier);
|
||||
ChartPlayer.etor.Evaluate(new PropOp.Identifier(v => input = new Identifier(v)), _rs.judges[tev.Id].input);
|
||||
double st = sev.Time, et = st + sev.Duration;
|
||||
@@ -127,6 +141,7 @@ namespace Cryville.Crtr {
|
||||
if (def.hit != null) _etor.Evaluate(_flagop, def.hit);
|
||||
else _flag = true;
|
||||
if (_flag) {
|
||||
if (ev.Definition == _judgePause) _sys.TogglePause();
|
||||
if (def.scores != null) UpdateScore(def.scores);
|
||||
if (def.pass != null) Pass(ev, (ft + tt) / 2, def.pass);
|
||||
actlist.RemoveAt(index);
|
||||
|
Reference in New Issue
Block a user