Структура файла levels.mrg: различия между версиями
Нет описания правки |
Shevron (обсуждение | вклад) Нет описания правки |
||
(не показано 5 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
Для начала для тех, кто в танке, уясню: <BR> | |||
int = 4 байта <BR> | ''int'' = 4 байта <BR> | ||
short = 2 байта <BR> | ''short'' = 2 байта <BR> | ||
byte = 1 байт <BR> | ''byte'' = 1 байт <BR> | ||
Итак. Грубо говоря, файл можно разделить на 2 части: заголовок и сам файл.< | |||
1. Заголовок | Итак. Грубо говоря, файл можно разделить на 2 части: заголовок и сам файл.<br /> | ||
=====1. Заголовок===== | |||
Заголовок, в свою очередь, можно поделить на 3 части: заголовок легкого, заголовок среднего, заголовок сложного уровней. | |||
<BR> | <BR> | ||
Структура заголовка (схематично): | Структура заголовка (схематично): | ||
[int кoл-во уровней на easy] { | |||
Это и есть "3 части" заголовка. | [int номер_байта][название уровня][byte нулевой байт] | ||
... | |||
Рассмотрим их поподробнее. <BR> | } | ||
Сначала идет int - количество уровней (на опр. уровне сложности). | [int кол-во уровней на medium] { | ||
Потом идет запись | [int номер_байта][название уровня][byte нулевой байт] | ||
Потом аналогично для medium и для hard.<BR> | ... | ||
} | |||
[int кол-во уровней на hard] { | |||
[int номер_байта][название уровня][byte нулевой байт] | |||
... | |||
} | |||
Это и есть "3 части" заголовка. Рассмотрим их поподробнее. <BR> | |||
Сначала идет int - количество уровней (на опр. уровне сложности). Потом идет запись: | |||
{ int - номер байта (номер байта в файле, считая с нуля, где записан сам уровень.), название уровня, byte - закрывающий нулевой байт } | |||
Эта запись повторяется столько раз, сколько уровней на данном уровне сложности - адрес начала для каждого трека. Потом аналогично для medium и для hard.<BR> | |||
2. Сами треки | ===== 2. Сами треки ===== | ||
Эту часть файла тоже можно условно разделить на 2 части: информация о треке и сам трек.<BR> | Эту часть файла тоже можно условно разделить на 2 части: информация о треке и сам трек.<BR> | ||
Как раз начало этой, адрес, где эта запись начинается в файле (номер байта) мы читаем в заголовке файла. То есть если в mrg файле 30 уровней (10/10/10), то таких "записей уровня" <BR>будет 30 - они просто идут друг за другом, ничем не разделяются.<BR> | Как раз начало этой, адрес, где эта запись начинается в файле (номер байта) мы читаем в заголовке файла. То есть если в mrg файле 30 уровней (10/10/10), то таких "записей уровня" <BR>будет 30 - они просто идут друг за другом, ничем не разделяются.<BR> | ||
"Информация" в файле записана следующим образом: <BR> | "Информация" в файле записана следующим образом: <BR> | ||
[byte - 0x33 - с этого байта начинаются все треки][int - положение старта по оси X][int - положение старта по оси Y (положение не флажка, а мотыка)][int - положение финиша по оси X][int - положение финиша по оси Y (в принципе ни от чего не зависит, постоянно 0)][short - количество точек][int - первая точка по оси X][int - первая точка по оси Y] Сам трек записывается как последовательность байтов | [byte - 0x33 - с этого байта начинаются все треки] | ||
2 байта - X и Y = 1 точка. (количество точек, как я уже сказал, записано в "заголовке", "информации" уровня).</ | [int* - положение старта по оси X][int* - положение старта по оси Y (положение не флажка, а мотыка)] | ||
Автор z- | [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 | |||
---- | |||
Автор: [[z-kzn-z]] | |||
[[Категория:Gravity Defied — Trial Racing]] [[Категория:levels.mrg]] |
Текущая версия от 10: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