/* * roomtest_cold.h — контракт между главным циклом (резидент W1/W2) и его * ХОЛОДНОЙ половиной, вынесенной в банк (roomtest_cold.c). * * Зачем. В режиме huge под кучу остаётся то, что не занял _CODE+_DATA, и к * уровню 8 запас упал ниже килобайта. Главный цикл при этом наполовину * состоит из кода, который отрабатывает РАЗ НА УРОВЕНЬ (старт/рестарт) или * вообще только по отладочной клавише (обход комнат, лейбл номера) — держать * его в дефицитном окне незачем. Кадровый путь (tick/draw/флип) остался в * резиденте целиком: цена выноса — один трамплин на вызов, а он тут ноль раз * за обычный кадр. * * Что ОСТАЛОСЬ в roomtest.c и почему: enter_room_side (её зовут и холодная * половина, и переходы между комнатами в кадре падения) и рабочие массивы * комнаты — они же и есть то состояние, ради которого функция вообще * существует; банковый модуль читает их как обычные глобалы (данные банков * линкуются в общий _DATA, --bank-data мы не включаем). */ #ifndef ROOMTEST_COLD_H #define ROOMTEST_COLD_H #include /* ---- то, что холодная половина берёт у главного цикла ---------------- */ extern uint8_t room_fg[30]; /* тайлы ОТРИСОВАННОЙ комнаты (fg & 0x1F) */ extern uint8_t cur_room; /* её номер (drawn_room) */ extern uint8_t pop_checkpoint; /* checkpoint (seg000:270) — ставит уход */ /* влево из комнаты 7 уровня 3 */ /* Вход в комнату БЕЗ перехода за Кидом (старт уровня, респавн, чит-обход): * страж такой смены не «видит» и остаётся в своей комнате. */ void enter_room(uint8_t room); /* ---- холодная половина ----------------------------------------------- */ /* start_level (seg003:0055) + do_startpos + set_start_pos: поставить Кида в * стартовую позицию уровня. Один вход и для запуска, и для рестарта после * смерти / выпадения из уровня — в оригинале это буквально один путь. */ void pop_start_level(void) __banked; /* ОТЛАДОЧНЫЙ обход комнат по номеру ('+' / '−'). dir: 1 — следующая, * 2 — предыдущая. Ставит Кида на подходящий пол новой комнаты и выводит * его из боя. Возвращает 1, если комната сменилась (вызывающий обязан * вернуть себе draw-страницу и обнулить счётчик кадров смерти). */ uint8_t pop_dbg_roomnav(uint8_t dir) __banked; /* ОТЛАДОЧНЫЙ лейбл номера комнаты палочками в верхнем борте. Рисует ТОЛЬКО * при смене комнаты (и по разу на каждую страницу дабл-буфера), поэтому * звать можно каждый кадр. */ void pop_dbg_room_label(uint8_t room) __banked; /* Кто рисуется ПОЗЖЕ — Кид или соперник (порядок обхода тайлов оригинала, * set_objtile_at_char + sort_curr_objs). 1 = соперник поверх. Зовётся раз * в кадр, поэтому живёт в банке: трамплин на кадр дешевле полукилобайта * резидента. */ uint8_t guard_over_kid(void) __banked; /* Перевернуть уже нарисованное (зелье инверсии, уровень 9): две копии * акселератором + инвалидация слотов персонажей и полосы HP. Звать РАЗ на * переключение, по флагу pop_upside_dirty. */ void pop_flip_screen(void) __banked; #endif /* ROOMTEST_COLD_H */