aboutsummaryrefslogtreecommitdiff
path: root/docs/appendices
diff options
context:
space:
mode:
Diffstat (limited to 'docs/appendices')
-rw-r--r--docs/appendices/knowledge-boundaries.md26
-rw-r--r--docs/appendices/script-vm.md52
2 files changed, 60 insertions, 18 deletions
diff --git a/docs/appendices/knowledge-boundaries.md b/docs/appendices/knowledge-boundaries.md
index fdf0496..e2dbffe 100644
--- a/docs/appendices/knowledge-boundaries.md
+++ b/docs/appendices/knowledge-boundaries.md
@@ -334,21 +334,27 @@ sidecar недоступен, запрос `0xe00` сообщает это отÐ
проецируются из AniMesh по глобальному ordinal; точные правила, native ABI
векторы и лицензированная root/`EXTO` fixture описаны в
[техническом подразделе](script-vm.md#начальная-msh-часть-строки-provider).
-Проверки подтверждают только начальный снимок: сборка runtime parent-ов
+MSH-часть проверки подтверждает начальный снимок: сборка runtime parent-ов
остаётся статическим выводом по RVA `AniMesh.dll+0xa460`, а последующие
изменения в полном Control/animation tick-е не проверялись.
-Для provider-строки Rust также хранит одно `initial_amount_bits`. Нативный
-`Control.dll` `FUN_1000f940` (RVA `0xf940`) кладёт результат selector `3` в
-текущее и обработанное значения строки; при подтверждённых единичных множителях
-это raw `max_volume` NDP. Последующее обновление меняет оба native поля, поэтому
-снимок не моделирует вместимость или изменяемый Control amount.
+Для 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` для
+узла. Он пока не доставляет её в AniMesh и не выполняет пересчёт стадий,
+видимости, FX или время Control. Поэтому обработанное количество остаётся
+прежним. Гибель root/critical узла и неизвестные flags/aggregate дают явную
+ошибку до записи; неподдержанные численные диапазоны тоже отклоняются.
Rust query обращается к загруженному объекту и поддерживает `0xe00` только для
текущего descriptor tag `26` с factory tag `26`; другие активные typed tags и
-factory paths остаются явными границами. Этот запрос возвращает начальный
-type-1 provider value (`1.0`); дальнейшее изменение provider amount в Rust не
-реализовано.
+factory paths остаются явными границами. Запрос читает текущее type-1 значение.
+Licensed `min_l_n1.dat` подтверждает изменение `0xe00` и Behavior `0x1002` с
+`1.0` до `0.5` после явного уменьшения количества вдвое; это ещё не
+автоматический бюджетный цикл.
Native oracle проверил изолированные пути распределения, обновления класса `4`,
стадийную арифметику `0x11220`, обход дочерних provider-строк `0x11130` и
visibility transition `0x11920` с исходными AniMesh callbacks. Отдельный
@@ -389,7 +395,7 @@ World3D RVA `0x6bf0` вычисляет часы из `timeGetTime()` с игрÐ
RVA `0xbcf0` для остальных. Это подтверждает статическую цепочку вызовов, но не
её исполнение на миссии: связывание интерфейсов, активация устройств и shapes,
остальные ветви `0xbcf0` и
-изменение provider-снимков Rust остаются открытыми. Источник контактного коэффициента прослежен статически,
+автоматическое изменение provider через clock и бюджет Rust остаются открытыми. Источник контактного коэффициента прослежен статически,
но не исполнен. Подробные векторы и статические границы приведены в
[техническом подразделе о provider-состоянии Control](script-vm.md#изменение-provider-состояния-control).
diff --git a/docs/appendices/script-vm.md b/docs/appendices/script-vm.md
index 9ff358f..314d86f 100644
--- a/docs/appendices/script-vm.md
+++ b/docs/appendices/script-vm.md
@@ -653,7 +653,41 @@ oracle вызывает оригинальные `FUN_10010ba0` (RVA `0x10ba0`),
через `FUN_10012ce0`. Бюджетная часть активной ветви проверена на ограниченном
хосте класса `10`, как описано ниже. Источник входного времени и порядок его
доставки до обработчика установлены статически;
-Rust продолжает читать начальные provider snapshots и не моделирует эти изменения.
+Rust ещё не вызывает этот бюджетный цикл; отдельно перенесён прямой путь
+изменения одной строки `0x10f30`, описанный ниже.
+
+#### Прямое изменение одной строки в Rust
+
+`apply_loaded_mission_control_node_delta(engine, handle, key, delta)` моделирует
+`0x10f30` с нулевым четвёртым аргументом: накопление анимационного изменения
+`+0x10` и detached-ветвь сюда не входят. Максимум читается из исходной NDP
+строки при подтверждённых единичных множителях Unit DAT. Сначала складываются
+`f32` amount и delta, результат ограничивается `0..maximum`; при изменении
+native `+0x590` получает `max(0, total + (new - old))`, `+0x14` — долю
+`new / maximum`, а `+0x598` становится dirty. Флаг `+0x28 & 0x10` отмечает
+истощение и снимается при пополнении. Количество `+0x0c` этим методом не
+обновляется: native записывает его позже в `0x11220`. Конструктор владельца
+`0x6bf0` начинает с `+0x598 = 1`, а `0xf940` оставляет этот dirty-флаг:
+первый агрегатный проход нужен даже до новой добавки. Rust loader сохраняет
+это начальное значение.
+
+Rust сохраняет начальные и текущие поля отдельно. Возвращаемая
+`ControlNodeProviderPublication` содержит ключ и значение для обязательного
+callback узла с selector `0x200`; автоматической доставки в AniMesh пока нет.
+Полный пересчёт стадии `0x11130`/`0x11220`, видимости и FX также не вызывается.
+Истощение корня или критического узла возвращает `UnsupportedNodeLifecycle`
+до записи: состояние владельца `+0x550`, отложенная гибель и сопутствующие
+callbacks ещё не реализованы. Отсутствие MSH flags, provider aggregate,
+неподдержанный численный диапазон или неверный handle тоже дают явную ошибку
+без частичных изменений.
+
+Rust-тест повторяет native последовательность количества
+`40 → 60 → 50 → 100 → 0 → 10` при максимуме `100`, проверяет публикации,
+неизменное обработанное количество и новые результаты `0xe00`/`0x1002`.
+Native oracle отдельно подтверждает сохранение `+0x0c = 40` и снятие флага
+истощения при последнем пополнении. Для amount `-0.0` с отрицательной добавкой
+native записывает биты `+0.0`, но сравнение количеств считает их равными:
+доля, флаги, итог и callback остаются прежними. Этот случай сохранён и в Rust.
#### Бюджет и обновление устройства tag 15
@@ -972,8 +1006,8 @@ Runtime временно собирает mesh-состояния в порядÐ
их с уже упорядоченными NDP provider-строками по общему ordinal. Избыточная NDP
строка или отсутствующий MSH asset получают `initial_mesh_state = None`;
совпадение по `(component_index, source_row_index)` не выполняется. Состояние
-также не меняет существующий `0xe00` query: он читает начальное type-1 поле
-`+0x14` provider-строки, равное `1.0` после нативного конструктора.
+не меняет правило `0xe00` query: он читает текущее type-1 поле `+0x14`
+provider-строки, которое после нативного конструктора равно `1.0`.
### Начальное количество строки provider
@@ -1005,15 +1039,17 @@ callback-и пришли в порядке `[0, 1, 2, 3]`. Отдельный п
`0x8310` имеет ветку установки scale. AniMesh constructor (`AniMesh.dll`,
SHA-256 `65659bf67f20e5be77d67a5b2f59968f61b94293143807fa59ca451c560c4f7e`,
RVA `0x68a0`) читает три DLL scale globals, которые после LoadLibrary в oracle
-равны `1.0`. В Rust одна `initial_amount_bits` запись
-сохраняет это общее начальное количество; полный update, который меняет
-amount и обработанное предыдущее значение, пока не моделируется.
+равны `1.0`. В Rust `initial_amount_bits` сохраняет это общее начальное
+количество отдельно от текущего и последнего обработанного. Прямой delta API
+меняет только текущее количество; стадийный update пока не перенесён.
Licensed full-load regression `full_load_builds_effective_control_device_table_for_mine_unit_dat`
проверяет значения настоящего `min_l_n1.dat`: корневой provider row `0` даёт
`1.0`, а row `1` примонтированного `EXTO` (общий ordinal `22`) даёт `6000.0`.
-Проверка использует исходные CTL/NDP/MSH и не делает выводов о динамическом
-изменении этих строк.
+Проверка использует исходные CTL/NDP/MSH, затем явно уменьшает количество
+строки tag-26 устройства вдвое. Rust `0xe00` и `0x1002` дают `0.5`, и обычный
+шаг runtime сохраняет эту долю. Это вызов прямого API, а не полный живой
+Control tick или автоматическая публикация изменения в AniMesh.
Native-часть этих ABI проверок воспроизводит
`behavior_distributor_tick_native_oracle.cs` на синтетически выделенной памяти