BUG-TORCH-CHOMP-2: застывший чомпер накрывался пламенем факела

Регрессия от BUG-TORCH-CHOMP-1 (пламя перевели на запекание в фон).
Аргумент «запекать безопасно, кадры пламени самонакрываются» верен для
пикселей самого факела, но не для чужой графики в той же ячейке: пламя
рисуется в клетке ПРАВОГО СОСЕДА (seg008:560), и челюсти чомпера возвращал
поверх огня только его собственный trob — пока анимация жива.

SDLPoP так не делает: animate_torch (seg007:0241) заканчивается вызовом
set_redraw_anim_right(), который метит правого соседа, а redraw_needed
(seg008:0178) рисует его слой строго в порядке draw_tile_anim_topright ->
draw_tile_anim_right (пламя) -> draw_tile_anim (СВОЯ графика тайла).  То
есть челюсти возвращаются поверх огня КАЖДЫЙ кадр факела, независимо от
собственной анимации чомпера.  У нас пламя рисуется напрямую, минуя
механизм пометок, — этой второй половины не было.

Фикс: после pop_torch_draw метим правого соседа POP_RD_CHOMP на ОДНУ
страницу (факел анимируется каждый кадр -> обе страницы получат свою
перерисовку по очереди).  Порядок сходится сам: блок факелов идёт до
pop_redraw_needed.  Код соседа читается в том же префетче кодов тайлов
(trob_rcode[]), чтобы не свапать W0 второй раз за кадр.  Банк 6 +104 Б.

Осознанное расхождение (оригинал метит соседа безусловно, мы — только под
чомпера) заведено открытым: TORCH-ANIM-RIGHT в bug_list.md.  Слой
draw_tile_anim рисует ещё пики/зелье/меч, но такого соседства на уровнях
1-4 не встретилось, а безусловная пометка стоит перерисовки тайла каждый
кадр на каждый факел.

tests-host: все 5 наборов прошли.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-10 21:16:58 +03:00
parent e261a35acb
commit 67a4c71138
3 changed files with 116 additions and 4 deletions
+48
View File
@@ -2206,3 +2206,51 @@ BUG-SEAM-PINGPONG (см. `bug_closed.md`). Приёмка:
(ср. закрытый BUG-SEAM-PINGPONG). Второй кандидат — `char_height` в
`can_bump_into_gate()`: если он берётся не от того кадра, решётка может
перестать считаться препятствием раньше времени.
---
## BUG-TORCH-CHOMP-2. Застывший чомпер накрывается пламенем факела — ЗАКРЫТ 2026-08-10
Симптом (уровень 4, скриншот пользователя): пока чомпер щёлкает, всё в
порядке; как только его анимация кончается, пламя соседнего факела ложится
ПОВЕРХ челюстей.
Регрессия от фикса [BUG-TORCH-CHOMP-1](#bug-torch-chomp-1): там пламя
перевели на ЗАПЕКАНИЕ в фон (`GFX_BANK_NORMAL`), чтобы `heal` соседнего
чомпера не съедал огонь. Аргумент «запекать безопасно, кадры пламени
самонакрываются» верен для СОБСТВЕННЫХ пикселей факела, но не для чужой
графики в той же ячейке: пламя рисуется в клетке ПРАВОГО СОСЕДА
(`x = (col+1)*32 + 8`, seg008:560), и если сосед — чомпер, огонь ложится на
его челюсти. Пока trob чомпера жив, `pop_set_redraw(tp, POP_RD_CHOMP, ...)`
возвращает их поверх каждый кадр; как только анимация кончилась и trob
умер, возвращать стало нечем.
**Как это устроено в оригинале** (и почему у него бага нет).
`animate_torch` (seg007:0241) заканчивается вызовом `set_redraw_anim_right()`
— он метит `redraw_frames_anim` у ПРАВОГО СОСЕДА (seg007:0101). А
`redraw_needed` (seg008:0178) рисует помеченный слой строго в порядке
```
draw_tile_anim_topright();
draw_tile_anim_right(); <- пламя ЛЕВОГО соседа (факела)
draw_tile_anim(); <- СВОЯ графика тайла: челюсти чомпера
```
То есть челюсти возвращаются поверх огня **каждый кадр факела**, независимо
от того, жива ли собственная анимация чомпера. У нас пламя рисуется
напрямую из `pop_process_trobs`, минуя механизм пометок, — этой второй
половины не было.
**Фикс** (`pop_trob.c`): после `pop_torch_draw` метим правого соседа
`pop_set_redraw(tp + 1, POP_RD_CHOMP, 1)`, если там чомпер. Одна страница:
факел анимируется каждый кадр, значит обе страницы дабл-буфера получат свою
перерисовку по очереди. Порядок сходится сам — блок факелов стоит ДО
`pop_redraw_needed`. Код соседа читается в том же префетче кодов тайлов
(`trob_rcode[]`), чтобы не свапать W0 второй раз за кадр. Банк 6: +104 Б.
**Осознанное расхождение** — оригинал метит соседа БЕЗУСЛОВНО, мы только под
чомпера. Безусловная пометка = перерисовка тайла каждый кадр на каждый
факел; слой `draw_tile_anim` рисует ещё пики, зелье и меч (seg008:0644),
поэтому теоретически «застыть под пламенем» могут и они — заведено открытым
в `bug_list.md` (TORCH-ANIM-RIGHT). На уровнях 1–4 такого соседства не
встретилось.