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); /* клип СВОЕГО выхода за поле (верхний борт / статус-полоса) — по ВСЕЙ ширине */