Пики оставались навсегда: запечка фона консервировала выдвинутый кадр

Уровень 7, комната 19.  Кнопка в (0,5) при нажатии зовёт pop_floor_bake,
а тот перерисовывает и правого соседа — пики (0,6) — в банке, который
пишет в ОЗУ-копию.  Кадр брался живой, и выдвинутая пика оставалась в
фоне: дальше heal возвращал её каждый кадр.  В (0,7) чисто, потому что
окно клипа запечки кончается на x=219, а колонка 7 начинается с 224.

Флаг pop_t_bake_rest («в фон кладём покой») для этого и был, но читал его
только pop_loose_frame.  Кадр пик считался по месту в ЧЕТЫРЁХ слоях.
Добавлен pop_spike_frame — порт get_spike_frame (SDLPoP seg008:08A0),
которого у нас не было, — и все четыре слоя переведены на него; заодно
позу покоя в запечке стал отдавать pop_chomp_pose.

Одна точка лечит все пять путей запечки, включая вход в комнату.
Резидент +28 Б, скорость не затронута.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-18 14:53:44 +03:00
parent 214d3a822a
commit 980d48c168
6 changed files with 157 additions and 13 deletions
+16 -5
View File
@@ -121,16 +121,27 @@ extern const uint8_t POP_LOOSE_FRAM_BOTTOM[12]; /* низ дрожащей пл
extern const uint8_t POP_CHOMP_FRAM_FOR[5]; /* чомпер: перед (pop_fore!) */
/* Режим ЗАПЕЧКИ статического фона (запись идёт и в ОЗУ-копию акселератора,
* из которой потом восстанавливает heal). В этом режиме дрожащие кадры
* ЧУЖИХ плит рисовать НЕЛЬЗЯ: транзиентный кадр законсервируется в копии, а
* так как запечка идёт двумя кадрами (по одному на страницу дабл-буфера),
* на страницах застынут РАЗНЫЕ кадры — вечное мерцание. Фон обязан быть
* состоянием ПОКОЯ; анимация каждый кадр кладётся поверх (банк SPRITE). */
* из которой потом восстанавливает heal). В этом режиме ТРАНЗИЕНТНЫЕ кадры
* рисовать НЕЛЬЗЯ — ни свои, ни соседские: кадр законсервируется в копии, и
* heal будет возвращать его вечно, даже когда ловушка давно вернулась в
* покой (пики: BUG-SPIKE-BAKED). А так как запечка идёт двумя кадрами (по
* одному на страницу дабл-буфера), на страницах могут застыть ещё и РАЗНЫЕ
* кадры — вечное мерцание. Фон обязан быть состоянием ПОКОЯ; анимация
* каждый кадр кладётся поверх (банк SPRITE).
*
* Флаг читают ВСЕ функции «кадр по модификатору»: pop_loose_frame,
* pop_spike_frame, pop_chomp_pose. Появится новая анимированная ловушка —
* её кадр обязан спрашивать флаг ТАМ ЖЕ, а не в вызывающем слое: слоёв
* отрисовки у тайла четыре, и забыть один слишком легко. */
extern uint8_t pop_t_bake_rest;
/* Кадр дрожащей/падающей плиты по её room_modif (seg007 loose_fram_*). */
uint8_t pop_loose_frame(uint8_t modif);
/* Кадр пик по их modif (индекс в spikes_fram_*): 0 = не видно, 5 = вышли
* целиком. В режиме запечки — всегда 0 (см. pop_t_bake_rest). */
uint8_t pop_spike_frame(uint8_t modif);
/* Номер позы чомпера по его модификатору (seg008 chomper_fram1): 0..4 —
* индекс во ВСЕ три набора кусков (низ/верх/перед) и в кровь (+114/+119). */
uint8_t pop_chomp_pose(uint8_t modif);