/* * pop_timer.h — глобальный игровой таймер (FG4, банк 9). * * Время измеряется логическими кадрами SDLPoP: 720 тиков = одна минута. * Модуль намеренно не знает ни о клавиатуре, ни о графике, ни о состоянии * Settings: вызывающий передаёт, разрешён ли лимит и можно ли времени идти. * Благодаря этому тот же код проверяется host-тестом без DSS/MAME. */ #ifndef POP_TIMER_H #define POP_TIMER_H #include #include "pop_qsave.h" #define POP_TIMER_START_MINUTES 60 #define POP_TIMER_TICKS_PER_MINUTE 720 #define POP_TIMER_START_TICKS (POP_TIMER_TICKS_PER_MINUTE - 1) /* Оставшееся время. ticks всегда 1..719 вне короткого участка timer_tick. * Нуль minutes означает естественное истечение; выключенный в Settings * лимит состояние не меняет, а просто останавливает отсчёт. */ extern uint8_t pop_timer_minutes; extern uint16_t pop_timer_ticks; /* Начать новую игру: ровно исходные 60:00 SDLPoP (60 минут, tick 719). */ void pop_timer_new_game(void) __banked; /* Один логический игровой кадр. enabled — переключатель Settings, * may_run — правила текущей сцены/уровня. Возвращает 1 ОДИН раз, когда * отсчёт дошёл до нуля; на паузе, HDD/QuickSave и при выключенном лимите * вызывать можно — состояние останется неизменным. */ uint8_t pop_timer_tick(uint8_t enabled, uint8_t may_run) __banked; /* Читы, повторяющие +/- SDLPoP: минус не даёт искусственно поставить 0, * плюс добавляет минуту. Они меняют счётчик и при выключенном лимите — * после включения пользователь продолжит именно это подготовленное время. */ void pop_timer_cheat_subtract(void) __banked; void pop_timer_cheat_add(void) __banked; /* Состояние входит в payload QuickSave. Неверный tick помечает поток * ошибочным, не подменяя живой таймер частично. */ void pop_timer_qsave(pop_qs_io_t *io) __banked; #endif /* POP_TIMER_H */