diff --git a/applications/PoP/roomtest/pop_cdraw.c b/applications/PoP/roomtest/pop_cdraw.c index 7aaba37..1f8f5f4 100644 --- a/applications/PoP/roomtest/pop_cdraw.c +++ b/applications/PoP/roomtest/pop_cdraw.c @@ -666,7 +666,7 @@ void pop_mirror_draw(int clip_top) __banked const uint8_t *img; uint8_t page, idx, flip; uint16_t w, h, vis_w; - int fwd, obj_x, obj_y, bx, top, skip = 0, rows, cl; + int fwd, obj_x, obj_y, fp_x, bx, top, skip = 0, rows, cl; uint8_t lskip = 0; if (fr->image == 255) return; @@ -678,6 +678,7 @@ void pop_mirror_draw(int clip_top) __banked obj_x = (fwd << 1) - 116; obj_y = (int)Char.y + fr->dy; if ((int8_t)(fr->flags ^ Char.direction) >= 0) obj_x++; + fp_x = obj_x; /* ЛОГИЧЕСКАЯ X — её ждёт fore-проход */ obj_x = scr_x(obj_x); img = (const uint8_t *)atlas_image(&kidp[page], idx); @@ -725,6 +726,20 @@ void pop_mirror_draw(int clip_top) __banked mi_x[dp] = bx + lskip; mi_y[dp] = top; mi_w[dp] = (uint16_t)(vis_w - lskip); mi_h[dp] = (uint16_t)rows; mi_valid[dp] = 1; + + /* FORE-ПРОХОД ПОВЕРХ ОТРАЖЕНИЯ — обязателен, и без него картинка неверна. + * В оригинале отражение уходит в objtable (add_objtable(4)), а дальше его + * накрывает передний слой тайлов на общих основаниях; у зеркала это + * fore_id 77 — ПЕРЕДНЯЯ ЧАСТЬ АРКИ. Именно она прячет то, что вылезло из + * проёма: ноги ниже нижней кромки и голову с руками выше верхней (видно + * на прыжке). Клип obj_clip_top этого НЕ делает — при curr_row = 0 он + * равен y_clip[1] = 3, то есть почти не режет; работу выполняет фон. + * + * Мы рисуем отражение мимо конвейера персонажей, поэтому проход надо + * позвать руками — ровно как это делает pop_char_fore для слотов. */ + pop_fore_set_clip(bx + lskip, top + POP_YOFF, + (int)(vis_w - lskip), rows); + pop_fore_over_char(&Char, fp_x, obj_y, w, h); } /* ---- Индикаторы HP (порт draw_kid_hp / draw_guard_hp, seg000:1416) --- *