BUG-GATE-PASS-1: история флагов коллизии переживает боковой переход
Оригинал (seg004:0004) индексирует флаги перекрытия колонкой ВНУТРИ разрешённой комнаты и хранит рядом её номер, поэтому решётка комнаты 8 остаётся в своём слоте и после перехода 8->6: переход флага 0->1 виден, bumped() срабатывает. У нас индекс — колонка отрисованной комнаты, тот же тайл менял слот, и enter_room вынужден был выбрасывать историю целиком — на кадре входа бампа не было, и Кид с разбега уходил сквозь закрытые ворота. Вариант B (сдвиг вместо тега комнаты): при БОКОВОМ переходе история не выбрасывается, а перенумеровывается на 10 слотов. check_leave двигает x ровно на ∓140 = 10 тайлов, координата грани едет на те же 140 вместе с габаритом Кида — сами флаги инвариантны, меняется только номер слота. Сдвигаются curr/above/below (prev на следующем кадре всё равно перезапишет move_coll_to_prev), освободившиеся слоты = 3 «уже перекрывал». Вверх/вниз и прочие входы в комнату — по-прежнему полная инвалидация. Дословный вариант A (10 слотов + массив номеров комнат) не взят: он тянет за собой сужение окна перебора колонок, то есть отказ от FIX_COLL_FLAGS. Заведён docs/impl_diff.md — список осознанных расхождений с SDLPoP; правило «фиксировать расхождение» в обоих CLAUDE.md теперь указывает туда. tests-host: все 5 наборов прошли. Приёмка в MAME впереди. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -28,6 +28,15 @@ void pop_map_set(uint8_t *fg) __banked;
|
||||
* get_tile отдавал мнимую стену (BUG-SWORD-GHOST-1). Звать в enter_room. */
|
||||
void pop_map_set_edges(uint8_t left, uint8_t right, uint8_t up, uint8_t down) __banked;
|
||||
|
||||
/* БОКОВОЙ переход в соседнюю комнату: перенумеровать историю флагов
|
||||
* перекрытия вместо того, чтобы её выбросить (иначе Кид с разбега проходит
|
||||
* сквозь закрытые ворота шва — BUG-GATE-PASS-1). dcol — на сколько
|
||||
* изменились номера колонок: ушли ВПРАВО −10, ВЛЕВО +10. Звать СРАЗУ после
|
||||
* pop_map_set_edges и только для боковых переходов; вверх/вниз и все прочие
|
||||
* входы в комнату остаются на полной инвалидации. Разбор — bug_closed.md,
|
||||
* расхождение с дословным портом — ../docs/impl_diff.md. */
|
||||
void pop_coll_shift(int8_t dcol) __banked;
|
||||
|
||||
/* check_skel: тайл скелета -> пол + пометка перерисовки (обе страницы). */
|
||||
void pop_skel_wake_tile(uint8_t tilepos) __banked;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user