/* * pop_vflip.h — ВЕРТИКАЛЬНО ЗЕРКАЛЬНЫЕ наборы спрайтов персонажей * (зелье инверсии, уровень 9). Реализация и замеры — в pop_vflip.c. * * Кому нужно. Фон и все row-major спрайты переворачиваются даром (порядок * строк = знак страйда, gfx_blit_*_vflip), а персонажи лежат КОЛОНКАМИ — * у них даром получается горизонтальное зеркало, а вертикальное требует * развернуть байты внутри колонки. Такой набор готовит упаковщик * (kid0_v.atl, sword_v.atl, g0_v.atl…), а здесь он только грузится и * связывается с оригиналом. Правило вызывающего: * * страница = pop_upside ? pop_vflip_page(a->page) : a->page; * if (!страница) страница = a->page; // набор не загружен * * Ни смещения лент, ни размеры кадров, ни горизонтальный флип при этом не * меняются: зеркальный файл имеет ТУ ЖЕ раскладку, отличаются только пиксели. * * КОГДА ГРУЗИТЬ — на усмотрение приложения: pop_vflip_load_all можно звать * где угодно (старт игры, показ интро, вход на уровень с зельем). До * загрузки движок просто рисует неперевёрнутыми кадрами — это заметно, но * не ломает ни кадр, ни физику. */ #ifndef POP_VFLIP_H #define POP_VFLIP_H #include #include /* Загрузить зеркальный файл path и связать его с атласом orig. * 0 — OK, -1 — файла нет / не хватило EMM / таблица полна. */ int pop_vflip_add(const atlas_t *orig, const char *path); /* Страница-зеркало для страницы src; 0 — пары нет (набор не загружен). */ uint8_t pop_vflip_page(uint8_t src); /* Загружен ли хоть один зеркальный атлас (чтобы не грузить дважды). */ uint8_t pop_vflip_ready(void); /* Освободить весь набор (смена набора спрайтов соперника / уровня). */ void pop_vflip_reset(void); /* Загрузить ВЕСЬ зеркальный набор: страницы Кида, меч и текущий набор * соперника. Идемпотентна — повторный вызов ничего не делает. 0 — OK, * -1 — что-то не загрузилось (движок останется на обычных кадрах). * Живёт в банке 8 (pop_kboot.c): зовётся раз за игру/уровень. */ int pop_vflip_load_all(void) __banked; #endif /* POP_VFLIP_H */