36a60f54ba
Симптом: Кид встаёт на плиту, которая физически в СОСЕДНЕЙ комнате (стоя в шве, curr_col = −1), и вместо одних ворот открываются двое — на уровне 5 плита комнаты 11 открывала и нижние ворота комнаты 24, и верхние, хотя связана только с нижними. Причина. check_press читал тайл через get_tile (тот резолвит шов в соседнюю комнату), а комнату и tilepos для trigger_button брал из координат персонажа: (своя комната, row*10 + curr_col). При curr_col = −1 это tilepos 9 СВОЕЙ комнаты — там стена с bg = 0, то есть индекс цепочки LINKLOC 0. Цепочка от нуля в данных уровня 5 ведёт на ДВА тайла: нижние ворота (link[0], next=1) и верхние (link[1]) — ровно то, что наблюдалось. Настоящая кнопка имеет индекс 9 и одну цель. В оригинале этого нет по построению: get_tile зовёт find_room_of_tile (seg006:005D) и ПЕРЕСТАВЛЯЕТ curr_room/curr_tilepos, а trigger_button работает уже с ними. У нас резолв комнаты жил только внутри get_tile, а наружу не отдавался. Фикс: tile_room_of(col,row) — комната и tilepos клетки с учётом швов (по образцу gate_modif, который так делал давно), check_press зовёт trigger_button с резолвнутыми room/tilepos. Ветка loose там же оставлена на координатах персонажа: make_loose_fall работает с g_fg своей комнаты. Два других вызова trigger_button (зацеп за кромку, севшая на кнопку плита) правки не требуют — оба ограничены колонками 0..9 своей комнаты. Заведён GATE-FORE-KID (BUGS_OPEN.md): Кид, стоящий В ПРОЁМЕ ворот, виден поверх решётки — у нас портирован только шовный случай окклюзии, а draw_tile_fore (seg008:0D15) рисует решётку поверх персонажа и внутри комнаты. Чинить в fore-слое отдельно, он горячий. tests-host 5/5, make size-check OK. Банк 3: 10648 -> 10828 Б. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>