applications/PoP/roomtest: фикс ухода Kid в стену при прыжке с кромки
Баг (из динамики): стоя на кромке [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 <noreply@anthropic.com>
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user