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