L9-INVERT II.4: персонажи рисуются перевёрнутыми (зеркальные страницы атласов)
Спрайты персонажей хранятся column-major (ради бесплатного H-флипа), а вертикальное зеркало у такой раскладки — разворот байтов ВНУТРИ колонки, чего accel не умеет. Поэтому pop_vflip.c готовит зеркальные КОПИИ страниц атласов: копия побайтово повторяет раскладку .atl (заголовок, каталог, смещения лент), развёрнуты только пиксели — значит вызывающему достаточно подменить номер страницы, которую он мапит в W0. * Кэш ленивый (страница зеркалится при первом обращении в перевёрнутом виде) и живёт до смены уровня — зелье переключает состояние туда-обратно, перезеркаливать по 16 КБ на каждый переворот незачем. EMM хватает: 34 страницы из ~215 свободных. * pop_cdraw/pop_kdraw: страница + позиция (top = 191 - obj_y для персонажа, 192 - top - h для клинка). «Пропустить skip строк сверху» у зеркальной ленты = «срезать снизу» у оригинала, поэтому клипы считаются как обычно. * Модуль резидентный: он маппит W3 (приёмник копии) — банку так нельзя. * pop_vflip_reset на смене уровня: копии сделаны из старых страниц. Проверено в MAME: чит U переворачивает всё разом, Кид и факелы вверх ногами, полоса HP на месте, бег без следов на фоне (heal бьёт в те же координаты). ОСТАЁТСЯ (L9-CLIPCHAR): clip_char в перевороте должен резать снизу, а не сверху — пока при pop_upside не режем вовсе. Тени/брызг это не касается.
This commit is contained in:
@@ -22,6 +22,8 @@
|
||||
#include "pop_cdraw.h" /* pop_cd — инвалидация слотов после переворота */
|
||||
#include <sprite.h> /* gfx_copy_page */
|
||||
#include "pop_tune.h"
|
||||
#include "pop_ctrl.h" /* pop_ctrl_init/close — ввод поднимает и закрывает boot */
|
||||
#include "pop_vflip.h" /* сброс зеркальных страниц на смене уровня */
|
||||
#include "pop_cheat.h" /* pop_cheats — режим разработки включает pop_boot */
|
||||
#include <stdio.h> /* puts/printf — сообщения об ошибках загрузки */
|
||||
#include <kbd_raw.h>
|
||||
@@ -622,6 +624,9 @@ int pop_level_switch(void) __banked
|
||||
* пределы, и персонаж просто не виден. */
|
||||
pop_guard_free();
|
||||
pop_guard_load();
|
||||
/* Зеркальные копии атласов сделаны из СТАРЫХ страниц —
|
||||
* после перезагрузки спрайтов они мусор (pop_vflip.h). */
|
||||
pop_vflip_reset();
|
||||
/* Тайлсет: подземелье <-> дворец (порт tbl_envir_ki,
|
||||
* seg000:1108). Внутри — no-op, если тип не менялся;
|
||||
* при смене выгружает старые атласы и правит 32 записи
|
||||
|
||||
Reference in New Issue
Block a user