Spiiin's blog

Формат карт Final Fantasy Tactics Advance [GBA]

Заканчиваю свой цикл заметок о разборе форматов уровней для старых игр. Последняя жертва - Final Fantasy Tactics Advance для Game Boy Advance.

Немного о формате карт описано здесь.
В частности, оттуда нужны массивы Tile arrangement data и Map height data. Оба они сжаты как описано тут, то есть после метки 11FFFFFF следует стандартный для GBA архив в формате LZ77, который распаковывается функцией BIOS приставки.

На RHDN нашлось несколько распаковщиков данных в этом формате, но все они сжимают данные обратно с худшим коэффициентом компрессии, но для рендера карты это неважно. После распаковки выясняется, что массивы ещё раз сжаты в формате, похожем на формат сжатия экранов capcom для nes.

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

Карта блоков графики описывает 2 слоя изображения блоками размеров 16x8 пикселей. Каждый из блоков кодируется двухбайтовым числом. Схема здесь такая же, как и для любой блочной карты для NES или SEGA, так что с помощью скриптов конвертации можно засунуть карту в CadEditor:
cad_fft

Карта высоты описывает данные о высоте каждой клетки и её проходимость для персонажей.

Карта высоты описывает изометрические клетки, строками, начиная от ряда между верхней клетки и правой и двигаясь к ряду между левой и нижней клеткой. (Статьи об изометрии и картах высоты: http://trac.bookofhook.com/bookofhook/trac.cgi/wiki/OverviewOfIsometricEngineDevelopment http://stackoverflow.com/questions/892811/drawing-isometric-game-worlds).

Для правильного порядка отрисовки “столбики” с информацией о высоте надо выводить в порядке ромба (как они и хранятся в массиве):

.. .. 01 .. .. 
.. 06 02 ..
.. 11 07 03 ..
16 12 08 04
21 17 13 09 05
22 18 14 10
.. 23 19 15 ..
.. 24 20 ..
.. .. 25 .. ..

Полученной информации достаточно для отрисовки карты высоты. К этому моменту ко мне присоединился Darthatron (Darcy Miles), дописал необходимые компрессоры-декомпрессоры данных и собрал все утилиты вместе для создания просмотрщика всех карт из игры:

babus

Ссылка на репозиторий проекта:
https://github.com/spiiin/FFTAUtils