From 49c0f955877375dc27e194c933aa20a7e6e9a4f0 Mon Sep 17 00:00:00 2001 From: xhbxx <120081648+xhbxx@users.noreply.github.com> Date: Tue, 20 Oct 2026 21:54:04 +0800 Subject: [PATCH] feat(discipline): add countdown ignition evaluator --- src/lib/discipline/countdown-ignition.ts | 38 ++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/lib/discipline/countdown-ignition.ts diff --git a/src/lib/discipline/countdown-ignition.ts b/src/lib/discipline/countdown-ignition.ts new file mode 100644 index 0000000..70ec9af --- /dev/null +++ b/src/lib/discipline/countdown-ignition.ts @@ -0,0 +1,38 @@ +export type IgnitionState = 'COUNTING_DOWN' | 'ACTION_WINDOW' | 'EXPIRED'; + +export interface IgnitionStatus { + state: IgnitionState; + secondsRemaining: number; + progressRatio: number; // 0.0 to 1.0 +} + +export function evaluateIgnitionCountdown( + elapsedMs: number, + countdownDurationMs: number = 5000, + actionWindowMs: number = 3000 +): IgnitionStatus { + const validElapsed = Math.max(0, elapsedMs); + + if (validElapsed < countdownDurationMs) { + const remainingMs = countdownDurationMs - validElapsed; + return { + state: 'COUNTING_DOWN', + secondsRemaining: Math.ceil(remainingMs / 1000), + progressRatio: parseFloat((validElapsed / countdownDurationMs).toFixed(3)), + }; + } + + if (validElapsed <= countdownDurationMs + actionWindowMs) { + return { + state: 'ACTION_WINDOW', + secondsRemaining: 0, + progressRatio: 1.0, + }; + } + + return { + state: 'EXPIRED', + secondsRemaining: 0, + progressRatio: 1.0, + }; +} \ No newline at end of file