Дворцовый портал: Кид скрывался за кромкой раньше времени
Уровень 4: в анимации ухода на следующий уровень контур Кида обрезался не
правой гранью портала, а раньше — брался клип подземного проёма, а
дворцовый шире.
draw_leveldoor считал кромку как xh*8 + 48, без дворцовой поправки. В
оригинале строкой ниже стоит (seg008:1429):
if (custom->tbl_level_type[current_level]) leveldoor_right += 8;
Значение читает clip_char как правую границу клипа персонажа — отсюда
ранняя обрезка. Расхождение было осознанным и отложенным: в коде стоял
комментарий «+8 у palace-уровней — на уровне 1 не применяется», дворцовых
уровней тогда в порту не было. tbl_level_type[4] = 1, там и проявилось.
pop_palace выставляет pop_bg_load из того же tbl_level_type, что читает
оригинал, так что эквивалент дословный.
Попутно найдено и НЕ починено (заведено отдельным багом
LEVELDOOR-STARTROOM-WIPE): в той же функции оригинал в СТАРТОВОЙ комнате
кладёт затирающий прямоугольник вместо лестницы, со своей дворцовой/
подземной разницей 48/39 и сдвигом 2 px, а мы рисуем марш 144 безусловно.
Видно только при приподнятой створке входной двери, поэтому на обходах
уровней 1-4 не попалось.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -812,3 +812,54 @@ seg008:1572).
|
||||
Правка: позвать `on_guard_killed()` в ветке «не скелет». Мешает только то,
|
||||
что функция сейчас `static` в `guards.c` (банк 1), а `pop_guard_fallout`
|
||||
живёт в резиденте.
|
||||
|
||||
---
|
||||
|
||||
<a id="leveldoor-startroom-wipe"></a>
|
||||
## LEVELDOOR-STARTROOM-WIPE. В стартовой комнате за входной дверью рисуется лестница вместо черноты
|
||||
|
||||
**Найдено разбором 2026-08-17** (попутно к фиксу
|
||||
[LEVELDOOR-PALACE-CLIP](BUGS_CLOSED.md#leveldoor-palace-clip) — то же
|
||||
`draw_leveldoor`).
|
||||
|
||||
`draw_leveldoor` (seg008:1D29) в приподнятой створке различает две комнаты:
|
||||
|
||||
```c
|
||||
if (modifier_left) {
|
||||
if (level.start_room != drawn_room) {
|
||||
add_backtable(..., 144 /*level door stairs*/, ...);
|
||||
} else {
|
||||
short leveldoor_width = (tbl_level_type[current_level] == 0) ? 39 : 48;
|
||||
sbyte x_low = (tbl_level_type[current_level] == 0) ? 2 : 0;
|
||||
add_wipetable(0, 8*(draw_xh + 1) + x_low, ybottom - 4, 45, leveldoor_width, 0);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Смысл: за дверью, **через которую вошли на уровень**, лестницы нет — там
|
||||
чернота, и оригинал её ЗАТИРАЕТ прямоугольником, а не рисует марш 144.
|
||||
Ширина затирки дворцовая/подземная (48 против 39) и подземная сдвинута на
|
||||
2 px вправо — то есть здесь ЕЩЁ одно расхождение подземелья и дворца, помимо
|
||||
уже починенного `leveldoor_right += 8`.
|
||||
|
||||
У нас (`pop_room.c`, `draw_leveldoor`) стоит безусловно:
|
||||
|
||||
```c
|
||||
if (modif)
|
||||
pop_env_b(144, x, ybottom - 4); /* лестница (комната ≠ стартовой) */
|
||||
```
|
||||
|
||||
— условие названо в комментарии, но не реализовано. Различие стартовой
|
||||
комнаты у нас есть только в логике входа (`pop_leveldoor_enter`,
|
||||
`pop_map.c:1166`), не в отрисовке.
|
||||
|
||||
**Когда видно:** только пока створка входной двери приподнята
|
||||
(`modif != 0`) в стартовой комнате — то есть в анимации входа на уровень и
|
||||
если дверь снова открыть. При закрытой двери `modif == 0`, и обе ветки
|
||||
ничего не рисуют, поэтому баг и не попался на обходах уровней 1-4.
|
||||
|
||||
**Что мешает сделать прямо:** у нас нет понятия wipetable — нужен чёрный
|
||||
прямоугольник в проходе backtable, то есть либо прямой `gfx`-fill в
|
||||
`draw_leveldoor`, либо запечка. Проверять на уровне 1 (подземелье, ширина
|
||||
39, сдвиг 2) И на уровне 4 (дворец, 48, сдвиг 0) — иначе поймаем только
|
||||
половину.
|
||||
|
||||
Reference in New Issue
Block a user