Том · bei.pm

Опубліковано 19.11.2015·Оновлено 13.02.2025·Українська
Цей текст був автоматично перекладений за допомогою OpenAI GPT-4o Mini.

Описані на цій сторінці формати файлів базуються на технічному аналізі інтелектуальної власності Dynamix, Inc. та Sierra Entertainment.
Інтелектуальна власність сьогодні є частиною маси Activision Publishing, Inc. / Activision Blizzard, Inc. і наразі належить Microsoft Corp..

Інформація була зібрана за допомогою реверс-інженерії та аналізу даних з метою архівування та взаємодії з історичними даними.
Не використовувалися жодні власницькі або конфіденційні специфікації.

Гру наразі можна придбати на gog.com як завантаження.

Обсяги - це контейнери даних для гри, схожі на архівний формат, наприклад, Tarball. Принаймні в Outpost 2 цей формат містить лише файли - без папок. Напевно, їх можна було б симулювати за допомогою відповідних імен файлів.

Обсяг складається з заголовка обсягу та кількох блоків обсягу, які відповідають конкретним файлам.

"Обсяги" - це файли з розширенням 'vol' у директорії гри.

Адр x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF симв.
0x0000 56 4f 4c 20 -- -- -- -- -- -- -- -- -- -- -- -- V O L . . . . . . . . . . . .
Зсув Тип даних Назва Пояснення
0x0000 uint(32) Магічні байти
0x0004 uint(24) Довжина блоку
0x0007 uint(8) Прапори

Заголовок обсягу

Адр x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF симв.
0x0000 76 6f 6c 68 -- -- -- -- -- -- -- -- -- -- -- -- v o l h . . . . . . . . . . . .
Зсув Тип даних Назва Пояснення
0x0000 uint(32) Магічні байти
0x0004 uint(24) Довжина блоку
0x0007 uint(8) Прапори

Обсяг заголовка не містить жодних корисних даних.
Він слугує лише як контейнер.

Першими даними в обсязі заголовка повинні бути рядки обсягу; далі слідують інформація про обсяг.

Об'ємні рядки

Адр x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF симв.
0x0000 76 6f 6c 69 -- -- -- -- -- -- -- -- -- -- -- -- v o l i . . . . . . . . . . . .
Зсув Тип даних Назва Пояснення
0x0000 uint(32) Магічні байти
0x0004 uint(24) Довжина блоку
0x0007 uint(8) Прапори
Адр x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF симв.
0x0000 76 6f 6c 73 -- -- -- -- -- -- -- -- -- -- -- -- v o l s . . . . . . . . . . . .
Зсув Тип даних Назва Пояснення
0x0000 uint(32) Магічні байти
0x0004 uint(24) Довжина блоку
0x0007 uint(8) Прапори
0x0008 uint(32) Довжина корисних даних

Вказує, скільки байтів з наведених даних насправді є корисними даними.

Залишкові дані списку рядків томів, очевидно, слід вважати сміттям.

У файлах з пізніми датами ці 'залишкові дані' становлять 0x00, що може свідчити про недоліки в інструментах під час розробки гри, а саме, що розробник почав піклуватися про правильну ініціалізацію буферів лише дуже пізно, оскільки це не впливає на гру, чи дані ініціалізовані, чи ні.

0x000c uint(8)[] Список імен файлів

Це 0-байтний термінований список імен файлів, який - принаймні в даному фрагменті даних - очікує лише ASCII-символи.

Не потрібно при парсингу даних більш детально оцінювати цей блок даних, оскільки в інформації про томи безпосередньо посилаються на офсети імен файлів.

Обсягові рядки є списком імен файлів, які містяться в обсязі.

Інформація про об'єм

Адр x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF симв.
0x0000 76 6f 6c 69 -- -- -- -- -- -- -- -- -- -- -- -- v o l i . . . . . . . . . . . .
Зсув Тип даних Назва Пояснення
0x0000 uint(32) Магічні байти
0x0004 uint(24) Довжина блоку
0x0007 uint(8) Прапори

Інформація про том містить більш детальні відомості про файли. Це, певним чином, є своєрідним записом у FAT-довіднику (FAT = таблиця розподілу файлів).

Кількість файлів визначається шляхом ділення розміру блоку на довжину записів у довіднику - 14 байт.

Окремі записи в довіднику мають наступну структуру:

Адр x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF симв.
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Зсув Тип даних Назва Пояснення
0x0000 uint(32) Зсув імен файлів

Вказує, на якому офсеті (!) у списку імен файлів (рядки томів) знаходиться ім'я файлу.

Це стосується початку блоку корисних даних.

0x0004 uint(32) Файл-офсет

Вказує, на якому зсуві в межах усієї об'ємної файлу знаходиться файл.

0x0008 uint(32) Розмір файлу

Вказує, яким є розмір файлу в байтах.

0x000c uint(16) Прапори?

Схоже, що є додаткова інформація щодо кодування файлів.

  • 0x03 встановлено, якщо файл стиснутий. Тут, ймовірно, використовується дерево Хаффмана.
  • 0x80 здається, завжди встановлено.

Об'ємний блок

Адр x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF симв.
0x0000 56 42 4c 48 -- -- -- -- -- -- -- -- -- -- -- -- V B L H . . . . . . . . . . . .
Зсув Тип даних Назва Пояснення
0x0000 uint(32) Магічні байти
0x0004 uint(24) Довжина блоку
0x0007 uint(8) Прапори

Об'ємний блок - це контейнер, який містить файли. Він містить лише ще раз - через формат блоку - редундантний розмір файлу, а потім безпосередньо слідують корисні дані.