test(runtime): verify native Control activation clocks
Docs Deploy / Build and Deploy MkDocs (push) Successful in 36s
Docs Deploy / Build and Deploy MkDocs (push) Successful in 36s
This commit is contained in:
3 files changed
+122
-5
No files matched your search
@@ -360,7 +360,11 @@ Control выставлен flag `0x102`, слово флагов ANI `+0x14` и
|
||||
часть активного `0xbcf0` исполнена на синтетическом хосте класса `10`:
|
||||
при периоде `500` и нулевом RNG проверены пропуск до deadline и на равенстве
|
||||
`437.5`, затем ресурсный `dt = 0.5` при времени `500`. Движение и очереди
|
||||
исключены условиями вектора; активация `+0xe0` задана явно. Источник времени
|
||||
исключены условиями вектора; активация `+0xe0` задана явно. Отдельный вектор
|
||||
класса `4` исполняет событие `4` через `0x31ae0` → `0x314f0`, проверяя
|
||||
активность, начальные часы `time - 100`, округление DWORD в `f32` и одну
|
||||
начальную команду. Геометрические callbacks подставлены явно, таблицы
|
||||
устройств и shapes пусты; полный загрузочный путь не проверен. Источник времени
|
||||
и доставка прослежены статически:
|
||||
World3D RVA `0x6bf0` вычисляет часы из `timeGetTime()` с игровым смещением и
|
||||
поправкой на паузу, затем выполняет первый обход `6/1`, шаг мировой физики и
|
||||
@@ -368,7 +372,8 @@ World3D RVA `0x6bf0` вычисляет часы из `timeGetTime()` с игр
|
||||
обработчик Control RVA `0x7830` численно преобразует unsigned DWORD в `f32`
|
||||
перед primary slot `+0x58`. Фабрика выбирает RVA `0xcbb0` для класса `9` и
|
||||
RVA `0xbcf0` для остальных. Это подтверждает статическую цепочку вызовов, но не
|
||||
её исполнение на миссии: загрузочная активация, остальные ветви `0xbcf0` и
|
||||
её исполнение на миссии: связывание интерфейсов, активация устройств и shapes,
|
||||
остальные ветви `0xbcf0` и
|
||||
изменение provider-снимков Rust остаются открытыми. Источник контактного коэффициента прослежен статически,
|
||||
но не исполнен. Подробные векторы и статические границы приведены в
|
||||
[техническом подразделе о provider-состоянии Control](script-vm.md#изменение-provider-состояния-control).
|
||||
|
||||
@@ -573,7 +573,9 @@ Tick-векторы проверяют нулевой шаг, обе ветви
|
||||
равенство спросу, разные веса и достаточную/недостаточную мощность. Тот же
|
||||
harness проверяет в оригинальном Control пропорциональное и последовательное
|
||||
распределение provider amount, коэффициент класса `4` с интервалом `2`, а также
|
||||
неактивную временную ветвь с входами `0.5`, `1` и `2`. Вызовы Control используют
|
||||
неактивную временную ветвь с входами `0.5`, `1` и `2`. Отдельные векторы
|
||||
проверяют активацию класса `4` и бюджетную часть активной ветви класса `10`.
|
||||
Вызовы Control используют
|
||||
синтетические строки и хостовые callbacks; ArealMap тоже получает синтетические
|
||||
объекты. Harness сверяет SHA-256 всех трёх DLL; ArealMap загружается из
|
||||
изолированной временной рабочей папки, которую процесс затем удаляет. Эти тесты
|
||||
@@ -676,6 +678,36 @@ provider getter и изменение количества не подменен
|
||||
категории и выполнение миссии этим не проверены.
|
||||
Rust пока не переносит этот изменяемый бюджетный цикл.
|
||||
|
||||
#### Активация и начальные часы
|
||||
|
||||
Для Control класса `4` oracle вызывает исходный конструктор RVA `0x31490`
|
||||
и обработчик интерфейса RVA `0x31ae0` → `0x314f0` с событием `4` и ненулевым
|
||||
DWORD времени. Он выставляет `+0xe0` по условию `class != 0`, копирует матрицу
|
||||
хоста в три transform-поля и численно преобразует беззнаковое время в `f32`.
|
||||
Поля `+0xe4`, `+0xe8` и `+0xec` получают `time - 100`, а командные часы
|
||||
`+0xd8` и `+0xdc` — `time`. Это разные базовые значения:
|
||||
|
||||
| Вход DWORD | Абсолютное `f32` | `+0xe4`, `+0xe8`, `+0xec` |
|
||||
|---|---|---|
|
||||
| `1000` | `1000` | `900` |
|
||||
| `33554433` | `33554432` | `33554332` |
|
||||
|
||||
Первый вызов при старом `+0xe4 == 0` добавляет начальную команду в очередь;
|
||||
повторный вызов в этом векторе сохраняет одну запись. Хост явно подставляет
|
||||
identity transform, единичный масштаб и нулевую геометрию. Oracle проверяет
|
||||
аргументы и порядок этих callbacks, а функции Control и изменения его часов
|
||||
остаются исходными. Таблицы устройств, shapes и дорожек пусты: их активация,
|
||||
полный object loader и ветвь события `4` с нулевым payload здесь не исполнены.
|
||||
Нулевой payload статически выбирает отдельную фазу связывания интерфейсов,
|
||||
поэтому его нельзя считать обычным ненулевым временем активации.
|
||||
|
||||
Период ресурсного обновления — поле `+8` глобального объекта настроек
|
||||
RVA `0x42478`. Инициализатор RVA `0x6350` и reset-метод RVA `0x6420` задают
|
||||
ему `250` миллисекунд (`0x437a0000`); oracle проверяет значение после загрузки
|
||||
DLL. Экспорт `InitializeSettings` (RVA `0x32260`) регистрирует объект с ключом
|
||||
`0x15` в `World3D::CreateGameSettings`. Это default, а не доказательство
|
||||
неизменности настройки во всех игровых режимах.
|
||||
|
||||
#### Активный ресурсный clock
|
||||
|
||||
Тот же native budget-вектор проходит через `Control.dll` RVA `0xbcf0` при
|
||||
@@ -703,8 +735,9 @@ Rust пока не переносит этот изменяемый бюджет
|
||||
до `0x42206666`, долю до `0x3ecd4fdf`; mock-генератор получает `dt = 0.5`
|
||||
ровно один раз. После вызова dirty равен `1`, а агрегат `+0x588` ещё не
|
||||
пересчитан: бюджетное изменение происходит после предшествующего `0x12a40`.
|
||||
Активация через загрузочные события, ненулевые состояния RNG, принудительный
|
||||
цикл по `+0xd4`, движение и непустые очереди остаются отдельными границами.
|
||||
Событие активации проверено отдельно выше. Ненулевые состояния RNG,
|
||||
принудительный цикл по `+0xd4`, движение и непустые очереди остаются отдельными
|
||||
границами.
|
||||
|
||||
#### Доставка игровых часов в Control
|
||||
|
||||
|
||||
Reference in new issue
Block a user