Newer
Older
rpg / v2 / packages / engine / src / core / cooldown.ts
/**
 * Кулдаун на фиксированном шаге (перенос v1): триггер → отсчёт → готовность.
 * Чистая логика без бэкенда — тестируется в 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;
    }
}