aboutsummaryrefslogtreecommitdiff
path: root/docs/tomes/06-behavior.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/tomes/06-behavior.md')
-rw-r--r--docs/tomes/06-behavior.md50
1 files changed, 50 insertions, 0 deletions
diff --git a/docs/tomes/06-behavior.md b/docs/tomes/06-behavior.md
index c00705b..16ea21a 100644
--- a/docs/tomes/06-behavior.md
+++ b/docs/tomes/06-behavior.md
@@ -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 работает со списком зарегистрированных объектов. За один