Files
Sprinter-SDCC/applications
snark13 3a0e847353 SprPoP: аудит расхождений с SDLPoP — Кид, стражи, seqtbl, отрисовка
КОД НЕ МЕНЯЛСЯ.  Построчный разбор наших реализаций против оригинала:
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
2026-08-31 18:25:02 +03:00
..