/* * _pop_bg.h — ВНУТРЕННИЙ контракт между двумя половинами слоя фона. * Публичный API слоя — pop_bg.h; общие листья (резидент) — pop_tile.h. * * Слой фона разрезан на два банка: * pop_bg.c (банк 2) — ГОРЯЧАЯ половина: fore-проход поверх персонажей, * оверлеи, клип. Работает каждый кадр. * pop_room.c (банк 7) — ХОЛОДНАЯ: полная отрисовка комнаты (draw_tile), * точечные перерисовки тайлов, падающие плиты, * загрузка атласов. Раз на комнату/событие. * * Резать пришлось потому, что банк 2 упирался в 16 КБ страницы (90.4 % до * разгрузки), а чомперам и остальным ловушкам уровня 3 место нужно. Граница * проведена по частоте вызова: холодная половина платит трамплин (~654 такта) * за каждый вызов сюда, и на входе в комнату таких вызовов ~40 — 26 000 * тактов, шестая часть кадрового бюджета РАЗОВО. Для горячего пути цена * нулевая: он зовёт свои функции прямо, а общие листья — из резидента. * * Что осталось в банке 2 и вынесено сюда обёртками: кладка стены * (wall_pattern — её зовёт и fore-проход каждый кадр) и решётка ворот * соседней комнаты (draw_gate_back — её зовёт шовная окклюзия). Обратных * зависимостей (горячая половина → холодная) нет вовсе. */ #ifndef _POP_BG_H #define _POP_BG_H #include /* Состояние дрожащих плит — живёт в pop_map, читают обе половины. */ extern uint8_t pop_loose_modif[30]; extern uint8_t pop_ceil_modif[10]; /* плита-потолок: loose ряда 2 комнаты сверху */ /* Видимая высота полосы кладки у потолка (room-space y 0..7): её печёт * холодная половина, а поверх персонажа кладёт горячая. */ #define CEIL_BAND_H 8 /* Тайл ОБЪЕКТА активного персонажа (set_objtile_at_char, seg006:1833) — в * момент обработки этого тайла спрайт попадает в midtable. Задаёт горячая * половина (pop_fore_over_char), читают other_overlay_tile (там же) и * порядок «плита vs Kid» в mob_tick_one (холодная). Писучие данные банка * лежат в _DATA/W2 и видны из любого банка — см. sdcc_banked_call_rules. */ extern int8_t pop_bg_obj_col, pop_bg_obj_row; /* ---- Точки входа ГОРЯЧЕЙ половины для холодной (через трамплин) ------- */ void pop_wall_pattern_b(int row, int col, int which_part) __banked; void pop_wall_pattern_reset_b(void) __banked; void pop_gate_back_b(uint8_t modl, int xh, int dby, int dmy) __banked; #endif