diff --git a/Assets/Cryville/Crtr/PdtEvaluator.cs b/Assets/Cryville/Crtr/PdtEvaluator.cs index 588409a..026f813 100644 --- a/Assets/Cryville/Crtr/PdtEvaluator.cs +++ b/Assets/Cryville/Crtr/PdtEvaluator.cs @@ -146,6 +146,8 @@ namespace Cryville.Crtr { _ctxops.Add(IdentifierManager.SharedInstance.Request("attack_timing"), new func_attack_timing(cccb)); _ctxops.Add(IdentifierManager.SharedInstance.Request("enter_timing"), new func_enter_timing(cccb)); _ctxops.Add(IdentifierManager.SharedInstance.Request("release_timing"), new func_release_timing(cccb)); + _ctxops.Add(IdentifierManager.SharedInstance.Request("leave_timing"), new func_leave_timing(cccb)); + _ctxops.Add(IdentifierManager.SharedInstance.Request("contact_timing"), new func_contact_timing(cccb)); } static PdtEvaluator() { _shortops.Add(new PdtOperatorSignature("@", 2), new op_at_2()); @@ -507,6 +509,22 @@ namespace Cryville.Crtr { return ft > t0 && ft <= t1; } } + class func_leave_timing : JudgeFunction { + public func_leave_timing(Func ctxcb) : base(1, ctxcb) { } + protected override bool ExecuteImpl(float fn, float tn, float ft, float tt, Vector3? fv, Vector3? tv) { + if (fv == null || tv == null) return false; + var t1 = GetOperand(0).AsNumber() + tn; + return ft < t1 && tt >= t1; + } + } + class func_contact_timing : JudgeFunction { + public func_contact_timing(Func ctxcb) : base(2, ctxcb) { } + protected override bool ExecuteImpl(float fn, float tn, float ft, float tt, Vector3? fv, Vector3? tv) { + var t0 = GetOperand(0).AsNumber() + fn; + var t1 = GetOperand(1).AsNumber() + tn; + return (fv == null || ft < t1) && (tv == null || tt >= t0); + } + } #endregion unsafe static class oputil { public static float AsNumber(PropSrc src) {