Здесь описана структура и состав файлов ресурсов для 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
(BOF = begin of file, EOF=end)
Тип |
Смещение
----------+-0 ---
Файлы | .... |
| .... | Блок данных
| N |
----------+------|
FilesTotal| N+1 | количество файлов
в данном DAT (23120 для 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].
Формат дескриптора файла:
struct DirEntryИтого: 17 байт + длина имени файла.
{
DWORD FilenameSize; //Размер ASCII-имени файла
char Filename[FilenameSize]; // Имя файла и путь к нему. Например, "text\english\game\WORLDMP.MSG"
BYTE Type; //если там 1, то файл считается компрессированым.
DWORD RealSize; //Размер файла без декомпрессии
DWORD PackedSize; //Размер сжатого файла
DWORD Offset; //Адрес файла в виде смещения от начала DAT-файла.
};
Пример. Дескриптор для самого первого файла (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 (т.е. с самого начала)
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 Сообщения в игре.
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).
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.
bits 0 to 3 CM Compression method bits 4 to 7 CINFO Compression info
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.
0 - compressor used fastest algorithm 1 - compressor used fast algorithm 2 - compressor used default algorithm 3 - compressor used maximum compression, slowest algorithmThe information in FLEVEL is not needed for decompression; it is there to indicate if recompression might be worthwhile.