/**
* Кулдаун на фиксированном шаге: триггер -> отсчёт -> готовность.
* Чистая логика без Pixi — тестируется в Vitest.
*/
export class Cooldown {
private remaining = 0;
constructor(private readonly seconds: number) {}
/** Запустить отсчёт заново (только если готов — см. triggerForce для перебива). */
trigger(): boolean {
if (!this.ready) return false;
this.remaining = this.seconds;
return true;
}
/** Перезапустить отсчёт даже если не готов. */
triggerForce(): void {
this.remaining = this.seconds;
}
update(dt: number): void {
if (this.remaining > 0) {
this.remaining = Math.max(0, this.remaining - dt);
}
}
get ready(): boolean {
return this.remaining <= 0;
}
/** Секунд до готовности (0 — уже готов). */
get timeRemaining(): number {
return this.remaining;
}
/** 1 — только запущен, 0 — готов. */
get progress(): number {
return this.seconds > 0 ? this.remaining / this.seconds : 0;
}
reset(): void {
this.remaining = 0;
}
}