feat(runtime): run tag-15 and tag-19 Control budgets
Docs Deploy / Build and Deploy MkDocs (push) Successful in 36s

This commit is contained in:
Valentin Popov committed 2026-10-29 19:05:13 +04:00
1 parent d8e86e4f33
commit d3a0f8c7ff
5 files changed
+1143 -30

No files matched your search

+24 -4
View File
@@ -1051,6 +1051,26 @@ Rust переносит этот порядок, сохраняет native на
реализованные FX или lifecycle-вызовы, таблица остаётся без изменений. Эти
операции обновляют только CPU-снимок и пока не подключены к игровым часам Control.
Распределение по бюджету тоже доступно как отдельный CPU-вызов
`advance_loaded_mission_control_budget`. Он сначала собирает положительные
ставки, затем обслуживает категории в исходном порядке и передаёт каждому
устройству его долю. Например, при запасе `40/100`, доле `0.4` и интервале
`0.5` секунды tag 19 может принести `0.1`, а tag 15 запросить `0.2`.
Потребитель получает половину запроса: запас становится `40.1`, доля — `0.401`,
а множитель генератора уменьшается до `0.75`. Хотя генератор может стоять раньше
в массиве, его обновление перечитывает уже изменённую долю после обслуживания
категории tag 15. Этот явный вызов хранит также две выходные ставки `+0x5dc` и
`+0x5e0`, но сам по себе ещё не запускается игровыми часами.
Поддержаны factory callbacks `15/19` и текущие descriptor tags `15/19`
(категории `0/1`); неизвестное устройство,
недоступные данные provider или нулевой знаменатель останавливают весь шаг без
частичных изменений.
Другие категории и полный миссионный цикл пока не подтверждены. В лицензированном
`min_l_n1.dat` рядом с тегами `19` и `15` есть также factory tags `9`, `12`,
`13`, `21`, `25` и `26`; поэтому его полный проход пока явно отклоняется на
первой неподдержанной категории `9`. Проверка сохраняет всю таблицу без
изменений и не доказывает успешный бюджетный шаг на реальной миссии.
Отдельный путь объекта класса `4` умножает интервал на контактный коэффициент и
передаёт изменение строке. В проверенном примере коэффициент `1`, интервал `2`,
и значение строки уменьшается на `2`; этот коэффициент не является ставкой
@@ -1064,10 +1084,10 @@ Control заново разыгрывает срок обновления, да
исходная DLL пропустила времена `500` и `501`, затем выполнила ресурсный шаг
на `502`. Выбрать случайный срок один раз и ждать его было бы неверно.
Принудительный шаг тоже расходует RNG; неактивный объект синхронизирует часы
без такого расхода. Это локальные native проверки, а не работающий Rust
Control: запросы Rust `0xe00` и `0x1002` читают текущее состояние строк,
которое меняют явные API одной строки и распределения, а `0x1005` — загруженную
ставку профиля.
без такого расхода. Это локальные native проверки, а не автоматический Rust
Control tick: запросы Rust `0xe00` и `0x1002` читают текущее состояние строк,
которое меняют явные API одной строки, распределения и бюджетного шага, а
`0x1005` — загруженную ставку профиля.
Точные нативные векторы и открытые границы описаны в [приложении](../appendices/script-vm.md#изменение-provider-состояния-control).
На x87 control word `0x007f` каждое умножение округляет мантиссу до 24 бит,