namespace NResLib; /// /// Архив NRes (файл NRes) /// public record NResArchive(NResArchiveHeader Header, List Files); /// /// Заголовок файла /// /// [0..4] ASCII NRes. /// [4..8] Версия кодировщика, обычно 0x100. /// [8..12] Количество записей каталога. /// [12..16] Длина всего архива. public record NResArchiveHeader(string NRes, int Version, int FileCount, int TotalFileLengthBytes); /// /// 64-байтная запись каталога NRes. /// /// Важный нюанс RE-имен: /// - ElementCount/Magic1/ElementSize оставлены как удобные имена для исследования, но на уровне /// общего NRes-контейнера это attr1/attr2/attr3. Их смысл зависит от TypeId ресурса. /// - FileName на диске занимает 36 байт: [20..56]. Старый разбор читал только [20..40]. /// - Старые Magic3..Magic6 оказались не отдельными полями формата, а байтами хвоста name_raw. /// - SortIndex на диске это перестановка для бинарного поиска по имени, а не порядковый /// индекс записи каталога. Порядковый индекс хранится отдельно в DirectoryIndex. /// /// [0x00..0x04] Resource type id. /// [0x00..0x04] Resource type id как ASCII или hex bytes для RE. /// [0x04..0x08] ElementCount. смысл зависит от TypeId. /// [0x08..0x0C] смысл зависит от TypeId. /// [0x0C..0x10] Длина payload в байтах. /// [0x10..0x14] ElementSize. смысл зависит от TypeId. /// [0x14..0x38] C-string из 36-байтного name_raw. /// [0x38..0x3C] Смещение payload от начала архива. /// [0x3C..0x40] Индекс перестановки для бинарного поиска по имени. /// Индекс записи в порядке каталога; не хранится отдельным полем NRes. public sealed record class ListMetadataItem( uint TypeId, string FileType, uint ElementCount, int Magic1, int FileLength, int ElementSize, string FileName, int OffsetInFile, int SortIndex, int DirectoryIndex);