aboutsummaryrefslogtreecommitdiff
path: root/docs/tomes
diff options
context:
space:
mode:
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`, затем