From c31930dcada598f409762fc304528ca31dbecd7a Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Thu, 13 Aug 2026 20:10:55 +0300 Subject: [PATCH] =?UTF-8?q?midtable:=20=D1=80=D0=B0=D0=B7=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=BE,=20=D0=BD=D0=B0=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=BA=D0=BE=20=D1=83=D0=B7=D0=BA=D0=BE=20=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=B3=D0=B8=D0=BD=D0=B0=D0=BB=20=D0=BF=D0=BE=D0=BC?= =?UTF-8?q?=D0=B5=D1=87=D0=B0=D0=B5=D1=82=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4?= =?UTF-8?q?=D0=BD=D0=B8=D0=B9=20=D1=81=D0=BB=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- applications/PoP/docs/midtable_analysis.md | 64 +++++++++++++++++++--- 1 file changed, 56 insertions(+), 8 deletions(-) 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 объекта), окно переднего слоя не теряется.