Особенность: убитый за правым краем страж не виден ни в одной комнате
Вопрос пользователя после боя в комнате 15: Кид вытеснил стража вправо (из-за края торчал только меч), убил — труп не появился ни в 15, ни в соседней справа. Это не наш баг, а сложение трёх механизмов оригинала: физика стража работает только в полосе x 44..211, поэтому комнату он не менял; мёртвый за Кидом не идёт (follow_guard требует alive < 0), и leave_guard сохраняет его в прежнюю комнату; а из чужой комнаты страж не рисуется вовсе — при Guard.room != drawn_room оригинал гасит слот (seg000:422). Труп остаётся приписан комнате 15 с guards_x за правым краем: при возврате восстанавливается там же, то есть вне видимого поля. Живьём в SDLPoP сценарий не воспроизводился — вывод из чтения кода, о чём в записи сказано прямо. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -439,3 +439,44 @@ BUG-CHEAT-FIGHT-1 (выход из боя), и лечится там же.
|
|||||||
|
|
||||||
**Что проверять при регрессе.** Уровень 13: `K` на Джафаре → белая вспышка,
|
**Что проверять при регрессе.** Уровень 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 этот сценарий не воспроизводил —
|
||||||
|
вывод сделан чтением трёх мест кода. Если понадобится подтверждение,
|
||||||
|
сценарий короткий: любой бой у правого края комнаты, вытеснить стража за
|
||||||
|
край и добить.
|
||||||
|
|||||||
Reference in New Issue
Block a user