aboutsummaryrefslogtreecommitdiff
path: root/docs/tomes
diff options
context:
space:
mode:
authorValentin Popov <valentin@popov.link>2026-10-23 11:32:49 +0300
committerValentin Popov <valentin@popov.link>2026-10-23 11:32:49 +0300
commitce8e65c8ae585098c0c74507bb2b05f14f44e6d4 (patch)
tree26e062050704b9b0f163678786a5c5e9577434c3 /docs/tomes
parent7c909ea67ba7f27e11d5b33b8df9f6569da7eb7b (diff)
downloadfparkan-ce8e65c8ae585098c0c74507bb2b05f14f44e6d4.tar.xz
fparkan-ce8e65c8ae585098c0c74507bb2b05f14f44e6d4.zip
test(runtime): verify native Control provider updates
Diffstat (limited to 'docs/tomes')
-rw-r--r--docs/tomes/06-behavior.md27
1 files changed, 20 insertions, 7 deletions
diff --git a/docs/tomes/06-behavior.md b/docs/tomes/06-behavior.md
index b3dd8d0..1d32930 100644
--- a/docs/tomes/06-behavior.md
+++ b/docs/tomes/06-behavior.md
@@ -859,13 +859,26 @@ tag-26 ряда получается `1.0` provider × `1.0` coefficient × `1.0
`1.0`. Эти запросы используют начальные provider-значения после конструкторов,
а не результаты живого игрового тика.
-Поведение provider-строк меняется и после загрузки: например,
-`Control.dll!FUN_10010f30` (RVA `0x10f30`) обновляет и ограничивает текущее
-значение, а соседние процедуры распространяют его между связанными строками.
-Эти изменения пока не отражены в Rust-снимке. Поэтому запрос Control `0xe00` и
-Behavior selector `0x1002`, который его суммирует, используют исходное состояние
-полной загрузки. Selector `0x1005` прямо возвращает загруженную ставку профиля.
-Ни один из них пока не исполняет Control tick или последующие изменения профиля.
+После загрузки количество в строках может меняться. Контроллер распределяет
+добавку либо пропорционально свободному месту, либо по очереди: при максимумах
+`[30, 60, 50]`, текущих значениях `[10, 20, 0]` и добавке `22` первый способ
+даёт `[14, 28, 10]`. При вычитании последовательный способ начинает с последней
+строки. Так одна таблица описывает и текущее значение, и то, как оно меняется.
+
+Для точного повтора важен порядок округления. При исходных значениях `[2^24, 2]`
+и запросе `-1` оригинал сначала складывает общий итог с изменением, затем
+вычитает прежний итог. Из-за округления фактическое изменение получается `-2`.
+Нативная проверка подтвердила это поведение; Rust пока использует начальный
+снимок provider-строк и не исполняет их дальнейшее распределение.
+
+Отдельный путь объекта класса `4` умножает интервал на контактный коэффициент и
+передаёт изменение строке. В проверенном примере коэффициент `1`, интервал `2`,
+и значение строки уменьшается на `2`; этот коэффициент не является ставкой
+производства из профиля. Проверка времени охватывает только начальную ветвь:
+активную ветвь не запускали, а источник времени и полный порядок вызовов в игре
+пока не установлены. Поэтому запросы Rust `0xe00` и `0x1002` используют
+начальные снимки provider-строк, а `0x1005` — загруженную ставку профиля.
+Точные нативные векторы и открытые границы описаны в [приложении](../appendices/script-vm.md#изменение-provider-состояния-control).
На x87 control word `0x007f` каждое умножение округляет мантиссу до 24 бит,
но промежуточная степень может выйти за диапазон `f32` и вернуться в него при