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

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




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

America — форматы RDA, SPR, PIC, FTB, SPX

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

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


Описание форматов RDA, SPR, PIC, FTB, SPX


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

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

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

  Junk: array[1..4]of char; //Хлам

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

end;


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

FATRecord: record
  Name: array[1..124]of char; //Имя файла

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

end;


Размер файлов не указывается, так что прийдется Вам его вычислять как разницу смещений соседних файлов.

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

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

SPRHeader: record
  Id: array[1..4]of char; //Идентификатор формата. Значение - "RDDX"

  Width: LongInt; //Ширина изображения

  Height: LongInt; //Высота изображения

  Junk: array[1..4]of char; //Хлам

  Sub_Id: array[1..4]of char; //Идентификатор битности. Значение - "P16B"

End;


Далее идут непосредственно графические данные в 16-ти битном формате размером Width*Height*2. Теперь, для получения адекватный пикселов, надо перейти от 16-ти битной формы записи к 24-х битной. 16-ти битный цвет в данном случае раскладывается так: 0RRRRRGGGGGBBBBB. После получения цветовых составляющих умножайте каждую из них на восемь (а то яркость будет ... не удовлетворительная). В результате получаем три байта RGB, определяющих пиксел в 24-х битном формате. Эте же схема действует и по отношению к графическим данным в следующем формате - PIC

 

За данными лежит таблица расположения спрайтов (SAT). Здесь все спрайты записаны в виде одного изображения, надо только их в нужном месте "вырезать". В начале SAT лежит идентификатор области, обычно - STAB. После этого общее количество спрайтов в формате LongInt. А затем непосредственно Таблица записей о спрайтах. Вот формат каждой записи:

SATRecord: record
  Id: LongInt; //Порядковый номер спрайта

  MarginLeft: LongInt; //Смещение спрайта от левого края

  MarginTop: LongInt; //Смещение спрайта от верхнего края

  Width: LongInt; //Ширина спрайта

  Height: LongInt; //Высота спрайта

  Junk: array[1..8]of char; //Хлам

End;


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

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

PICHeader: record
  Id: array[1..4]of char; //Идентификатор формата. Значение - "RDIC"

  Width: LongInt; //Ширина изображения

  Height: LongInt; //Высота изображения

  Junk: array[1..4]of char; //Хлам

  Sub_Id: array[1..4]of char; //Идентификатор битности.

End;


Дальнейший разбор зависит от идентификатора битности. Если он равен P16B, то далее читаем данные в 16-ти битном формате. От том, как это делается, смотри описание формата SPR. Если же идентификатор равен COLS, то действуем следующим образом:

  1. После идентификатора битности (COLS)Лежит 256-ти цветная палитра в формате RGB, общим размером в 768 байт.
  2. Далее лежит идентификатор начала области графических данных, с постоянным значением - PRAW.
  3. И уже потом лежит графическая матрица размером Width*Height, в 8-ми битном формате.

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

Сравнительно простой формат для хранения палитры. Первые 4 байта - идентификатор, с постоянным значением - C256. Далее лежат определители 256-ти цветов в 16-ти битном формате (0RRRRRGGGGGBBBBB)

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

В отличии от SPR, где все спрайты скомпанованы в одном изображении, и, по мере необходимости, из него вырезаются, здесь каждый спрайт представляет из себя отдельную область данных внутри SPX.

 

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

SPXHeader: record
  Id: array[1..4]of char; //Идентификатор формата. Значение - "RDSX"

  TotalSprites: LongInt; //Количество спрайтов

End;


Далее последовательно идут все спрайты. Образно, структуру каждого спрайта можно представить следующим образом:

  1. Заголовок
  2. Таблица смещения начала строк относительно начала области данных
  3. Область данных

Заголовок имеет следующий формат:

Header: record
  Id: LongInt; //Порядковый номер спрайта

  MarginLeft: LongInt; //Смещение спрайта слева (?)

  MarginTop: LongInt; //Смещение спрайта сверху (?)

  Width: LongInt; //Ширина спрайта

  Height: LongInt; //Высота спрайта

End;


Переменные MarginLeft и MarginTop используются, вероятно, для позиционирования спрайтов относительно некого общего центра. Практического применения этих переменных я искать не стал.

 

Далее идет таблица значений типа LongInt, определяющая смещение на начало данных каждой строки. Смещение отсчитывается от начала области данных. После этой таблицы лежит еще одно число LongInt - оно указывает на конечный+1 байт текущего спрайта (лично я его просто игнорирую). И вот только после этого располагается сама Область Данных. Формат записи здесь не самый простой, так что попробую его описать:

 

Каждая строка состоит из ряда сегментов. Типа сегментов всего два: блок пустых пикселов, и последовательность различных пикселов. Сегменты эти идут по строгой очередности: в начале каждой строки группа прозрачных (пустых) пикселов, затем обязательно группа из отдельных пикселов, затем снова прозрачные. Т.е. сегменты непрерывно чередуются. Дляна каждого сегмента определяется числом типа Byte. Попробую привести пример строки:

00 01 FF 05 03 FF FF F1 01

  1. Первый сегмент всегда состоит из прозрачных пикселов. Т.е. первый байт определяет длину первого сегмента, состоящего из прозрачных пикселов. Т.к. первый байт равен нулю, то прозрачных пикселов тут не будет
  2. Второй байт определяет длину второго сегмента, состоящего из последовательности байтов. Длина сегмента равна еденице, следовательно в конечную строку считываем один байт (FF)
  3. Опять прозрачный сегмент. На сей раз его длина равна пяти, т.е. в конечную строку вписываем пять нулей
  4. Последовательность из трех пикселов - FF FF F1
  5. Последный сегмент - один прозрачный пиксел.

В результате получаем строку: FF 00 00 00 00 00 FF FF F1 00

 

Для того, чтобы знать, где остановиться при чтении данных, рекомендую считать, сколько пикселов уже составлено и сравнивать это значение с шириной спрайта.


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

Rambler's Top100