feat(runtime): run resource schedules during world steps
Docs Deploy / Build and Deploy MkDocs (push) Successful in 34s

This commit is contained in:
Valentin Popov committed 2026-10-29 15:58:33 +04:00
1 parent 5600ebb388
commit e29e3c6bb9
5 files changed
+245 -49

No files matched your search

+6 -3
View File
@@ -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` используют значения выбранного
+13 -5
View File
@@ -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.
### Добавление и нормализация долей