Приёмка ур. 2–3: сквозь стену, клин в шве, бар под плитой, глухой страж
Четыре разбора с прогонов пользователя; три бага закрыты, четвёртый (BUG-SPIKE-1, пики) заведён с замером и гипотезой. BUG-JUMPWALL-1 (Critical) — недолетевший прыжок проходил СКВОЗЬ стену. check_collisions держал флаги перекрытия ОДНОГО ряда, а оригинал (seg004:0004) — трёх, и move_coll_to_prev (seg004:00DF) берёт «прошлые» флаги из нужного. Наш prev=3 («уже перекрывал») подавлял бамп ровно на кадре смены ряда, а в падении ряд меняется почти каждый кадр — переход 0→1 на стене приходился как раз на него. Порт трёх рядов дословно. Воспроизведено и закрыто на харнессе (новый набор t_wall: свип по 20 стартовым X, 4 давали проход сквозь кладку); 1723 трассы t_phys НЕ изменились — правка поведение-сохраняющая. Живьём подтвердил пользователь. BUG-GUARD-DEAF-1 (Major) — is_guard_notice не взводился НИГДЕ, поэтому неактивный страж не оборачивался на Кида за спиной никогда. Портированы все пять мест оригинала: опкод SOUND в play_seq (звуки 0..2), bumped_sound, мягкое/среднее приземление, обрушенная плита, щелчок кнопки. Ждёт игровой проверки боем в комнате 11 уровня 2. BUG-SEAM-WEDGE-1 — клин кладки в пустом (2,0). Сосед угла снизу-слева лежит в комнате по диагонали (room_BL); мы безусловно считали его стеной, оригинал (load_rowbelow, seg008:368) — только когда такой комнаты нет. Ряд «снизу» стал 11-байтным: [10] = тайл (0,9) диагональной комнаты. BUG-LOOSE-3 — чёрный бар под упавшей плитой-потолком. pop_ceil_bake_empty стирал полосу и восстанавливал только два тайла ряда −1, а в полосу лезет графика соседа слева и верхушки ряда 0. Теперь перерисовываются ряды −1 и 0, колонки col−1..col+1. Проверено попиксельной сверкой с эталонной перерисовкой: 0 различий. Плюс карта связности комнат уровней 1–3 (TASKS.md): на ур. 2 недостижимых нет, на ур. 3 это 23 и 24 — те же односторонние ссылки, что дали 13/18/24 на уровне 1, только комнаты полностью пустые. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -633,7 +633,11 @@ static void draw_tile(int row, int col)
|
||||
* room_B(0, col-1); col-1<0 → левая комната снизу = стена уровня. */
|
||||
if (row + 1 > 2) {
|
||||
int lc = col - 1;
|
||||
if (lc < 0) rbl_code = 20; /* кромка уровня = стена */
|
||||
/* lc < 0 — угол (2,0): сосед снизу-слева лежит в ЧУЖОЙ комнате
|
||||
* (room_BL). Её тайл (0,9) приходит одиннадцатым байтом below-ряда;
|
||||
* «стена» там стоит, только если такой комнаты нет — как в
|
||||
* load_rowbelow (seg008:368). См. BUG-SEAM-WEDGE-1. */
|
||||
if (lc < 0) rbl_code = g_below ? (uint8_t)(g_below[10] & 0x1F) : 20;
|
||||
else rbl_code = g_below ? (uint8_t)(g_below[lc] & 0x1F) : 1;
|
||||
} else rbl_code = tile_code(row + 1, col - 1);
|
||||
|
||||
@@ -843,8 +847,22 @@ void pop_ceil_bake_empty(int col) __banked
|
||||
gfx_set_bank(GFX_BANK_TRANSPARENT);
|
||||
g_clip_top = POP_YOFF;
|
||||
bake_rest = 1; /* фон = покой (см. bake_rest) */
|
||||
draw_tile(-1, col); /* тайл уже EMPTY → колодец наверх */
|
||||
if (col + 1 < 10) draw_tile(-1, col + 1);
|
||||
/* Восстанавливаем ВСЁ, чья графика попадает в стёртую полосу, а не только
|
||||
* два тайла ряда −1 (BUG-LOOSE-3). Куски тайла рисуются ВВЕРХ от своей
|
||||
* нижней грани и свисают ВПРАВО, поэтому в полосу над тайлом col лезут:
|
||||
* • ряд −1, колонки col−1..col+1 — сама полоса кладки у потолка;
|
||||
* • ряд 0, колонки col−1..col+1 — их верхушки заходят в те же 8 px.
|
||||
* Раньше перерисовывались только (−1,col) и (−1,col+1), и в полосе
|
||||
* оставался чёрный прямоугольник ~13×3 px (замер: экранные y 47..52 при
|
||||
* полосе 44..52), который heal возвращал каждый кадр. Признак, что дело
|
||||
* именно в запечке: после выхода из комнаты и возврата бара нет. */
|
||||
{
|
||||
int c0 = (col > 0) ? col - 1 : 0;
|
||||
int c1 = (col + 1 < 9) ? col + 1 : 9;
|
||||
int c;
|
||||
for (c = c0; c <= c1; c++) draw_tile(-1, c);
|
||||
for (c = c0; c <= c1; c++) draw_tile(0, c);
|
||||
}
|
||||
bake_rest = 0;
|
||||
g_clip_top = 0;
|
||||
gfx_set_bank(GFX_BANK_NORMAL);
|
||||
|
||||
Reference in New Issue
Block a user