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:
@@ -382,6 +382,29 @@ MAME по кромкам.
|
||||
которые БЫЛИ нашими багами и исправлены: вис/подтягивание на кромке плиты и
|
||||
падение вместе с плитой — там плита обязана быть поверх Кида.
|
||||
|
||||
- **Ноги стоящего Кида поверх головы лежащего трупа стража.** Комната 21:
|
||||
страж убит, комната покинута и открыта заново (у трупа своя запомненная X),
|
||||
Кид СТОИТ на одну колонку правее тела — его ноги рисуются поверх головы.
|
||||
Проверено в SDLPoP (2026-08-03): там ровно то же.
|
||||
|
||||
Корень — устройство движка, а не наш порт. `set_objtile_at_char`
|
||||
(seg006:13F3) приписывает персонажа РОВНО ОДНОМУ тайлу, и ширина спрайта на
|
||||
выбор тайла не влияет никак; дальше `redraw_needed_tiles` (seg008:1B06)
|
||||
обходит тайлы рядами 2,1,0 и колонками 0..9, и кто позже — тот поверх.
|
||||
Стоящий Кид укладывается примерно в колонку, поэтому у него это незаметно, а
|
||||
лежащий труп занимает две-три колонки, но «принадлежит» левой. Всё, что
|
||||
стоит правее, перекрывает выступающую часть тела. Механизма «широкий объект
|
||||
участвует в нескольких тайлах» в оригинале нет — сверено с
|
||||
`draw_objtable_items_at_tile`, `sort_curr_objs` и веткой
|
||||
`tile_object_redraw == 0xFF` (последняя про оверлеи пола, не про персонажей).
|
||||
|
||||
Отличать от того, что БЫЛО нашими багами в этом же месте и исправлено
|
||||
(BUG-DRAWORDER-1): колонка трупа считалась из тайла вместо X, ветка
|
||||
`actions_1_run_jump` не была портирована, окно fore-клипа затиралось стражем.
|
||||
Если когда-нибудь захочется «починить» и это — минимальный вариант — брать
|
||||
тайл по ЦЕНТРУ габарита, а не по левой границе; но это осознанный отход от
|
||||
эталона, и в других позах порядок поменяется в обратную сторону.
|
||||
|
||||
- **Комнаты 13, 18, 24 недостижимы в обычной игре** — свойство ДАННЫХ уровня 1,
|
||||
не наш баг. Обход графа от стартовой комнаты (по `res2001.bin`, links @1952)
|
||||
показывает: у всех трёх ссылки наружу есть, а на них не ссылается никто
|
||||
@@ -623,3 +646,59 @@ dir_56_none`. То есть стражи — такая же часть дан
|
||||
**Проверено в MAME:** комната 21, страж жив (`alive = -1`, hp 3) → убит читом
|
||||
`K` (`alive = 0`, hp 0) → Кид убит стражем → респавн → возврат в комнату 21:
|
||||
страж снова `alive = -1`, hp 3.
|
||||
|
||||
<a id="bug-draworder-1"></a>
|
||||
## BUG-DRAWORDER-1. Кид рисовался поверх тела стража — **ЗАКРЫТ**
|
||||
|
||||
**Симптом.** В оригинале Кид проходит ЗА телом убитого стража; у нас — перед ним.
|
||||
|
||||
**Три разных корня, найденные по очереди.** Стоит того, чтобы перечислить: два
|
||||
первых захода были неполны, и каждый следующий кадр от тестера вскрывал новый
|
||||
слой.
|
||||
|
||||
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` = позже.
|
||||
Фикс: `guard_over_kid()` в `roomtest.c`.
|
||||
|
||||
2. **Своя же регрессия: Кид полез поверх передних столбов.** Окно fore-клипа
|
||||
(`pop_fore_set_clip`) одно на всех, и его ставит каждый, кто рисует
|
||||
персонажа. Пока страж рисовался строго ДО Кида, к моменту
|
||||
`pop_fore_over_kid` в окне оказывался Кид и всё сходилось само. Как только
|
||||
порядок стал переменным, при «страж поверх» окно оставалось СТРАЖЬИМ, и
|
||||
fore-проход Кида отсекался целиком.
|
||||
Фикс: `kid_fore_clip_restore()` — окно восстанавливается явно, а не
|
||||
«по счастливому порядку вызовов».
|
||||
|
||||
3. **Колонка трупа была нулевой.** `leave_guard` сохраняет тайл как
|
||||
`get_tilepos(0, row)`, то есть колонку 0 всегда, а `enter_guard` у нас брал
|
||||
`curr_col` оттуда и следом перетирал X запомненным значением. В памяти это
|
||||
было видно прямо: `col=0` при `x=95`. Оригинал (seg002:180) выводит колонку
|
||||
ИЗ X: `Char.curr_col = get_tile_div_mod_m7(Char.x)`. У живого стража
|
||||
незаметно (X там сама считается из колонки), у запомненного ТРУПА — ломало
|
||||
порядок. Колонка нужна не только отрисовке: на неё смотрят коллизия и
|
||||
`check_can_guard_see_kid`.
|
||||
|
||||
4. **Ветка `actions_1_run_jump` оказалась не «упрощаемой».** Сначала я решил,
|
||||
что её можно не портировать. Кадр в движении показал `ACT=1`: в беге
|
||||
оригинал берёт тайл не из `curr_row`/`curr_col`, а из нижнего ряда и ЛЕВОЙ
|
||||
колонки ГАБАРИТА (`char_bottom_row`/`char_col_left` из `set_char_collision`,
|
||||
seg006:0723). При беге вправо левая колонка меньше `curr_col` примерно на
|
||||
тайл — потому бегущий Кид и уходит за объекты справа. Отсюда «некоторые
|
||||
кадры бега рисовали Кида поверх тела». Считается для ОБОИХ персонажей:
|
||||
`enter_guard` ставит `action = 1` и стражу, односторонний учёт дал бы
|
||||
перекос в другую сторону. Тонкость: `char_col_left` берётся по НЕ
|
||||
утоньшённой границе — поправку THIN оригинал применяет только к `*_coll`.
|
||||
|
||||
**Проверено в MAME:** после возврата в комнату у трупа `col=5` при `x=135`
|
||||
(было `col=0`); Кид слева от тела — и стоя, и в кадре бега — рисуется за телом;
|
||||
передние столбы снова перекрывают Кида.
|
||||
|
||||
**Остаток, который НЕ баг.** Ноги стоящего Кида поверх головы трупа, когда он
|
||||
стоит колонкой правее тела, — врождённое свойство движка (один спрайт = один
|
||||
тайл при спрайте шире колонки). Сверено в SDLPoP: там так же. Подробности — в
|
||||
разделе «НЕ БАГИ» выше.
|
||||
|
||||
Reference in New Issue
Block a user