/* * pop_cutscene.h — маленький интерпретатор сценариев экранных сцен (FG8). * * Данные сценария статичны, состояние — только pc и счётчик ожидания. Это * пригодится и PV intro, и сценам перед уровнями FG9: графика/звук остаются * у вызывающего режима, а не тащатся в общий механизм. */ #ifndef POP_CUTSCENE_H #define POP_CUTSCENE_H #include /* ТИК ОРИГИНАЛА -> НАШ КАДР. Все длительности сцен взяты из SDLPoP в его * тиках (BASE_FPS = 60), а ждём мы кадрами луча (50 Гц). Без пересчёта * сцена идёт на 20 % дольше — незаметно, пока она немая, и сразу слышно, * когда под неё играет музыка: реплика кончается раньше картинки. * Аргумент — константа сценария, до 2500, так что 32-бит не возникает. */ #define POP_T60(t) ((uint16_t)((uint16_t)(t) * 5u / 6u)) typedef enum { POP_CS_SHOW = 1, /* arg: номер готового кадра */ POP_CS_WAIT, /* arg: число логических кадров */ POP_CS_PALETTE, /* arg: номер палитрового набора */ POP_CS_FADE_IN, POP_CS_FADE_OUT, POP_CS_FLASH, /* arg: длительность белой вспышки */ POP_CS_END } pop_cs_opcode_t; typedef struct { uint8_t op; uint16_t arg; } pop_cs_cmd_t; typedef struct { const pop_cs_cmd_t *script; uint8_t pc; uint16_t waiting; uint8_t ended; } pop_cutscene_t; typedef enum { POP_CS_EVENT_NONE = 0, POP_CS_EVENT_SHOW, POP_CS_EVENT_PALETTE, POP_CS_EVENT_FADE_IN, POP_CS_EVENT_FADE_OUT, POP_CS_EVENT_FLASH, POP_CS_EVENT_END } pop_cs_event_t; void pop_cutscene_begin(pop_cutscene_t *cs, const pop_cs_cmd_t *script) __banked; void pop_cutscene_abort(pop_cutscene_t *cs) __banked; pop_cs_event_t pop_cutscene_tick(pop_cutscene_t *cs, uint16_t *arg) __banked; #endif /* POP_CUTSCENE_H */