L9-INVERT: зеркальный слой фона + вход в комнату в банк 8

II.3: pop_upside проведён в единственную точку тайлового слоя (pop_blit_b /
blit_b_clip): позиция через FLIP_TOP, блит — vflip-двойник.  Этим зеркалятся
полная отрисовка комнаты, точечные редрои, trob-анимации, fore-слой и кладка.
В клипованном пути обрезка сверху экрана съедает нижние строки источника,
поэтому кусок пересчитывается как sy' = h - sy - dh.

MEM-COLD2 п.1: enter_room_side/enter_room — в банк 8 (куча 450 -> 1231 Б).
Рабочие массивы комнаты остались в _DATA, в банк уехал только код.

Проверено в MAME (уровень 9, чит U): комната перевёрнута целиком, пол
вверху, дверь и кладка вверх ногами.  tests-host 6/6, size-check OK.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-12 17:43:22 +03:00
parent 5c015739fa
commit 7c1ded340c
5 changed files with 228 additions and 161 deletions
+20 -4
View File
@@ -23,14 +23,30 @@
/* ---- то, что холодная половина берёт у главного цикла ---------------- */
extern uint8_t room_fg[30]; /* тайлы ОТРИСОВАННОЙ комнаты (fg & 0x1F) */
/* Рабочие массивы комнаты: заполняет вход в комнату (банк), читают и он, и
* главный цикл (шов, straddle, чит-навигация). Данные банковых модулей
* линкуются в общий _DATA, поэтому обе половины видят их как обычные
* глобалы — в банк уехал только КОД. */
extern uint8_t room_fg[30], room_bg[30];
extern uint8_t lcol_fg[6], lcol_bg[3], rcol_fg[6], rcol_bg[3], below_fg[11];
extern uint8_t above_fg[10], above_mod[10];
extern uint8_t kid_room; /* РЕАЛЬНАЯ комната Kid (straddle) */
extern uint8_t seam_sig[3]; /* последняя нарисованная openness в шве */
extern uint8_t seam_rows, seam_redraw;
/* Сигнатура ряда шва: openness ворот соседа либо «кнопка нажата». Живёт в
* резиденте — её зовёт и кадровый путь главного цикла, и вход в комнату. */
uint8_t seam_row_sig(const uint8_t *m, const uint8_t *lfg, uint8_t r);
extern uint8_t cur_room; /* её номер (drawn_room) */
extern uint8_t pop_checkpoint; /* checkpoint (seg000:270) — ставит уход */
/* влево из комнаты 7 уровня 3 */
/* Вход в комнату БЕЗ перехода за Кидом (старт уровня, респавн, чит-обход):
* страж такой смены не «видит» и остаётся в своей комнате. */
void enter_room(uint8_t room);
/* Вход в комнату. side — куда ушёл КИД (0 L, 1 R, 2 U, 3 D); 0xFF = «не
* переход за Кидом» (старт уровня, респавн, чит-навигация): от этого
* зависит, пойдёт ли страж следом. enter_room — обёртка с 0xFF.
* Обе в банке 8: зовутся раз на комнату, а кода там на полтора килобайта. */
void enter_room_side(uint8_t room, uint8_t side) __banked;
void enter_room(uint8_t room) __banked;
/* ---- холодная половина ----------------------------------------------- */