fix(runtime): load research tables for every AI owner
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:
3 files changed
+108
-62
No files matched your search
@@ -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
|
||||
|
||||
+20
-11
@@ -579,8 +579,14 @@ let cost = calc_full_research_cost(&candidate, &table)?;
|
||||
штатный Handler(43) и запуск миссии здесь не проверялись.
|
||||
|
||||
Владелец начальной записи исследования — индекс текущего прохода по кланам.
|
||||
Движок сохраняет его в `descriptor[0]`, а затем переносит в контекст, чтобы
|
||||
связать запрос с AI-данными того же клана.
|
||||
В GOG-сборке `iron3d.dll!FUN_1005ff40` (RVA `0x5ff40`) проходит записи кланов
|
||||
и вызывает для каждой `FUN_100392e0` (RVA `0x392e0`), которая создаёт AI;
|
||||
`ai.dll!CreateSuperAI` (RVA `0xf710`) выделяет объект и вызывает конструктор
|
||||
по RVA `0x1000`, не проверяя наличие сценарного пути. Для исследовательского
|
||||
пути нужны отдельный флаг включения и непустой `second_resource.path`; наличие
|
||||
сценарного пакета условием не является. Индекс клана сохраняется в
|
||||
`descriptor[0]` и переносится в контекст, чтобы связать запрос с AI-данными
|
||||
того же клана.
|
||||
|
||||
Это значение отдельно от аргумента 1 `AddNewObjectToGame`, берущегося из
|
||||
`GetNetPlayerNum`, и от TMA-тега `second_resource`, задающего число вызовов
|
||||
@@ -590,12 +596,14 @@ Handler(43) и штатный запуск миссии остаются неп
|
||||
|
||||
Полный Rust-загрузчик принимает явный `MissionStartupInput`: время очереди
|
||||
и отдельный `research_creation_gate`. Режим миссии и имя файла этот
|
||||
флаг не заменяют. При включённом флаге таблица загружается только для клана,
|
||||
чей сценарный пакет уже прочитан и успешно разобран; путь берётся из второго
|
||||
ресурса этого клана как C-строка. Пустая C-строка пропускается, а не-ASCII
|
||||
байты дают явную ошибку. Клан индексируется по порядку в TMA, тег ресурса на
|
||||
владение не влияет. Если несколько кланов указывают на один файл, каждый
|
||||
получает отдельно декодированную таблицу с собственными строками TRF0.
|
||||
флаг не заменяют. При включённом флаге загрузчик использует уже имеющееся
|
||||
`MissionAiStartupState` каждого TMA-клана, даже если у него нет сценарного
|
||||
пакета; путь берётся из второго ресурса как C-строка до первого NUL. Пустой
|
||||
путь и выключенный флаг пропускают чтение, а не-ASCII байты дают явную ошибку.
|
||||
Предпросмотр тоже не читает TRF. Клан индексируется по порядку в TMA, а тег
|
||||
`second_resource` задаёт число слотов AI, не владельца. Если несколько кланов
|
||||
указывают на один файл, каждый получает отдельно декодированную таблицу со
|
||||
своими строками TRF0.
|
||||
|
||||
```rust
|
||||
MissionStartupInput {
|
||||
@@ -604,9 +612,10 @@ MissionStartupInput {
|
||||
}
|
||||
```
|
||||
|
||||
Это сохраняет исходные таблицы и их связь с владельцами для следующих этапов.
|
||||
Оно ещё не создаёт полный исследовательский контекст оригинала и не запускает
|
||||
`Handler(43)`; эта обработка пока остаётся явно неподдержанной.
|
||||
Это сохраняет декодированные таблицы и связь с владельцами для следующих
|
||||
этапов. Оно ещё не создаёт полный исследовательский контекст оригинала, не
|
||||
строит AI-каталог и не запускает `Handler(43)`; эти части пока не
|
||||
восстановлены.
|
||||
|
||||
Отдельная frozen-матрица непосредственно вызвала chooser GOG `ai.dll` SHA-256
|
||||
`c19cd6cd31cd2896f8c4ba0f0e700dd3408aec8182daaf4863d98a7d233a2abc`: функция
|
||||
|
||||
Reference in new issue
Block a user