EXTRACTOR | .RU – версия 2.2 |
||
Что у нас есть? Это тоже интересно Подробное описание Подшипник 6010 ZZ (80110) на сайте. |
Статьи и описания форматов игровых файлов 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; У файлов нет имен, так что его роль может играть номер файла. Расширение зависит от типа файла. Ниже приведены все известные мне типы.
Описание формата .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; У файлов нет имен, так что его роль может играть номер файла. Расширение зависит от типа файла. Ниже приведены все известные мне типы.
Описание формата .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. Повторюсь, что каждый фрейм может быть задействован сколь угодное количество раз. 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 «EXTRACTOR.ru» — игровые ресурсы: распаковка музыки и графики, конверторы форматов и многое другое… |