export interface TravelDistance { advance(deltaSeconds: number, speed: number, roadEnergy: number): number; snapshot(): number; } const MAX_FRAME_SECONDS = 0.1; const CRUISE_UNITS_PER_SECOND = 18; const SPEED_UNITS_PER_SECOND = 54; const ENERGY_UNITS_PER_SECOND = 48; export function createTravelDistance(): TravelDistance { let distance = 0; return { advance(deltaSeconds, speed, roadEnergy) { if (!Number.isFinite(deltaSeconds) || deltaSeconds <= 0) return distance; const dt = Math.min(MAX_FRAME_SECONDS, deltaSeconds); distance += dt * ( CRUISE_UNITS_PER_SECOND + clamp01(speed) * SPEED_UNITS_PER_SECOND + clamp01(roadEnergy) * ENERGY_UNITS_PER_SECOND ); return distance; }, snapshot: () => distance, }; } function clamp01(value: number): number { return Number.isFinite(value) ? Math.min(1, Math.max(0, value)) : 0; }