aboutsummaryrefslogtreecommitdiff
path: root/docs/tomes
diff options
context:
space:
mode:
authorValentin Popov <valentin@popov.link>2026-10-20 04:15:11 +0300
committerValentin Popov <valentin@popov.link>2026-10-20 04:15:11 +0300
commit89a0d1da6180767dd20fccc47227580b83f9a874 (patch)
tree8daaa0d1ef4061084b998be09c33d0affaa85172 /docs/tomes
parent31fd9d2ea9b7fb01a952eef38a2af31eceebbe86 (diff)
downloadfparkan-89a0d1da6180767dd20fccc47227580b83f9a874.tar.xz
fparkan-89a0d1da6180767dd20fccc47227580b83f9a874.zip
fix(runtime): warm behavior before mission Init
Diffstat (limited to 'docs/tomes')
-rw-r--r--docs/tomes/06-behavior.md30
1 files changed, 30 insertions, 0 deletions
diff --git a/docs/tomes/06-behavior.md b/docs/tomes/06-behavior.md
index f5c7a7b..62c7b56 100644
--- a/docs/tomes/06-behavior.md
+++ b/docs/tomes/06-behavior.md
@@ -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`, затем