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

Уровень 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
+2 -4
View File
@@ -593,8 +593,7 @@ static void fore_only_tile(int row, int col)
return;
}
if (code == 2) { /* пики: fore-кадр */
uint8_t sm = pop_tile_mod(row, col);
uint8_t sf = (sm & 0x80) ? 5 : sm;
uint8_t sf = pop_spike_frame(pop_tile_mod(row, col));
if (sf > 0 && sf < 10 && SPIKES_FRAM_FORE[sf])
pop_env_b(SPIKES_FRAM_FORE[sf], x, dmy - 2);
}
@@ -770,8 +769,7 @@ static void overlay_mid_tile(int row, int col)
pop_env_b(base_id, x, t->base_y + dmy);
}
if (code == 2) { /* draw_tile_anim: свои пики */
uint8_t sm = pop_tile_mod(row, col);
uint8_t sf = (sm & 0x80) ? 5 : sm;
uint8_t sf = pop_spike_frame(pop_tile_mod(row, col));
if (sf > 0 && sf < 10 && POP_SPIKES_FRAM_LEFT[sf])
pop_env_b(POP_SPIKES_FRAM_LEFT[sf], x, dmy - 2);
}