Что у нас есть?

Это тоже интересно




Статьи и описания форматов игровых файлов

Baldur's Gate — форматы BIF, BAM, MOS

Эта статья относится к играм:

Автор материала: Михаил Бесчетнов aka Terminus


Описание форматов BIF, BAM, MOS


Описание формата .BIF

В начале заголовок:

BIFHeader: record
  id: array[1..8]of char; //Идентификатор формата

  Files: LongInt //Количество файлов

End;


Таблица размещения файлов располагается по адресу $14. Описание записи о файле:

FATRecord: record
  Number: Word; //Порядковый номер файла

  Junk: array[1..2]of Char; //Хлам

  Offset: LongInt; //Смещение до файла

  Size: LongInt; //Размер файла

  Type: LongInt; //Тип файла

End;


У файлов нет имен, так что его роль может играть номер файла. Расширение зависит от типа файла. Ниже приведены все известные мне типы.

 

Код Возможное расширение Описание
0001 BMP Графика
1002 ??? Неизвестен
1004 MOS Графика
1006 SPL Spells(очевидно - графика)
03EE SPL Spells(очевидно - графика)
03E8 BAM Графика
0004 WAV Звук(в особом формате Interplay)
0803 ??? Неизвестен
03EC MOS Графика
03F4 2DA Неизвестен
03E9 WED Неизвестен
03F2 ARE Описание месности
03EF SCR Скрипты для карт
03F1 CRE Описание существ
03F3 DLG Скрипты для существ
03F0 ??? Консольные команды(в том числе - коды)
0802 INI Файл настроек
03ED ITM Описание предметов
03F6 STO Неизвестен
???? MVE Видео. Для проигрывания нужен Interplay MVE Player

Описание формата .BAM

В начале заголовок:

BAMHeader: record
  ID: array[1..4]of char; //Идентификатор формата

  Version: array[1..4]of char; //Версия формата

  TotalFrames: Word; //Всего кадров

  TotalAnims: Byte; //Всего анимаций

  TransparentIndex: Byte; //Индекс прозрачного цвета

  FramesATOffset: LongInt; //Смещение до Таблицы распределения фреймов

  PaletteOffset: LongInt; //Смещение до палитр

  AnimsATOffset: LongInt; //Смещение до таблицы распределения анимаций

End;


Чтобы дальнейшее лучше усваивалось, необходимо дать некоторые разъяснения. Формат BAM используется для хранения анимаций т.е. последовательности фреймов. По смещению FramesATOffset расположены записи о каждом фрейме, т.е. размеры и расположение в файле. Сразу за этой таблицей расположеты записи о каждой из анимаций (назовем ее FrameEntriesTable), содержащие номер стартового фрейма и общее количество фреймов. Однако каждая анимация может состоять из фреймов, расположеных НЕ последовательно. Более того, один фрейм может содержаться в нескольких анимациях одновременно, или же встречаться несколько раз в одной и той же анимации.

 

Для того, чтобы описать структуру каждой анимации, существует еще одна таблица - AnimsAT со смещением AnimsATOffset. Она содержит последовательность номеров фреймов для каждой анимации.

 

Предположим, что у нас есть 10 фреймов. Тогда последовательность фреймов в анимации может быть такой: 0 3 4 5 8 3 1. Повторюсь, что каждый фрейм может быть задействован сколь угодное количество раз.

 

Вот формат записи из таблицы FramesAT:

FramesATRecord: record
  Width: ShortInt; //Ширина фрейма

  Height: ShortInt; //Высота фрейма

  OffsetX: LongInt; //Смещение фрейма по X

  OffsetY: LongInt; //Смещение фрейма по Y

  DataOffset: LongInt; //Расположение данных фрейма в файле

End;


Хочу отметить, что переменные Width и Height должгы быть именно типа ShortInt, т.е. иметь диапазон [-32768..+32768].

Формат изображения не так сложен, однако мне потребовался не один месяц, чтобы это понять... Если индекс пиксела отличен от индекса прозрачных пикселов (BAMHeader.TransparentIndex) он представляет сам себя, в противном случае это прозрачная область с длиной, указаной в следующем байте. Например, последовательность "57 F3 00 06 F1" следует понимать так: 2 обычных пиксела "57 F3", 6 прозрачных пикселов, 1 обычный пиксел "F1". Есть у этого формата еще одна особенность. Данные записаны не построчно, как обычно, а сплошным потоком. В нашем примере, при длине строки в 4 пиксела, первая строка будет состоять из 2 обычных пикселов и 2 прозрачных. Остальные 4 прозрачных пиксела из группы пойдут на следующую строку.

Описание формата .MOS

Заголовок:

MOSHeader: record
  ID: array[1..4]of char; //Идентификатор формата

  Version: array[1..4]of char; //Версия формата

  PixelWidth: Word; //Ширина (в пикселах)

  PixelHeight: Word; //Высота (в пикселах)

  BlockWidth: Word; //Ширина (в блоках)

  BlockHeight: Word; //Высота (в блоках)

  BlockSize: LongInt; //Размер целого блока

  PalOffset: LongInt; //Смещение до таблицы палитр

End;


Этот формат используется для хранения полноцветных 16-битных изображений в 8-битном формате. Сделано это в целях уменьшения размера данных. А реализуется следующим образом:

 

Изображение делится на фрагменты размером 64x64, и для каждого фрагмента создается отдельная 256-цветная палитра. Если ширина/высота изображения не кратны 64-ем, размер остаточного блока определяется разницей между общим размером изображения и суммарным размером всех целых блоков. Данные каждого блока представляют собой обычную двумерную матрицу без сжатия и прозрачных областей.

Описание формата .BIF

В начале заголовок:

BIFHeader: record
  id: array[1..8]of char; //Идентификатор формата

  Files: LongInt //Количество файлов

End;


Таблица размещения файлов располагается по адресу $14. Описание записи о файле:

FATRecord: record
  Number: Word; //Порядковый номер файла

  Junk: array[1..2]of Char; //Хлам

  Offset: LongInt; //Смещение до файла

  Size: LongInt; //Размер файла

  Type: LongInt; //Тип файла

End;


У файлов нет имен, так что его роль может играть номер файла. Расширение зависит от типа файла. Ниже приведены все известные мне типы.

 

Код Возможное расширение Описание
0001 BMP Графика
1002 ??? Неизвестен
1004 MOS Графика
1006 SPL Spells(очевидно - графика)
03EE SPL Spells(очевидно - графика)
03E8 BAM Графика
0004 WAV Звук(в особом формате Interplay)
0803 ??? Неизвестен
03EC MOS Графика
03F4 2DA Неизвестен
03E9 WED Неизвестен
03F2 ARE Описание месности
03EF SCR Скрипты для карт
03F1 CRE Описание существ
03F3 DLG Скрипты для существ
03F0 ??? Консольные команды(в том числе - коды)
0802 INI Файл настроек
03ED ITM Описание предметов
03F6 STO Неизвестен
???? MVE Видео. Для проигрывания нужен Interplay MVE Player

Описание формата .BAM

В начале заголовок:

BAMHeader: record
  ID: array[1..4]of char; //Идентификатор формата

  Version: array[1..4]of char; //Версия формата

  TotalFrames: Word; //Всего кадров

  TotalAnims: Byte; //Всего анимаций

  TransparentIndex: Byte; //Индекс прозрачного цвета

  FramesATOffset: LongInt; //Смещение до Таблицы распределения фреймов

  PaletteOffset: LongInt; //Смещение до палитр

  AnimsATOffset: LongInt; //Смещение до таблицы распределения анимаций

End;


Чтобы дальнейшее лучше усваивалось, необходимо дать некоторые разъяснения. Формат BAM используется для хранения анимаций т.е. последовательности фреймов. По смещению FramesATOffset расположены записи о каждом фрейме, т.е. размеры и расположение в файле. Сразу за этой таблицей расположеты записи о каждой из анимаций (назовем ее FrameEntriesTable), содержащие номер стартового фрейма и общее количество фреймов. Однако каждая анимация может состоять из фреймов, расположеных НЕ последовательно. Более того, один фрейм может содержаться в нескольких анимациях одновременно, или же встречаться несколько раз в одной и той же анимации.

 

Для того, чтобы описать структуру каждой анимации, существует еще одна таблица - AnimsAT со смещением AnimsATOffset. Она содержит последовательность номеров фреймов для каждой анимации.

 

Предположим, что у нас есть 10 фреймов. Тогда последовательность фреймов в анимации может быть такой: 0 3 4 5 8 3 1. Повторюсь, что каждый фрейм может быть задействован сколь угодное количество раз.
Вот формат записи из таблицы FramesAT:

FramesATRecord: record
  Width: ShortInt; //Ширина фрейма

  Height: ShortInt; //Высота фрейма

  OffsetX: LongInt; //Смещение фрейма по X

  OffsetY: LongInt; //Смещение фрейма по Y

  DataOffset: LongInt; //Расположение данных фрейма в файле

End;


Хочу отметить, что переменные Width и Height должгы быть именно типа ShortInt, т.е. иметь диапазон [-32768..+32768].

 

Формат изображения не так сложен, однако мне потребовался не один месяц, чтобы это понять... Если индекс пиксела отличен от индекса прозрачных пикселов (BAMHeader.TransparentIndex) он представляет сам себя, в противном случае это прозрачная область с длиной, указаной в следующем байте. Например, последовательность "57 F3 00 06 F1" следует понимать так: 2 обычных пиксела "57 F3", 6 прозрачных пикселов, 1 обычный пиксел "F1". Есть у этого формата еще одна особенность. Данные записаны не построчно, как обычно, а сплошным потоком. В нашем примере, при длине строки в 4 пиксела, первая строка будет состоять из 2 обычных пикселов и 2 прозрачных. Остальные 4 прозрачных пиксела из группы пойдут на следующую строку.

Описание формата .MOS

Заголовок:

MOSHeader: record
  ID: array[1..4]of char; //Идентификатор формата

  Version: array[1..4]of char; //Версия формата

  PixelWidth: Word; //Ширина (в пикселах)

  PixelHeight: Word; //Высота (в пикселах)

  BlockWidth: Word; //Ширина (в блоках)

  BlockHeight: Word; //Высота (в блоках)

  BlockSize: LongInt; //Размер целого блока

  PalOffset: LongInt; //Смещение до таблицы палитр

End;


Этот формат используется для хранения полноцветных 16-битных изображений в 8-битном формате. Сделано это в целях уменьшения размера данных. А реализуется следующим образом:

 

Изображение делится на фрагменты размером 64x64, и для каждого фрагмента создается отдельная 256-цветная палитра. Если ширина/высота изображения не кратны 64-ем, размер остаточного блока определяется разницей между общим размером изображения и суммарным размером всех целых блоков. Данные каждого блока представляют собой обычную двумерную матрицу без сжатия и прозрачных областей.

 

За заголовком идут последовательно палитры для всех блоков. Вначале для блоков первой строки, затем для второй и т.д. Затем идет таблица смещений каждого блока (значения типа LongInt)

 

За заголовком идут последовательно палитры для всех блоков. Вначале для блоков первой строки, затем для второй и т.д. Затем идет таблица смещений каждого блока (значения типа LongInt)


 
©2000—2010 Михаил Бесчетнов aka Terminus
«EXTRACTOR.ru» — игровые ресурсы: распаковка музыки и графики, конверторы форматов и многое другое…
Ссылка на «EXTRACTOR.ru» при перепечатывании оригинальных материалов крайне желательна

Rambler's Top100