/* * pop_cutscene.c — общий data-driven шагатель кат-сцен, банк 9 (FG8). * * Один вызов = один логический кадр. WAIT съедает текущий шаг сразу, поэтому * WAIT(1) откладывает следующую видимую команду ровно на один тик. Команды * без ожидания выдаются по одной: runtime успевает переключить палитру, * собрать hidden page или сделать fade до следующего шага. */ #include #include "pop_cutscene.h" void pop_cutscene_begin(pop_cutscene_t *cs, const pop_cs_cmd_t *script) __banked { cs->script = script; cs->pc = 0; cs->waiting = 0; cs->ended = 0; } void pop_cutscene_abort(pop_cutscene_t *cs) __banked { cs->waiting = 0; cs->ended = 1; } pop_cs_event_t pop_cutscene_tick(pop_cutscene_t *cs, uint16_t *arg) __banked { const pop_cs_cmd_t *cmd; *arg = 0; if (cs->ended) return POP_CS_EVENT_END; if (cs->waiting) { --cs->waiting; return POP_CS_EVENT_NONE; } cmd = &cs->script[cs->pc++]; *arg = cmd->arg; switch (cmd->op) { case POP_CS_SHOW: return POP_CS_EVENT_SHOW; case POP_CS_PALETTE: return POP_CS_EVENT_PALETTE; case POP_CS_FADE_IN: return POP_CS_EVENT_FADE_IN; case POP_CS_FADE_OUT: return POP_CS_EVENT_FADE_OUT; case POP_CS_FLASH: return POP_CS_EVENT_FLASH; case POP_CS_WAIT: /* Текущий tick — первый из N: это исключает скрытый +1 кадр. */ cs->waiting = cmd->arg; if (cs->waiting) --cs->waiting; return POP_CS_EVENT_NONE; case POP_CS_END: default: cs->ended = 1; return POP_CS_EVENT_END; } }