From 8548aa9132587371d5023fceb31e88432d225d02 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Wed, 2 Sep 2026 17:41:29 +0300 Subject: [PATCH] =?UTF-8?q?SprPoP:=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=B4=20=D0=9A=D0=B8=D0=B4=D0=BE=D0=BC=20=D0=B1?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D1=88=D0=B5=20=D0=BD=D0=B5=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=D0=B2=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=BA=D0=BB?= =?UTF-8?q?=D0=B0=D0=B4=D0=BA=D0=BE=D0=B9=20(=D0=BF=D0=B0=D0=BB=D0=B0?= =?UTF-8?q?=D1=81)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Симптом (пользователь, 2026-09-02, уровень 4 комната 18): Кид подтягивается на открывающую кнопку (0,4), и кромка, которая его прячет, нарисована кирпичом вместо кнопки. РАЗБОР ПО ЖИВОМУ КАДРУ (заморозка): Kid frame 139, x 123, col 4, row 1, room 18 — то есть персонаж действительно под кромкой кнопки (0,4). Отсюда путь: кадр подъёма -> climb_overlay_tile; тайл не floor-подобный (кнопка) -> other_overlay_tile; сосед слева (0,3) пуст -> overlay_mid_tile, полная перерисовка тайла ПОВЕРХ персонажа. ПРИЧИНА. draw_tile_base оригинала подменяет базу кнопки на «левую половину без пола слева» (id 148) по ТРЁМ условиям (seg008:628): тайл — opener, слева пусто И tbl_level_type[current_level] == 0, то есть только в ПОДЗЕМЕЛЬЕ. Третье условие у нас было потеряно ИМЕННО В ОВЕРЛЕЕ: статическая отрисовка (pop_room.c, draw_tile_base) его имеет и даже ссылается на ту же строку оригинала, а pop_bg.c — нет. Уровень 4 дворцовый, поэтому оверлей брал спрайт 148, а в дворцовом наборе это другая картинка. Этим же объясняется, почему баг не виден «просто так»: пока тайл рисует статика, кнопка правильная — кирпич появляется ровно в тот момент, когда персонаж встаёт под кромку и включается оверлей. Цена: +6 байт в банке 2 (8976 -> 8982, свободно 7402). Проверять стоит на любом ДВОРЦОВОМ уровне, где у открывающей кнопки слева пусто и персонаж лезет на неё снизу. Живая проверка в MAME пользователем: корректно. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_018T2k4VZrSyERwk6H97Sfi1 --- applications/SprPoP/src/pop_bg.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/applications/SprPoP/src/pop_bg.c b/applications/SprPoP/src/pop_bg.c index 0632cb1..89eca09 100644 --- a/applications/SprPoP/src/pop_bg.c +++ b/applications/SprPoP/src/pop_bg.c @@ -771,15 +771,26 @@ static void overlay_mid_tile(int row, int col) pop_env_b(42, x, pop_tile_table[1].right_y + dmy); { /* draw_tile_base (seg008:0A8E) — ЦЕЛИКОМ, вместе с подстановками id: * у loose верх плиты берётся из loose_fram_left (в pop_tile_table base_id=0), - * у opener'а без пола слева — 148. Раньше здесь стоял голый base_id, и + * у opener'а без пола слева — 148, НО только в ПОДЗЕМЕЛЬЕ. Условие + * `tbl_level_type[current_level] == 0` в оригинале стоит третьим + * (seg008:628) и у нас было потеряно ИМЕННО ЗДЕСЬ: статическая + * отрисовка (pop_room.c, draw_tile_base) его имеет, а оверлей — нет. + * Отсюда симптом «кнопка, на которую лезет Кид, залита кирпичом»: + * пока тайл рисует статика, кнопка правильная, но как только Kid + * встаёт под кромку, оверлей перерисовывает её поверх него уже + * спрайтом 148, а во дворце это другая картинка (кладку палас + * вообще рисует заливками, а не спрайтами). Уровень 4, комната 18, + * кнопка (0,4) — найдено пользователем 2026-09-02. + * + * Раньше здесь стоял голый base_id, и * верх loose-плиты в оверлей не попадал: передняя грань ложилась поверх * Kid (foretable), а сама плита — нет, и подтягивающийся Kid рисовался * поверх её верхней плоскости (комната 12). */ uint8_t base_id = t->base_id; if (code == 11 && row >= 0) base_id = POP_LOOSE_FRAM_LEFT[pop_loose_frame(pop_loose_modif[row * 10 + col])]; - else if (code == 0x0F && lcode == 0) - base_id = 148; + else if (code == 0x0F && lcode == 0 && !pop_palace) + base_id = 148; /* ТОЛЬКО ПОДЗЕМЕЛЬЕ (seg008:628) */ if (base_id) pop_env_b(base_id, x, t->base_y + dmy); }