feat(runtime): load clan research tables during startup
Docs Deploy / Build and Deploy MkDocs (push) Successful in 37s
Docs Deploy / Build and Deploy MkDocs (push) Successful in 37s
This commit is contained in:
4 files changed
+737
-103
No files matched your search
@@ -10,8 +10,8 @@ pub use fparkan_material::{
|
|||||||
sample_material_normalized_phase, sample_material_phase, Mat0Document, MaterialCoefficients,
|
sample_material_normalized_phase, sample_material_phase, Mat0Document, MaterialCoefficients,
|
||||||
MaterialError, MaterialPhase, MaterialPhaseSample,
|
MaterialError, MaterialPhase, MaterialPhaseSample,
|
||||||
};
|
};
|
||||||
use fparkan_mission_format::{decode_tma, decode_tma_land_path, ClanBody};
|
use fparkan_mission_format::{decode_tma, decode_tma_land_path};
|
||||||
pub use fparkan_mission_format::{LpString, MissionDocument, MissionError, TmaProfile};
|
pub use fparkan_mission_format::{ClanBody, LpString, MissionDocument, MissionError, TmaProfile};
|
||||||
use fparkan_msh::{decode_msh, validate_msh, ModelAsset, MshError};
|
use fparkan_msh::{decode_msh, validate_msh, ModelAsset, MshError};
|
||||||
use fparkan_nres::{decode as decode_nres, ReadProfile};
|
use fparkan_nres::{decode as decode_nres, ReadProfile};
|
||||||
pub use fparkan_nres::{NresDocument, NresError};
|
pub use fparkan_nres::{NresDocument, NresError};
|
||||||
|
|||||||
+687
-101
File diff suppressed because it is too large.
Load diff
@@ -819,6 +819,34 @@ arg1 следующего вызова. `AddNewObjectToGame` принимает
|
|||||||
`FUN_10002a30` (RVA `0x2a30`, `RET 8`) записывает его в `inner+8`. TMA tag
|
`FUN_10002a30` (RVA `0x2a30`, `RET 8`) записывает его в `inner+8`. TMA tag
|
||||||
`row+0x20` ограничивает число вызовов AI slot `+0x38`, но не задаёт владельца.
|
`row+0x20` ограничивает число вызовов 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`.
|
||||||
|
|
||||||
|
Нативный metadata loader нельзя считать простым копированием таблицы. В GOG
|
||||||
|
`Behavior.dll` (SHA-256
|
||||||
|
`ddfbdbde07832358fe6e35e01c8dba9b58e7313789498b6049ed51d4ed9baf99`) selector
|
||||||
|
`0x204` по RVA `0xa490` обновляет сохранённое float-значение `+0x678`. В GOG `Control.dll`
|
||||||
|
(SHA-256 `bcb86318089028548a178b03a21accdce15df0cc85ddd91674cf3c2f55012c6e`)
|
||||||
|
selector `0x36` проходит цепочку RVA `0x31af0` → `0xe6c0` и записывает в общую
|
||||||
|
ячейку памяти по RVA `0x434bc`; selector `0x91` выполняет одноразовую
|
||||||
|
инициализацию, только если функция ещё не выполнила её. В Rust пока хранятся
|
||||||
|
только декодированные TRF-данные и сведения о владельце: эти побочные записи,
|
||||||
|
очередь и lifetime контекста не моделируются.
|
||||||
|
|
||||||
Открыты runtime-выполнение Handler(43), создание и lifetime research context,
|
Открыты runtime-выполнение Handler(43), создание и lifetime research context,
|
||||||
включение factory-цепочки в полный штатный startup миссии, построение AI
|
включение factory-цепочки в полный штатный startup миссии, построение AI
|
||||||
candidate list и штатный порядок кандидатов, live x87 policy,
|
candidate list и штатный порядок кандидатов, live x87 policy,
|
||||||
|
|||||||
@@ -536,6 +536,26 @@ AI-слота `+0x38`. Передача поля подтверждена по
|
|||||||
Handler(43) и штатный запуск миссии остаются непроверенными. Технические
|
Handler(43) и штатный запуск миссии остаются непроверенными. Технические
|
||||||
сведения и адреса исходных сборок приведены в [границах знания](../appendices/knowledge-boundaries.md).
|
сведения и адреса исходных сборок приведены в [границах знания](../appendices/knowledge-boundaries.md).
|
||||||
|
|
||||||
|
Полный Rust-загрузчик принимает явный `MissionStartupInput`: время очереди
|
||||||
|
и отдельный `research_creation_gate`. Режим миссии и имя файла этот
|
||||||
|
флаг не заменяют. При включённом флаге таблица загружается только для клана,
|
||||||
|
чей сценарный пакет уже прочитан и успешно разобран; путь берётся из второго
|
||||||
|
ресурса этого клана как C-строка. Пустая C-строка пропускается, а не-ASCII
|
||||||
|
байты дают явную ошибку. Клан индексируется по порядку в TMA, тег ресурса на
|
||||||
|
владение не влияет. Если несколько кланов указывают на один файл, каждый
|
||||||
|
получает отдельно декодированную таблицу с собственными строками TRF0.
|
||||||
|
|
||||||
|
```rust
|
||||||
|
MissionStartupInput {
|
||||||
|
queue_time_ms: 100_000,
|
||||||
|
research_creation_gate: true,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Это сохраняет исходные таблицы и их связь с владельцами для следующих этапов.
|
||||||
|
Оно ещё не создаёт полный исследовательский контекст оригинала и не запускает
|
||||||
|
`Handler(43)`; эта обработка пока остаётся явно неподдержанной.
|
||||||
|
|
||||||
Отдельная frozen-матрица непосредственно вызвала chooser GOG `ai.dll` SHA-256
|
Отдельная frozen-матрица непосредственно вызвала chooser GOG `ai.dll` SHA-256
|
||||||
`c19cd6cd31cd2896f8c4ba0f0e700dd3408aec8182daaf4863d98a7d233a2abc`: функция
|
`c19cd6cd31cd2896f8c4ba0f0e700dd3408aec8182daaf4863d98a7d233a2abc`: функция
|
||||||
`FUN_10010f90` (RVA `0x10f90`) прошла три guard-case и все 15 проверок.
|
`FUN_10010f90` (RVA `0x10f90`) прошла три guard-case и все 15 проверок.
|
||||||
|
|||||||
Reference in new issue
Block a user