From 40e43921385740b6e2cb502f1cb5e3d8347dc2d7 Mon Sep 17 00:00:00 2001 From: Valentin Popov Date: Thu, 22 Oct 2026 13:55:31 +0400 Subject: feat(runtime): project merged Control device tables --- docs/appendices/knowledge-boundaries.md | 38 ++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 10 deletions(-) (limited to 'docs/appendices/knowledge-boundaries.md') diff --git a/docs/appendices/knowledge-boundaries.md b/docs/appendices/knowledge-boundaries.md index 5791836..27cf74a 100644 --- a/docs/appendices/knowledge-boundaries.md +++ b/docs/appendices/knowledge-boundaries.md @@ -253,12 +253,26 @@ solver. То же относится к редким MSH auxiliary streams и ч разрешается в индекс устройства и сдвигает локальный индекс только когда parent ID не равен `-1` и IID `0x202` доступен; иначе используется raw локальный индекс. В этом потоке нулевой raw kind пропускает узел вместе с потомками, поэтому общий -assigned ID нельзя получать из preorder-позиции записи. Это закрывает только -передачу полей в native loader-е; Rust ещё должен строить такую же проекцию. - -Control loader также различает добавление устройств и применение одной записи -к уже выбранному устройству. Для tag `19` найденные поля и ветви описаны в -главе, но эффективное слияние пока не реализовано. В Rust parser-е +assigned ID нельзя получать из preorder-позиции записи. Полная загрузка миссии +в FParkan строит упорядоченную базовую проекцию таблицы +Control для объектов с Unit DAT: корневые записи добавляются, `EXTO` добавляет +строки с ключами глобальной MSH-иерархии, а `INTO` обновляет первую строку +выбранного индекса либо добавляет список при sentinel `-1`. Проверка полной +загрузки на оригинальном `min_l_n1.dat` получает 11 строк: 10 корневых записей, +четыре замены `INTO` и одну добавленную строку дочернего `EXTO`. Ветви C4/C8 и +добавление `EXTO` подтверждены машинными инструкциями оригинальных модулей, но +полный результат FParkan не сравнивался с таблицей из запущенной игры. Тест на +искусственном дереве также проверяет ID после пропущенного поддерева с raw kind +`0`. Проекция хранит общие поля и происхождение записей; она не исполняет все +обработчики Control. + +Control различает добавление устройства и применение одной записи к уже +выбранному устройству. Исполнение оригинальной 32-битной DLL на искусственных +данных подтверждает общую ветвь переопределения для получателей tags `9`, `15`, +`19` и `25`: остаются прежними слот, ключ, ID компонента, множитель и класс, +а коэффициенты копируются из новой записи. Искусственный tag `9`-объект создан +без FX-хоста (`+0x3c == 0`), а запись не содержит строк таблицы map; поэтому +работа FX-хоста здесь не проверялась. В Rust parser-е `Unsupported { typed_record_index: Some(_) }` означает, что разбор остановился внутри списка typed records; без индекса остановки unsupported может относиться к effect-tail после уже разобранного списка. Эти случаи нужно различать. @@ -269,10 +283,14 @@ Control loader также различает добавление устройс трактоваться как пустой список. Глобальные Control selectors `1/2` и setter selector `1` по tag `19` описаны -там же только по статическому разбору `Control.dll`; execution oracle для этих -глобальных вызовов нет. Остаются открытыми проверка effective merge на живых -объектах, полный охват registry types и host factory paths, а также runtime -жизненный цикл множителя `+0x4c`. +там же только по статическому разбору `Control.dll`; их вызовы отдельно не +исполнялись. Проекция полного mission load недоступна для неполного списка +typed records, Control resource у non-geometric prototype и некоторых +неразрешённых EXTO node mappings; preview и объекты без Unit DAT root её не +строят. Её соответствие полной загрузке игры для всех типов компонентов и +factory paths ещё не установлено. Не восстановлен и жизненный цикл множителя +`+0x4c` после конструктора и переопределения; также неизвестно, когда эти +объекты создаются при отложенной загрузке. Для `Control.dll` (SHA-256 `bcb86318089028548a178b03a21accdce15df0cc85ddd91674cf3c2f55012c6e`) tag-26 -- cgit v1.2.3