feat(runtime): restore indexed Control provider query
Docs Deploy / Build and Deploy MkDocs (push) Successful in 37s

This commit is contained in:
Valentin Popov committed 2026-10-31 09:22:41 +04:00
1 parent 8c11e0f470
commit 3e3ab0e0c6
4 files changed
+313 -19

No files matched your search

+42 -6
View File
@@ -532,12 +532,48 @@ callbacks. Licensed двухстадийный узел шахты подтве
новый API при доле `0.5`, без FX и window path. Гибель root/critical узла и
неизвестные flags/aggregate также остаются явными ошибками.
Rust query обращается к загруженному объекту и поддерживает `0xe00` только для
текущего descriptor tag `26` с factory tag `26`; другие активные typed tags и
factory paths остаются явными границами. Запрос читает текущее type-1 значение.
Licensed `min_l_n1.dat` подтверждает изменение `0xe00` и Behavior `0x1002` с
`1.0` до `0.5` после явного уменьшения количества вдвое; чтение получает
текущее значение provider, который также меняет явный бюджетный шаг.
Rust query обращается к загруженному объекту и поддерживает `0xe00` для пар
текущего descriptor tag и factory tag `(5,5)`, `(5,26)`, `(26,5)` и `(26,26)`;
прочие специализированные tag/factory пути остаются явными границами. Запрос
читает текущее type-1 значение provider. Licensed `min_l_n1.dat` подтверждает
изменение `0xe00` и Behavior `0x1002` с `1.0` до `0.5` после явного уменьшения
количества вдвое; чтение получает текущее значение provider, который также
меняет явный бюджетный шаг.
Indexed selector `0x400` в том же Control IID `0x204` возвращает текущее type-1
значение строки provider, выбранной через key устройства, при любом descriptor
и factory tag. Rust принимает конечное normal-or-zero значение, включая оба
знака нуля, и сохраняет его биты; недоступная таблица, отсутствующий key и
значения вне этой численной области дают типизированную ошибку. В оригинальном
`Control.dll` с SHA-256
`bcb86318089028548a178b03a21accdce15df0cc85ddd91674cf3c2f55012c6e` ветвь
`FUN_1002bb40` (RVA `0x2bc3c`) читает provider pointer `device+0x44` и key
`device+0x04`, вызывает provider slot `+0x0c` в режиме `1` и не проверяет
descriptor/factory tag. Rust-проекция читает сохранённый снимок; она не вычисляет
value из amount, maximum, coefficients или множителя `M`. Native selector-cell
alias/fallback за пределами валидной записи и поведение native при невалидном
key остаются неисследованными; Rust не подставляет для них `0.0` или `None`.
Это покрывает перечисленные query-пути. Полный интерфейс IID `0x204`, его
взаимодействие со всеми Behavior-вызовами и полный игровой tick остаются за
границей подтверждённого поведения.
Объём свидетельств для `0x400` ограничен и состоит из трёх частей. Native
oracle на настоящем `Control.dll` проверил шесть выходов по raw bits для
ограждённого синтетического owner/provider table; он вызвал indexed query и
реальный provider getter, но не создавал оригинальные factory-объекты. Матрица
выходов находится в [техническом разборе](script-vm.md#индексный-control-getter-сырой-селектор-0x400).
Независимый разбор AutoDemo обнаружил восемь таблиц и 100 устройств с
доступными ключами, но все выбранные provider values равны `1.0`; такой набор
подтверждает загрузку и область ключей, однако не различает, какую именно
строку выбирает алгоритм. Игнорируемый Rust-тест опрашивает эти 100 устройств и
проверяет те же биты, не выдавая равенство ресурсных данных за доказательство
индексирования.
Вместе native-векторы и resource acceptance не подтверждают состояние
оригинальных factory instances, полный контракт IID `0x204`, полный
Behavior-call flow или живую миссию/gameplay. Поведение при ошибочных native
указателях и ключах, а также selector-cell alias/fallback вне валидной строки
по-прежнему не описано; Rust сохраняет typed errors на этой границе.
Native oracle проверил изолированные пути распределения, обновления класса `4`,
стадийную арифметику `0x11220`, обход дочерних provider-строк `0x11130` на
interleaved parents `[-1, 0, 0, 1, 3]` с callback-порядком `1, 3, 4, 2` и