aboutsummaryrefslogtreecommitdiff
path: root/docs/appendices/script-vm.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/appendices/script-vm.md')
-rw-r--r--docs/appendices/script-vm.md40
1 files changed, 29 insertions, 11 deletions
diff --git a/docs/appendices/script-vm.md b/docs/appendices/script-vm.md
index bd363e5..60d15e1 100644
--- a/docs/appendices/script-vm.md
+++ b/docs/appendices/script-vm.md
@@ -695,8 +695,8 @@ provider остаётся с заданным тестом значением `0
текущего Control stage/sentinel. Неизвестный узел даёт ошибку без частичной
записи; callback отражён в CPU-проекции, но GPU/window path ещё не подключён.
Delta API не вызывает стадийный проход. Отдельный single-node API для
-`0x11220` описан в разделе о стадиях; обход `0x11130`, видимость и FX остаются
-вне этого исполнения.
+`0x11220` и отдельный API обхода потомков `0x11130` описаны в разделе о
+стадиях; видимость и FX callbacks остаются вне этого исполнения.
Истощение корня или критического узла возвращает `UnsupportedNodeLifecycle`
до записи: состояние владельца `+0x550`, отложенная гибель и сопутствующие
callbacks ещё не реализованы. Отсутствие MSH flags, provider aggregate,
@@ -964,15 +964,33 @@ Native oracle и Rust-тест также проверяют двухстадиÐ
стадии и отсутствие такого обновления при защищённом раннем выходе. Licensed
тест повторяет отдельный переход `0 → 1` на двухстадийном узле настоящего
`min_l_n1.dat`, с `update_effects = false`. Полный игровой вызов не подменяется
-этим режимом: FX, lifecycle, видимость и обход потомков ещё требуют реализации.
-
-После перехода родительского ряда `FUN_10011130` находит более поздние строки
-с его индексом в поле parent. Обход идёт в глубину: сначала ребёнок и всё его
-поддерево, затем следующий ребёнок. Рост стадии или истощение родителя снимает
-количество с дочерних строк; защитные флаги `0x40` и `0x100` меняют часть
-обработки флагов, но не останавливают снятие количества и обход потомков в
-проверенных входах. Нативный тест задал родителя с дочерними рядами, снял их
-количество и проверил порядок вызовов и значение stage snapshot.
+этим режимом: FX, lifecycle и видимость всё ещё требуют реализации; обход
+потомков доступен отдельным CPU API и пока не подключён к игровому циклу.
+
+`FUN_10011130` сохраняет старую стадию, вызывает `0x11220`, затем сохраняет
+обновлённые flags родителя для всего прохода. В исследованной сборке
+`0x11130` вызывает `0x11220` по RVA `0x11156`; caller-ы `0x11130` находятся в
+`0x10ba0`, `0x12a40`, `0x12ce0`, `0x13180` и в самой рекурсивной функции.
+`0x10f30` вызывает `0x11220` напрямую по RVA `0x1110f`.
+
+Затем `0x11130` сканирует provider-строки с большим индексом и выбирает строки,
+у которых parent равен текущему ключу. Обход идёт в глубину: сначала ребёнок и
+всё его поддерево, затем следующий ребёнок. Для parents `[-1, 0, 0, 1, 3]`
+порядок callbacks равен `1, 3, 4, 2`. Если стадия родителя выросла или у него
+стоит флаг истощения `0x10`, Control снимает количество с ребёнка. При флагах
+родителя `0xc0` дочернему ряду ставится `0x80`; в обычной ветви ставится `0x100`
+при ухудшении и очищается `0x80`. Дочерний mask `0x140` запрещает только
+перезапись его flags: количество всё равно снимается, и обход продолжается.
+Стадии детей пересчитываются, даже если родитель не ухудшился.
+
+Rust API `propagate_loaded_mission_control_node_stage` выполняет этот обход
+отдельно от single-node `update_loaded_mission_control_node_stage`. Он работает
+с копией provider-таблицы и публикует её только после успешной обработки всех
+потомков. Если в проверяемом суффиксе отсутствуют mesh metadata и поэтому нельзя
+установить parent-связи, либо потомку требуются lifecycle, FX или visibility
+callbacks, API возвращает ошибку и оставляет исходную таблицу без изменений.
+Native oracle использует синтетические NDP/Node38-строки и исходные
+Control/AniMesh callbacks; это не полное исполнение или сравнение миссии.
Переход между обычной стадией и sentinel `stage == count` вызывает
`Control.dll!FUN_10011920`, только если у строки не установлен флаг `0x02`.