Отладочный старт перехватывал смену уровня
DBG_START_ROOM/POS подменялись безусловно, а pop_start_level зовётся и на границе уровня. Из-за этого на 7-м стартовой становилась отладочная комната вместо комнаты 17 из данных, и спецсобытие «вход падением» (set_start_pos, seg003:0196) не срабатывало — переход 6->7 выглядел сломанным. Подмена теперь действует только на своём уровне (FIRST_LEVEL); рестарт того же уровня отладочную позицию сохраняет, как и задумано.
This commit is contained in:
@@ -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, переход вниз).
|
||||
|
||||
@@ -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, а экран тут же переводится на
|
||||
|
||||
Reference in New Issue
Block a user