From db4106a55eff1fe8efe7ccf35ec619df78e47a3c Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Sat, 8 Aug 2026 19:24:21 +0300 Subject: [PATCH] =?UTF-8?q?L3-CHOMP:=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=20?= =?UTF-8?q?=D1=87=D0=BE=D0=BC=D0=BF=D0=B5=D1=80=D0=BE=D0=BC=20=D0=9A=D0=B8?= =?UTF-8?q?=D0=B4=20=D1=80=D0=B0=D0=B7=D0=B1=D0=B5=D0=B3=D0=B0=D0=B5=D1=82?= =?UTF-8?q?=D1=81=D1=8F=20=D1=81=D1=80=D0=B0=D0=B7=D1=83,=20=D0=B1=D0=B5?= =?UTF-8?q?=D0=B7=20=D0=BE=D1=81=D1=82=D0=BE=D1=80=D0=BE=D0=B6=D0=BD=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D1=88=D0=B0=D0=B3=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit forward_pressed (seg005:0577) исключает чомпер из правила «у стены шагаем, а не бежим»: `edge_type == EDGE_TYPE_WALL && curr_tile2 != tiles_18_chomper && distance < 8`. У нас исключения не было, а wall_type(18) = 3 — чомпер считается стеной, — поэтому из позиции вплотную к челюстям Кид сначала делал safe_step на 1-2 px и только потом бежал. Лишние кадры шага не дают проскочить между челюстями (поймано на приёмке, комната 3.22). Добавлен pop_edge_tile() — порт curr_tile2 после get_edge_distance. control_turning не трогаем: у нас он ванильный, а второе такое исключение в SDLPoP сидит под фиксом fix_turn_running_near_wall. --- applications/PoP/roomtest/pop_ctrl.c | 12 ++++++++++-- applications/PoP/roomtest/pop_map.c | 5 +++++ applications/PoP/roomtest/pop_map.h | 2 ++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/applications/PoP/roomtest/pop_ctrl.c b/applications/PoP/roomtest/pop_ctrl.c index 24987ed..a71445f 100644 --- a/applications/PoP/roomtest/pop_ctrl.c +++ b/applications/PoP/roomtest/pop_ctrl.c @@ -101,6 +101,8 @@ static int8_t release_arrows(void) return CONTROL_IGNORE; /* seg006: return 1 */ } +#define TILE_CHOMPER 18 /* tiles_18_chomper (исключение в forward_pressed) */ + /* Край/стена впереди — из pop_map (get_edge_distance): pop_edge_distance() * возвращает дистанцию и ставит pop_edge_type() = EDGE_WALL/FLOOR/CLOSER. */ @@ -158,8 +160,14 @@ static void draw_sword(void); /* fwd: нужен в control_standing */ static void forward_pressed(void) { int distance = pop_edge_distance(); - if (pop_edge_type() == EDGE_WALL && distance < 8) { - /* рядом стена — вместо бега осторожный шаг (в стену не разбежится) */ + /* seg005:0577 — «у стены шагаем, а не бежим», НО чомпер из этого правила + * ЯВНО исключён (`curr_tile2 != tiles_18_chomper`). Он проходим в + * разомкнутой фазе, и оригинал даёт разбежаться сразу: без исключения + * Кид перед чомпером делает лишний осторожный шаг, а это кадры — и он + * не успевает проскочить между челюстями (поймано на приёмке + * 2026-08-08, комната 3.22). */ + if (pop_edge_type() == EDGE_WALL && pop_edge_tile() != TILE_CHOMPER && + distance < 8) { if (control_forward == CONTROL_HELD) safe_step(); } else { diff --git a/applications/PoP/roomtest/pop_map.c b/applications/PoP/roomtest/pop_map.c index 068e5bf..e31f898 100644 --- a/applications/PoP/roomtest/pop_map.c +++ b/applications/PoP/roomtest/pop_map.c @@ -846,6 +846,11 @@ int pop_edge_distance(void) __banked uint8_t pop_edge_type(void) __banked { return g_edge_type; } +/* Тайл, на котором закончился разбор края (порт curr_tile2 после + * get_edge_distance). Нужен control'у: правило «у стены шагаем, а не + * бежим» в оригинале ЯВНО исключает чомпер (seg005:0577). */ +uint8_t pop_edge_tile(void) __banked { return g_curr_tile; } + /* ---- Прыжок вверх с зацепом (seg005 check_jump_up и производные) --- * * pop_jump_up_seq выбирает seq для ↑ в стойке: чистый прыжок (seq_28 в * пустоту / seq_14 в потолок) ЛИБО прыжок-и-зацеп за уступ выше (seq_8/ diff --git a/applications/PoP/roomtest/pop_map.h b/applications/PoP/roomtest/pop_map.h index 5fa216e..48e787f 100644 --- a/applications/PoP/roomtest/pop_map.h +++ b/applications/PoP/roomtest/pop_map.h @@ -175,6 +175,8 @@ int pop_clip_char_right(void) __banked; /* Расстояние до края/стены впереди + побочно g_edge_type (pop_edge_type). */ int pop_edge_distance(void) __banked; uint8_t pop_edge_type(void) __banked; +/* Тайл, на котором остановился разбор края (curr_tile2 оригинала). */ +uint8_t pop_edge_tile(void) __banked; /* Стена впереди в пределах стопа? Если да — прижимает Kid.x к корректной * позиции (передний край у стены, симметрично) и возвращает 1. Для