aboutsummaryrefslogtreecommitdiff
path: root/docs/tomes/06-behavior.md
diff options
context:
space:
mode:
authorValentin Popov <valentin@popov.link>2026-10-29 19:55:48 +0300
committerValentin Popov <valentin@popov.link>2026-10-29 19:55:48 +0300
commit6c079d9457fddf9927d3e2057463d95c502d4673 (patch)
tree8519a80dd36764d12c053bef9d69ac75dbe74c53 /docs/tomes/06-behavior.md
parentba7cb7f0f9f572bf587824cc5816ed933fe74f12 (diff)
downloadfparkan-6c079d9457fddf9927d3e2057463d95c502d4673.tar.xz
fparkan-6c079d9457fddf9927d3e2057463d95c502d4673.zip
feat(runtime): retain Control owner profiles during loading
Diffstat (limited to 'docs/tomes/06-behavior.md')
-rw-r--r--docs/tomes/06-behavior.md12
1 files changed, 12 insertions, 0 deletions
diff --git a/docs/tomes/06-behavior.md b/docs/tomes/06-behavior.md
index d3af8f7..45a6303 100644
--- a/docs/tomes/06-behavior.md
+++ b/docs/tomes/06-behavior.md
@@ -691,6 +691,18 @@ Rust full-loader теста на оригинальных ресурсах. Ве
`EXTO` подтверждены статически по native ASM; отдельный native full-load oracle
для всей таблицы не запускался.
+Профиль владельца читается из отдельного блока каждого CTLD сразу после пяти
+слов заголовка: это 27 исходных DWORD, начиная с байта `20`. Control выбирает
+для владельца только компонент с native ID `0`; его блок остаётся исходной
+копией, а те же 27 слов отдельно копируются в изменяемую память владельца.
+Поэтому профиль дочернего компонента, даже если его `INTO` обновляет строку
+таблицы `0`, не подменяет профиль корня. В Rust `PreparedComponentControl`
+сохраняет эти слова без предположений об их типах, а полная Control-проекция
+хранит источник, native ID, исходный массив и отдельную начальную копию. Эти
+массивы сначала равны; отсутствие CTLD у компонента с ID `0` остаётся явным
+`None`, без дочернего fallback или синтетических нулей. Точные native writes и
+открытые вопросы о смысле полей приведены в [техническом разборе загрузки CTLD](../appendices/script-vm.md#профиль-владельца-control-при-загрузке-ctld).
+
Для tag `19` фабрика создаёт объект с его исходными классом и vtable. Базовый
конструктор `FUN_100218b0` задаёт multiplier `+0x4c = 1.0`. Override через
`FUN_1002d890` вызывает у выбранного объекта vtable slot `+0x1c`, то есть