diff --git a/applications/PoP/docs/midtable_analysis.md b/applications/PoP/docs/midtable_analysis.md index 4b0a3f8..635e98d 100644 --- a/applications/PoP/docs/midtable_analysis.md +++ b/applications/PoP/docs/midtable_analysis.md @@ -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 объекта), окно переднего слоя не теряется.