feat(runtime): initialize mission ore properties
Docs Deploy / Build and Deploy MkDocs (push) Successful in 1m9s

This commit is contained in:
Valentin Popov committed 2026-10-22 11:45:23 +04:00
1 parent 374db10daf
commit dcc6459891
5 files changed
+379 -4

No files matched your search

+50
View File
@@ -255,6 +255,56 @@ Rust хранит этот небольшой начальный список с
опирается на уже созданный `ObjectHandle`. Регулярный обмен ресурсами пока
остаётся отдельным этапом, потому что для него нужны интерфейсы игровых объектов.
### Начальные свойства запасов руды
Behavior хранит `CurrentOre` и `MaximumOre` в одной записи свойства с ключом
`0x02000100`: текущее количество лежит в основном float-слове, предел — в
дополнительном DWORD. В TMA это не означает, что оба значения свободно задаются
файлом. При загрузке `MisLoad.dll` ищет первое свойство с точным, чувствительным
к регистру совпадением имени и передаёт его второе raw-слово в setter. В
Behavior дескриптор `CurrentOre` записывает это слово в основное значение;
дескриптор `MaximumOre` читает дополнительное слово, но его setter ничего не
меняет.
Оба дескриптора регистрируются как коды `4` и `5`. Это коды обработчика, а не
позиции в таблице дескрипторов: исходная DLL корректно работает и после
перестановки строк, потому что callback выбирает обработчик по коду строки.
Поэтому начальное состояние можно описать так, сохраняя биты без пересчёта
через `float`:
```text
current = first_exact("CurrentOre").raw_value[1] ?? class_default_current
maximum = class_default_maximum
```
Класс задаёт значения по умолчанию в Behavior RVA `0x8790`:
| Слово класса | `CurrentOre` | `MaximumOre` |
| --- | ---: | ---: |
| `0x80000004` | 0 | 500 |
| `0x80000008` | 0 | 4000 |
| `0x01002000` | 0 | 2000 |
| `0x01004000` | 2000 | 2000 |
| прочие слова в этой ветви | 0 | 0 |
Вызов RVA `0x8790` на синтетической структуре подтвердил эти значения для
классов таблицы, включая `0x01008000`; он проверяет тело native initializer-а,
но не его полный жизненный цикл в игре.
В полной загрузке Rust сохраняет эти два raw-значения рядом с исходным TMA ID
и `ObjectHandle` каждого объекта с Unit DAT; список участников распределителя
для этого не требуется. Это важно для объектов, у которых есть компонент
Behavior, но нет членства в ресурсном distributor. Preview намеренно не создаёт
начальное состояние. Лицензированная AutoDemo показывает восемь объектов с
Unit DAT, включая объекты класса `0x01008000` вне списков distributor; в этом
снимке TMA `CurrentOre` равен нулю у всех восьми. Нативный x86 oracle отдельно
проверяет ненулевое raw-слово, чтение предела, отсутствие записи в `MaximumOre`
и переставленные строки дескрипторов.
Эта модель покрывает именно начальную загрузку полных TMA-объектов. Она не
утверждает, что уже восстановлены все пути создания Behavior, отложенное
создание объектов или внешняя подмена class defaults конфигурацией.
### Регулярная передача ресурсов
Resource Distributor работает со списком зарегистрированных объектов. За один