fix(runtime): load research tables for every AI owner
Docs Deploy / Build and Deploy MkDocs (push) Successful in 38s

This commit is contained in:
Valentin Popov committed 2026-10-31 11:43:24 +04:00
1 parent 0b2184429f
commit 2a3b826c26
3 files changed
+108 -62

No files matched your search

+26 -14
View File
@@ -905,22 +905,34 @@ arg1 следующего вызова. `AddNewObjectToGame` принимает
`FUN_10002a30` (RVA `0x2a30`, `RET 8`) записывает его в `inner+8`. TMA tag
`row+0x20` ограничивает число вызовов AI slot `+0x38`, но не задаёт владельца.
Создание AI не фильтруется по наличию сценарного пути. В `iron3d.dll` SHA-256
`d1dc4ea8535e2069b0a05c9e8be2724dd438ba44cca7a83007d8b2e50f9e35fa`
`FUN_1005ff40` (RVA `0x5ff40`) проходит записи кланов и вызывает для каждой
`FUN_100392e0` (RVA `0x392e0`); в `ai.dll` SHA-256
`c19cd6cd31cd2896f8c4ba0f0e700dd3408aec8182daaf4863d98a7d233a2abc`
`CreateSuperAI` (RVA `0xf710`) выделяет AI и вызывает конструктор по RVA
`0x1000` без проверки пути сценария. Создание исследовательского контекста
следует за успешным созданием AI и требует включённого флага создания
исследований и непустого `second_resource.path` до первого NUL. Переданный в
`descriptor[0]` индекс клана, а не `second_resource.tag`, задаёт владельца;
тег остаётся счётчиком начальных вызовов AI slot `+0x38`.
В Rust эта граница представлена только загрузкой таблиц. Полный
`load_mission` требует явный `MissionStartupInput { queue_time_ms,
research_creation_gate }`; gate не выводится из `MissionMode` или имени пути.
При `true` загрузчик проходит по успешно разобранным пакетам сценариев, берёт
реальный `second_resource.path` соответствующего TMA-клана до первого NUL,
отклоняет не-ASCII путь, затем сохраняет отдельный `ResearchTrfDocument` с
`clan_index` и нормализованным путём. Пустая строка, выключенный gate или
отсутствие пакета сценариев пропускают чтение. Повтор одного пути разными
владельцами приводит к отдельным буферам строк TRF0. Обычные тесты на
искусственных данных проверяют владельцев, повторное декодирование, пропуски,
ошибки и откат; игнорируемая проверка оригинальных ресурсов связывает реальные
`Campaign.00/Mission.01` пары путей с индексами владельцев. Это не загружает
полный исследовательский контекст оригинала.
Успешно разобранный пакет сценариев здесь обозначает только границу текущей
настройки Rust, а не совпадение с полным нативным жизненным циклом
`CreateSuperAI`.
research_creation_gate }`; этот флаг не выводится из `MissionMode` или имени
пути. Если флаг равен `true`, загрузчик проходит по существующим
`MissionAiStartupState` всех TMA-кланов, в том числе без сценарного пакета,
читает их `second_resource.path` до первого NUL и отклоняет не-ASCII путь.
Пустая строка пропускается; выключенный флаг и статический preview не читают
TRF. На каждого
владельца сохраняется отдельный `ResearchTrfDocument` с нормализованным путём,
даже когда разные кланы указывают на один файл. Обычные тесты на искусственных
данных проверяют владение у кланов со сценариями и без них, повторное
декодирование, пропуски, ошибки и откат; игнорируемая проверка оригинальных
ресурсов связывает реальные `Campaign.00/Mission.01` пары путей с индексами владельцев.
Rust пока сохраняет только декодированные данные и связь с владельцем: он не
создаёт полный исследовательский контекст, не строит AI-каталог и не исполняет
`Handler(43)`.
Нативный metadata loader нельзя считать простым копированием таблицы. В GOG
`Behavior.dll` (SHA-256