/* * pop_menu.h — контракт pause menu (план docs/menu_settings_plan.md §10.3, * этап MS0). * * UI НЕ вызывает gameplay-модули напрямую: меню формирует КОМАНДУ, а * исполнение остаётся в главном цикле (roomtest.c). Вся работа с меню — * код, шрифты и таблицы строк — живёт в БАНКЕ 9. Флаг запроса принадлежит * главному циклу (W2): это единственная резидентная граница UI. */ #ifndef POP_MENU_H #define POP_MENU_H #include typedef enum { POP_MENU_NONE = 0, /* меню не открывалось / пункт-заглушка */ POP_MENU_RESUME, /* закрыть меню, продолжить игру */ POP_MENU_QUICKSAVE, /* то же, что F6 */ POP_MENU_QUICKLOAD, /* то же, что F9 */ POP_MENU_RESTART_LEVEL, /* штатный reset текущего уровня (без CFG) */ POP_MENU_RESTART_GAME, /* новая игра с уровня 1, настройки и SAV */ POP_MENU_QUIT, /* выход из программы (после подтверждения) */ POP_MENU_QUICKLOAD_BACKUP, /* загрузить подтверждённый POP.BAK */ POP_MENU_SETTINGS /* внутренний экран Settings (не возвращается) */ } pop_menu_cmd_t; /* Флаг запроса в roomtest.c (W2); банк читает напрямую. */ extern uint8_t pop_menu_request; /* Загрузить/освободить EMM-атлас исходных шрифтов SDLPoP. Вызывается из * холодного boot/shutdown, не из кадрового пути. */ int pop_menu_init(void) __banked; void pop_menu_free(void) __banked; /* Граница кадра. Запроса нет — мгновенный POP_MENU_NONE. Меню МОДАЛЬНО: * пока открыто, не возвращается (игра стоит — логика, таймер и звуковой * насос главного цикла просто не выполняются); по выбору пользователя * отдаёт pop_menu_cmd_t. */ int8_t pop_menu_process(void) __banked; /* Экран Sprinter build, если он включён в POP.CFG. Вызывается после * открытия raw-клавиатуры и до первого игрового кадра. */ void pop_build_info_show(void) __banked; #endif