feat(runtime): project load-time Control profile values
Docs Deploy / Build and Deploy MkDocs (push) Successful in 41s

This commit is contained in:
Valentin Popov committed 2026-10-29 22:51:25 +04:00
1 parent cc5c6414ce
commit aa6d4b8537
5 files changed
+1435 -17

No files matched your search

+28
View File
@@ -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`, то есть