SprPoP: кнопка под Кидом больше не заливается кладкой (палас)
Симптом (пользователь, 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 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018T2k4VZrSyERwk6H97Sfi1
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user