diff options
| author | Valentin Popov <valentin@popov.link> | 2026-10-29 14:41:08 +0300 |
|---|---|---|
| committer | Valentin Popov <valentin@popov.link> | 2026-10-29 14:41:08 +0300 |
| commit | e20b9029866b44a87a0127293626c55d07dc3f9f (patch) | |
| tree | 25ad0e213250fe00a967c9248632869f6485b3ed /docs/appendices | |
| parent | 35b9d86637e43f8289c61aba09dce8e939ecdd4f (diff) | |
| download | fparkan-e20b9029866b44a87a0127293626c55d07dc3f9f.tar.xz fparkan-e20b9029866b44a87a0127293626c55d07dc3f9f.zip | |
test(runtime): verify active Control resource clock
Diffstat (limited to 'docs/appendices')
| -rw-r--r-- | docs/appendices/knowledge-boundaries.md | 12 | ||||
| -rw-r--r-- | docs/appendices/script-vm.md | 48 |
2 files changed, 48 insertions, 12 deletions
diff --git a/docs/appendices/knowledge-boundaries.md b/docs/appendices/knowledge-boundaries.md index 4890de0..3dc0e6b 100644 --- a/docs/appendices/knowledge-boundaries.md +++ b/docs/appendices/knowledge-boundaries.md @@ -356,16 +356,20 @@ visibility transition `0x11920` с исходными AniMesh callbacks. ОтдÐ смены видимости, поэтому связанное с ним движение не проверено. Хотя у строки Control выставлен flag `0x102`, слово флагов ANI `+0x14` и производные байты `+0x111..+0x113` изначально равны нулю. Вызовы AniMesh `0x93c0` и `0xa2a0` обновляют производную геометрию и -видимость, это отдельная непроверенная граница, а не FX callbacks. Активную -clock-ветвь не запускали. Источник времени и доставка прослежены статически: +видимость, это отдельная непроверенная граница, а не FX callbacks. Бюджетная +часть активного `0xbcf0` исполнена на синтетическом хосте класса `10`: +при периоде `500` и нулевом RNG проверены пропуск до deadline и на равенстве +`437.5`, затем ресурсный `dt = 0.5` при времени `500`. Движение и очереди +исключены условиями вектора; активация `+0xe0` задана явно. Источник времени +и доставка прослежены статически: World3D RVA `0x6bf0` вычисляет часы из `timeGetTime()` с игровым смещением и поправкой на паузу, затем выполняет первый обход `6/1`, шаг мировой физики и второй обход `6/0x1c`. AniMesh RVA `0x1370` передаёт часы Control; общий обработчик Control RVA `0x7830` численно преобразует unsigned DWORD в `f32` перед primary slot `+0x58`. Фабрика выбирает RVA `0xcbb0` для класса `9` и RVA `0xbcf0` для остальных. Это подтверждает статическую цепочку вызовов, но не -её исполнение на миссии: активный путь `0xbcf0` и изменение provider-снимков -Rust остаются открытыми. Источник контактного коэффициента прослежен статически, +её исполнение на миссии: загрузочная активация, остальные ветви `0xbcf0` и +изменение provider-снимков Rust остаются открытыми. Источник контактного коэффициента прослежен статически, но не исполнен. Подробные векторы и статические границы приведены в [техническом подразделе о provider-состоянии Control](script-vm.md#изменение-provider-состояния-control). diff --git a/docs/appendices/script-vm.md b/docs/appendices/script-vm.md index 9ed3e80..d031158 100644 --- a/docs/appendices/script-vm.md +++ b/docs/appendices/script-vm.md @@ -640,8 +640,9 @@ oracle вызывает оригинальные `FUN_10010ba0` (RVA `0x10ba0`), затем `FMUL` с binary32-константой `0.001` (`0x3a83126f`), после чего результат сохраняется в `f32`. Код вызывает `FUN_10012a40`, затем `FUN_1002d340` и присваивает `+0xec = +0xe4`. В соседней ветви update packet queue обрабатывается -через `FUN_10012ce0`. Активную clock-ветвь oracle не запускал. Источник её -входного времени и порядок доставки установлены статически, как описано ниже; +через `FUN_10012ce0`. Бюджетная часть активной ветви проверена на ограниченном +хосте класса `10`, как описано ниже. Источник входного времени и порядок его +доставки до обработчика установлены статически; Rust продолжает читать начальные provider snapshots и не моделирует эти изменения. #### Бюджет и обновление устройства tag 15 @@ -657,7 +658,7 @@ RVA `0x22ae0`, его rate RVA `0x22b20` и update RVA `0x22bb0`. Вектор задаёт provider с максимумом `100`, количеством `40` и долей `0.4`, интервал `0.5` секунды, коэффициенты tag 15 равные `1` и нулевое поле - descriptor `+0x20`. Исходная rate-функция возвращает `-0.2`. +descriptor `+0x20`. Исходная rate-функция возвращает `-0.2`. Генератор с descriptor tag `14` подставлен явно: mock возвращает положительный вклад `0.1` или `0.5` и записывает аргументы своего update. Функции tag 15, provider getter и изменение количества не подменены. @@ -672,9 +673,39 @@ provider getter и изменение количества не подменен Хотя генератор стоит первым в массиве, его update уже видит изменённое количество: категория tag 15 обслуживается раньше. Проверены также интервал и коэффициент, переданные mock-генератору. Его собственная генерация, другие -категории, активный clock-путь и выполнение миссии этим не проверены. +категории и выполнение миссии этим не проверены. Rust пока не переносит этот изменяемый бюджетный цикл. +#### Активный ресурсный clock + +Тот же native budget-вектор проходит через `Control.dll` RVA `0xbcf0` при +явно заданных классе `10` и признаке активности `+0xe0 = 1`. Хост подставляет +два getter-а: наличие игрового хоста и отсутствие объекта движения. Класс `10` +пропускает цикл команд и движения; очереди пакетов и detached-объектов пусты. +Поле dirty перед первым ресурсным циклом равно нулю, поэтому `0x12a40` +возвращается без пересчёта геометрии. Это исполнение бюджетной части активной +ветви, а не полная загрузка или физика объекта. + +Период по RVA `0x42480` явно равен `500`, состояние RNG по RVA `0x43228` — +нулю. Эти данные принадлежат изолированному процессу oracle и восстанавливаются +после вектора. Нулевое состояние остаётся нулевым и даёт deadline +`500 - 500 / 8 = 437.5` миллисекунды при исходном `+0xec = 0`. + +| Абсолютное время | Результат | +|---|---| +| `0.5` | меньше миллисекунды: `+0xe4` ещё равен `0` | +| `436` | время принято, ресурсный deadline ещё не пройден | +| `437.5` | равенство deadline: ресурсный цикл пропущен | +| `500` | `dt = (500 - 0) * 0.001 = 0.5`, бюджет исполнен, `+0xec = 500` | + +Последний межкадровый интервал `+0xe8` равен `62.5`, но ресурсный интервал +берётся от отдельного `+0xec`. Исходные `0x2d340` и tag 15 изменяют amount +до `0x42206666`, долю до `0x3ecd4fdf`; mock-генератор получает `dt = 0.5` +ровно один раз. После вызова dirty равен `1`, а агрегат `+0x588` ещё не +пересчитан: бюджетное изменение происходит после предшествующего `0x12a40`. +Активация через загрузочные события, ненулевые состояния RNG, принудительный +цикл по `+0xd4`, движение и непустые очереди остаются отдельными границами. + #### Доставка игровых часов в Control Статическая цепочка относится к GOG-модулям `World3D.dll` (SHA-256 @@ -720,8 +751,8 @@ vtable RVA `0x3b8cc` направляет этот слот в RVA `0xcbb0`; у vtable RVA `0x3d298` направляет его в RVA `0xbcf0`. Эта цепочка доказана инструкциями и таблицами исходных модулей. Она не является -проверкой исполнения активной ветви `0xbcf0`, её callbacks или изменения -provider-состояния в реальной миссии. +проверкой полного исполнения активной ветви `0xbcf0` или изменения +provider-состояния в реальной миссии. Ограниченный активный вектор описан выше. #### Родители, стадии и видимость provider-узлов @@ -773,8 +804,9 @@ NDP, Node38 и объект хоста синтетические; слот life `AniMesh.dll!FUN_100093c0` и `FUN_1000a2a0` (пересчёт производной геометрии и видимости) не покрыты. Эти результаты подтверждают локальные переходы и порядок callbacks, но не полный Control update реальной миссии. Источник часов и порядок -их доставки установлены статически выше; исполнение активной clock-ветви и её -влияние на состояние реальной миссии остаются непроверенными. +их доставки установлены статически выше; бюджетная часть активной clock-ветви +проверена на синтетическом хосте класса `10`, её исполнение в реальной миссии +остаётся непроверенным. ### Начальная MSH-часть строки provider |
