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. Для