From aa6d4b8537405628d77f0928eb6fb3e3ba9a826b Mon Sep 17 00:00:00 2001 From: Valentin Popov Date: Thu, 29 Oct 2026 22:51:25 +0400 Subject: feat(runtime): project load-time Control profile values --- docs/tomes/06-behavior.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'docs/tomes') diff --git a/docs/tomes/06-behavior.md b/docs/tomes/06-behavior.md index 68a35e6..cd8a0ba 100644 --- a/docs/tomes/06-behavior.md +++ b/docs/tomes/06-behavior.md @@ -717,6 +717,34 @@ Rust full-loader теста на оригинальных ресурсах. Ве `None`, без дочернего fallback или синтетических нулей. Точные native writes и открытые вопросы о смысле полей приведены в [техническом разборе загрузки CTLD](../appendices/script-vm.md#профиль-владельца-control-при-загрузке-ctld). +Изолированный x86-вектор подтвердил общий проход `Control.dll!FUN_1000fca0` +(RVA `0x0fac0`): расчёт начинает с исходного profile word 26, а затем пишет +производное значение в изменяемую копию и заполняет три поля-накопителя +владельца, а также `+0x20` каждой строки provider. Для этого выбираются два +сырых слова `Slot68` через `Node38` state 0 / LOD 0, учитываются cache tag 27 и +устройства таблицы. +Смысл слов `Slot68` и итоговых чисел не установлен; мы не называем их массой +или площадью. + +Rust повторяет эту формулу изолированным helper-ом, и его тест совпадает с +оригинальным кодом на синтетических векторах при x87 control word `0x007f`. +В обычной цепочке загрузки AniMesh начинает с масштабов `[1, 1, 1]`, а вызванные +до FAC0 обработчики привязки модели, FX и collision-компонентов эти поля не +меняют. Поэтому загрузчик использует подтверждённые значения конструктора, а +не scale из TMA. Теперь `build_control_device_projection` выполняет FAC0 после +сборки provider rows и списка устройств и публикует результат вместе с копией +профиля владельца. + +Игнорируемый corpus-тест полного загрузчика на оригинальном +`UNITS/BUILDS/MINE/min_l_n1.dat` подтверждает сопоставление всех 25 provider +rows с начальными узлами и проекцию 11 устройств. Для профиля mine получены +агрегаты `+0x530 = 0x470833fc`, `+0x534 = 0x4897e712` и +`+0x538 = 0x4d9452cb`; тест сверяет также все 25 значений строк. Это результат +Rust loader-а на лицензированных данных, а не сравнение с полным native load +оригинала. Смысл слов `Slot68` и итоговых чисел по-прежнему неизвестен. Точные +входы, вектор и границы приведены в +[техническом разборе загрузки CTLD](../appendices/script-vm.md#изолированный-проход-fac0). + Для tag `19` фабрика создаёт объект с его исходными классом и vtable. Базовый конструктор `FUN_100218b0` задаёт multiplier `+0x4c = 1.0`. Override через `FUN_1002d890` вызывает у выбранного объекта vtable slot `+0x1c`, то есть -- cgit v1.2.3