Files
fparkan/docs/reference/rsli.md
T
Valentin Popov 78fc5f1deb
Docs Deploy / Build and Deploy MkDocs (push) Successful in 34s
Test / Lint (push) Failing after 1m7s
Test / Test (push) Has been skipped
Test / Render parity (push) Has been skipped
docs: rewrite MkDocs documentation
2026-06-22 01:58:51 +04:00

2.0 KiB

RsLi

RsLi -- библиотечный архив Iron3D с каталогом в начале файла и payloads после него.

[Header: 32 bytes]
[Entry table: entry_count * 32 bytes]
[Payloads]
[optional trailer]

Header fields

+0x00  char[2]  "NL"
+0x02  u8       reserved
+0x03  u8       version = 1
+0x04  i16      entry_count
+0x0E  u16      presorted_flag = 0xABBA
+0x14  u32      xor_seed

Остальные bytes сохраняются без нормализации.

Entry

struct RsLiEntry32 {
    char     name[12];
    uint8_t  service[4];
    int16_t  flags;
    int16_t  sort_to_original;
    uint32_t unpacked_size;
    uint32_t data_offset_raw;
    uint32_t packed_size;
};

Имя обычно хранится в uppercase ASCII. sort_to_original связывает sorted position с исходной записью.

Table transform

Entry table проходит обратимое потоковое XOR-преобразование. Начальное состояние берётся из младших 16 bits xor_seed и продолжается через всю таблицу, не сбрасываясь на границе записи.

Storage methods

0x000  raw block
0x020  byte transform only
0x040  LZSS
0x060  transform + LZSS
0x080  adaptive Huffman + LZSS
0x0A0  transform + adaptive Huffman + LZSS
0x100  raw Deflate

После любого пути должно получиться ровно unpacked_size bytes. Методы 0x080 и 0x0A0 подтверждены decoder-кодом, но не живыми payload демоверсии или обеих частей.

Compatibility quirk

sprites.lib::INTERF8.TEX объявляет Deflate range на один byte дальше EOF. Совместимый reader допускает packed_size - 1 только для этого именованного случая. Строгий режим сообщает deflate_eof_plus_one.