docs: BUG-DRAWORDER-1 закрыт; остаток «ноги поверх головы» — в НЕ БАГИ

Сверено в SDLPoP: Кид, стоящий колонкой правее лежащего трупа, и там
рисуется поверх его головы.  Значит порт верен, а артефакт врождённый:
set_objtile_at_char приписывает персонажа РОВНО ОДНОМУ тайлу, ширина
спрайта на выбор тайла не влияет, и всё, что стоит правее, перекрывает
выступающую часть тела.  Механизма «широкий объект в нескольких тайлах» в
оригинале нет — сверено с draw_objtable_items_at_tile, sort_curr_objs и
веткой tile_object_redraw == 0xFF (та про оверлеи пола).

Закрытая запись перечисляет все четыре корня, которые пришлось снять по
очереди: порядок по роли вместо тайла; своя регрессия с общим окном
fore-клипа; колонка трупа из тайла вместо X; непортированная ветка
actions_1_run_jump.  Записано и то, как отличать остаток от этих багов,
и цена «починки» остатка (тайл по центру габарита = отход от эталона).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Александр Петров
2026-08-03 23:02:02 +03:00
parent 61d4255091
commit a89b8b30c6
2 changed files with 84 additions and 37 deletions
+5 -37
View File
@@ -17,14 +17,14 @@ BUG-DEATH-1 (смерть от меча), BUG-GATE-ANIM-1 (анимация во
(см. ниже); из первой волны открытым остался косметический BUG-SEAM-DRAW-1.
Ревизия **2026-08-03, вечер** (вторая волна с прогона): четыре наблюдения →
BUG-KBD-4 (фантомный отжим Shift) и BUG-RESPAWN-2 (стражи не оживают)
**закрыты и проверены в MAME**; BUG-DRAWORDER-1 (Кид поверх тела стража) и
BUG-LOOSE-2 (осколки только от одной из двух плит) — **исправлены по SDLPoP,
но их сценарии автоматикой не воспроизведены** (см. таблицу ниже).
BUG-KBD-4 (фантомный отжим Shift), BUG-RESPAWN-2 (стражи не оживают) и
BUG-DRAWORDER-1 (Кид поверх тела стража) **закрыты**; у последнего остался
артефакт «ноги поверх головы», сверенный с SDLPoP и записанный в «НЕ БАГИ».
BUG-LOOSE-2 (осколки только от одной из двух плит) — **исправлен по SDLPoP, но
гонка автоматикой не воспроизведена** (см. таблицу ниже).
| ID | что | тип | статус |
|----|-----|-----|--------|
| [BUG-DRAWORDER-1](#bug-draworder-1) | Кид рисуется поверх тела стража (в оригинале — за телом) | Minor | фикс есть, **сценарий не проверен** |
| [BUG-LOOSE-2](#bug-loose-2) | осколки только от одной из двух падающих плит (комната 12) | Minor | фикс есть, **гонка не воспроизведена** |
| [BUG-SEAM-DRAW-1](#bug-seam-draw-1) | у решётки на шве экран переключается, а Кид в шве НЕ рисуется | Minor | открыт |
| [T-1](#t-1) | пики перерисовываются безусловно | оптимизация | открыт |
@@ -64,7 +64,6 @@ BUG-LOOSE-2 (осколки только от одной из двух плит)
| # | что проверить | ожидаемо |
|---|---------------|----------|
| 13 | **[BUG-DRAWORDER-1]** убить стража там, где через тело можно пройти С ЛЕВОЙ стороны (не у самой кромки), и провести Кида сквозь тело | Кид проходит ЗА телом, когда его тайл в обходе РАНЬШЕ (левее по колонке или ниже по ряду), и поверх — когда позже |
| 14 | **[BUG-LOOSE-2]** комната 12: разбежаться по плитам (0,1)/(0,2) и уйти в 15 ДО того, как долетит вторая; вернуться | осколки на ОБОИХ — (1,1) и (1,2) |
| 15 | то же в комнате 7 (плиты 0,5/0,6 → 2,5/2,6) | не сломалось: по-прежнему двое осколков |
| 16 | плита, улетевшая из комнаты вниз, при возврате | лишнего щебня не появилось |
@@ -80,37 +79,6 @@ BUG-LOOSE-2 (осколки только от одной из двух плит)
# Открытые баги уровня 1
<a id="bug-draworder-1"></a>
## BUG-DRAWORDER-1. Кид рисуется поверх тела стража
**Симптом.** В оригинале Кид проходит ЗА телом убитого стража; у нас — перед
ним.
**Корень.** Мы рисовали безусловно `pop_guard_draw()``kid_draw()`, то есть
Кид всегда сверху. В оригинале «кто поверх» никем не назначается: и Кид, и
страж кладутся в midtable при обработке СВОЕГО тайла
(`set_objtile_at_char`, seg006:13F3), а тайлы обходятся строго —
`redraw_needed_tiles` (seg008:1B06) идёт рядами 2,1,0 и внутри ряда
колонками 0..9. Нарисованный позже оказывается сверху. Если тайлы совпали,
решает `sort_curr_objs` (seg008:203C): у обычных объектов (не тень, не плита)
ниже по `obj_y` — значит позже.
**Фикс** (`roomtest.c`): `guard_over_kid()` считает ключ обхода
`(2 - row) * 10 + col` для обоих персонажей (с поправкой
`set_objtile_at_char` на лазание/полёт/вис — колонка левее), сравнивает, при
равенстве сравнивает `obj_y`, и порядок вызова `pop_guard_draw`/`kid_draw`
выбирается по результату.
**Известное упрощение.** Ветку `actions_1_run_jump` (там оригинал берёт
нижний ряд и левую колонку ГАБАРИТА, а не `curr_row`/`curr_col`) не
воспроизводим: она требует полного футпринта, а влияет только когда
прыгающий Кид делит тайл со стражем — там порядок всё равно разводит `obj_y`.
**Не проверено.** Сценарий не воспроизведён: в комнате 21 страж падает у
самой левой кромки (col 0), слева от тела встать нельзя, а «Кид поверх» при
Кид.col=1 > страж.col=0 — это как раз ПРАВИЛЬНЫЙ порядок и бага не
показывает. Нужен ручной прогон, п.13 таблицы выше.
<a id="bug-loose-2"></a>
## BUG-LOOSE-2. Осколки только от одной из двух падающих плит