feat(runtime): distribute Control provider amounts
Docs Deploy / Build and Deploy MkDocs (push) Successful in 39s
Docs Deploy / Build and Deploy MkDocs (push) Successful in 39s
This commit is contained in:
5 files changed
+1022
-38
No files matched your search
@@ -338,17 +338,37 @@ MSH-часть проверки подтверждает начальный сн
|
||||
остаётся статическим выводом по RVA `AniMesh.dll+0xa460`, а последующие
|
||||
изменения в полном Control/animation tick-е не проверялись.
|
||||
|
||||
Для provider-строки Rust сохраняет исходные и текущие amount/type-1 поля
|
||||
отдельно, а `processed_amount_bits` соответствует native `+0x0c`. Инициализатор
|
||||
`Control.dll+0xf940` кладёт результат selector `3` в текущее и обработанное
|
||||
количество; при подтверждённых единичных множителях это raw `max_volume` NDP.
|
||||
Прямой API `apply_loaded_mission_control_node_delta` меняет amount, долю, флаг
|
||||
истощения, aggregate и dirty, применяя публикацию `0x200` к CPU-проекции
|
||||
соответствующего узла модели. Исходный `AniMesh.dll+0x5750` подтверждён в
|
||||
связке с `Control+0x10f30`: меняется только поле узла `+0x124`, а стадия и
|
||||
соседние узлы сохраняются. Эта проекция ещё не подключена к GPU/window path
|
||||
и сама delta-операция не выполняет пересчёт стадий, видимости, FX или время
|
||||
Control. Обработанное количество при ней остаётся прежним. Отдельный
|
||||
Для provider-строки Rust хранит amount `+0x08`, накопитель `+0x10`, обработанное
|
||||
количество `+0x0c`, долю `+0x14`, стадию `+0x18` и flags `+0x28` раздельно.
|
||||
Инициализатор `Control.dll+0xf940` кладёт результат selector `3` в текущее и
|
||||
обработанное количество; при подтверждённых единичных множителях это raw
|
||||
`max_volume` NDP. Таблица также хранит capacity aggregate `+0x58c`, текущий
|
||||
aggregate `+0x590`, dirty `+0x598` и начальный gate `+0x618`.
|
||||
|
||||
Прямой API `apply_loaded_mission_control_node_delta` сохраняет native четвёртый
|
||||
аргумент `0`: меняет amount, долю, флаг истощения, aggregate и dirty, оставляя
|
||||
`+0x10` нетронутым. Публикация `0x200` отражается в CPU-проекции соответствующего
|
||||
узла модели по правилу исходного обработчика; стадия и соседние узлы не меняются.
|
||||
Обработанное количество при этой прямой операции остаётся прежним.
|
||||
API `distribute_loaded_mission_control_provider_amount` переносит
|
||||
`Control+0x10ba0`: proportional mode делит добавку по свободной ёмкости, а
|
||||
вычитание распределяет по текущим количествам; sequential заполняет строки
|
||||
вперёд, снимает с конца и использует исходный запрос даже если общая ёмкость
|
||||
округлилась вниз. Row updater вызывается с четвёртым аргументом `1`, поэтому
|
||||
`+0x10` получает фактическую разницу amount. После распределения обязателен
|
||||
`0x11130(root, true)`.
|
||||
|
||||
Оба API работают только с CPU-проекцией и не подключены к GPU/window path или
|
||||
игровому Control clock. Gate `+0x618` изначально выключен; событие `7` задаёт его
|
||||
по правилу `gate = (arg == 2)` и вызывает `0x2dc20`, только если gate изменился.
|
||||
События Control в Rust пока не исполняются.
|
||||
Capacity aggregate выведен при подтверждённых единичных множителях Unit DAT;
|
||||
изменение масштабов `0x9ee0`/`0x9f90` не реализовано. Из-за округления `+0x590`
|
||||
может стать больше сохранённого `+0x58c`; распределение сохраняет этот signed
|
||||
capacity по native формуле, не вводя отдельного запрета. Если итоговый stage walk
|
||||
нуждается в неизвестном состоянии, depletion lifecycle, FX или host callback,
|
||||
распределение сообщает ошибку и не публикует ни одной частичной записи.
|
||||
Отдельный
|
||||
`update_loaded_mission_control_node_stage` реализует наследование parent ratio
|
||||
и stage, ceiling-арифметику, CPU visible stage и копию processed amount.
|
||||
Отдельная `propagate_loaded_mission_control_node_stage` переносит `0x11130`:
|
||||
|
||||
Reference in new issue
Block a user