32 lines
905 B
TypeScript
32 lines
905 B
TypeScript
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;
|
|
}
|