aboutsummaryrefslogtreecommitdiff
path: root/docs/tomes/06-behavior.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/tomes/06-behavior.md')
-rw-r--r--docs/tomes/06-behavior.md28
1 files changed, 24 insertions, 4 deletions
diff --git a/docs/tomes/06-behavior.md b/docs/tomes/06-behavior.md
index 452f577..6406307 100644
--- a/docs/tomes/06-behavior.md
+++ b/docs/tomes/06-behavior.md
@@ -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 бит,