From cf00bd8db0f899625c04ae8bebe1d5cd71cff6b4 Mon Sep 17 00:00:00 2001 From: PopSlime Date: Fri, 11 Nov 2022 10:01:24 +0800 Subject: [PATCH] Implement input name evaluation. Implement context state. --- Assets/Cryville/Crtr/Chart.cs | 12 +++++++++--- Assets/Cryville/Crtr/ChartPlayer.cs | 2 +- Assets/Cryville/Crtr/Event/ContainerState.cs | 12 ++++++++---- Assets/Cryville/Crtr/Judge.cs | 1 - Assets/Cryville/Crtr/NoteHandler.cs | 14 +++++++++++++- Assets/Cryville/Crtr/PdtEvaluator.cs | 8 +++++++- Assets/Cryville/Crtr/PropSrc.cs | 8 ++++++++ 7 files changed, 46 insertions(+), 11 deletions(-) diff --git a/Assets/Cryville/Crtr/Chart.cs b/Assets/Cryville/Crtr/Chart.cs index 545d1ec..ab2d780 100644 --- a/Assets/Cryville/Crtr/Chart.cs +++ b/Assets/Cryville/Crtr/Chart.cs @@ -397,14 +397,20 @@ namespace Cryville.Crtr { } public class Judge : ChartEvent { - public string name; + [JsonIgnore] + public Identifier Id; + public string name { + get { return Id.ToString(); } + set { Id = new Identifier(value); } + } + public override int Priority { get { return 0; } } public Judge() { - SubmitPropSrc("name", new PropSrc.String(() => name)); - SubmitPropOp("name", new PropOp.String(v => name = v)); + SubmitPropSrc("name", new PropSrc.Identifier(() => Id.Key)); + SubmitPropOp("name", new PropOp.Identifier(v => Id = new Identifier(v))); } } diff --git a/Assets/Cryville/Crtr/ChartPlayer.cs b/Assets/Cryville/Crtr/ChartPlayer.cs index 4de4d3b..5f5920e 100644 --- a/Assets/Cryville/Crtr/ChartPlayer.cs +++ b/Assets/Cryville/Crtr/ChartPlayer.cs @@ -518,7 +518,7 @@ namespace Cryville.Crtr { foreach (var ts in gs.Value.Children) { ContainerHandler th; if (ts.Key is Chart.Note) { - th = new NoteHandler(gh, (Chart.Note)ts.Key, judge); + th = new NoteHandler(gh, (Chart.Note)ts.Key, pruleset, judge); } else { th = new TrackHandler(gh, (Chart.Track)ts.Key); diff --git a/Assets/Cryville/Crtr/Event/ContainerState.cs b/Assets/Cryville/Crtr/Event/ContainerState.cs index e41f7f8..802cb7c 100644 --- a/Assets/Cryville/Crtr/Event/ContainerState.cs +++ b/Assets/Cryville/Crtr/Event/ContainerState.cs @@ -214,27 +214,31 @@ namespace Cryville.Crtr.Event { this.judge = judge; } - public T GetRawValue(Identifier key) where T : Vector { + public Vector GetRawValue(Identifier key) { Vector tr; if (!CachedValues.TryGetValue(key, out tr)) { - tr = (Vector)ReflectionHelper.InvokeEmptyConstructor(typeof(T)); + tr = (Vector)ReflectionHelper.InvokeEmptyConstructor(ChartPlayer.motionRegistry[key].Type); CachedValues.Add(key, tr); CachedValueStates[key] = false; } - T r = (T)tr; + Vector r = tr; #if !DISABLE_CACHE if (CachedValueStates[key]) return r; #endif float reltime = 0; if (rootPrototype != null) reltime = Time - rootPrototype.Time; GetMotionValue(key).GetValue(reltime, ref r); - if (Parent != null) r.ApplyFrom(Parent.GetRawValue(key)); + if (Parent != null) r.ApplyFrom(Parent.GetRawValue(key)); #if !DISABLE_CACHE CachedValueStates[key] = true; #endif return r; } + public T GetRawValue(Identifier key) where T : Vector { + return (T)GetRawValue(key); + } + static readonly Identifier n_pt = new Identifier("pt"); public Vector2 ScreenPoint { get { diff --git a/Assets/Cryville/Crtr/Judge.cs b/Assets/Cryville/Crtr/Judge.cs index 456343f..26c0636 100644 --- a/Assets/Cryville/Crtr/Judge.cs +++ b/Assets/Cryville/Crtr/Judge.cs @@ -50,7 +50,6 @@ namespace Cryville.Crtr { public class JudgeDefinition { public PdtExpression clip; public PdtExpression input; - public Identifier InputName; public PdtExpression hit; public Identifier[] pass; public Identifier miss; diff --git a/Assets/Cryville/Crtr/NoteHandler.cs b/Assets/Cryville/Crtr/NoteHandler.cs index e263b19..c289ef6 100644 --- a/Assets/Cryville/Crtr/NoteHandler.cs +++ b/Assets/Cryville/Crtr/NoteHandler.cs @@ -1,3 +1,4 @@ +using Cryville.Common; using Cryville.Common.Math; using Cryville.Crtr.Components; using Cryville.Crtr.Event; @@ -9,10 +10,12 @@ namespace Cryville.Crtr { class NoteHandler : ContainerHandler { readonly GroupHandler gh; public readonly Chart.Note Event; + readonly PdtRuleset ruleset; readonly Judge judge; - public NoteHandler(GroupHandler gh, Chart.Note ev, Judge j) : base() { + public NoteHandler(GroupHandler gh, Chart.Note ev, PdtRuleset rs, Judge j) : base() { this.gh = gh; Event = ev; + ruleset = rs; judge = j; } @@ -90,6 +93,15 @@ namespace Cryville.Crtr { else if (s.CloneType == 16) { if (ev == null) { } else if (ev.Unstamped == null) { } + else if (ev.Unstamped is Chart.Judge) { + var tev = (Chart.Judge)ev.Unstamped; + Identifier name; + ChartPlayer.etor.ContextEvent = tev; + ChartPlayer.etor.ContextState = s; + ChartPlayer.etor.Evaluate(new PropOp.Identifier(v => name = new Identifier(v)), ruleset.judges[tev.Id].input); + ChartPlayer.etor.ContextState = null; + ChartPlayer.etor.ContextEvent = null; + } else if (ev.Unstamped is Chart.Motion) { /*var tev = (Chart.Motion)ev.Unstamped; if (tev.Name != "judge") return; diff --git a/Assets/Cryville/Crtr/PdtEvaluator.cs b/Assets/Cryville/Crtr/PdtEvaluator.cs index b93b508..f8e8597 100644 --- a/Assets/Cryville/Crtr/PdtEvaluator.cs +++ b/Assets/Cryville/Crtr/PdtEvaluator.cs @@ -1,5 +1,6 @@ using Cryville.Common; using Cryville.Common.Pdt; +using Cryville.Crtr.Event; using System; using System.Collections.Generic; using UnityEngine; @@ -20,11 +21,16 @@ namespace Cryville.Crtr { else if (name == _var_true) { LoadNum(1); type = PdtInternalType.Number; value = _numbuf; } else if (name == _var_false) { LoadNum(0); type = PdtInternalType.Number; value = _numbuf; } else { + var id = new Identifier(name); PropSrc prop; string str; if (ContextEvent != null && ContextEvent.PropSrcs.TryGetValue(name, out prop)) { prop.Get(out type, out value); } + else if (ContextState != null && ChartPlayer.motionRegistry.ContainsKey(id)) { + var vec = ContextState.GetRawValue(id); + new VectorSrc(() => vec).Get(out type, out value); + } else if (ContextJudge != null && ContextJudge.GetFormattedScoreStrings().TryGetValue(name, out str)) { type = PdtInternalType.String; value = GetBytes(str); @@ -41,7 +47,6 @@ namespace Cryville.Crtr { value = _numbuf; } } - return; } } unsafe void LoadNum(int value) { @@ -93,6 +98,7 @@ namespace Cryville.Crtr { } public ChartEvent ContextEvent { private get; set; } + public ContainerState ContextState { private get; set; } public Transform ContextTransform { private get; set; } public Judge ContextJudge { private get; set; } public PropSrc ContextSelfValue { private get; set; } diff --git a/Assets/Cryville/Crtr/PropSrc.cs b/Assets/Cryville/Crtr/PropSrc.cs index 2515eeb..7c800c2 100644 --- a/Assets/Cryville/Crtr/PropSrc.cs +++ b/Assets/Cryville/Crtr/PropSrc.cs @@ -56,6 +56,14 @@ namespace Cryville.Crtr { } } } + public class Identifier : PropSrc { + readonly Func _cb; + public Identifier(Func cb) { _cb = cb; } + protected override void InternalGet(out int type, out byte[] value) { + type = PdtInternalType.Undefined; + value = BitConverter.GetBytes(_cb()); + } + } public class BeatTime : PropSrc { readonly Func _cb; public BeatTime(Func cb) { _cb = cb; }