feat(runtime): run resource schedules during world steps
Docs Deploy / Build and Deploy MkDocs (push) Successful in 34s
Docs Deploy / Build and Deploy MkDocs (push) Successful in 34s
This commit is contained in:
5 files changed
+245
-49
No files matched your search
@@ -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` используют значения выбранного
|
||||
|
||||
@@ -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.
|
||||
|
||||
### Добавление и нормализация долей
|
||||
|
||||
|
||||
@@ -363,6 +363,13 @@ CollObject, Control и PhysicalModel, пропуская отсутствующ
|
||||
Статическая цепочка ещё не доказывает исполнение активного Control update на
|
||||
миссии. Rust пока сохраняет начальные provider-снимки и не изменяет их этим путём.
|
||||
|
||||
В текущем runtime `step_headless` и `frame` получают время очереди явным
|
||||
аргументом `u32`. По нему запускается представленный ресурсный планировщик
|
||||
Behavior, после чего обрабатываются очередь мира и отложенные удаления.
|
||||
Ресурсные изменения публикуются после успешного мирового шага, поэтому ошибка
|
||||
не оставляет мир и ресурсы на разных шагах. Это начало расчётного цикла;
|
||||
отдельное обновление Control, общая VM и движение ещё требуют подключения.
|
||||
|
||||
## World3D
|
||||
|
||||
World3D связывает игровые объекты, события, время, ввод, камеру, сетевые
|
||||
|
||||
@@ -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 тест проходит несколько временных точек:
|
||||
|
||||
Reference in new issue
Block a user