Code cleanup with the implementation of property store.

This commit is contained in:
2023-08-02 17:20:45 +08:00
parent e34a9cc868
commit 5393ff1451
9 changed files with 122 additions and 99 deletions

View File

@@ -62,13 +62,6 @@ namespace Cryville.Crtr {
_etor.ContextJudge = this;
_rs = rs;
_areaFuncs = rs.areas;
_numsrc1 = new PropSrc.Float(() => _numbuf1);
_numsrc2 = new PropSrc.Float(() => _numbuf2);
_numsrc3 = new PropSrc.Float(() => _numbuf3);
_numsrc4 = new PropSrc.Float(() => _numbuf4);
_jnumsrc = new PropSrc.Float(() => _jnumbuf);
_jdnumsrc = new PropSrc.Float(() => _jdnumbuf);
_jvecsrc = new PropSrc.Vector4(() => _jvecbuf);
_identop = new PropOp.Identifier(v => _identbuf = new Identifier(v));
_clipop = new PropOp.Clip(v => _clipbuf = v);
_rs.judges.TryGetValue(new Identifier(_var_pause), out _judgePause);
@@ -173,14 +166,19 @@ namespace Cryville.Crtr {
static readonly int _var_tn = IdentifierManager.Shared.Request("judge_time_to");
static readonly int _var_ft = IdentifierManager.Shared.Request("input_time_from");
static readonly int _var_tt = IdentifierManager.Shared.Request("input_time_to");
float _numbuf1, _numbuf2, _numbuf3, _numbuf4;
readonly PropSrc _numsrc1, _numsrc2, _numsrc3, _numsrc4;
readonly PropStores.Float
_numst1 = new PropStores.Float(),
_numst2 = new PropStores.Float(),
_numst3 = new PropStores.Float(),
_numst4 = new PropStores.Float();
static readonly int _var_jt = IdentifierManager.Shared.Request("hit_time");
static readonly int _var_jdt = IdentifierManager.Shared.Request("hit_delta_time");
static readonly int _var_jv = IdentifierManager.Shared.Request("hit_vec");
float _jnumbuf, _jdnumbuf; Vector4 _jvecbuf;
readonly PropSrc _jnumsrc, _jdnumsrc, _jvecsrc;
readonly PropStores.Float
_jnumst = new PropStores.Float(),
_jdnumst = new PropStores.Float();
readonly PropStores.Vector4 _jvecst = new PropStores.Vector4();
// Adopted from System.Collections.Generic.ArraySortHelper<T>.InternalBinarySearch(T[] array, int index, int length, T value, IComparer<T> comparer)
int BinarySearch(List<JudgeEvent> list, float time, int stack) {
@@ -211,8 +209,8 @@ namespace Cryville.Crtr {
return ~num;
}
void UpdateContextJudgeEvent(JudgeEvent ev) {
_numbuf1 = (float)ev.StartTime; _numsrc1.Invalidate(); _etor.ContextCascadeUpdate(_var_fn, _numsrc1);
_numbuf2 = (float)ev.EndTime; _numsrc2.Invalidate(); _etor.ContextCascadeUpdate(_var_tn, _numsrc2);
_numst1.Value = (float)ev.StartTime; _etor.ContextCascadeUpdate(_var_fn, _numst1.Source);
_numst2.Value = (float)ev.EndTime; _etor.ContextCascadeUpdate(_var_tn, _numst2.Source);
if (ev.BaseEvent != null) {
_etor.ContextEvent = ev.BaseEvent;
_etor.ContextState = ev.Handler.cs;
@@ -220,9 +218,9 @@ namespace Cryville.Crtr {
var call = ev.CallContext;
if (call.ReturnEvent != null) {
JudgeResult judgeResult = call.ReturnEvent.JudgeResult;
_jnumbuf = judgeResult.Time.Value; _jnumsrc.Invalidate(); _etor.ContextCascadeUpdate(_var_jt, _jnumsrc);
_jdnumbuf = (float)(judgeResult.Time.Value - call.ReturnEvent.StartTime); _jdnumsrc.Invalidate(); _etor.ContextCascadeUpdate(_var_jdt, _jdnumsrc);
_jvecbuf = judgeResult.Vector; _jvecsrc.Invalidate(); _etor.ContextCascadeUpdate(_var_jv, _jvecsrc);
_jnumst.Value = judgeResult.Time.Value; _etor.ContextCascadeUpdate(_var_jt, _jnumst.Source);
_jdnumst.Value = (float)(judgeResult.Time.Value - call.ReturnEvent.StartTime); _etor.ContextCascadeUpdate(_var_jdt, _jdnumst.Source);
_jvecst.Value = judgeResult.Vector; _etor.ContextCascadeUpdate(_var_jv, _jvecst.Source);
}
else {
_etor.ContextCascadeUpdate(_var_jt, PropSrc.Null);
@@ -233,8 +231,8 @@ namespace Cryville.Crtr {
Forward(target, tt);
var actlist = activeEvs[target];
if (actlist.Count > 0) {
_numbuf3 = ft; _numsrc3.Invalidate(); _etor.ContextCascadeUpdate(_var_ft, _numsrc3);
_numbuf4 = tt; _numsrc4.Invalidate(); _etor.ContextCascadeUpdate(_var_tt, _numsrc4);
_numst3.Value = ft; _etor.ContextCascadeUpdate(_var_ft, _numst3.Source);
_numst4.Value = tt; _etor.ContextCascadeUpdate(_var_tt, _numst4.Source);
int index = 0, iter = 0;
while (index < actlist.Count) {
if (iter++ >= 16) throw new JudgePropagationException();
@@ -305,9 +303,9 @@ namespace Cryville.Crtr {
void Execute(JudgeEvent ev, float time, PairList<JudgeAction, PdtExpression> actions, bool onMiss, int depth = 0, int index = 0) {
JudgeResult judgeResult = ev.JudgeResult;
if (!onMiss && judgeResult.Time != null) {
_jnumbuf = judgeResult.Time.Value; _jnumsrc.Invalidate(); _etor.ContextCascadeUpdate(_var_jt, _jnumsrc);
_jdnumbuf = (float)(judgeResult.Time.Value - ev.StartTime); _jdnumsrc.Invalidate(); _etor.ContextCascadeUpdate(_var_jdt, _jdnumsrc);
_jvecbuf = judgeResult.Vector; _jvecsrc.Invalidate(); _etor.ContextCascadeUpdate(_var_jv, _jvecsrc);
_jnumst.Value = judgeResult.Time.Value; _etor.ContextCascadeUpdate(_var_jt, _jnumst.Source);
_jdnumst.Value = (float)(judgeResult.Time.Value - ev.StartTime); _etor.ContextCascadeUpdate(_var_jdt, _jdnumst.Source);
_jvecst.Value = judgeResult.Vector; _etor.ContextCascadeUpdate(_var_jv, _jvecst.Source);
}
if (actions != null) {
// Ensure that all actions that modifies judge result sources break the execution