From d1183f731528771c0d5f8a41a84dadf63a64c688 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Thu, 20 Aug 2026 11:35:09 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D1=82=D0=BB=D0=B0=D0=B4=D0=BE=D1=87?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20=D1=81=D1=82=D0=B0=D1=80=D1=82=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D1=85=D0=B2=D0=B0=D1=82=D1=8B=D0=B2=D0=B0?= =?UTF-8?q?=D0=BB=20=D1=81=D0=BC=D0=B5=D0=BD=D1=83=20=D1=83=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=BD=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DBG_START_ROOM/POS подменялись безусловно, а pop_start_level зовётся и на границе уровня. Из-за этого на 7-м стартовой становилась отладочная комната вместо комнаты 17 из данных, и спецсобытие «вход падением» (set_start_pos, seg003:0196) не срабатывало — переход 6->7 выглядел сломанным. Подмена теперь действует только на своём уровне (FIRST_LEVEL); рестарт того же уровня отладочную позицию сохраняет, как и задумано. --- applications/PoP/roomtest/BUGS_CLOSED.md | 25 +++++++++++++++++++++++ applications/PoP/roomtest/roomtest_cold.c | 25 ++++++++++++++++++----- 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/applications/PoP/roomtest/BUGS_CLOSED.md b/applications/PoP/roomtest/BUGS_CLOSED.md index 5f1f5b6..65946cd 100644 --- a/applications/PoP/roomtest/BUGS_CLOSED.md +++ b/applications/PoP/roomtest/BUGS_CLOSED.md @@ -3380,3 +3380,28 @@ draw_tile_anim(); draw_tile_bottom(0); draw_loose(0); Основной кандидат на возврат этих тактов — задача [HEAL-WIDTH](TASKS_OPEN.md#heal-width): heal'ы кусков и плит берут ширину по клеткам, а фактический след — 58/57. + +### BUG-DBGSTART-LEVEL. Отладочный старт ломал переход между уровнями (закрыт 2026-08-20) + +**Симптом** (найден пользователем на сборке `make LEVEL=6 ROOM=1 POS=18`): +Кид проваливается в комнате 1 шестого уровня, уровень меняется на 7-й — и +Кид появляется не там: приземляется в комнате 1 на 2,8 вместо того, чтобы +продолжать падение по своей колонке. + +**Корень.** Отладочный старт (`DBG_START_ROOM`/`DBG_START_POS`, +`roomtest_cold.c`) подменял комнату и позицию БЕЗУСЛОВНО, а +`pop_start_level` зовётся не только на первом запуске, но и **на каждой +смене уровня**. В результате на 7-м уровне стартовой становилась +отладочная комната 1 вместо комнаты 17 из данных — и спецсобытие «вход +падением» (`set_start_pos`, seg003:0196: уровень 7, комната 17 -> +`goto_other_room(3)`) не срабатывало вовсе, потому что его условие +сравнивает именно `start_room`. + +Само спецсобытие было портировано и работало; сломан был вход в него. + +**Починка:** подмена применяется только пока `pop_current_level == +FIRST_LEVEL`. Рестарт ТОГО ЖЕ уровня (смерть, чекпойнт) отладочную +позицию сохраняет — ради этого она и перебивает чекпойнт. + +**Проверено в MAME:** после провала на 6-м `pop_current_level` = 7, Kid.room += 16, то есть спецсобытие отработало (старт в 17, переход вниз). diff --git a/applications/PoP/roomtest/roomtest_cold.c b/applications/PoP/roomtest/roomtest_cold.c index 774fe5e..c8d5051 100644 --- a/applications/PoP/roomtest/roomtest_cold.c +++ b/applications/PoP/roomtest/roomtest_cold.c @@ -113,8 +113,21 @@ void pop_start_level(void) __banked * перебивать и его тоже, иначе рестарт уровня уводил бы Кида из * измеряемой комнаты. Направление и позу входа не трогаем — они из * данных уровня, как у обычного старта. */ - start_room = DBG_START_ROOM; - pos = DBG_START_POS; + /* ...НО ТОЛЬКО НА СВОЁМ УРОВНЕ. pop_start_level зовётся ещё и на + * СМЕНЕ уровня, и без этой проверки отладочная позиция перехватывала + * переход: на 6-м Кид проваливается в комнате 1, а на 7-м обязан + * появиться в комнате 17 и продолжить падение вниз (спецсобытие + * «вход падением», см. ниже). Вместо этого он оказывался в + * DBG_START_ROOM/POS, спецсобытие не срабатывало вовсе, и переход 6->7 + * выглядел сломанным (поймано пользователем 2026-08-20 на сборке + * make LEVEL=6 ROOM=1 POS=18). + * + * Рестарт ТОГО ЖЕ уровня (смерть, чекпойнт) отладочную позицию + * сохраняет — ради этого она и перебивает чекпойнт выше. */ + if (pop_current_level == FIRST_LEVEL) { + start_room = DBG_START_ROOM; + pos = DBG_START_POS; + } #endif /* Рестарт уровня = load_level() заново (play_level, seg003:57): в @@ -176,9 +189,11 @@ void pop_start_level(void) __banked * weight-биты, с учётом направления), поэтому геометрически ровной * середины тут нет. Число снято замером живой сцены: x = 98 при позе * стойки даёт curr_col = 2, x = 94 — уже 1. */ - Kid.x = (uint8_t)(pop_x_bump[(pos % 10) + FIRST_ONSCREEN_COLUMN] + - TILE_SIZEX - 2); - Kid.curr_col = (int8_t)(pos % 10); + if (pop_current_level == FIRST_LEVEL) { /* см. условие выше */ + Kid.x = (uint8_t)(pop_x_bump[(pos % 10) + FIRST_ONSCREEN_COLUMN] + + TILE_SIZEX - 2); + Kid.curr_col = (int8_t)(pos % 10); + } #endif /* Спецсобытие «вход падением» (set_start_pos, seg003:0196): на 7-м * уровне Кид ставится в комнату 17, а экран тут же переводится на