midtable: разобрано, насколько узко оригинал помечает передний слой
set_redraw_fore (seg007:0550) зовут ровно из трёх мест, и нигде нет пометки «всё»: персонаж помечает прямоугольник своего футпринта (redraw_at_char, seg003:0576; для Кида — объединение с прошлым кадром), падающий кусок — соседа справа и второй тайл на границе рядов (draw_mob, seg007:1147), анимация тайла — один тайл. Значит пометка переднего слоя НЕ ШИРЕ нашего окна вокруг персонажа, и полный порт objtable её не отнимает, а формализует. Главный риск снят. Побочно найден точный рецепт для MOB-CLIP-RIGHT: оригинал не рисует соседа поверх куска и не полагается на clip.right — он помечает соседний тайл парой set_redraw2 + set_redraw_fore, и порядок делает всё сам. Это же закрывает «плиту перед колонной». Рекомендация по итогам: вариант A (полный порт). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -215,13 +215,61 @@ fore-прохода — соотношение 131 к 1.
|
||||
окна вокруг персонажа, мы потеряем 10 % кадра, и потеряем их НА ДВИЖЕНИИ,
|
||||
когда бюджет и так самый напряжённый.
|
||||
|
||||
### 7.2 Что осталось выяснить ДО выбора варианта
|
||||
### 7.2 Насколько узко оригинал помечает передний слой — ВЫЯСНЕНО
|
||||
|
||||
Как оригинал отсекает лишнюю работу переднего слоя: `redraw_frames_fore[tilepos]`
|
||||
рисует передние части ТОЛЬКО у помеченных тайлов (seg008:214). Надо понять,
|
||||
насколько узко эта пометка ставится — если не шире нашего окна, вариант A
|
||||
безопасен по кадру; если шире, остаёмся на B.
|
||||
Пометки `redraw_frames_fore[]` ставит ровно одна функция — `set_redraw_fore`
|
||||
(seg007:0550), и зовут её из трёх мест. Ни в одном нет «пометить всё».
|
||||
|
||||
**Обновлённая рекомендация:** решение упирается в §7.2, и до его разбора
|
||||
выбирать между A и B преждевременно. B остаётся безопасным запасным
|
||||
вариантом.
|
||||
**Персонаж — `redraw_at_char` (seg003:0576).** Помечается ПРЯМОУГОЛЬНИК
|
||||
футпринта:
|
||||
|
||||
```c
|
||||
for (tile_row = x_top_row; tile_row <= char_bottom_row; ++tile_row)
|
||||
for (tile_col = x_col_left; tile_col <= x_col_right; ++tile_col)
|
||||
set_redraw_fore(get_tilepos(tile_col, tile_row), 1);
|
||||
```
|
||||
|
||||
с двумя уточнениями: при вынутом мече прямоугольник расширяется на колонку в
|
||||
сторону клинка, а для КИДА берётся объединение с футпринтом ПРОШЛОГО кадра
|
||||
(`prev_char_*`) — чтобы освободившиеся тайлы тоже вернули свои передние
|
||||
части.
|
||||
|
||||
**Падающий кусок — `draw_mob` (seg007:~1147).** Каждый кадр помечается
|
||||
СОСЕД СПРАВА (`++tile_col`), и второй тайл, если кусок висит на границе
|
||||
рядов:
|
||||
|
||||
```c
|
||||
++tile_col;
|
||||
tilepos = get_tilepos(tile_col, tile_row);
|
||||
set_redraw2(tilepos, 1);
|
||||
set_redraw_fore(tilepos, 1);
|
||||
top_row = y_to_row_mod4(ypos - 18);
|
||||
if (top_row != tile_row) { ... то же для top_row ... }
|
||||
add_mob_to_objtable(ypos);
|
||||
```
|
||||
|
||||
**Анимация тайла — `draw_trob` (seg007:01E6):** один тайл.
|
||||
|
||||
**Вывод: пометка переднего слоя в оригинале НЕ ШИРЕ нашего окна.** Она
|
||||
пообъектная — футпринт персонажа и 1-2 тайла на кусок. Значит полный порт
|
||||
objtable **не отнимает** нашу оптимизацию fore-окна, а формализует её:
|
||||
вместо «окно вокруг персонажа» будет «тайлы, помеченные объектами», что
|
||||
как минимум не шире, а для одиночного куска заметно уже.
|
||||
|
||||
Риск, вокруг которого крутилась вся оценка, снят.
|
||||
|
||||
### 7.3 Побочный результат: готовый рецепт для MOB-CLIP-RIGHT
|
||||
|
||||
`draw_mob` даёт точный ответ на вопрос, как оригинал прячет правую часть
|
||||
куска за соседним полом: он НЕ рисует сосед поверх куска (наша подпорка) и
|
||||
НЕ полагается только на `clip.right`. Он помечает соседний тайл СРАЗУ
|
||||
двумя пометками — `set_redraw2` (фон) и `set_redraw_fore` (передний слой).
|
||||
Дальше порядок делает всё сам: фон соседа рисуется ДО куска, его передние
|
||||
части — ПОСЛЕ.
|
||||
|
||||
Это же закрывает и «плиту перед колонной»: передние части соседнего тайла
|
||||
(колонна) ложатся поверх куска, потому что тайл помечен.
|
||||
|
||||
**Рекомендация после разбора: вариант A (полный порт).** Оба возражения
|
||||
против него сняты замерами и этим разбором — сортировка внутри тайла
|
||||
бесплатна (максимум 2 объекта), окно переднего слоя не теряется.
|
||||
|
||||
Reference in New Issue
Block a user