aboutsummaryrefslogtreecommitdiff
path: root/docs/tomes/06-behavior.md
diff options
context:
space:
mode:
authorValentin Popov <valentin@popov.link>2026-10-29 17:24:43 +0300
committerValentin Popov <valentin@popov.link>2026-10-29 17:24:43 +0300
commitd8e86e4f33241d4c0cbb236ecbd32f71798ce9ed (patch)
tree6318667b6880f26de54dd3a8dcd6e89f6eae6af7 /docs/tomes/06-behavior.md
parentbe4031cb54d9bd88d1bad9cf993d27f914c767fa (diff)
downloadfparkan-d8e86e4f33241d4c0cbb236ecbd32f71798ce9ed.tar.xz
fparkan-d8e86e4f33241d4c0cbb236ecbd32f71798ce9ed.zip
feat(runtime): distribute Control provider amounts
Diffstat (limited to 'docs/tomes/06-behavior.md')
-rw-r--r--docs/tomes/06-behavior.md17
1 files changed, 13 insertions, 4 deletions
diff --git a/docs/tomes/06-behavior.md b/docs/tomes/06-behavior.md
index 777caf1..452f577 100644
--- a/docs/tomes/06-behavior.md
+++ b/docs/tomes/06-behavior.md
@@ -995,7 +995,13 @@ clock Control.
добавку либо пропорционально свободному месту, либо по очереди: при максимумах
`[30, 60, 50]`, текущих значениях `[10, 20, 0]` и добавке `22` первый способ
даёт `[14, 28, 10]`. При вычитании последовательный способ начинает с последней
-строки. Так одна таблица описывает и текущее значение, и то, как оно меняется.
+строки. Пропорциональное вычитание делит запрос по текущим количествам.
+У каждой изменившейся строки есть отдельный накопитель изменений количества: он
+получает фактически применённую разницу, а не исходный запрос.
+Большие суммы округляются в двоичном формате. Поэтому после нескольких
+маленьких изменений общий запас иногда оказывается чуть больше первоначальной
+ёмкости; оригинал продолжает считать с этой отрицательной разностью, а не
+исправляет её отдельным правилом.
У строк есть и связи с родительскими узлами. Нативный `Control.dll` сначала
обновляет запрошенную строку через `0x11220`, затем `0x11130` ищет её детей
@@ -1040,8 +1046,10 @@ clock Control.
Для точного повтора важен порядок округления. При исходных значениях `[2^24, 2]`
и запросе `-1` оригинал сначала складывает общий итог с изменением, затем
вычитает прежний итог. Из-за округления фактическое изменение получается `-2`.
-Нативная проверка подтвердила это поведение; общий распределитель
-`0x10ba0` в Rust ещё не перенесён, хотя прямая добавка к одной строке уже доступна.
+Rust переносит этот порядок, сохраняет native накопитель каждой строки и
+запускает обязательный проход стадий с effects. Если ему нужны ещё не
+реализованные FX или lifecycle-вызовы, таблица остаётся без изменений. Эти
+операции обновляют только CPU-снимок и пока не подключены к игровым часам Control.
Отдельный путь объекта класса `4` умножает интервал на контактный коэффициент и
передаёт изменение строке. В проверенном примере коэффициент `1`, интервал `2`,
@@ -1058,7 +1066,8 @@ Control заново разыгрывает срок обновления, даÐ
Принудительный шаг тоже расходует RNG; неактивный объект синхронизирует часы
без такого расхода. Это локальные native проверки, а не работающий Rust
Control: запросы Rust `0xe00` и `0x1002` читают текущее состояние строк,
-которое пока меняет только прямой API, а `0x1005` — загруженную ставку профиля.
+которое меняют явные API одной строки и распределения, а `0x1005` — загруженную
+ставку профиля.
Точные нативные векторы и открытые границы описаны в [приложении](../appendices/script-vm.md#изменение-provider-состояния-control).
На x87 control word `0x007f` каждое умножение округляет мантиссу до 24 бит,