CLIP-1: heal Кида и стража — линейным ядром, когда клип не нужен
kid_heal/pop_guard_heal звали gfx_heal всегда, хотя рисуют ровно тот прямоугольник, который блит в большинстве кадров кладёт noclip-ядром. Все три места heal (+ heal_off фона) сведены к общему pop_heal_fast. Замер в MAME, счётчики totalcycles на входах kid_heal и kid_tick (вся группа heal за кадр), комната 1, Кид стоит: клипающее ядро 26 200 тактов/кадр (149 кадров) noclip 15 848 тактов/кадр (239 кадров) −10 352 такта, −39.5 %. A/B в одном прогоне: вторая половина снята с пропатченным в памяти условием (jr nz → jr), то есть на той же геометрии. Размер СУММАРНО −362 Б: _CODE +17, BANK2 −116 (свободно 2708 — это тесный банк из рисков levels_plan §5), BANK3 −263, BANK4 без изменений. Грабли по дороге: первым заходом хелпер был static inline в pop_bg.h — SDCC 4.5 И встраивает тело (181 Б) в каждый вызов, И оставляет копию в каждом TU, который видит заголовок. pop_guard_heal раздулся с ~60 до 663 Б, итого +1091 Б в _CODE и +636 Б в банке стража. Отсюда pop_draw.c: обычная функция в резиденте W1, из банков это прямой call без трамплина. pop_room_clip_borders оставлен клипающим осознанно (320 не лезет в 8 бит, гейт border_dirty редкий) — причина записана в коде. Проверено визуально: ходьба, прыжок, спуск, позиция за решёткой шва (straddle — там работает клипающий фолбэк) — артефактов нет. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -84,6 +84,72 @@ BUG-3 — дубль пункта «спуск с кнопки (room8, кром
|
||||
|
||||
---
|
||||
|
||||
## Косметика окклюзии — закрыта кодом, список отставал (сверено 2026-08-01)
|
||||
|
||||
Четыре записи от 2026-07-22 висели как открытые Medium. Каждая описывала
|
||||
недостающий кусок порта; каждый из них с тех пор написан, но записи никто не
|
||||
снял. Ниже — что именно закрывает каждую.
|
||||
|
||||
### BUG-CEIL-1. Прыжок вверх: руки Kid рисуются ПОВЕРХ потолка — **ЗАКРЫТ**
|
||||
|
||||
**Был симптом:** при прыжке вверх (SEQ up, кадры 67..79) руки/голова Kid
|
||||
заходили в полосу кладки у потолка (row −1) и рисовались ПОВЕРХ неё.
|
||||
|
||||
**Чем закрыт:** `ceil_over_kid_tile()` (`pop_bg.c:1275`) — порт «нижняя грань
|
||||
потолка и кадр плиты-потолка идут в FOREtable», т.е. поверх персонажа.
|
||||
Зовётся из `pop_fore_over_kid` (`pop_bg.c:1575`) и из fore-прохода стража
|
||||
(`:1607`). Комментарий на месте прямо называет причину: «иначе руки
|
||||
прыгающего Kid лезут на кромку потолка».
|
||||
|
||||
### BUG-CEIL-2. Тряска/разбитие loose-плиты в потолке (row −1) — **ЗАКРЫТ**
|
||||
|
||||
**Был симптом:** loose-плита в ряду 2 верхнего соседа (room5 (2,5) → потолок
|
||||
room6 над (0,5)) при прыжках Kid на (0,5) не тряслась и не разбивалась —
|
||||
loose-состояние соседней комнаты не тянулось.
|
||||
|
||||
**Чем закрыт:** отдельное состояние плиты-потолка `pop_ceil_modif[10]`
|
||||
(`pop_bg.c:547`, ведёт `pop_map`) + пара `pop_ceil_shake_draw()` /
|
||||
`pop_ceil_bake_empty()` (`pop_bg.c:815,827`): дрожание рисуется на текущей
|
||||
странице поверх фона, а провал «запекается» в ОЗУ-копию, чтобы heal его
|
||||
сохранял. В полосе у потолка виден только НИЗ плиты (`draw_tile_aboveroom`),
|
||||
всё выше режется клипом `POP_YOFF` — как в оригинале.
|
||||
|
||||
Из этого следует, что и запись «требует персистентного per-room modifier
|
||||
соседей, это Фаза P0 gates_spikes_plan» больше не верна: понадобился не общий
|
||||
механизм, а один массив на 10 байт под конкретный случай.
|
||||
|
||||
### BUG-CEIL-3. Анимация ворот стирает потолок над ними — **ЗАКРЫТ**
|
||||
|
||||
**Был симптом:** при анимации решётки шва полоса кладки у потолка НАД
|
||||
воротами пропадала — чёрный `bar` по col0 стирал ряд −1, а redraw его не
|
||||
восстанавливал.
|
||||
|
||||
**Чем закрыт:** `pop_room_redraw_seam_left()` (`pop_bg.c:793`) больше не
|
||||
трогает полосу потолка — `bar` идёт с `POP_YOFF + 3`, а не с `POP_YOFF`:
|
||||
низ полосы кладки на room-space y=2, бары ворот начинаются с y=3
|
||||
(`gate_top_y = dby − 62`). Приятный побочный эффект: отпала необходимость
|
||||
перерисовывать `draw_tile(-1,0)` на КАЖДОМ кадре анимации решётки — то есть
|
||||
фикс не только косметический, но и вдвое дешевле прежнего.
|
||||
|
||||
### BUG-OCCL-1. Тень дальней колонны перекрывает Kid — **ЗАКРЫТ**
|
||||
|
||||
**Был симптом:** Kid у (0,4)-(0,5) частично перекрыт тёмной штриховкой —
|
||||
боковой гранью ДАЛЬНЕЙ колонны, которая окклюдить персонажа не должна
|
||||
(over-occlusion fore-слоя, рисовавшего fore футпринт-тайлов без учёта
|
||||
глубины).
|
||||
|
||||
**Чем закрыт:** разделение слоёв по признаку из оригинала, а не по нашим
|
||||
соображениям о глубине (`overlay_mid_tile`, `pop_bg.c:1367`). Ключ,
|
||||
подтверждённый трассой оригинала: `draw_tile_right`, `draw_tile_anim_right` и
|
||||
`draw_loose` кладут спрайты через `add_backtable` НАПРЯМУЮ, минуя
|
||||
`ptr_add_table` — значит правая грань левого соседа («шахматка» столба 93,
|
||||
blueline, грани пик/loose соседа, кадр loose) **всегда** рисуется ПОД
|
||||
персонажем. Через `ptr_add_table` (→ midtable при `draw_other_overlay`) идут
|
||||
только «floor B» 42 при левом соседе-поле, `draw_tile_base`,
|
||||
`draw_tile_anim` (свои пики) и `draw_tile_bottom`.
|
||||
|
||||
---
|
||||
|
||||
## BUG-SEAM-PINGPONG (#4). Пинг-понг drawn_room у шва с закрытыми воротами — **РЕШЁН 2026-07-22**
|
||||
|
||||
Настоящий корень найден потиковой трассой ЖИВОГО SDLPoP 1.23
|
||||
|
||||
Reference in New Issue
Block a user