Зацеп за кромку нижнего ряда: do_fall пускает ряд до 3 + check_grab в midair
Уровень 7, комната 14: спуск с ряда 0 на ряд 2 через зацеп (повис на кромке кнопки (0,2), отпустил, взялся за (2,2)) не работал ни при какой фазе и задержке — Кид пролетал мимо и разгонялся до fall_y = 33, после чего окно зацепа закрыто уже по скорости. Корень: do_fall не давал curr_row выйти за 2, а check_grab целится в тайл ряда curr_row-1 — то есть ряд 2 своей комнаты становится целью только при curr_row == 3. В оригинале (seg005:0030) inc_curr_row безусловный, а get_tile для ряда 3 уходит по links.down (find_room_of_tile, seg006:005D). - pop_map.c do_fall: inc_curr_row теперь 2 -> 3; ветка «достиг y_land» гейтится по curr_row <= 2 (при ряде 3 ни in_wall, ни land звать нельзя — тайлов своей комнаты там нет, а до y_land[4] дело не доходит: комнату меняет check_leave_below на y >= 211). - pop_map.c check_action: восстановлена ветка ACT_MIDAIR (кадры 102..105, seg006:0619) — первые четыре кадра падения, где fall_y ещё не разогнан, зацеп не работал вовсе. Отсюда же «иногда цепляется, иногда нет». - tests-host/t_grab.c: регресс grab_below_room_edge_window_exists — сцена комнаты 14 + переход в 15 по pop_fell_out. До фикса ни одного зацепа, после — окно из 8 фаз X при задержках 0..5 кадров; проверяется и играбельность (зацеп при «отпустил и сразу зажал Shift»). - roomtest.c + pop_guard.h: чит-навигация ставит Кида на верхний ряд в комнате 14 уровня 7 (GRAB_DOWN_LEVEL/ROOM) — снизу этот спуск не проверить. Общее правило (снизу вверх) не тронуто: в верхнем ряду пола чаще нет и Кид проваливается сразу после телепорта. Проверено: tests-host 5/5 (55 в [grab]), size-check OK, живьём в MAME — Кид повис на кромке (2,2): frame=91 y=55 row=0 room=15. Доски: GRAB-BELOW-ROOM в BUGS_CLOSED, GRAB-KBD-TIMING в BUGS_OPEN (отложен пользователем до готовности всех уровней), план L7-FEATHER в TASKS_OPEN. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -696,15 +696,25 @@ int main(void)
|
||||
* это и «прилёт» в проём/ворота, и, на уровне 5, посадка
|
||||
* вплотную к тени спецсобытия, которая ждёт в колонке −1
|
||||
* ряда 0. Вместо сцены кражи зелья начиналась схватка,
|
||||
* которой в этой комнате быть не должно.
|
||||
* которой в этой комнате быть не должно. Снизу вверх нужно
|
||||
* и самой навигации: в верхнем ряду пола чаще нет, и Кид
|
||||
* проваливается из комнаты сразу после телепорта.
|
||||
*
|
||||
* ИСКЛЮЧЕНИЕ — комната 14 уровня 7 (пользователь 2026-08-12):
|
||||
* её проходят СВЕРХУ ВНИЗ (с ряда 0 на ряд 2 через зацеп за
|
||||
* кромки), и с нижнего ряда этот спуск не проверить вовсе.
|
||||
* Пол в ряду 0 там есть, так что Кид не проваливается.
|
||||
*
|
||||
* В каждом ряду сначала ищем ОБЫЧНЫЙ пол, и только если его
|
||||
* там нет — любой проходимый tile_is_floor (seg001: всё,
|
||||
* кроме пустоты, верха колонны, верха двери, стены и
|
||||
* «половинок» 26..29). */
|
||||
{
|
||||
int8_t row;
|
||||
for (row = 2; row >= 0 && any == 0xFF; row--) {
|
||||
int8_t row, step = -1, first = 2;
|
||||
if (pop_current_level == GRAB_DOWN_LEVEL &&
|
||||
r == GRAB_DOWN_ROOM) { first = 0; step = 1; }
|
||||
for (row = first; row >= 0 && row <= 2 && any == 0xFF;
|
||||
row = (int8_t)(row + step)) {
|
||||
uint8_t fallback = 0xFF;
|
||||
for (i = (uint8_t)(row * 10); i < (uint8_t)(row * 10 + 10); i++) {
|
||||
c = (uint8_t)(room_fg[i] & 0x1F);
|
||||
|
||||
Reference in New Issue
Block a user