Структура файла levels.mrg — различия между версиями

Материал из Gravity Defied Wiki
Перейти к: навигация, поиск
 
(не показаны 4 промежуточные версии 2 участников)
Строка 1: Строка 1:
 
Для начала для тех, кто в танке, уясню: <BR>
 
Для начала для тех, кто в танке, уясню: <BR>
int = 4 байта <BR>
+
''int'' = 4 байта <BR>
short = 2 байта <BR>
+
''short'' = 2 байта <BR>
byte = 1 байт <BR>
+
''byte'' = 1 байт <BR>
Итак. Грубо говоря, файл можно разделить на 2 части: заголовок и сам файл.<BR>
+
 
1. Заголовок. Заголовок, в свою очередь, можно поделить на 3 части: заголовок легкого, заголовок среднего, заголовок сложного уровней<BR>.
+
Итак. Грубо говоря, файл можно разделить на 2 части: заголовок и сам файл.<br />
<BR>
+
 
Структура заголовка (схематично):<BR> [int кoл-во уровней на easy] { [int номер_байта][название уровня][byte нулевой байт] ... } [int кол-во уровней на medium] { [int номер_байта][название уровня][byte нулевой байт] ... } [int кол-во уровней на hard] { [int номер_байта][название уровня][byte нулевой байт] ... }
+
=====1. Заголовок=====
 +
Заголовок, в свою очередь, можно поделить на 3 части: заголовок легкого, заголовок среднего, заголовок сложного уровней.
 
<BR>
 
<BR>
Это и есть "3 части" заголовка.<BR>
+
Структура заголовка (схематично):
<BR>
+
[int кoл-во уровней на easy] {
Рассмотрим их поподробнее. <BR>
+
  [int номер_байта][название уровня][byte нулевой байт]
Сначала идет int - количество уровней (на опр. уровне сложности). <BR>
+
  ...
Потом идет запись (объединяю в контейнер): { int - номер байта (номер байта в файле, считая с нуля, где записан сам уровень.), название уровня, byte - закрывающий нулевой байт }.<BR> Эта запись повторяется столько раз, сколько уровней на данном уровне сложности - адрес начала для каждого трека. <BR>
+
}
Потом аналогично для medium и для hard.<BR>
+
[int кол-во уровней на medium] {
 +
  [int номер_байта][название уровня][byte нулевой байт]
 +
  ...
 +
}
 +
[int кол-во уровней на hard] {
 +
  [int номер_байта][название уровня][byte нулевой байт]
 +
  ...
 +
}
 +
Это и есть "3 части" заголовка. Рассмотрим их поподробнее. <BR>
 +
Сначала идет int - количество уровней (на опр. уровне сложности). Потом идет запись:  
 +
{ int - номер байта (номер байта в файле, считая с нуля, где записан сам уровень.), название уровня, byte - закрывающий нулевой байт }
 +
Эта запись повторяется столько раз, сколько уровней на данном уровне сложности - адрес начала для каждого трека. Потом аналогично для medium и для hard.<BR>
  
2. Сами треки <BR>
+
===== 2. Сами треки =====
 
Эту часть файла тоже можно условно разделить на 2 части: информация о треке и сам трек.<BR>
 
Эту часть файла тоже можно условно разделить на 2 части: информация о треке и сам трек.<BR>
<BR>
 
 
Как раз начало этой, адрес, где эта запись начинается в файле (номер байта) мы читаем в заголовке файла. То есть если в mrg файле 30 уровней (10/10/10), то таких "записей уровня" <BR>будет 30 - они просто идут друг за другом, ничем не разделяются.<BR>
 
Как раз начало этой, адрес, где эта запись начинается в файле (номер байта) мы читаем в заголовке файла. То есть если в mrg файле 30 уровней (10/10/10), то таких "записей уровня" <BR>будет 30 - они просто идут друг за другом, ничем не разделяются.<BR>
<BR>
 
 
"Информация" в файле записана следующим образом: <BR>
 
"Информация" в файле записана следующим образом: <BR>
[byte - 0x33 - с этого байта начинаются все треки][int - положение старта по оси X][int - положение старта по оси Y (положение не флажка, а мотыка)][int - положение финиша по оси X][int - положение финиша по оси Y (в принципе ни от чего не зависит, постоянно 0)][short - количество точек][int - первая точка по оси X][int - первая точка по оси Y] Сам трек записывается как последовательность байтов { [byte - точка по оси X][byte точка по оси Y] }: [byte - точка по оси X][byte точка по оси Y][byte - точка по оси X][byte точка по оси Y]...[byte - точка по оси X][byte точка по оси Y]. <BR>
+
[byte - 0x33 - с этого байта начинаются все треки]
2 байта - X и Y = 1 точка. (количество точек, как я уже сказал, записано в "заголовке", "информации" уровня).
+
[int* - положение старта по оси X][int* - положение старта по оси Y (положение не флажка, а мотыка)]
 +
[int* - положение финиша по оси X][int* - положение финиша по оси Y (в принципе ни от чего не зависит, постоянно 0)]
 +
[short - количество точек][int - первая точка по оси X][int - первая точка по оси Y]  
 +
Сам трек записывается как последовательность байтов:
 +
  [byte - точка по оси X][byte точка по оси Y]
 +
  [byte - точка по оси X][byte точка по оси Y]
 +
  ...
 +
  [byte - точка по оси X][byte точка по оси Y]
 +
2 байта - X и Y = 1 точка. (количество точек, как я уже сказал, записано в "заголовке", "информации" уровня).<br />
 +
Оба байта - со знаком. Их значение - это смещение относительно предыдущей точки. <br/>
 +
Если byte x равен -1, то byte y не читается, а читаются 2 int-а: <br/>
 +
 
 +
signed int x
 +
signed int y
 +
 
 +
Если значение signed int y больше 127, оно игнорируется и принимается за ноль. <br/>
 +
Далее - без изменений, как раньше, byte x и byte y. Порядок байт - от старшего к младшему (big-endian). <br/>
 +
int-ы, помеченные звездочками, записаны по-особому. Их нужно читать так:
 +
 
 +
(i >> 16) << 3
 
----
 
----
<small>Автор [[z-kzn-z]]</small>
+
Автор: [[z-kzn-z]]
 +
[[Категория:Gravity Defied — Trial Racing‏‎]] [[Категория:levels.mrg]]

Текущая версия на 15:54, 1 марта 2014

Для начала для тех, кто в танке, уясню:
int = 4 байта
short = 2 байта
byte = 1 байт

Итак. Грубо говоря, файл можно разделить на 2 части: заголовок и сам файл.

1. Заголовок

Заголовок, в свою очередь, можно поделить на 3 части: заголовок легкого, заголовок среднего, заголовок сложного уровней.
Структура заголовка (схематично):

[int кoл-во уровней на easy] { 
 [int номер_байта][название уровня][byte нулевой байт] 
 ... 
} 
[int кол-во уровней на medium] { 
 [int номер_байта][название уровня][byte нулевой байт] 
 ...
} 
[int кол-во уровней на hard] { 
 [int номер_байта][название уровня][byte нулевой байт] 
 ... 
}

Это и есть "3 части" заголовка. Рассмотрим их поподробнее.
Сначала идет int - количество уровней (на опр. уровне сложности). Потом идет запись:

{ int - номер байта (номер байта в файле, считая с нуля, где записан сам уровень.), название уровня, byte - закрывающий нулевой байт }

Эта запись повторяется столько раз, сколько уровней на данном уровне сложности - адрес начала для каждого трека. Потом аналогично для medium и для hard.

2. Сами треки

Эту часть файла тоже можно условно разделить на 2 части: информация о треке и сам трек.
Как раз начало этой, адрес, где эта запись начинается в файле (номер байта) мы читаем в заголовке файла. То есть если в mrg файле 30 уровней (10/10/10), то таких "записей уровня"
будет 30 - они просто идут друг за другом, ничем не разделяются.
"Информация" в файле записана следующим образом:

[byte - 0x33 - с этого байта начинаются все треки]
[int* - положение старта по оси X][int* - положение старта по оси Y (положение не флажка, а мотыка)]
[int* - положение финиша по оси X][int* - положение финиша по оси Y (в принципе ни от чего не зависит, постоянно 0)]
[short - количество точек][int - первая точка по оси X][int - первая точка по оси Y] 

Сам трек записывается как последовательность байтов:

 [byte - точка по оси X][byte точка по оси Y]
 [byte - точка по оси X][byte точка по оси Y]
 ...
 [byte - точка по оси X][byte точка по оси Y]

2 байта - X и Y = 1 точка. (количество точек, как я уже сказал, записано в "заголовке", "информации" уровня).
Оба байта - со знаком. Их значение - это смещение относительно предыдущей точки.
Если byte x равен -1, то byte y не читается, а читаются 2 int-а:

signed int x 
signed int y

Если значение signed int y больше 127, оно игнорируется и принимается за ноль.
Далее - без изменений, как раньше, byte x и byte y. Порядок байт - от старшего к младшему (big-endian).
int-ы, помеченные звездочками, записаны по-особому. Их нужно читать так:

(i >> 16) << 3

Автор: z-kzn-z