diff --git a/applications/PoP/roomtest/BUGS_CLOSED.md b/applications/PoP/roomtest/BUGS_CLOSED.md index 889948e..cd128cf 100644 --- a/applications/PoP/roomtest/BUGS_CLOSED.md +++ b/applications/PoP/roomtest/BUGS_CLOSED.md @@ -3304,3 +3304,36 @@ else return; Host-тесты 5106 проверок без расхождений (`pop_room.c` они не линкуют — проверка визуальная, в MAME: уровень 11 комната 14, отделившаяся плита видна три кадра). + +### Продолжение: в мид-оверлее не было переднего торца плиты + +Пользователь тут же нашёл следующий слой (2026-08-18, та же комната): правый +конец падающего куска рисовался ПОВЕРХ соседней плиты `(2,6)`, хотя торец той +плиты при этом лежал поверх куска — то есть порядок был противоречивым в +разных частях перекрытия. + +Сначала я проверил, не нужен ли клип объекта: `add_mob_to_objtable` +(seg007:1161) ставит куску `clip.right = 40`. Оказалось — **не нужен и в +оригинале не работает**: клип применяется только если +`chtab_flip_clip[chtab_id]`, а таблица (`data.h:196`, +`{1,0,1,1,1,1,0,0,0,0}`) для `chtab_6_environment` даёт **0**. Поле +выставляется и молча игнорируется, так что «клипа нет» у нас — верно. Пункт +MOB-CLIP-RIGHT можно закрывать как несуществующий. + +Настоящая причина — состав мид-оверлея. У оригинала это `draw_tile2()`: + +```c +draw_tile_right(); draw_tile_anim_right(); draw_tile_base(); +draw_tile_anim(); draw_tile_bottom(0); draw_loose(0); +``` + +а у нашего `overlay_mid_tile` последнего вызова не было. У loose в +`pop_tile_table` `bottom_id = 0`, поэтому передний торец плиты рисует ТОЛЬКО +`draw_loose` — и в оверлее его не рисовал никто. Добавлено; кадр берётся по +живому modif, чтобы дрожащая плита осталась дрожащей. + +**Осталось невыясненным:** в `overlay_mid_tile` по-прежнему нет полного +`draw_tile_right` (есть только случай пола, спрайт 42) и нет +`draw_tile_anim_right` — то есть анимированной правой грани СОСЕДА (пики, +ворота, loose). Симптома на это пока не видели; если всплывёт «правая грань +соседа под персонажем/куском» — смотреть сюда. diff --git a/applications/PoP/roomtest/pop_bg.c b/applications/PoP/roomtest/pop_bg.c index b6e5ef0..3a5bb64 100644 --- a/applications/PoP/roomtest/pop_bg.c +++ b/applications/PoP/roomtest/pop_bg.c @@ -781,6 +781,20 @@ static void overlay_mid_tile(int row, int col) } else if (t->bottom_id) { pop_env_b(t->bottom_id, x, dby); } + /* draw_loose(0) — ПЕРЕДНИЙ ТОРЕЦ плиты, последний вызов draw_tile2 + * (seg008: draw_tile_right, draw_tile_anim_right, draw_tile_base, + * draw_tile_anim, draw_tile_bottom, draw_loose). У loose в + * pop_tile_table bottom_id = 0, поэтому ветка выше его НЕ рисует, и в + * оверлее торца не было вовсе: падающий кусок оставался ПОВЕРХ торца + * соседней плиты (найдено пользователем 2026-08-18, ур.11 к.14 — + * трясущаяся плита (2,6) и кусок, отвалившийся от (2,5)). + * + * Кадр берётся по ЖИВОМУ modif, как и верх плиты выше: оверлей рисуется + * поверх уже готовой картинки, и дрожащая плита обязана остаться + * дрожащей. */ + if (code == 11 && row >= 0) + pop_env_b(POP_LOOSE_FRAM_BOTTOM[pop_loose_frame(pop_loose_modif[row * 10 + col])], + x, dby); } /* draw_tile_fore (seg008:690) — ТОЛЬКО передний слой (add_foretable): он