diff options
Diffstat (limited to 'docs/appendices')
| -rw-r--r-- | docs/appendices/knowledge-boundaries.md | 7 | ||||
| -rw-r--r-- | docs/appendices/script-vm.md | 24 |
2 files changed, 31 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` |
