feat(runtime): initialize mission ore properties
Docs Deploy / Build and Deploy MkDocs (push) Successful in 1m9s
Docs Deploy / Build and Deploy MkDocs (push) Successful in 1m9s
This commit is contained in:
5 files changed
+379
-4
No files matched your search
@@ -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 работает со списком зарегистрированных объектов. За один
|
||||
|
||||
Reference in new issue
Block a user