From ce8e65c8ae585098c0c74507bb2b05f14f44e6d4 Mon Sep 17 00:00:00 2001 From: Valentin Popov Date: Fri, 23 Oct 2026 12:32:49 +0400 Subject: test(runtime): verify native Control provider updates --- docs/tomes/06-behavior.md | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) (limited to 'docs/tomes') 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` и вернуться в него при -- cgit v1.2.3