ФИКС РЕГРЕССИИ шва: полный seq_39 у стены пропускал Кида сквозь ворота

073a6e0 вернул в safe_step(distance == 0) оригинальный seq_39 — а это шаг на
ОДИННАДЦАТЬ пикселей, который останавливает только бамп.  У ворот шва
(ур. 1, комн. 6) наш бамп срабатывает не на том же кадре, что у оригинала
(своя история — BUG-SEAM-PINGPONG), и Кид с разбега ПРОБЕГАЛ сквозь
закрытую решётку между комнатами 8 и 6.  Мелким шагом упирался нормально —
то есть промах именно в длине шага, а не в самом бампе.

Теперь ветка разделена по препятствию:
  ЧОМПЕР — оригинальный seq_39: бампа там нет по определению (is_obstacle
    требует modif == 2), и шаг обязан пройти целиком, иначе Кид топчется на
    1 px и не успевает между челюстями;
  СТЕНА И ВОРОТА — прежний «шаг-1»: осознанное приближение, проверенное
    трассой живого SDLPoP в BUG-SEAM-PINGPONG.  Останется таким, пока наш
    бамп не сойдётся с оригиналом покадрово.
This commit is contained in:
2026-08-08 20:09:58 +03:00
parent 1461ed5633
commit 463f35d440
+24 -9
View File
@@ -229,18 +229,33 @@ static void safe_step(void)
if (distance) { if (distance) {
Char.repeat = 1; Char.repeat = 1;
seqtbl_offset_char((uint8_t)(distance + SEQ_STEP_BASE)); seqtbl_offset_char((uint8_t)(distance + SEQ_STEP_BASE));
} else if (pop_edge_type() != EDGE_WALL && Char.repeat != 0) { } else if (pop_edge_type() == EDGE_WALL) {
/* ВПЛОТНУЮ К ПРЕПЯТСТВИЮ. Оригинал (seg005:0604) уходит здесь в
* seq_39 — а это шаг на ОДИННАДЦАТЬ пикселей, который останавливает
* только бамп.
*
* ЧОМПЕР: бампа нет по определению (в разомкнутой фазе он не
* препятствие, is_obstacle требует modif == 2), и шаг обязан пройти
* целиком — иначе Кид топчется на 1 px и не успевает между
* челюстями. Здесь играем оригинальный seq_39.
*
* СТЕНА И ВОРОТА: держим «шаг-1» — осознанное приближение. Наш бамп
* ловит не тот же кадр, что у оригинала (см. BUG-SEAM-PINGPONG, там
* трасса живого SDLPoP: `safe_step(d=0) -> step, на первом dx(1)
* x=62 -> bump`), и с полным seq_39 Кид ПРОБЕГАЕТ сквозь закрытые
* ворота шва комнаты 6 — поймано приёмкой 2026-08-08. Пока бамп не
* сойдётся с оригиналом покадрово, этот шаг остаётся коротким. */
if (pop_edge_tile() == TILE_CHOMPER) {
seqtbl_offset_char(SEQ_39_UNSAFE_STEP);
} else {
Char.repeat = 1;
seqtbl_offset_char((uint8_t)(1 + SEQ_STEP_BASE));
}
} else if (Char.repeat != 0) {
Char.repeat = 0; Char.repeat = 0;
seqtbl_offset_char(SEQ_44_STEP_ON_EDGE); seqtbl_offset_char(SEQ_44_STEP_ON_EDGE);
} else { } else {
/* Вплотную к СТЕНЕ оригинал тоже уходит сюда — seq_39 (шаг 11). seqtbl_offset_char(SEQ_39_UNSAFE_STEP); /* реальный обрыв (edge=CLOSER) */
* Раньше здесь стоял «маленький шаг-1»: у стены результат тот же
* (трасса живого SDLPoP в BUG-SEAM-PINGPONG: `safe_step(d=0) -> step,
* на первом dx(1) x=62 -> bump`), но у ЧОМПЕРА бампа нет — в
* разомкнутой фазе он не препятствие, — и оригинал уносит Кида на все
* 11 px, а мы шагали на один. Отсюда «микрошаг вместо нормального
* короткого шага» перед челюстями (приёмка 2026-08-08). */
seqtbl_offset_char(SEQ_39_UNSAFE_STEP);
} }
} }