fix(runtime): execute the first supported Init event
Docs Deploy / Build and Deploy MkDocs (push) Successful in 38s

This commit is contained in:
Valentin Popov committed 2026-10-20 04:11:35 +04:00
1 parent dc8be18458
commit 31fd9d2ea9
8 files changed
+1448 -106

No files matched your search

+26
View File
@@ -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`, затем