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

+20 -11
View File
@@ -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`: функция