diff options
Diffstat (limited to 'docs/tomes/06-behavior.md')
| -rw-r--r-- | docs/tomes/06-behavior.md | 30 |
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`, затем |
