From 419d5e4effe60f681ba36ddab46ae0d3210580e2 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Sat, 18 Jul 2026 11:20:48 +0300 Subject: [PATCH] =?UTF-8?q?applications/PoP/roomtest:=20=D1=84=D0=B8=D0=BA?= =?UTF-8?q?=D1=81=20=D1=83=D1=85=D0=BE=D0=B4=D0=B0=20Kid=20=D0=B2=20=D1=81?= =?UTF-8?q?=D1=82=D0=B5=D0=BD=D1=83=20=D0=BF=D1=80=D0=B8=20=D0=BF=D1=80?= =?UTF-8?q?=D1=8B=D0=B6=D0=BA=D0=B5=20=D1=81=20=D0=BA=D1=80=D0=BE=D0=BC?= =?UTF-8?q?=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Баг (из динамики): стоя на кромке [1,3]/[1,4] лицом вправо + Up, Kid телепортировался/застревал в стене col8. КОРЕНЬ (трасса MCP): jumpup(seq_14) на кромке → приземление над ямой → падение; на кадрах падения action=3 (midair) check_bumped был НЕ заглушён (guard покрывал только freefall/hang/climb-кадры). Kid дрейфовал к стене, get_tile вне рядов давал WALL, dist_from_wall_forward/x_bump[] — мусор с большим отрицательным сдвигом → Kid.x=char_dx_forward((int8_t)d) → underflow uint8 X (0→255) → долёт до col8 и застревание в стене. Фикс check_bumped: заглушить и в action MIDAIR (кадры падения), и при curr_row вне [0..2] (падение мимо пола — тайлы вне комнаты = WALL, bump-мусор; fell_out ловит do_fall). Проверено в MAME: на кромке Kid больше НЕ уходит в стену — чисто падает (в тесте сброс на старт). Co-Authored-By: Claude Opus 4.8 --- applications/PoP/roomtest/pop_map.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/applications/PoP/roomtest/pop_map.c b/applications/PoP/roomtest/pop_map.c index 50bc22f..38ae3a1 100644 --- a/applications/PoP/roomtest/pop_map.c +++ b/applications/PoP/roomtest/pop_map.c @@ -580,12 +580,16 @@ static void check_bumped(void) * climb-up у стены прерывается отскоком). FREEFALL — наш guard: стену * в падении держит do_fall/in_wall. */ if (Kid.action == ACT_FREEFALL || Kid.action == ACT_HANGCLIMB || - Kid.action == ACT_HANGSTRAIGHT) return; + Kid.action == ACT_HANGSTRAIGHT || Kid.action == ACT_MIDAIR) return; if (Kid.frame >= 135 && Kid.frame < 149) return; /* кадры подъёма/спуска */ /* Кадры виса 87..99: в спуске (seq_68) кадр frame_91 идёт ДО act(hang_climb), * т.е. action ещё midair — без этого guard'а bump у стены рвёт цепочку * hang->hang_fall->seq_11 (правильное приземление). */ if (Kid.frame >= 87 && Kid.frame < 100) return; + /* Вне рядов комнаты (падение мимо пола): get_tile даёт WALL, а + * dist_from_wall_forward/x_bump[] — мусор с большим отриц. сдвигом → + * underflow X и уход в стену. fell_out ловит do_fall. */ + if (Kid.curr_row < 0 || Kid.curr_row > 2) return; t = get_tile_at_char(); tcol = Kid.curr_col; if (!wall_type(t)) { t = get_tile_infrontof_char(); tcol = g_infrontx; } if (!wall_type(t)) return;