let timeElapsed = 0; let intervalId: ReturnType | null = null; export type TimerDeclaration = { name: string; interval: number; callback: () => void; }; const timers: TimerDeclaration[] = []; const nextFireTime: Map = new Map(); export function addTimer(timer: TimerDeclaration): void { if (timers.some((t) => t.name === timer.name)) { console.warn(`timer with name "${timer.name}" is already registered.`); return; } timers.push(timer); nextFireTime.set(timer.name, timeElapsed + timer.interval); } export function removeTimer(name: string): void { const index = timers.findIndex((t) => t.name === name); if (index !== -1) { timers.splice(index, 1); nextFireTime.delete(name); } } export function startSystem(): void { if (intervalId !== null) { console.warn("timer is already running."); return; } intervalId = setInterval(() => { timeElapsed++; for (const timer of timers) { const fireAt = nextFireTime.get(timer.name) ?? 0; if (timeElapsed >= fireAt) { timer.callback(); nextFireTime.set(timer.name, timeElapsed + timer.interval); } } }, 1000); } export function stopSystem(): void { if (intervalId !== null) { clearInterval(intervalId); intervalId = null; } } export function getTimeElapsed(): number { return timeElapsed; } export function resetSystem(): void { stopSystem(); timers.length = 0; nextFireTime.clear(); timeElapsed = 0; } startSystem();