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