diff --git a/src/data/rocketLaunches.test.mjs b/src/data/rocketLaunches.test.mjs index b68a11db3..15b37420d 100644 --- a/src/data/rocketLaunches.test.mjs +++ b/src/data/rocketLaunches.test.mjs @@ -448,6 +448,18 @@ test('holds replay at the pad for a real-time countdown independent of replay sp assert.ok(liftoff.phaseProgress > 0); }); +test('runs the five-second tile hold before a full T-10 countdown', () => { + const launch = { launchTime: '2026-07-20T10:00:00Z', timeline: [] }; + // REPLAY ASCENT puts liftoff 5 s (tile hold) + 10 s (countdown) ahead. + const hold = replayState(launch, 115000, 12, 28, 5400, 1, 104500, 5); + assert.equal(hold.preCountdownActive, true); + assert.equal(hold.countdownActive, false); + const countdown = replayState(launch, 115000, 12, 28, 5400, 1, 105000, 5); + assert.equal(countdown.preCountdownActive, false); + assert.equal(countdown.countdownActive, true); + assert.equal(countdown.countdownSeconds, 10); +}); + test('hands replay directly from ascent into orbit', () => { const launch = { launchTime: '2026-07-20T10:00:00Z', timeline: [] }; const orbit = replayState(launch, 0, 12, 28, 5400, 1, 16_000); diff --git a/src/layers/launches/replay.js b/src/layers/launches/replay.js index 5354996bd..4317de0ab 100644 --- a/src/layers/launches/replay.js +++ b/src/layers/launches/replay.js @@ -139,8 +139,10 @@ export function createReplay({ state: layerState, services, parts, source }) { 0, Number(preCountdownDurationSec) || 0, ); + // The hold precedes the whole countdown; ending it at -hold cut T-10 to T-5. const preCountdownActive = - preCountdownDuration > 0 && realSecondsSinceStart < -preCountdownDuration; + preCountdownDuration > 0 && + realSecondsSinceStart < -REPLAY_COUNTDOWN_DURATION_SEC; const countdownActive = realSecondsSinceStart < 0 && !preCountdownActive; const countdownSeconds = countdownActive ? Math.ceil(-realSecondsSinceStart)