PoP roomtest: окклюзия падающей плиты соседним полом — ряд из координаты
Комната 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 <noreply@anthropic.com>
This commit is contained in:
@@ -427,7 +427,7 @@ Kid ставится на первый пол, `pop_trob_reset()` возвращ
|
||||
|
||||
| комната | статус | что не так |
|
||||
|---------|--------|------------|
|
||||
| 1 | | |
|
||||
| 1 | пофикшено | падающая плита (2,6): правая грань видна через пол (2,7) и перекрывает его переднюю грань — `mob_render` брал ряд соседа из `m->row` (счётчик, уже ушедший на ряд вперёд), а не из координаты |
|
||||
| 2 | | |
|
||||
| 3 | | |
|
||||
| 4 | | |
|
||||
|
||||
@@ -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);
|
||||
/* клип СВОЕГО выхода за поле (верхний борт / статус-полоса) — по ВСЕЙ ширине */
|
||||
|
||||
Reference in New Issue
Block a user