- Introduced `terrain-core` crate for loading and processing terrain mesh data. - Added `tma` crate for parsing mission files, including footer and object records. - Created `unitdat` crate for reading unit data files with validation of structure. - Implemented error handling and tests for all new crates. - Documented object registry format and rendering pipeline in specifications.
6.6 KiB
Object Registry (objects.rlb)
objects.rlb - это не архив с готовыми мешами.
Это реестр игровых прототипов, который связывает логический идентификатор объекта (r_h_01, s_tree_04, fr_m_brige, ...) с набором реальных ресурсов в других архивах.
Документ описывает формат и runtime-контракт на высоком уровне, без привязки к внутренним именам/адресам из дизассемблера.
Связанные страницы:
1. Роль в пайплайне
При загрузке миссии движок работает так:
- Из
data.tmaполучаетresource_nameобъекта:- либо прямой ключ (
s_tree_04); - либо путь к
*.dat(напримерUNITS\\UNITS\\HERO\\tut1_p.dat).
- либо прямой ключ (
- Для
*.datчитает заголовок и получает:archive_name(в retail-корпусе всегдаobjects.rlb);model_key(напримерR_H_02).
- В
objects.rlbпо ключу (model_key/resource_name) ищет запись прототипа. - Из записи прототипа резолвит фактический
*.mshи архив, где лежит геометрия. - Дальше запускается стандартная цепочка:
MSH -> WEAR -> MAT0 -> Texm.
2. Контейнер
objects.rlb сам является обычным NRes-архивом.
Практические наблюдения на retail-корпусе:
- формат заголовка/каталога полностью совпадает с
NRes; - payload каждой записи прототипа кратен
64байтам; - имя entry в каталоге - это логический ключ объекта (например
r_h_01,s_tree_04).
3. Формат payload записи прототипа
Payload состоит из массива фиксированных записей:
struct ObjectRef64 {
char archive_name[32]; // C-строка (CP1251/ASCII)
char resource_name[32]; // C-строка (CP1251/ASCII)
}
Интерпретация:
archive_name: архив-источник (bases.rlb,static.rlb,fortif.rlb,effects.rlb, ...).resource_name: имя ресурса в этом архиве (*.msh,*.wea,*.cpt,*.ctl,*.bas, ...).
Важно:
- после первого
NULв 32-байтовом поле могут встречаться служебные байты; для runtime-резолва используется только C-строка до первогоNUL; - неизвестные хвостовые байты должны сохраняться 1:1 при writer/roundtrip-редактировании.
4. Runtime-резолв геометрии
Канонический порядок выбора меша:
- Найти запись прототипа по ключу в
objects.rlb. - Прочитать список
ObjectRef64. - Если есть ссылка на
*.msh:- взять первую валидную ссылку;
- открыть указанный архив;
- загрузить этот
*.msh.
- Если
*.mshнет, но есть*.bas:- взять stem от
*.bas(fr_m_brige.bas->fr_m_brige); - искать
<stem>.mshв том же архиве (fortif.rlb).
- взять stem от
- Если нет ни
*.msh, ни*.bas, объект трактуется как не-геометрический (пример: солнечный/системный объект) и в 3D-проход не попадает.
5. Типовые примеры
r_h_01:
bases.rlb :: r_h_01.mshbases.rlb :: r_h_01.weabases.rlb :: r_h_01.cpt- ...
s_tree_04:
static.rlb :: s_tree_0_04.mshstatic.rlb :: s_tree_0_04.wea- ...
fr_m_brige:
- прямого
*.mshв записи нет; - есть
fortif.rlb :: fr_m_brige.bas; - меш резолвится как
fortif.rlb :: fr_m_brige.msh.
sun_01:
- ссылки на
*.sun/effect-ресурсы; - 3D-меш отсутствует.
6. Инварианты для reader/writer
Reader:
- payload записи прототипа должен быть кратен
64; - каждая запись читается как две независимые C-строки фиксированной длины;
- поиск в архивах должен быть case-insensitive по ASCII.
Writer/editor:
- сохранять порядок
ObjectRef64без перестановок; - сохранять неизвестные служебные байты полей 1:1;
- не нормализовать имена, если это не требуется задачей.
7. Валидация
Проверено на retail-корпусе testdata/Parkan - Iron Strategy:
- все
590записейobjects.rlbимеют payload, кратный64; 554записей имеют прямую ссылку на*.msh;34записи используют ветку через*.bas;2записи не содержат геометрии (системные/sun).
Интеграционные тесты в Rust подтверждают резолв:
r_h_01 -> bases.rlb :: r_h_01.mshs_tree_04 -> static.rlb :: s_tree_0_04.mshfr_m_brige -> fortif.rlb :: fr_m_brige.msh
8. Статус покрытия и что осталось до 100%
Закрыто:
- Формат payload записи прототипа (
ObjectRef64) и правила чтения. - Runtime-алгоритм выбора меша (
*.mshнапрямую и fallback через*.bas). - Корпусная проверка структуры и интеграционные тесты резолва.
Осталось:
- Полная field-level семантика служебных байтов после
NULвresource_name[32]. - Формальная семантика всех категорий ссылок (
*.ctl,*.cpt,*.ndp,*.sun) в терминах систем движка (не только render-пути). - Writer-спецификация уровня "authoring new prototype from scratch" с гарантией runtime-паритета.