Формат FM3
Формат FM3 является расширенной версией старого формата FM2. В FM2 хранятся данные, необходимые для воспроизведения мувика, а FM3 добавляет к ним данные о состоянии рабочего процесса в Тасэдиторе.
Спецификации формата FM2 можно прочитать в Справке FCEUX, а также на официальном сайте эмулятора.
Любой FM3-файл состоит из трёх частей:
Заголовок
Заголовок хранится в текстовом формате, в кодировке ASCII.
Он состоит из нескольких строк вида "ключевое слово + значение".
Символом перевода строки может быть как \r\n, так и \n.
Если в начале очередной строки идёт символ "|" (вертикальная черта), это значит, что Заголовок закончился, и начался Журнал Ввода.
В начале каждой строки Заголовка находится ключевое слово, после которого стоит пробел, а затем идёт текстовое представление значения.
В первой строке Заголовка должно идти ключевое слово version, остальные ключевые слова могут располагаться в какой угодно последовательности.
Значение заканчивается переводом строки.
Значение следует разбирать в зависимости от ключевого слова – либо как целочисленное значение, либо как строку текста.
Список ключевых слов с целочисленным значением:
(включая значения для переменных типа Boolean, где 1 = true, 0 = false)
(числовое значение должно умещаться в переменную типа int32)
Список ключевых слов со строковым значением:
(эти строки не могут содержать символ перевода строки, так как он служит индикатором окончания значения)
romFilename (обязательно) – имя файла, использованного при создании проекта
romChecksum (обязательно) – MD5-чексумма РОМа, использованного при создании мувика
comment (не обязательно) – комментарий. По традиции автор мувика обозначается комментарием вида "author имя". Пример: "comment author AnS"
subtitle (не обязательно) – сообщение, которое будет выводиться на экран эмулятора во время проигрывания этого мувика. Сразу после слова subtitle через пробел должно следовать целочисленное значение, определяющее номер кадра, на котором должно появиться сообщение. После этого числа через пробел следует текст выводимого сообщения. Пример: "subtitle 100 Level Two" – на сотом кадре мувика появится сообщение "Level Two"
guid (обязательно) – уникальный идентификатор мувика, сгенерированный при его создании
Журнал Ввода
Журнал Ввода состоит из последовательности записей о состоянии Ввода на каждом кадре мувика. Эти записи могут храниться в виде текстовых строк или в виде двоичных данных.
Текстовый формат:
Каждый кадр мувика представлен текстовой строкой, в начале и конце которой находится символ "|".
Если не используется fourscore, строка имеет следующий вид:
|команды|port0|port1|port2|
В поле команды должно находиться десятичное целое число, интерпретируемое как битовая карта состояний команд приставки:
Формат полей port0, port1 и port2 зависит от типа устройства ввода, настроенного на данный порт.
Если используется fourscore, все устройства ввода считаются геймпадами, и каждая запись представлена строкой вида:
|команды|RLDUTSBA|RLDUTSBA|RLDUTSBA|RLDUTSBA|port2|
(команды, игрок 1, игрок 2, игрок 3, игрок 4, пустота)
Двоичный формат:
Перед началом Журнала Ввода располагается символ "|".
Каждый кадр мувика представлен записью в виде последовательности байтов. Размер каждой записи одинаков и зависит от устройств ввода, настроенных на порты приставки.
В первом байте каждой записи хранится битовая карта состояний команд приставки:
Если не используется fourscore, остальное содержание записи зависит от устройств ввода, настреонных на порт 0 и порт 1:
Если используется fourscore, все устройства ввода считаются геймпадами, и к размеру записи добавляется 4 байта. Биты первого байта отражают состояние сооветствующей кнопки первого джойстика (бит 0 = A, бит 1 = B, бит 2 = Select, бит 3 = Start, бит 4 = Вверх, бит 5 = Вниз, бит 6 = Влево, бит 7 = Вправо). Биты второго байта отражают состояние сооветствующей кнопки второго джойстика, и т.д.
Данные Тасэдитора
4 байта |
unsigned int32 |
Версия FM3 |
4 байта |
unsigned int32 |
Какие модули сохранены |
4 байта |
unsigned int32 |
Количество смещений (N) |
4 * N байтов |
указатели |
Смещения |
??? |
stream |
MARKERS DATA |
??? |
stream |
BOOKMARKS DATA |
??? |
stream |
GREENZONE DATA |
??? |
stream |
HISTORY DATA |
??? |
stream |
PIANO ROLL DATA |
??? |
stream |
SELECTION DATA |
Данные Тасэдитора начинаются сразу после окончания последней записи в Журнале Ввода. Если сразу после окончания последней записи обнаруживается конец файла, Тасэдитор воспримет этот файл как fm2-файл.
Первые 4 байта данных содержат номер версии формата проекта. Релизная версия TAS Editor 1.0 имеет версию формата под номером 3.
Следующие 4 байта содержат битовую карту, которая может использоваться для определения, какие модули Тасэдитора сохранили свои данные в этот файл:
Следующие 4 байта содержат общее число сохраняемых модулей, в версии 3 это число всегда должно быть равно 6.
Затем располагаются шесть четырёхбайтных смещений на данные каждого модуля. Смещения отсчитываются от начала файла.
При сохранении проекта Тасэдитор поочерёдно вызывает все модули, требующие сохранения данных. Каждый модуль сначала сохраняет текущую позицию записи в файл (смещение), а затем в зависимости от настроек компактного сохранения осуществляет выборочную сериализацию своих данных в файловый поток. Порядок сохранения модулей всегда одинаков (Маркеры, Закладки, Гринзона, История, Piano Roll, Выделение). При загрузке проекта Тасэдитор вызывает модули в той же очерёдности, и они переходят по нужному смещению и загружают свои данные из файлового потока.
Чтобы оценить целостность загружаемых данных, каждый модуль при сохранении записывает в файл строку-идентификатор своих данных. И если перед началом загрузки своих данных модуль не обнаружит эту строку на текущей позиции в файловом потоке, он откажется от загрузки и создаст данные по умолчанию, передав Тасэдитору сообщение об ошибке загрузки. Кроме того, если вместо строки-идентификатора сохранения он обнаружит строку-идентификатор отсутствия данных, он откажется от загрузки и создаст данные по умолчанию, без генерации сообщения об ошибке.
Модуль |
Идентификатор сохранённых данных |
Идентификатор отсутствия данных |
Маркеры |
MARKERS |
MARKERX |
Закладки |
BOOKMARKS |
BOOKMARKX |
Гринзона |
GREENZONE |
GREENZONX |
История |
HISTORY |
HISTORX |
Piano Roll |
PIANO_ROLL |
PIANO_ROLX |
Выделение |
SELECTION |
SELECTIOX |
Created with the Personal Edition of HelpNDoc: Single source CHM, PDF, DOC and HTML Help creation