diff --git a/applications/PoP/docs/impl_diff.md b/applications/PoP/docs/impl_diff.md index 2228031..0763856 100644 --- a/applications/PoP/docs/impl_diff.md +++ b/applications/PoP/docs/impl_diff.md @@ -439,3 +439,44 @@ BUG-CHEAT-FIGHT-1 (выход из боя), и лечится там же. **Что проверять при регрессе.** Уровень 13: `K` на Джафаре → белая вспышка, уход ВЛЕВО открывает дверь уровня. Честная победа в бою даёт то же самое. + +--- + +## Страж, вытесненный за правый край комнаты и там убитый, не виден нигде + +**Не расхождение, а особенность оригинала.** Записано, чтобы вопрос не +возникал повторно (спросил пользователь 2026-08-19: бой шёл в комнате 15, +Кид вытеснил стража вправо — из-за края торчал только меч, — убил его, и +труп не появился ни в комнате 15, ни в соседней справа). + +**Почему так.** Три механизма складываются: + +1. **комнату страж не менял.** Его физика работает только в полосе + `x ∈ [44, 211)` (`seg000:1254`, у нас то же условие в + `pop_guard_phys_tick`), поэтому своим ходом за край он не уходит — + Кид вытолкнул его туда толчком, а `Guard.room` остался прежним; +2. **мёртвый за Кидом не идёт.** Единственный способ сменить комнату — + `follow_guard` при переходе Кида, и первое же условие там + (`seg002:0346`) — `Guard.alive < 0 && Guard.sword == sword_2_drawn`, + то есть ЖИВОЙ и с вынутым мечом. Мёртвый уходит веткой `leave_guard`, + которая сохраняет его в **`Guard.room`** — в старую комнату. У нас + ровно это же условие, `pop_guard_cold.c` (`pop_guard_follow`); +3. **из соседней комнаты страж не рисуется.** Оригинал при + `Guard.room != drawn_room` просто ГАСИТ слот (`seg000:422`: + `Guard.direction = dir_56_none`). Механизм «видно из-за шва» + (`xpos_in_drawn_room`) работает для коллизий и для Кида, но стража из + чужой комнаты на экран не выводит. + +Итог: труп приписан комнате, где страж стоял, а его `guards_x` — за +правым краем. При возврате в ту комнату он честно восстанавливается там +же, то есть за пределами видимого поля; в соседней комнате его нет, +потому что в её данных стража и не было. + +**Живой страж в этой ситуации ведёт себя иначе** — при уходе Кида вправо +он идёт следом, если стоит достаточно близко к краю (`Guard.x >= 165`). +Это портировано и работает. + +**Чего я НЕ проверял:** живьём в SDLPoP этот сценарий не воспроизводил — +вывод сделан чтением трёх мест кода. Если понадобится подтверждение, +сценарий короткий: любой бой у правого края комнаты, вытеснить стража за +край и добить.