КОД НЕ МЕНЯЛСЯ. Построчный разбор наших реализаций против оригинала:
26 позиций за пять проходов, каждая с рангом вероятности (А..Д), с
описанием «чем грозит» и сценарием проверки.
Расхождения группируются в три узла, и это главный вывод аудита:
1. СМЕРТЬ ПРИ АКТИВНОЙ ФИЗИКЕ — здесь все находки ранга А. У нас смерть
это флаг, а физика продолжает вести персонажа как живого: нет ветки
«убит и сброшен с уступа» (оригинал выбирает её по тайлу позади),
прижатие к полу в hurt_by_sword стало безусловным (в оригинале только
для выжившего удара), в land лишний пересчёт колонки. Этим
объясняется наблюдение пользователя: заколотый на краю Кид доезжает
этажом ниже и садится в присед.
2. ГРАНИЦЫ МОДУЛЕЙ — pop_map не отдаёт наружу тайловые запросы от
произвольного Char, wall_type и загрузку кадра. Три ветки упрощены НЕ
по логике, а по доступности функций: отсутствующая ветка уступа,
«стена впереди» сужена у стражей до одного тайла (оригинал считает
преградой ещё ворота, верх двери, зеркало и чомпер), in_wall не
перезагружает кадр. Чинить это заплатками неправильно — сначала
расширять интерфейс pop_map.
3. МОМЕНТ ПОБОЧНЫХ ДЕЙСТВИЙ — делаем то же самое, но раньше или позже:
сброс fall_x, побудка чомперов (у нас отложена до конца play_seq),
звук удара, перезагрузка кадра. По отдельности мелочь, вместе — сдвиг
состояния на кадр.
Восемь позиций СВЕРЕНЫ И СОВПАДАЮТ (диспетчер control, все 15 опкодов
seqtbl, control_with_sword, parry, swordfight, sword_strike,
check_sword_hurt, check_hurting, bumped_fall, таблицы кадров) — их не
нужно перепроверять. Дважды по ходу работы едва не записана ложная
находка из-за чтения отфильтрованного вывода; отсюда правило: фиксировать
расхождение только после чтения обеих реализаций целиком.
Отдельно: второе наблюдение пользователя (падение частично в стене) —
у SDLPoP есть ТРИ опциональных фикса ровно про это, то есть в ванили баг
присутствует, и мы его намеренно повторяем. Но найдены два места, где мы
можем быть хуже ванили (гард curr_row<=2 в do_fall и in_wall выше).
Незакрытое перечислено в файле: тела autocontrol_*, check_grab,
check_bumped_look_left, старшие биты байта клинка. Также отмечено, что
ни одно найденное осознанное отличие не занесено в docs/impl_diff.md,
хотя правило проекта этого требует.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011MsUsEFAQfsjjQpJ7RtKVY