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

+25 -2
View File
@@ -1089,8 +1089,31 @@ NDP, а `FUN_1000a100` (RVA `0xa100`) добавляет их в общую та
последовательность provider-строк: её длина берётся из NDP, она не дополняется
до числа узлов MSH и не участвует во второй перенумерации ключа.
Так этот селектор включён в цепочку добычи руды оригинала. В той же сборке
`Behavior.dll` (SHA-256
Индексный selector `0x400` выдаёт значение выбранной строки provider как есть.
Сначала общий индекс устройств выбирает дескриптор, затем его ключ выбирает
строку NDP; это разные номера. Результатом становится текущее type-1 значение
этой строки, а не запас `CurrentOre`, предел или значение после умножения на
коэффициент и `M`. Например, provider-строка с `0.625` возвращает `0.625`, а
записанный в ней ноль тоже остаётся успешным результатом. Rust использует уже
подготовленную таблицу и сообщает отдельную ошибку, если provider-таблица или
строка по ключу недоступна. Этот запрос читает снимок состояния и сам не меняет
таблицу и не запускает её обновление.
У правила есть два разных подтверждения. Разбор AutoDemo нашёл восемь таблиц
Control и 100 устройств; все 100 значений по ключам устройств в этом корпусе
равны `1.0`, поэтому Rust-проверка подтверждает реальные ключи и доступность
строк, но сама по себе не различает выбор по ключу и по номеру устройства.
Отдельная x86-проверка исходного `Control.dll` включала шесть вызовов на
синтетической таблице, где значения строк были заданы вручную и различались.
Например, при номере устройства `2`, ключе `1` и нулевом слове
`device+0x50` оригинал вернул `0.625` из выбранной строки. Точные биты ответов
приведены в [техническом разборе](../appendices/script-vm.md#индексный-control-getter-сырой-селектор-0x400).
Этот опыт не создавал оригинальные factory-объекты и не исполнял полную миссию:
полный интерфейс IID `0x204`, интеграция Behavior и игровое поведение остаются
непроверенными.
В цепочке добычи руды оригинал использует описанный выше selector `0x300`.
В той же сборке `Behavior.dll` (SHA-256
`ddfbdbde07832358fe6e35e01c8dba9b58e7313789498b6049ed51d4ed9baf99`)
`FUN_100186b0` (RVA `0x186b0`) перечисляет устройства типа `0x1a`, а
`FUN_100198e0` (RVA `0x198e0`) суммирует успешные запросы IID `0x204` с selector