/* * pop_app.h — автомат верхнего уровня Prince of Persia (FG1). * * Игровой цикл — лишь состояние PLAYING, а не «вся программа». Каждый * режим возвращает результат через pop_app_dispatch(), поэтому будущие * TITLE/demo/cutscene не будут вызывать друг друга рекурсивно и копить * стек или EMM-ресурсы. */ #ifndef POP_APP_H #define POP_APP_H #include typedef enum { POP_APP_BOOT = 0, POP_APP_BUILD_INFO, POP_APP_TITLE, POP_APP_INTRO, POP_APP_DEMO, POP_APP_LEVEL_LOAD, POP_APP_PLAYING, POP_APP_PAUSE_MENU, POP_APP_CUTSCENE, POP_APP_TIME_EXPIRED, POP_APP_ENDING, POP_APP_HALL_OF_FAME, POP_APP_QUIT } pop_app_state_t; /* События не содержат деталей конкретного режима: режим завершился, а * переход выбирает центральная таблица. Это намеренно делает недопустимый * переход явным no-op вместо случайного прыжка в код другого экрана. */ typedef enum { POP_APP_EV_BOOT_READY = 0, POP_APP_EV_BUILD_DONE, POP_APP_EV_INTRO_STARTED, POP_APP_EV_DEMO_STARTED, POP_APP_EV_CUTSCENE_STARTED, POP_APP_EV_NEW_GAME, POP_APP_EV_PAUSE, POP_APP_EV_RESUME, POP_APP_EV_LEVEL_READY, POP_APP_EV_LEVEL_FINISHED, POP_APP_EV_DEMO_FINISHED, POP_APP_EV_CUTSCENE_FINISHED, POP_APP_EV_TIME_EXPIRED, POP_APP_EV_ENDING_STARTED, POP_APP_EV_ENDING_FINISHED, POP_APP_EV_HOF_FINISHED, POP_APP_EV_RESTART_INTRO, POP_APP_EV_QUIT } pop_app_event_t; extern pop_app_state_t pop_app_state; /* Начать новый маршрут с BOOT. */ void pop_app_reset(void) __banked; /* Выполнить допустимый переход. Возвращает 1 при успехе, 0 при ошибке * протокола; в ошибочном случае состояние не меняется. */ uint8_t pop_app_dispatch(pop_app_event_t event) __banked; #endif /* POP_APP_H */