/* pop_flow.c — таблица level-flow SDLPoP, банк 9 (FG9). */ #include #include "pop_level.h" #include "pop_flow.h" /* Индекс равен номеру следующего уровня. pre_cutscene повторяет * tbl_cutscenes[] SDLPoP, но тип значения — компактный экранный сценарий, * а не указатель на игровую функцию. Уровень 14 намеренно скрывает номер. */ static const pop_level_flow_t level_flow[POP_LEVEL_LAST + 1] = { { 0, POP_PRE_NONE, 0, 0 }, { 1, POP_PRE_NONE, 1, 0 }, { 2, POP_PRE_2_6, 1, 0 }, { 3, POP_PRE_NONE, 1, 0 }, { 4, POP_PRE_4, 1, 0 }, { 5, POP_PRE_NONE, 1, 0 }, { 6, POP_PRE_2_6, 1, 0 }, { 7, POP_PRE_NONE, 1, 0 }, { 8, POP_PRE_8, 1, 0 }, { 9, POP_PRE_9, 1, 0 }, { 10, POP_PRE_NONE, 1, 0 }, { 11, POP_PRE_NONE, 1, 0 }, { 12, POP_PRE_12, 1, 0 }, { 13, POP_PRE_NONE, 1, 0 }, { 14, POP_PRE_NONE, 0, 1 } }; const pop_level_flow_t *pop_flow_level(uint8_t level) __banked { if (level > POP_LEVEL_LAST) return 0; return &level_flow[level]; } pop_pre_cutscene_t pop_flow_pre_cutscene(uint8_t level, uint8_t remaining_minutes) __banked { pop_pre_cutscene_t scene; const pop_level_flow_t *flow = pop_flow_level(level); if (!flow) return POP_PRE_NONE; scene = (pop_pre_cutscene_t)flow->pre_cutscene; /* hourglass_frame(): frame 6 iff `time_bound[0] (6) > rem_min`. */ if (scene == POP_PRE_12 && remaining_minutes < 6) return POP_PRE_12_SHORT; return scene; } uint8_t pop_flow_is_ending(uint8_t level, uint8_t room) __banked { const pop_level_flow_t *flow = pop_flow_level(level); /* WIN_LEVEL/WIN_ROOM в SDLPoP: level 14, room 5. Номер комнаты держим * здесь, а не в горячем игровом цикле, чтобы таблица оставалась * единственным владельцем специальных переходов. */ return (uint8_t)(flow && flow->ending_rule && room == 5); }