fix(runtime): warm behavior before mission Init
Docs Deploy / Build and Deploy MkDocs (push) Successful in 40s

This commit is contained in:
Valentin Popov committed 2026-10-20 05:15:11 +04:00
1 parent 31fd9d2ea9
commit 89a0d1da61
6 files changed
+866 -48

No files matched your search

+30
View File
@@ -177,6 +177,36 @@ Rust исполняет только подтверждённую форму э
событие считается исполненным без записей. Остальные события пока не образуют
исполняемую VM.
### Первый запуск сценария
До регулярной работы Behavior настраивает расписание своего первого шага. Он
берёт текущее 32-битное время игровой очереди и назначает проверку через три
интервала по 64 мс, добавляя небольшую случайную задержку от 0 до 63 мс. Эта
задержка нужна каждому экземпляру, но случайные числа берутся из общего
генератора, поэтому порядок запуска кланов влияет на их значения. При первой
подготовке controller также очищает несколько внутренних слов. В проверенном
повторном вызове до назначенного срока ненулевое сохранённое время оставило
срок прежним, не потребовало нового случайного числа и не очистило эти слова;
поведение после срока пока неизвестно.
В оригинале вызов идёт через обратный вызов движка: Iron3D сначала создаёт
SuperAI для записей кланов, затем обновляет Behavior и ищет `Init` для
соответствующего AI. Если `Init` не найдено, одноразовая метка остаётся
выключенной. Если оно найдено, диспетчер запускается только при свободной защите
от повторного входа; при занятой защите вызов пропускается, но одноразовая метка
всё равно устанавливается. В полной загрузке Rust вызывающая сторона передаёт
значение времени очереди; после регистрации объектов загрузчик последовательно
подготавливает каждый сценарный пакет и выполняет только подтверждённые действия
`Handler(19)` из первого `Init`. Статический просмотр не запускает Behavior, но
может сохранить подтверждённые записи `Init` в сценарном varset.
Это полезное начало сценария, но ещё не целая игровая жизнь AI. Текущий runtime
не воспроизводит аргумент обратного вызова в `AI+0x3fc`, защиту от повторного
входа `AI+0x78`, одноразовую метку `AI+0x8a8` или обновления Behavior на игровых
тиках. Он также не подменяет очередь оригинала: вызывающая сторона сама
передаёт время, а локальный генератор Rust пока учитывает только случайные
числа этого восстановленного шага.
Первый часто встречающийся table entry с side effect — `Handler(2)` (176
records в corpus). Он берёт active instruction, разрешает семь slots через
varset, приводит три значения к float по observed kinds `5`/`3`, затем