Уровень 6: переход на 7-й, портал, многокомнатное падение плиты

Всё проверено пользователем в MAME.

1. Переход 6 -> 7 падением.  leave_room (seg002:0504) для «вниз» на уровне 6
   из комнаты 1 даёт особый результат −2, главный цикл (seg000:0893) читает
   его как ++next_level; вход на 7-м (set_start_pos, seg003:0196) ставит Кида
   в комнату 17 и сразу переводит экран на комнату под ней.  Проверка ОБЯЗАНА
   идти раньше связи вниз: у комнаты 1 сосед снизу есть (шахта, комната 3).

2. BUG-BALCONY-RIGHT: правая половина портала не рисовалась.  id 12 стоял в
   FORE_ENV_IDS (в tile_table он fore_id ЗЕЛЬЯ), но зелье рисуется из
   chtab_1, а в chtab_6 под этим номером — правая часть арки балкона 32x62,
   идущая в backtable.  Спрайт уезжал в fore-атлас, env-страница получала
   дырку (idx 12: w=0 h=0).  Найдено трассой POP_TRACE_BT + чтением каталога
   .atl; дифф комнаты с оригиналом 1151 -> 375.

3. BUG-BELOWROW-WALL: жёлтые треугольники в шахте падения.  load_rowbelow
   (seg008:368) при отсутствующей комнате снизу подставляет tiles_0_empty
   колонкам 1..9 и tiles_20_wall только левому краю; у нас стеной забивались
   все 11 позиций.

4. BUG-MOB-MULTIROOM: честный mob_down_a_row (seg007:1387) — кусок переходит
   в комнату снизу и летит дальше.  Плита (1,7) комнаты 6 пролетает шахту
   комнаты 7 и жмёт кнопку (2,7) комнаты 11, открывая ворота комнаты 18.

5. BUG-MOB-STALE-PAGE: чистка следа куска стояла под гейтом «в отрисованной
   комнате» — улетевший вниз оставлял себя на одной из страниц навсегда.

6. BUG-CHAR-STALE-PAGE: тень застывала на двух страницах в РАЗНЫХ позах.
   Прямоугольник и valid пишутся внутри `if (w && h)`, а снимок состояния
   брался безусловно — при нулевом спрайте слот залипал «тихим».  Остаток
   (почему спрайт нулевой) заведён как SPRITE-ZERO-W0 в BUGS_OPEN.

NEXT_SESSION переписан: следующая задача — зацеп за край пола в свободном
падении (вход на уровень 7).  tests-host 5/5, size-check чист.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-11 23:01:58 +03:00
parent e4ef489872
commit 9ecea17ba6
13 changed files with 310 additions and 65 deletions
+10 -3
View File
@@ -610,9 +610,16 @@ void pop_char_draw(uint8_t who) __banked
}
gfx_w0_unmap();
/* Что именно нарисовано на ЭТОЙ странице — снимок для пропуска
* следующих кадров (DRAW-COST). Только на полном пути: ранние выходы
* оставляют valid[dp] снятым, и cd_quiet отсеет слот и без снимка. */
cd_sig_make(who, &cd_sig[who][dp]);
* следующих кадров (DRAW-COST). Только если кадр РЕАЛЬНО рисовали:
* при нулевом спрайте (`w && h` ложно — пустая запись атласа) блок выше
* не выполняется, и x/y/w/h/valid остаются от ПРОШЛОГО кадра этой
* страницы. Снимок же брался всегда — и слот залипал: cd_quiet видел
* valid = 1 и совпавшую сигнатуру, то есть считал «на странице
* нарисовано ровно то, что нужно», а на ней стоял старый спрайт. Так
* тень оставалась на двух страницах дабл-буфера в РАЗНЫХ позах и мигала
* между ними (BUG-CHAR-STALE-PAGE). Без снимка слот просто не будет
* «тихим», и следующий кадр начнётся с heal — старое сотрётся. */
if (w && h) cd_sig_make(who, &cd_sig[who][dp]);
}
void pop_char_fore(uint8_t who) __banked