feat(runtime): retain Control owner profiles during loading
Docs Deploy / Build and Deploy MkDocs (push) Successful in 38s
Docs Deploy / Build and Deploy MkDocs (push) Successful in 38s
This commit is contained in:
6 files changed
+271
No files matched your search
@@ -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 или реакцией на движение.
|
||||
|
||||
@@ -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`
|
||||
|
||||
Reference in new issue
Block a user