Дворцовый портал: Кид скрывался за кромкой раньше времени
Уровень 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:
@@ -2740,3 +2740,48 @@ if (Char.sword != SWORD_2_DRAWN) {
|
||||
`Kid`: `ldir` копирует байт кадра (0) раньше байта меча (12), поэтому по
|
||||
`Kid` ловушка слепа ровно в тот тик, когда меч теряется, и ложно срабатывает
|
||||
на каждом законном доставании.
|
||||
|
||||
---
|
||||
|
||||
<a id="leveldoor-palace-clip"></a>
|
||||
## LEVELDOOR-PALACE-CLIP. Кид скрывался за кромкой дворцового портала раньше времени — ЗАКРЫТ 2026-08-17
|
||||
|
||||
**Наблюдение (пользователь, уровень 4, обход после оптимизации фаз).**
|
||||
Порталы, через которые Кид входит на уровень и уходит на следующий, в
|
||||
подземелье и во дворце РАЗНОЙ ширины — дворцовый шире. В анимации ухода с
|
||||
уровня 4 на 5-й Кид убегает по лестнице, и его контур обрезается не правой
|
||||
гранью портала, а раньше, «как будто он прячется проходом». Диагноз
|
||||
пользователя сразу верный: взята ширина подземного портала.
|
||||
|
||||
**Корень.** `draw_leveldoor` (`pop_room.c`, порт seg008:1D29) считал правую
|
||||
кромку проёма без дворцовой поправки:
|
||||
|
||||
```c
|
||||
pop_leveldoor_right = xh * 8 + 48;
|
||||
```
|
||||
|
||||
В оригинале строкой ниже стоит (seg008:1429):
|
||||
|
||||
```c
|
||||
leveldoor_right = (draw_xh<<3)+48;
|
||||
if (custom->tbl_level_type[current_level]) leveldoor_right += 8;
|
||||
```
|
||||
|
||||
Это значение читает `clip_char` (у нас `pop_map.c:2668`) как правую границу
|
||||
клипа персонажа — отсюда ранняя обрезка.
|
||||
|
||||
Расхождение было **осознанным и отложенным**: в коде стоял комментарий
|
||||
«+8 у palace-уровней (tbl_level_type) — на уровне 1 не применяется». На
|
||||
момент написания дворцовых уровней в порту не было, и условие не дописали.
|
||||
`tbl_level_type[4] = 1` (`pop_level_cold.c:52`), то есть уровень 4 —
|
||||
дворцовый, и на нём это наконец проявилось.
|
||||
|
||||
**Фикс.** `if (pop_palace) pop_leveldoor_right += 8;` Флаг `pop_palace`
|
||||
выставляет `pop_bg_load(set)` из того же `tbl_level_type`, который читает
|
||||
оригинал, так что эквивалент дословный и рассинхронизироваться не может.
|
||||
|
||||
**Найдено попутно, НЕ починено:**
|
||||
[LEVELDOOR-STARTROOM-WIPE](BUGS_OPEN.md#leveldoor-startroom-wipe) — в той же
|
||||
функции оригинал в СТАРТОВОЙ комнате кладёт затирающий прямоугольник вместо
|
||||
лестницы (и там своя дворцовая/подземная разница 48/39 и сдвиг 2 px), а мы
|
||||
рисуем марш 144 безусловно. Заведено отдельным багом.
|
||||
|
||||
Reference in New Issue
Block a user