/**
* Внутреигровое время суток. Темп: 1 секунда реального времени = 1 игровая
* минута (сутки = 24 минуты реального). Чистый класс без Pixi — тестируется
* в Vitest; живёт на Game (LocationScene пересоздаётся при переходах).
*/
/** Игровых минут за секунду реального времени. */
export const GAME_MIN_PER_SEC = 1;
/** Минут в сутках. */
export const DAY_MINUTES = 1440;
/** Время старта новой игры (8:00). */
export const START_MINUTES = 8 * 60;
export class GameClock {
/** Сырые минуты суток (float, 0..1440). */
private m = START_MINUTES;
/** Целые минуты суток 0..1439. */
get minutes(): number {
return Math.floor(this.m) % DAY_MINUTES;
}
/** Часы суток float 0..24 — вход кривой dayNightFactor. */
get hours(): number {
return this.m / 60;
}
/** Строка для часов предмета: «8:00», «13:05» (часы без ведущего нуля). */
get label(): string {
const m = this.minutes;
const h = Math.floor(m / 60);
const mm = m % 60;
return `${h}:${mm < 10 ? '0' : ''}${mm}`;
}
/** Продвинуть время на dtSec секунд реального времени. */
advance(dtSec: number): void {
this.m = (this.m + dtSec * GAME_MIN_PER_SEC) % DAY_MINUTES;
}
/** Перемотка (мост/загрузка): mod 1440, отрицательные — в диапазон. */
set(minutes: number): void {
this.m = ((minutes % DAY_MINUTES) + DAY_MINUTES) % DAY_MINUTES;
}
/** Новая игра: 8:00. */
reset(): void {
this.set(START_MINUTES);
}
}