Пики оставались навсегда: запечка фона консервировала выдвинутый кадр
Уровень 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:
@@ -153,7 +153,11 @@ const uint8_t POP_CHOMP_FRAM_FOR[5] = {106, 107, 108, 109, 110};
|
||||
uint8_t pop_chomp_pose(uint8_t modif)
|
||||
{
|
||||
uint8_t m = (uint8_t)(modif & 0x7F);
|
||||
if (m > 6) m = 6;
|
||||
/* В ЗАПЕЧКЕ — поза ПОКОЯ, по той же причине, что у плиты и пик: фаза
|
||||
* челюстей транзиентна. Покой и есть фаза 0 (она же 6, на которой
|
||||
* animate_chomper снимает trob): CHOMP_FRAM1[0] == CHOMP_FRAM1[6]. */
|
||||
if (pop_t_bake_rest) m = 0;
|
||||
else if (m > 6) m = 6;
|
||||
return CHOMP_FRAM1[m];
|
||||
}
|
||||
|
||||
@@ -167,6 +171,20 @@ uint8_t pop_loose_frame(uint8_t m)
|
||||
return m;
|
||||
}
|
||||
|
||||
/* Кадр пик по их модификатору: 1..4 — выдвижение, 0x80|n — «вышли целиком»
|
||||
* (один кадр 5), 6..8 — уход. Как и у плиты, в режиме ЗАПЕЧКИ отдаёт кадр
|
||||
* ПОКОЯ (0 = пик не видно): выдвинутая пика — транзиент, её место в ОЗУ-копии
|
||||
* фона делает heal вечным (BUG-SPIKE-BAKED, см. BUGS_CLOSED.md).
|
||||
*
|
||||
* Отдельная функция, а не `(m & 0x80) ? 5 : m` по месту: считают кадр ЧЕТЫРЕ
|
||||
* слоя (draw_tile_anim, draw_tile_anim_right соседа, fore-проход и
|
||||
* mid-оверлей), и одного забытого хватило, чтобы пики законсервировались. */
|
||||
uint8_t pop_spike_frame(uint8_t m)
|
||||
{
|
||||
if (pop_t_bake_rest) return 0;
|
||||
return (uint8_t)((m & 0x80) ? 5 : m);
|
||||
}
|
||||
|
||||
/* ---- «Фон трогали ВОТ ЗДЕСЬ» (DRAW-COST; контракт — pop_cdraw.h) ----- *
|
||||
*
|
||||
* Метка — БИТОВАЯ МАСКА ТАЙЛОВ, по слову на ряд и по набору на страницу.
|
||||
|
||||
Reference in New Issue
Block a user