From cdac5746acc930e379687e61572e24be239f9dc8 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Tue, 18 Aug 2026 21:16:59 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9C=D0=B8=D0=B4-=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BB=D0=B5=D0=B9=20=D0=BD=D0=B5=20=D1=80=D0=B8=D1=81=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BB=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=BD=D0=B8?= =?UTF-8?q?=D0=B9=20=D1=82=D0=BE=D1=80=D0=B5=D1=86=20=D0=BF=D0=BB=D0=B8?= =?UTF-8?q?=D1=82=D1=8B=20(draw=5Floose=20=D0=B8=D0=B7=20draw=5Ftile2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Правый конец падающего куска лежал поверх соседней плиты. У оригинала мид-оверлей — draw_tile2(), и его последний вызов draw_loose(0) рисует передний торец плиты; у loose bottom_id = 0, поэтому больше его не рисует никто, и в overlay_mid_tile торца не было вовсе. Заодно снят вопрос про клип объекта: add_mob_to_objtable ставит куску clip.right = 40, но клип применяется только при chtab_flip_clip[chtab_id], а для chtab_6_environment там 0 — поле игнорируется и в оригинале. Значит «клипа нет» у нас верно, MOB-CLIP-RIGHT закрывается как несуществующий. Co-Authored-By: Claude Opus 5 --- applications/PoP/roomtest/BUGS_CLOSED.md | 33 ++++++++++++++++++++++++ applications/PoP/roomtest/pop_bg.c | 14 ++++++++++ 2 files changed, 47 insertions(+) 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): он