From 463f35d4404eab054fe60445e15df15eb0c6dd31 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Sat, 8 Aug 2026 20:09:58 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=98=D0=9A=D0=A1=20=D0=A0=D0=95=D0=93?= =?UTF-8?q?=D0=A0=D0=95=D0=A1=D0=A1=D0=98=D0=98=20=D1=88=D0=B2=D0=B0:=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D0=BD=D1=8B=D0=B9=20seq=5F39=20=D1=83=20?= =?UTF-8?q?=D1=81=D1=82=D0=B5=D0=BD=D1=8B=20=D0=BF=D1=80=D0=BE=D0=BF=D1=83?= =?UTF-8?q?=D1=81=D0=BA=D0=B0=D0=BB=20=D0=9A=D0=B8=D0=B4=D0=B0=20=D1=81?= =?UTF-8?q?=D0=BA=D0=B2=D0=BE=D0=B7=D1=8C=20=D0=B2=D0=BE=D1=80=D0=BE=D1=82?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. Останется таким, пока наш бамп не сойдётся с оригиналом покадрово. --- applications/PoP/roomtest/pop_ctrl.c | 33 ++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/applications/PoP/roomtest/pop_ctrl.c b/applications/PoP/roomtest/pop_ctrl.c index 0fd3cc7..b7cc5de 100644 --- a/applications/PoP/roomtest/pop_ctrl.c +++ b/applications/PoP/roomtest/pop_ctrl.c @@ -229,18 +229,33 @@ static void safe_step(void) if (distance) { Char.repeat = 1; 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; seqtbl_offset_char(SEQ_44_STEP_ON_EDGE); } else { - /* Вплотную к СТЕНЕ оригинал тоже уходит сюда — seq_39 (шаг 11). - * Раньше здесь стоял «маленький шаг-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); + seqtbl_offset_char(SEQ_39_UNSAFE_STEP); /* реальный обрыв (edge=CLOSER) */ } }