fix(runtime): execute the first supported Init event
Docs Deploy / Build and Deploy MkDocs (push) Successful in 38s
Docs Deploy / Build and Deploy MkDocs (push) Successful in 38s
This commit is contained in:
8 files changed
+1448
-106
No files matched your search
@@ -44,6 +44,58 @@ state ещё не восстановлены.
|
||||
вывод по одному известному `ai.dll`, а не утверждение о совпадении во время
|
||||
исполнения.
|
||||
|
||||
Для начального сценарного события закрыт более узкий путь. В проверенной GOG
|
||||
сборке `ai.dll` SHA-256
|
||||
`c19cd6cd31cd2896f8c4ba0f0e700dd3408aec8182daaf4863d98a7d233a2abc` функции
|
||||
`FUN_10011f40` (RVA `0x11f40`) и `FUN_10011f10` (RVA `0x11f10`) выбирают первое
|
||||
имя-событие C-string `Init` и запускают его инструкции по порядку. Для координат
|
||||
из TMA найден и проверен ещё один участок: `iron3d.dll` SHA-256
|
||||
`d1dc4ea8535e2069b0a05c9e8be2724dd438ba44cca7a83007d8b2e50f9e35fa`,
|
||||
`FUN_100392e0` (RVA `0x392e0`) выполняет x87 `FISTP qword` и передаёт младшие
|
||||
DWORD координат пятым и шестым аргументами `CreateSuperAI`. Затем
|
||||
`ai.dll!FUN_10005c70` (RVA `0x5c70`) преобразует DWORD в `float`, а `Handler(19)`
|
||||
возвращает его к DWORD усечением.
|
||||
|
||||
Две x86-проверки вызвали эти оригинальные DLL-функции на изолированной
|
||||
синтетической памяти. Caller oracle подтвердил AutoDemo-координаты
|
||||
`(500.2857, 751.8217) -> (500, 752)`, ties-to-even в nearest-режиме и переход
|
||||
`-0.6 -> 0xffffffff`. AI oracle проверил оба набора AutoDemo anchor-ов,
|
||||
дублирующий `Init`, имя `Init\\0suffix\\0`, отсутствие события, а также
|
||||
нативную связку `FUN_10005c70` → `Handler(19)`: DWORD `(0xffffffff, 10001)` стал
|
||||
полями `(2^32, 10001.0)` и varset-записями `(0, 10001, 2)`. Эти проверки
|
||||
подтверждают только изолированные участки ABI.
|
||||
|
||||
В одном read-only snapshot запущенной GOG AutoDemo были связаны записи кланов
|
||||
Iron3D и указатели `GetSuperAI` из `ai.dll` (таблица RVA `0x55398`). Клан 0 имел
|
||||
исходные float-координаты `(500.2857, 751.8217)` и поля AI
|
||||
`(+0x80, +0x84, +0x7c) = (500.0, 752.0, 0)`; клан 1 имел `(728.0, 449.0)` и
|
||||
`(728.0, 449.0, 1)`. Первый набор связывает те же значения в одном процессе и
|
||||
выбирает ближайшее округление среди направлений округления x87. Синтетические
|
||||
tie-векторы проверяют, как сам `FISTP` реагирует на каждый RC, но не измеряют
|
||||
control word процесса.
|
||||
|
||||
Отдельно проверены загрузка лицензированного AutoDemo в Rust и preview
|
||||
лицензированной кампании. AutoDemo даёт raw TMA anchor-ы
|
||||
`[(500.2857, 751.8217), (728.0, 449.0)]` и записи `[(500, 752, 0),
|
||||
(728, 449, 1)]`; preview кампании сохраняет package и статус `Unsupported`,
|
||||
не применяя частичные записи. Это подтверждает загрузчик и узкий Init resolver
|
||||
Rust, но не доказывает, что штатный host вызывает `Init` при старте оригинальной
|
||||
миссии.
|
||||
|
||||
Нативный конструктор показывает предупреждение при координате выше `10000`, но
|
||||
продолжает работу. Rust моделирует числовую запись, а не это UI-предупреждение;
|
||||
на первом `FISTP qword` он явно завершает загрузку ошибкой для NaN, infinity и
|
||||
значений вне signed-qword диапазона. В первом событии `Init` Rust поддерживает
|
||||
только action-форму `Handler(19)` (`control word` и `result reference` равны
|
||||
`0xffffffff`). Неизвестная инструкция даёт `Unsupported` в preview, не применяя
|
||||
накопленные частичные записи; при полной загрузке это ошибка. Это ограничение
|
||||
Rust исполнителя, не правило оригинального dispatcher-а. Ошибочные ссылки и
|
||||
типы остаются ошибками в обоих режимах.
|
||||
|
||||
Открыты вызов `Init` при штатном старте Iron3D и проверка другой миссии с
|
||||
непустым `Init`. Не восстановлены host-ingress `Init` в игровом цикле и общий
|
||||
dispatcher остальных событий.
|
||||
|
||||
Для `Handler(30)` отдельно подтверждены обратный вызов `iron3d.dll` RVA
|
||||
`0x611d0` (SHA-256 `d1dc4ea8535e2069b0a05c9e8be2724dd438ba44cca7a83007d8b2e50f9e35fa`),
|
||||
начальные поля IGame и проверки режима/состояния. Обработчик выбора миссии
|
||||
|
||||
Reference in new issue
Block a user