aboutsummaryrefslogtreecommitdiff
path: root/docs/tomes/03-resources.md
diff options
context:
space:
mode:
authorValentin Popov <valentin@popov.link>2026-10-22 11:49:24 +0300
committerValentin Popov <valentin@popov.link>2026-10-22 11:49:24 +0300
commit5c400e7e40651d662ec4a744d2c2444d27cbe7e1 (patch)
tree366771d9e46c311ea921876f19a1d8ff1fb49fcb /docs/tomes/03-resources.md
parentccb5af0e37b94942962004ea2e84eea1d519c4bb (diff)
downloadfparkan-5c400e7e40651d662ec4a744d2c2444d27cbe7e1.tar.xz
fparkan-5c400e7e40651d662ec4a744d2c2444d27cbe7e1.zip
docs(control): explain component device overrides
Diffstat (limited to 'docs/tomes/03-resources.md')
-rw-r--r--docs/tomes/03-resources.md29
1 files changed, 17 insertions, 12 deletions
diff --git a/docs/tomes/03-resources.md b/docs/tomes/03-resources.md
index 29fef77..a11ad55 100644
--- a/docs/tomes/03-resources.md
+++ b/docs/tomes/03-resources.md
@@ -448,21 +448,28 @@ struct UnitDatRecord112 {
char archive_name[32]; // +0x00
char resource_name[32]; // +0x20
uint32_t kind; // +0x40, в корпусе всегда 1
- int32_t parent_or_link; // +0x44
+ int32_t parent_or_link; // +0x44, context-dependent local index
char description[32]; // +0x48
uint32_t tail0; // +0x68, opaque
- uint32_t tail1; // +0x6C, opaque
+ uint32_t tail1; // +0x6C, immediate_child_count
};
#pragma pack(pop)
```
Во всех проверенных records `archive_name == "objects.rlb"` и `kind == 1`.
-Поле `parent_or_link` встречается как `-1`, `0`, `1` и другие небольшие индексы
-и связывает компоненты составного unit; точная предметная классификация ссылки
-ещё не закрыта. `description` -- человекочитаемое описание компонента. В Части 2
-есть поля `description[32]`, полностью заполненные без NUL; это валидная bounded
-string длиной 32 байта. Требование обязательного terminator применяется только
-к полям, где оно доказано форматом. `tail0` и `tail1` нельзя нормализовать.
+`tail1` задаёт `immediate_child_count` — число непосредственных дочерних
+записей при построении дерева Unit DAT; оно не opaque. Поле `parent_or_link`
+встречается как `-1`, `0`, `1` и другие небольшие индексы. В подтверждённой
+цепочке Unit DAT → AniMesh → Control оно становится локальным индексом. Для
+`INTO` индекс задаёт устройство Control относительно первого устройства
+родительского компонента, а `EXTO` обрабатывается отдельной ветвью. Поэтому
+поле нельзя трактовать как универсальный parent ID или одинаковую ссылку для
+всех registry types. Детали передачи описаны в [главе о Behavior и Control](06-behavior.md).
+`tail0` сохраняется как raw DWORD без установленной семантики. `description` --
+человекочитаемое описание компонента. В Части 2 есть поля `description[32]`,
+полностью заполненные без NUL; это валидная bounded string длиной 32 байта.
+Требование обязательного terminator применяется только к полям, где оно доказано
+форматом.
Проверено 425 файлов / 5 219 records Части 1 и 676 файлов / 8 145 records
Части 2. Все соответствуют формуле размера, `kind == 1` и
@@ -470,10 +477,8 @@ string длиной 32 байта. Требование обязательног
При построении mission prototype graph FParkan сохраняет для каждого root
упорядоченный список этих raw records. Список передаётся в
-`MissionObjectDraft` без преобразования `kind`, `parent_or_link`, description
-или tails в предполагаемые роли. Так runtime уже располагает исходными данными
-составного unit для будущих Control/physics/AniMesh consumers, но не выдаёт
-структурное сходство за доказанную семантику.
+`MissionObjectDraft` с исходными `kind`, `parent_or_link`, description и tails;
+эти данные пока не объединяются в таблицу эффективных устройств Control.
Каждый graph edge от `UnitDatRoot` к effective component и далее к его MSH
dependency также несёт `unit_component_index`. Это индекс исходной записи в