aboutsummaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/appendices/knowledge-boundaries.md7
-rw-r--r--docs/appendices/script-vm.md24
-rw-r--r--docs/tomes/06-behavior.md12
3 files changed, 43 insertions, 0 deletions
diff --git a/docs/appendices/knowledge-boundaries.md b/docs/appendices/knowledge-boundaries.md
index 2f93502..e73ba68 100644
--- a/docs/appendices/knowledge-boundaries.md
+++ b/docs/appendices/knowledge-boundaries.md
@@ -520,6 +520,13 @@ provider rows после пропуска первого `EXTO` row. Он выз
getter оригинальной DLL здесь не исполняется. Это не запись живого
resource-device значения во время игры.
+### Профиль владельца Control из CTLD
+
+Смысл отдельных слов, последующие изменения mutable-копии и чтения в Control
+`fca0/fac0` остаются открытыми. Загрузочный тест проверяет CPU-проекцию, но не
+исполнение native полного загрузчика или игрового tick. Точные writer, RVA и
+указатели описаны в [техническом разделе о загрузке CTLD](script-vm.md#профиль-владельца-control-при-загрузке-ctld).
+
Закрывающий эксперимент: трассировать `LoadControlSystem`,
`LoadPhysicalModel`, `CreateCollManager` и создание collision objects; связать
каждый изменяемый field с созданным shape, contact или реакцией на движение.
diff --git a/docs/appendices/script-vm.md b/docs/appendices/script-vm.md
index 84bb4b9..a1e867d 100644
--- a/docs/appendices/script-vm.md
+++ b/docs/appendices/script-vm.md
@@ -953,6 +953,30 @@ Ignored Rust-тест также проходит полный неотфильÑ
Это проверка CPU-проекции реальной таблицы, а не сравнение целой миссии с
оригиналом.
+#### Профиль владельца Control при загрузке CTLD
+
+Для `Control.dll` с SHA-256
+`bcb86318089028548a178b03a21accdce15df0cc85ddd91674cf3c2f55012c6e`
+`FUN_10008b10` (RVA `0x8b10`) проверяет native component ID из параметра
+`+0xc0`. Только при значении `0` запись около RVA `0x8ee9` указывает на блок
+`payload + 0x14` в `owner + 0x46c` и копирует `0x1b` DWORD в `owner + 0x470`.
+Затем `FUN_100143e0` (RVA `0x143e0`) связывает указатель исходного блока и
+указатель изменяемой копии; при `this = owner + 0x1b4` это указатели
+`owner + 0x360` и `owner + 0x364`. Итого CTLD bytes `20..128` — 27 сырых слов:
+они первоначально одинаковы в двух областях, но изменение копии владельца не
+меняет оригинал.
+
+Текущая Control-проекция назначает корню native ID `0`, а следующим активным
+компонентам — ID от `1`. `INTO` с локальным индексом `0` может переопределять
+первую строку таблицы, не меняя native ID самого компонента. В Rust
+`PreparedComponentControl` сохраняет блок как `[u32; 27]`, а полная проекция
+прикрепляет к ID `0` источник CTLD, исходный массив и отдельную начальную копию
+владельца. Загрузочный тест `UNITS/BUILDS/MINE/min_l_n1.dat` подтверждает
+источник `fr_l_mine.ctl` и сырые слова корня; отдельный synthetic-тест проверяет
+`INTO` slot `0`, независимость массивов и отсутствие fallback к дочернему
+профилю. Это подтверждает декодирование и CPU-проекцию, но не исполнение native
+полного загрузчика.
+
#### Активация и начальные часы
Для Control класса `4` oracle вызывает исходный конструктор RVA `0x31490`
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`, то есть