aboutsummaryrefslogtreecommitdiff
path: root/docs/tomes
diff options
context:
space:
mode:
authorValentin Popov <valentin@popov.link>2026-10-20 03:11:35 +0300
committerValentin Popov <valentin@popov.link>2026-10-20 03:11:35 +0300
commit31fd9d2ea9b7fb01a952eef38a2af31eceebbe86 (patch)
tree8ad10aa8b2ab02ed298c9b62b050c5fa73d7d382 /docs/tomes
parentdc8be18458d6bd69e8b47b10bcbe7ddf4ed257f2 (diff)
downloadfparkan-31fd9d2ea9b7fb01a952eef38a2af31eceebbe86.tar.xz
fparkan-31fd9d2ea9b7fb01a952eef38a2af31eceebbe86.zip
fix(runtime): execute the first supported Init event
Diffstat (limited to 'docs/tomes')
-rw-r--r--docs/tomes/06-behavior.md26
1 files changed, 26 insertions, 0 deletions
diff --git a/docs/tomes/06-behavior.md b/docs/tomes/06-behavior.md
index 3742772..f5c7a7b 100644
--- a/docs/tomes/06-behavior.md
+++ b/docs/tomes/06-behavior.md
@@ -151,6 +151,32 @@ handler contracts и runtime traces.
handler лишь инициирует execution context (`+0x50 = 1`); его gameplay meaning
пока не назван.
+Когда в `.scr` есть событие `Init`, сценарная машина ищет его имя как C-строку:
+сравнение учитывает регистр, останавливается на первом NUL, а среди повторов
+выбирает первое событие. В проверенном AutoDemo это событие содержит один
+`Handler(19)`. Он записывает в переменные клана координаты его основания и номер
+клана:
+
+```text
+первый Init -> действия по порядку -> ClanBaseX, ClanBaseY, ClanID
+```
+
+На пути к этим переменным координаты сначала округляются оригиналом до ближайшего
+целого с правилом ties-to-even, затем сохраняется младшее 32-битное слово.
+Например, `-0.6` даёт `0xffffffff`. AI хранит это слово как `float`, поэтому
+`0xffffffff` становится `2^32`; `Handler(19)` усекает значение и снова берёт
+младшие 32 бита, что даёт `0`. Значение `10001` также проходит дальше: оригинал
+показывает предупреждение для чисел выше `10000`, но не отменяет создание AI.
+
+Rust исполняет только подтверждённую форму этого действия. Поддержанные записи
+применяются к состоянию лишь после успешного прохода всего первого `Init`.
+Если встретилась неподдержанная форма, preview сохраняет пакет, сообщает
+`Unsupported` и оставляет значения по умолчанию; при полной загрузке та же форма
+становится ошибкой. Это политика Rust для ограниченного исполнителя, а не правило
+оригинального обработчика. Отсутствующее событие не создаёт записей; пустое
+событие считается исполненным без записей. Остальные события пока не образуют
+исполняемую VM.
+
Первый часто встречающийся table entry с side effect — `Handler(2)` (176
records в corpus). Он берёт active instruction, разрешает семь slots через
varset, приводит три значения к float по observed kinds `5`/`3`, затем