From 6c079d9457fddf9927d3e2057463d95c502d4673 Mon Sep 17 00:00:00 2001 From: Valentin Popov Date: Thu, 29 Oct 2026 20:55:48 +0400 Subject: feat(runtime): retain Control owner profiles during loading --- docs/tomes/06-behavior.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'docs/tomes') 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`, то есть -- cgit v1.2.3