aboutsummaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/appendices/knowledge-boundaries.md9
-rw-r--r--docs/appendices/script-vm.md18
-rw-r--r--docs/tomes/02-architecture.md7
-rw-r--r--docs/tomes/06-behavior.md23
4 files changed, 41 insertions, 16 deletions
diff --git a/docs/appendices/knowledge-boundaries.md b/docs/appendices/knowledge-boundaries.md
index 58deb31..00b261c 100644
--- a/docs/appendices/knowledge-boundaries.md
+++ b/docs/appendices/knowledge-boundaries.md
@@ -380,11 +380,14 @@ RVA `0xbcf0` для остальных. Это подтверждает стат
Отдельный API `advance_loaded_mission_resources` принимает явное время очереди
и обновляет представленные поля `CurrentOre`, строк распределителя и Control
-selector `1`. API не подключён к игровому циклу и не обновляет Control amount,
-профили, special object-state gate или жизненный цикл объектов. Если обязательный
+selector `1`. Тот же расчёт вызывают `step_headless` и `frame` с явным
+clock очереди; подготовка ресурсов и мировой шаг завершаются атомарно.
+Оконное приложение пока использует static preview. Этот путь не обновляет
+Control amount, профили или special object-state gate. Если обязательный
запрос позднего объекта не поддержан, транзакция возвращает ошибку без применения
подготовленных изменений. AutoDemo-тест подтверждает связь настоящих профилей с
-этим шагом, но не полный паритет миссии; отдельный aggregate getter Behavior RVA
+этим шагом и проверяет откат при ошибке ресурсов или мировой очереди,
+но не полный паритет миссии; отдельный aggregate getter Behavior RVA
`0xa490` в oracle не исполнен.
Behavior selectors `0x1002` и `0x1005` используют значения выбранного
diff --git a/docs/appendices/script-vm.md b/docs/appendices/script-vm.md
index 69ea54f..dc42959 100644
--- a/docs/appendices/script-vm.md
+++ b/docs/appendices/script-vm.md
@@ -408,9 +408,11 @@ bundle, но остальные потребители исходного гло
В Rust также нет значения аргумента в `AI+0x3fc`, recursion guard `AI+0x78`
или одноразового latch `AI+0x8a8`. Поэтому это связанный начальный поднабор, а
не полная активация SuperAI. После полной загрузки узкая Rust-реализация
-вызывается явно через `advance_loaded_mission_resources(engine, queue_time_ms)`;
-runtime не читает системную очередь, а приложение пока не вызывает API из
-игрового цикла. Шаг использует разрешённые handles и представленные snapshots
+вызывается из `step_headless(engine, input, queue_time_ms)` и
+`frame(engine, queue_time_ms)`. Отдельный
+`advance_loaded_mission_resources(engine, queue_time_ms)` остаётся доступен
+для прямого ресурсного шага. Runtime не читает системную очередь, а оконное
+приложение пока использует static preview. Шаг использует разрешённые handles и представленные snapshots
профилей и Control, поэтому не воспроизводит отсутствующие в них callbacks. При
ошибке ограниченного `Init` Rust отклоняет полную загрузку и сохраняет прежний
мир и состояние генератора; такая политика отката принадлежит Rust loader-у.
@@ -479,8 +481,14 @@ selector `1` на интерфейсе получателя становится
только для полного режима; preview остаётся статическим. Явный API
`advance_loaded_mission_resources` использует очередь времени, расписание,
профили и представленные Control-таблицы, чтобы исполнить этот ограниченный
-шаг над загруженным состоянием. `step_headless` по-прежнему шагает только
-`World`.
+шаг над загруженным состоянием. `step_headless` и `frame` требуют явный
+`u32` clock и используют ту же подготовку: ресурсные изменения, расписания и
+RNG остаются временными до успешного `World::step`. Ошибка ресурсов не
+продвигает мир; ошибка мировой очереди не публикует ресурсные изменения.
+Игнорируемый тест `headless_step_runs_resource_schedule_and_rolls_back_both_error_paths`
+на AutoDemo проверяет равенство срока, исполнение следующего шага и обе ветви
+отказа, включая отсутствие Control-таблицы у позднего клана и устаревший handle
+в очереди. Это не запускает отдельный clock Control или полную миссионную VM.
### Добавление и нормализация долей
diff --git a/docs/tomes/02-architecture.md b/docs/tomes/02-architecture.md
index 0d0ea11..527d7b2 100644
--- a/docs/tomes/02-architecture.md
+++ b/docs/tomes/02-architecture.md
@@ -363,6 +363,13 @@ CollObject, Control и PhysicalModel, пропуская отсутствующÐ
Статическая цепочка ещё не доказывает исполнение активного Control update на
миссии. Rust пока сохраняет начальные provider-снимки и не изменяет их этим путём.
+В текущем runtime `step_headless` и `frame` получают время очереди явным
+аргументом `u32`. По нему запускается представленный ресурсный планировщик
+Behavior, после чего обрабатываются очередь мира и отложенные удаления.
+Ресурсные изменения публикуются после успешного мирового шага, поэтому ошибка
+не оставляет мир и ресурсы на разных шагах. Это начало расчётного цикла;
+отдельное обновление Control, общая VM и движение ещё требуют подключения.
+
## World3D
World3D связывает игровые объекты, события, время, ввод, камеру, сетевые
diff --git a/docs/tomes/06-behavior.md b/docs/tomes/06-behavior.md
index 0ebbbf7..84f4f6e 100644
--- a/docs/tomes/06-behavior.md
+++ b/docs/tomes/06-behavior.md
@@ -202,17 +202,17 @@ SuperAI для записей кланов, затем обновляет Behavi
Это полезное начало сценария, но ещё не целая игровая жизнь AI. Текущий runtime
не воспроизводит аргумент обратного вызова в `AI+0x3fc`, защиту от повторного
-входа `AI+0x78`, одноразовую метку `AI+0x8a8` или обновления Behavior на игровых
-тиках. При этом один конкретный шаг Behavior — распределение ресурсов — уже
-исполнен на исходной DLL с искусственными объектами. Rust пока не вызывает
-регулярный шаг: игровой мир ещё не предоставляет нужные ресурсные интерфейсы.
+входа `AI+0x78`, одноразовую метку `AI+0x8a8` или полное обновление Behavior на игровых
+тиках. Распределение ресурсов исполнено на исходной DLL с искусственными
+объектами и подключено к Rust `step_headless`: явное время очереди определяет,
+какой клан должен выполнить очередной ресурсный шаг.
При полной загрузке Rust уже восстанавливает членство объектов в клановых
списках Behavior и задаёт их начальные доли. Остальные слова записи хранятся
сырыми: семантика только первого из пяти слов хвоста установлена для
нормализации.
Runtime также не подменяет очередь оригинала: вызывающая сторона сама передаёт
время, а локальный генератор Rust пока учитывает только случайные числа
-восстановленного стартового шага.
+восстановленного стартового шага и ресурсного планировщика.
### Откуда берутся объекты распределителя
@@ -355,9 +355,16 @@ Control selector `1`; неподдержанное свойство, запроÑ
арифметическое значение возвращает ошибку. Обновления нескольких кланов, их
расписания и RNG фиксируются одной транзакцией: если обязательный запрос
позднего клана не разрешён, ранее подготовленные изменения остаются
-неприменёнными. Приложение пока не вызывает
-этот API из игрового цикла, а динамические callbacks, которые переносят
-количество между Control provider-строками, ещё не моделируются. Поэтому это
+неприменёнными. Обычные `step_headless(engine, input, queue_time_ms)` и
+`frame(engine, queue_time_ms)` запускают этот расчёт до обработки очереди мира.
+Они сначала готовят ресурсные изменения, затем выполняют шаг мира и публикуют
+ресурсное состояние после его успеха. Ошибка любой стадии сохраняет прежние
+ресурсы; ошибка подготовки также не продвигает мировой tick. До срока
+планировщика большие таблицы ресурсов не копируются.
+
+Оконное приложение пока запускает static preview и не вызывает этот расчётный
+путь. Динамические callbacks, которые переносят количество между Control
+provider-строками, ещё не моделируются. Поэтому это
исполняемый загруженный resource step, а не полный симулятор миссии.
Для настоящих ресурсов AutoDemo тест проходит несколько временных точек: