Все уровни Gravity Defied хранятся в файле levels.mrg. Ниже представлено подробное описание формата.
Используемый порядок байтов — Big Endian.
int= 4 байта
short= 2 байта
byte= 1 байт

Список треков

Файл начинается с описания трех уровней со списком треков:
level levels[3]
Каждый уровень описан так:
level
int countколичество треков
track_name tracks[count]треки
Список треков tracks в каждом уровне повторяется count раз:
track_name
int offsetсмещение описания трека относительно начала файла
string nameназвание трека
byte null=0x00нулевой байт

Описание треков

Данные о каждом треке находятся по смещению offset из track_name.
track
byte mark=0x33маркер начала описания трека, всегда 0x33
int start_xначальное положение игрока по оси X
int start_yначальное положение игрока по оси Y
int finish_xположение финиша по оси X
int finish_yположение финиша по оси Y (ни на что не влияет, обычно 0)
short points_countколичество точек
int point_xпервая точка по оси X
int point_yпервая точка по оси Y
point points[points_count-1]точки
Координаты start_x, start_y, finish_x и finish_y записаны в файле как (int << 16) >> 3; соответственно, читать их нужно наоборот.
Список точек повторяется points_count-1 раз (т.к. первая точка уже была задана). Координаты суммируются, т.е., значение каждой точки является смещением относительно предыдущей. Обычно точка выглядит так:
point
byte xсмещение по оси X
byte yсмещение по оси Y
Однако, в случае, если x равен -1, следующий байт (y) не читается, а обнуляется текущая координата (сумма смещений) и далее читается такая точка:
point2
int xкоордината по оси X
int yкоордината по оси Y
Следующая точка читается как обычно.