From 3913f1eb7d199ee8a6e18af6efd0be762e4b1c6b Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Mon, 10 Aug 2026 22:19:14 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D1=82=D1=80=D0=B0=D0=B6=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B2=20=D0=B7=D0=B5=D1=80=D0=BA=D0=B0=D0=BB?= =?UTF-8?q?=D0=B5:=20fore-=D0=BF=D1=80=D0=BE=D1=85=D0=BE=D0=B4=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B2=D0=B5=D1=80=D1=85=20=D0=BD=D0=B5=D0=B3=D0=BE=20(?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=B8/=D0=B3=D0=BE=D0=BB=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=20=D0=B2=D1=8B=D0=BB=D0=B5=D0=B7=D0=B0=D0=BB=D0=B8=20=D0=B8?= =?UTF-8?q?=D0=B7=20=D0=B0=D1=80=D0=BA=D0=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Симптом (скриншоты пользователя, ур. 4): у отражения видны ноги ниже нижней кромки зеркала, а на прыжке — голова и руки выше верхней. В оригинале и то и другое скрыто. Причина: над отражением не шёл fore-проход. В SDLPoP отражение уходит в objtable (add_objtable(4), seg003:0798), и передний слой тайлов накрывает его на общих основаниях — у зеркала это fore_id 77, ПЕРЕДНЯЯ ЧАСТЬ АРКИ. Именно она прячет всё, что вылезло из проёма. Клип obj_clip_top этого не делает и делать не может: при curr_row = 0 он равен y_clip[1] = 3, то есть режет только по верху поля. У нас отражение рисуется мимо конвейера персонажей (сокращённый путь, как и в оригинале), поэтому проход надо звать руками — ровно как это делает pop_char_fore для слотов: pop_fore_set_clip по нарисованному прямоугольнику + pop_fore_over_char(&Char, ...) с ЛОГИЧЕСКОЙ x кадра. Порядок сходится сам: pop_check_mirror стоит до отрисовки персонажей, так что получается отражение -> его fore -> Кид -> его fore, и каждый ставит своё окно клипа. Банк 4: 9590 -> 9770. tests-host: все 5 наборов прошли. Co-Authored-By: Claude Opus 5 --- applications/PoP/roomtest/pop_cdraw.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) 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) --- *