BUG-DOOR-CLIP: обрезка силуэта правым косяком двери уровня
Симптом (нашёл пользователь сразу после L1-EXIT): при подъёме по лестнице за
дверью уровня силуэт Кида вылезал ПРАВЕЕ правого косяка проёма; по высоте
обрезка была корректна.
Причина — недопортированная половина clip_char (seg006:1231). Для кадров
двери оригинал ставит ДВА клипа, у нас был только первый:
obj_clip_top = leveldoor_ybottom + 1; // было
obj_clip_right = leveldoor_right; // не было
Отдельная ловушка: комментарий в SDLPoP говорит «frames 217..228», а КОД
проверяет >= frame_224_exit_stairs_8, то есть 224..228 — портировано по коду.
Fore-слоем это не лечится: створка и косяк уходят в оригинале целиком в
backtable (draw_leveldoor, все add_backtable), рисуются ПОД персонажем и
перекрыть его не могут. Единственный способ — срезать сам спрайт.
libbgi: gfx_blit_cols_part_w(..., uint8_t maxw) — обрезка СПРАВА у
колоночного блита. Для column-major это ровно уменьшение числа колонок, то
есть внутри ядра механизм уже был (так же клипается край экрана,
w = _bgi_maxx + 1 - x), наружу не выводился. Тело блита переехало туда,
gfx_blit_cols_part стал тонкой обёрткой (maxw=0) — тем же приёмом, каким
gfx_blit_cols уже обёрнут вокруг gfx_blit_cols_part. Работает и при flip:
первые maxw нарисованных колонок всегда ложатся в левую часть футпринта.
make size-check: роста нет.
PoP: pop_leveldoor_right / pop_leveldoor_ybottom (порт одноимённых глобалов)
пишет draw_leveldoor в pop_state — их читает clip_char из другого банка;
pop_clip_char_right() отдаёт границу, kid_draw превращает её в maxw и уводит
эти кадры с noclip-пути на общий. Прямоугольник heal (kid_lw) сужается тоже
— стираем ровно нарисованное.
Проверено в MAME: pop_leveldoor_right = 176, что есть ровно (draw_xh<<3)+48
для двери комнаты 9; pop_leveldoor_ybottom = 112 у закрытой створки и 69 у
поднятой — сходится с формулой оригинала. Отрисовку подтвердил пользователь
на живом подъёме.
Заодно: ROOMNAV остаётся включённым осознанно — это наш чит, которого в
оригинале не было, как и S/K/I; позже сведём в общий блок читов.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -150,6 +150,53 @@ blueline, грани пик/loose соседа, кадр loose) **всегда**
|
||||
|
||||
---
|
||||
|
||||
## BUG-DOOR-CLIP. Подъём по лестнице двери уровня: нет обрезки по правому косяку — **ИСПРАВЛЕН 2026-08-01**
|
||||
|
||||
**Был симптом (найден пользователем сразу после L1-EXIT):** при подъёме по
|
||||
лестнице за дверью уровня (кадры 224..228) силуэт Кида вылезал ПРАВЕЕ правого
|
||||
косяка проёма. По высоте обрезка была корректна.
|
||||
|
||||
**Причина — недопортированная половина `clip_char`** (seg006:1231). Для
|
||||
кадров двери оригинал ставит ДВА клипа, у нас был только первый:
|
||||
|
||||
```c
|
||||
if (frame >= frame_224_exit_stairs_8 && frame < 229) {
|
||||
obj_clip_top = leveldoor_ybottom + 1;
|
||||
obj_clip_right = leveldoor_right;
|
||||
}
|
||||
```
|
||||
|
||||
Отдельная ловушка: комментарий в SDLPoP говорит «frames 217..228», а КОД
|
||||
проверяет `>= frame_224_exit_stairs_8`, то есть **224..228**. Портировано по
|
||||
коду.
|
||||
|
||||
**Почему именно обрезка, а не fore-слой:** створка и косяк уходят в оригинале
|
||||
ЦЕЛИКОМ в backtable (`draw_leveldoor`, все `add_backtable`), то есть рисуются
|
||||
ПОД персонажем и перекрыть его не могут. Единственный способ спрятать
|
||||
поднимающегося — срезать сам спрайт.
|
||||
|
||||
**Фикс:**
|
||||
- libbgi: `gfx_blit_cols_part_w(..., uint8_t maxw)` — обрезка СПРАВА у
|
||||
колоночного блита. Для column-major это ровно уменьшение числа колонок,
|
||||
то есть внутри ядра механизм уже был (так же клипается край экрана:
|
||||
`w = _bgi_maxx + 1 - x`), наружу не было выведено. Тело блита переехало
|
||||
туда, `gfx_blit_cols_part` стал тонкой обёрткой (maxw=0) — тем же приёмом,
|
||||
каким `gfx_blit_cols` уже обёрнут вокруг `gfx_blit_cols_part`. Работает и
|
||||
при flip: первые `maxw` нарисованных колонок всегда ложатся в ЛЕВУЮ часть
|
||||
футпринта.
|
||||
- PoP: `pop_leveldoor_right` / `pop_leveldoor_ybottom` (порт одноимённых
|
||||
глобалов) пишет `draw_leveldoor` в `pop_state` — их читает `clip_char` из
|
||||
другого банка; `pop_clip_char_right()` отдаёт границу, `kid_draw`
|
||||
превращает её в `maxw` и уводит эти кадры с noclip-пути на общий.
|
||||
`kid_lw` (прямоугольник heal) тоже сужается — стираем ровно нарисованное.
|
||||
|
||||
**Проверено в MAME:** `pop_leveldoor_right = 176` — ровно
|
||||
`(draw_xh<<3) + 48` для двери комнаты 9; `pop_leveldoor_ybottom` = 112 у
|
||||
закрытой створки и 69 у поднятой (сходится с формулой оригинала).
|
||||
Отрисовка подтверждена пользователем на живом подъёме.
|
||||
|
||||
---
|
||||
|
||||
## BUG-SEAM-PINGPONG (#4). Пинг-понг drawn_room у шва с закрытыми воротами — **РЕШЁН 2026-07-22**
|
||||
|
||||
Настоящий корень найден потиковой трассой ЖИВОГО SDLPoP 1.23
|
||||
|
||||
Reference in New Issue
Block a user