Last Updated: 05-Feb-2000
 

Формат файлов DAT для Fallout 2.

Здесь описана структура и состав файлов ресурсов для Fallout 2,
имеющих расширение DAT (DAT-файлы). Всего существует 2 основных
DAT-файла: master.dat и critters.dat. В файле master.dat содержится
большинство графики, музыка, сценарии, тексты и т.д.
В файле critters.dat содержатся спрайты созданий (creatures, critters).
Данное описание справедливо и для файлов-патчей типа patch000.dat .

Содержание

1. Общая структура DAT-файлов
2. Формат дерева каталогов
3. Список каталогов файла master.dat
4. Формат блока данных
5. Zlib stream data format
6. Credits

1. Общая структура DAT-файлов.

DAT состоит из трех частей. Сначала идёт блок данных
(т.е. набор компрессированных файлов), затем дерево каталогов,
в котором содержится информация о файлах внутри DAT-файла.
В самом конце DAT-файла находится информация об его размере.
В самом конце дерева каталогов находится информация о размере этого дерева.

(BOF = begin of file, EOF=end)

Тип       | Смещение
----------+-0 ---
Файлы     | .... |
          | .... | Блок данных
          | N    |
----------+------|
FilesTotal| N+1  | количество файлов в данном DAT (DWORD at EOF-8-TreeSize) (23120 для русского файла master.dat) (23140 для американского файла master.dat)
----------+------|
Дерево    | N+5  |
Каталогов | .... | Каталог файлов блока данных
          | M    |
----------+------|
TreeSize  | M+1, 4 bytes (DWORD at EOF-8) размер дерева каталогов, включая DWORD FilesTotal.
DataSize  | M+5, 4 bytes (DWORD at EOF-4) размер самого DAT-файла.
------------EOF--

Для того, чтобы найти начало дерева каталогов, необходимо сделать следующее:

DirTreeAddr = DataSize - TreeSize - 4
Все контрольные числовые значения в файле хранятся в формате Intel. То есть, [L] [H]. (Little Endian).
Для файлов Fallout 1 эти числы будет Big Endian. [H] [L]
 
 

2. Формат дерева каталогов

Дерево состоит из элементов. Один элемент-описатель (дескриптор) описывает один файл. Размер одного дескриптора варьируется. Дескриптор состоит из данных об имени файла, его размерах и другой информации. Имя файла состоит из пути файла и собственно имени. Все дескрипторы, описывающие файлы, которые принадлежат к одному и тому же подкаталогу, хранятся в дереве каталогов вместе.

Формат дескриптора файла:

struct DirEntry
{
  DWORD FilenameSize; //Размер ASCII-имени файла
  char  Filename[FilenameSize]; // Имя файла и путь к нему. Например, "text\english\game\WORLDMP.MSG"
  BYTE  Type; //если там 1, то файл считается компрессированым.
  DWORD RealSize; //Размер файла без декомпрессии
  DWORD PackedSize; //Размер сжатого файла
  DWORD Offset; //Адрес файла в виде смещения от начала DAT-файла.
};
Итого: 17 байт + длина имени файла.

Пример. Дескриптор для самого первого файла (Adobe.frm) в master.dat.
Дескриптор находится по смещению 0x13CC46AD от начала DAT-файла.

13CC46AD:  16 00 00 00 FilenameSize (размер ASCII-имени файла), 0x16
13CC46B1:  61 72 74 5C
           62 61 63 6B   Имя файла в ASCII, в данном случае
           67 72 6E 64
           5C 41 64 6F   art\backgrnd\Adobe.frm
           62 65 2E 66
           72 6D
13СС46С7:  01         Type (признак компрессии?), 0x1 = компрессирован
13CC46C8:  6A 2F 01 00   RealSize (размер файла после декомпрессии), 0x12f6a
13CC46CC:  94 85 00 00   PackedSize (текущий размер файла), 0x8594
13CC46D0:  00 00 00 00   Offset от начала DAT, 0x0 (т.е. с самого начала)

3. Список каталогов файла master.dat

art\backgrnd\
   \cuts\ Фильмы
   \heads\ "Говорящие головы".
   \intrface\ файлы интерфейса, например картинки городов etc.
   \inven\ Изображения предметов (такими, какими они находятся у игрока).
   \items\ Изображения предметов (такими, какими они лежат на земле).
   \misc\ Special effects (взрывы etc.)
   \scenery\ Декорации (т.е. спрайты, не играющие роли) - кресла, стены, лестницы, фонари, вертибёрды...
   \skilldex\ Рисунки, показываемые для каждого skill/trait/stat.
   \splash\ Сплэш - экраны (splash screens). Те, которые появляются при загрузке Fallout 2...
   \tiles\ "Пол". Плитки пола.
   \walls\ "Стены". Элементы стен.

data\ Текстовые файлы, обильно комментированые. Содержат информацию о том, что должно происходить в игре.

maps\ Карты городов, местности (пустыня) и случайных встреч (random encounters).

premade\ Файлы с данными для "встроенных" героев, которых можно выбрать при начале новой игры.(Narg, Chitsa...)

proto\ Файлы описаний для предметов, существ, стен, пола и т.д. См. тж.
      \critters                       "Концепция объектов в Fallout 2".
      \items
      \misc
      \scenery
      \tiles
      \walls

scripts\ Компилированные скрипты, которые управляют ходом игры. Формат пока что неизвестен полностью, вкратце - это dword-овый байт-код. См. соотв. документы на сайте.

sound\
      \sfx\ Звуки в формате ACM
      \speech\ Музыка в формате ACM
             \bosss
             \elder
             \haku2
             \hakun
             \hrld2
             \lynet
             \mrcus
             \myron
             \narrator
             \power
             \presi
             \sulik
             \tndi2

text\
     \english\
     \cuts Титры в фильмах.
     \dialog Диалоги. Один диалог соответствует одному компилированному скрипту. Например, файл text\english\dialog\acbrahmn.msg взаимосвязан с файлом scripts\acbrahmn.int .
     \game Сообщения в игре.
 
 
 

4. Формат блока данных

Начинается с самого начала DAT. Состоит из файлов, информация о которых
хранится в дескрипторах дерева каталогов. В том случае, если файл начинается
с сигнатуры
unsigned short int 0xDA78; //В памяти наоборот - 78 DA
то файл считается компрессированным.

Сам файл, за исключением сигнатуры, содержит только данные в формате zlib stream data. Для того, чтобы файл превратить в полноценный gz-архив (спецификации RFC-1950(zlib format), RFC-1951(deflate format), RFC-1952(gzip format)), к нему необходимо "приклеить" gz-заголовок (в самое начало файла), а также 4 байта контрольной суммы и 4 байта размера файла к концу файла. Всю дальнейшую информацию, программы и библиотеки можно получить по адресу http://www.gzip.org.

Однако, если к файлу в самое начало "приклеить" примерно следующий gzip-заголовок:

1F 8B 08 08 9F E8 B7 36 02 03
и больше ничего с ним не делать, то такой файл прекрасно распакуется WinZip'ом (опробовано на версии WinZip 7.0, http://www.winzip.com).
 
 

5. Zlib stream data format

Здесь приведена выдержка из документа "ZLIB Compressed Data Format
Specification version 3.3". Пакованные файлы в master.dat имеют CMF и FLG 78h и DAh соответственно, а поле dictid не используется.

A zlib stream has the following structure:

  0   1  
+---+---+
|CMF|FLG|   (more-->)
+---+---+
(if FLG.FDICT set)
  0   1   2   3
+---+---+---+---+
|     DICTID    |   (more-->)
+---+---+---+---+
+=====================+---+---+---+---+
|...compressed data...|    ADLER32    |
+=====================+---+---+---+---+
Any data which may appear after ADLER32 are not part of the zlib stream.
CMF (Compression Method and flags)
This byte is divided into a 4-bit compression method and a 4-bit information field depending on the compression method.
bits 0 to 3  CM     Compression method
bits 4 to 7  CINFO  Compression info
CM (Compression method)
This identifies the compression method used in the file. CM = 8 denotes the "deflate" compression method with a window size up to 32K. This is the method used by gzip and PNG. CM = 15 is reserved. It might be used in a future version of this specification to indicate the presence of an extra field before the compressed data.

 
CINFO (Compression info)
For CM = 8, CINFO is the base-2 logarithm of the LZ77 window size, minus eight (CINFO=7 indicates a 32K window size). Values of CINFO above 7 are not allowed in this version of the specification. CINFO is not defined in this specification for CM not equal to 8.

 
FLG (FLaGs)
This flag byte is divided as follows:
bits 0 to 4  FCHECK  (check bits for CMF and FLG)
bit  5       FDICT   (preset dictionary)
bits 6 to 7  FLEVEL  (compression level)
The FCHECK value must be such that CMF and FLG, when viewed as a 16-bit unsigned integer stored in MSB order (CMF*256 + FLG), is a multiple of 31.
 
FDICT (Preset dictionary)
If FDICT is set, a DICT dictionary identifier is present immediately after the FLG byte. The dictionary is a sequence of bytes which are initially fed to the compressor without producing any compressed output. DICT is the Adler-32 checksum of this sequence of bytes (see the definition of ADLER32 below). The decompressor can use this identifier to determine which dictionary has been used by the compressor.

 
FLEVEL (Compression level)
These flags are available for use by specific compression methods. The "deflate" method (CM = 8) sets these flags as follows:
0 - compressor used fastest algorithm
1 - compressor used fast algorithm
2 - compressor used default algorithm
3 - compressor used maximum compression, slowest algorithm
The information in FLEVEL is not needed for decompression; it is there to indicate if recompression might be worthwhile.
  Сompressed data
For compression method 8, the compressed data is stored in the deflate compressed data format as described in the document "DEFLATE Compressed Data Format Specification" by L. Peter Deutsch.
Other compressed data formats are not specified in this version of the zlib specification.

 
ADLER32 (Adler-32 checksum)
This contains a checksum value of the uncompressed data (excluding any dictionary data) computed according to Adler-32 algorithm. This algorithm is a 32-bit extension and improvement of the Fletcher algorithm, used in the ITU-T X.224 / ISO 8073 standard.
Adler-32 is composed of two sums accumulated per byte: s1 is the sum of all bytes, s2 is the sum of all s1 values. Both sums are done modulo 65521. s1 is initialized to 1, s2 to zero. The Adler-32 checksum is stored as s2*65536 + s1 in most-significant-byte first (network) order.

 

6. Credits

This doc has been written by Serge, master of unDAT division at www.fallout.ru .
Thanks to Borg Locutus  for f2re sources.
Thanks to Alexander Belyakov  for important additions.
"ZLIB Compressed Data Format Specification version 3.3" developed and written by
L. Peter Deutsch and Jean-Loup Gailly .