From fc69316c2c2ba21a7101ed701e6d0571237f9cec Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Wed, 29 Jul 2026 12:28:50 +0300 Subject: [PATCH] =?UTF-8?q?PoP=20roomtest:=20=D0=BE=D0=BA=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D0=B7=D0=B8=D1=8F=20=D0=BF=D0=B0=D0=B4=D0=B0=D1=8E=D1=89?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=BF=D0=BB=D0=B8=D1=82=D1=8B=20=D1=81=D0=BE?= =?UTF-8?q?=D1=81=D0=B5=D0=B4=D0=BD=D0=B8=D0=BC=20=D0=BF=D0=BE=D0=BB=D0=BE?= =?UTF-8?q?=D0=BC=20=E2=80=94=20=D1=80=D1=8F=D0=B4=20=D0=B8=D0=B7=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BE=D1=80=D0=B4=D0=B8=D0=BD=D0=B0=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Комната 1, плита (2,6): её правая грань (env 42, лежит целиком в ячейке 7) оставалась ПОВЕРХ пола (2,7) и перекрывала его переднюю грань. Причина: mob_render перерисовывал соседний тайл по m->row — а это ЛОГИЧЕСКИЙ счётчик «сквозь какой ряд летим», который mob_down_a_row уводит на ряд вперёд. Для плиты НИЖНЕГО ряда он сразу становится 3, и окклюзия звала draw_tile(3, col+1) — ряда 3 нет, тайл рисовался за нижним краем экрана, то есть пол соседа не перерисовывался никогда. Оригинал берёт ряд ИЗ КООРДИНАТЫ куска, draw_mob (seg007:13E5): tile_row = y_to_row_mod4(ypos); set_redraw2(tilepos справа) top_row = y_to_row_mod4(ypos - 18); если отличается — ТОЖЕ пометить То есть помечаются ДВА тайла справа: под низом куска и под его верхом, пока кусок висит на границе рядов. Второго у нас не было вовсе — и именно он тут решающий: при y=194 нижний ряд даёт -1 (полоса у потолка), а верхний — 2, то есть настоящий пол (2,7). Проверено в MAME покадрово (bp на pop_loose_mob_spawn + cmd gv; NB: главный цикл ждёт ТРИ vsync на итерацию, один gv = треть игрового кадра): следов плиты на полу (2,7) нет, передняя грань цела, потолочная полоса не тронута. Co-Authored-By: Claude Opus 5 --- applications/PoP/roomtest/bug_list.md | 2 +- applications/PoP/roomtest/pop_bg.c | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/applications/PoP/roomtest/bug_list.md b/applications/PoP/roomtest/bug_list.md index b283f5f..97e17ac 100644 --- a/applications/PoP/roomtest/bug_list.md +++ b/applications/PoP/roomtest/bug_list.md @@ -427,7 +427,7 @@ Kid ставится на первый пол, `pop_trob_reset()` возвращ | комната | статус | что не так | |---------|--------|------------| -| 1 | | | +| 1 | пофикшено | падающая плита (2,6): правая грань видна через пол (2,7) и перекрывает его переднюю грань — `mob_render` брал ряд соседа из `m->row` (счётчик, уже ушедший на ряд вперёд), а не из координаты | | 2 | | | | 3 | | | | 4 | | | diff --git a/applications/PoP/roomtest/pop_bg.c b/applications/PoP/roomtest/pop_bg.c index f1f43e4..be357b0 100644 --- a/applications/PoP/roomtest/pop_bg.c +++ b/applications/PoP/roomtest/pop_bg.c @@ -967,9 +967,24 @@ static void mob_render(mob_t *m, uint8_t pg) * сосед-тайл В ТОМ ЖЕ КАДРЕ поверх куска (иначе край торчит на полу * до heal'а следующего кадра — виден как хвост во время падения). */ if (m->col + 1 < 10) { - if (m->row < 0) g_clip_top = POP_YOFF; /* полоса у потолка — только срез */ - draw_tile(m->row, m->col + 1); + /* Ряд соседа берём ИЗ КООРДИНАТЫ куска (y_to_row_mod4(ypos)), а НЕ из + * m->row: последний — логический счётчик «сквозь какой ряд летим», и + * mob_down_a_row уводит его на ряд ВПЕРЁД (для плиты нижнего ряда — + * сразу в 3, которого нет). Тогда пол соседа не перерисовывался + * вообще, и правый кусок 42 оставался ПОВЕРХ него: грань плиты видна + * через пол + перекрыта передняя грань пола. + * Плюс ВТОРОЙ тайл — под ВЕРХОМ куска (ypos-18), пока кусок висит на + * границе рядов. Порт draw_mob (seg007:13E5). */ + int8_t r = (int8_t)(((m->y + 60) / 63) % 4 - 1); + int8_t rt = (int8_t)(((m->y - 18 + 60) / 63) % 4 - 1); + if (r < 0) g_clip_top = POP_YOFF; /* полоса у потолка — только срез */ + draw_tile(r, m->col + 1); g_clip_top = 0; + if (rt != r) { + if (rt < 0) g_clip_top = POP_YOFF; + draw_tile(rt, m->col + 1); + g_clip_top = 0; + } } gfx_set_bank(GFX_BANK_NORMAL); /* клип СВОЕГО выхода за поле (верхний борт / статус-полоса) — по ВСЕЙ ширине */