Формат FM3
Формат FM3 является расширенной версией старого формата FM2. В FM2 хранятся данные, необходимые для воспроизведения мувика, а FM3 добавляет к ним данные о состоянии рабочего процесса в Тасэдиторе.
Спецификации формата FM2 можно прочитать в Справке FCEUX, а также на официальном сайте эмулятора.
Любой FM3-файл состоит из трёх частей:
● Заголовок (как в fm2)
● Журнал Ввода (как в fm2)
Заголовок
Заголовок хранится в текстовом формате, в кодировке ASCII.
Он состоит из нескольких строк вида "ключевое слово + значение".
Символом перевода строки может быть как \r\n, так и \n.
Если в начале очередной строки идёт символ "|" (вертикальная черта), это значит, что Заголовок закончился, и начался Журнал Ввода.
В начале каждой строки Заголовка находится ключевое слово, после которого стоит пробел, а затем идёт текстовое представление значения.
В первой строке Заголовка должно идти ключевое слово version, остальные ключевые слова могут располагаться в какой угодно последовательности.
Значение заканчивается переводом строки.
Значение следует разбирать в зависимости от ключевого слова – либо как целочисленное значение, либо как строку текста.
Список ключевых слов с целочисленным значением:
(включая значения для переменных типа Boolean, где 1 = true, 0 = false)
(числовое значение должно умещаться в переменную типа int32)
● version (наличие обязательно) – номер версии формата мувика; на данный момент это 3
● emuVersion (обязательно) – версия эмулятора, в котором был создан этот файл (например, 21060)
● rerecordCount (наличие не обязательно) – счётчик перезаписей
● palFlag (bool) (не обязательно) – true, если мувик использует тайминг PAL, а по умолчанию используется NTSC
● NewPPU (bool) (не обязательно) – true, если мувик использует New PPU
● FDS (bool) (не обязательно) – true, если мувик создан для игры с Famicom Disk System
● fourscore (bool) – true, если мувик создан с использованием устройства fourscore. Если fourscore не использовалось, то в Заголовке обязательно наличие значений для ключевых слов port0 и port1.
● port0 – тип устройства ввода, настроенного на порт 0 приставки. Возможны следующие значения:
● SI_NONE = 0 (ничего не подключено)
● SI_GAMEPAD = 1 (подключен стандартный геймпад NES)
● SI_ZAPPER = 2 (подключен пистолет)
● port1 – тип устройства ввода, настроенного на порт 1 приставки. Возможны следующие значения:
● SI_NONE = 0 (ничего не подключено)
● SI_GAMEPAD = 1 (подключен стандартный геймпад NES)
● SI_ZAPPER = 2 (подключен пистолет)
● port2 (обязательно) – тип устройства ввода, настроенного на порт FCExp приставки. Возможны следующие значения:
● SIFC_NONE = 0 (ничего не подключено)
● binary (bool) (не обязательно) – true, если Журнал Ввода сохранён в двоичном формате. FM2-файлы обычно хранят Ввод в текстовом формате, чтобы его было удобно редактировать в текстовых редакторах. FM3-файлы обычно хранят Ввод в двоичном формате, чтобы сэкономить место на диске
● length (обязательно для fm3) – размер мувика (количество кадров в сохранённом Журнале Ввода). Если в Заголовке есть это ключевое слово, и его значение >= 0, то Журнал Ввода оканчивается после означенного количества записей, а затем следуют данные Тасэдитора. Именно наличие этого ключевого слова в Заголовке отличает FM3-файлы от FM2-файлов.
Список ключевых слов со строковым значением:
(эти строки не могут содержать символ перевода строки, так как он служит индикатором окончания значения)
romFilename (обязательно) – имя файла, использованного при создании проекта
romChecksum (обязательно) – MD5-чексумма РОМа, использованного при создании мувика
comment (не обязательно) – комментарий. По традиции автор мувика обозначается комментарием вида "author имя". Пример: "comment author AnS"
subtitle (не обязательно) – сообщение, которое будет выводиться на экран эмулятора во время проигрывания этого мувика. Сразу после слова subtitle через пробел должно следовать целочисленное значение, определяющее номер кадра, на котором должно появиться сообщение. После этого числа через пробел следует текст выводимого сообщения. Пример: "subtitle 100 Level Two" – на сотом кадре мувика появится сообщение "Level Two"
guid (обязательно) – уникальный идентификатор мувика, сгенерированный при его создании
Журнал Ввода
Журнал Ввода состоит из последовательности записей о состоянии Ввода на каждом кадре мувика. Эти записи могут храниться в виде текстовых строк или в виде двоичных данных.
Текстовый формат:
Каждый кадр мувика представлен текстовой строкой, в начале и конце которой находится символ "|".
Если не используется fourscore, строка имеет следующий вид:
|команды|port0|port1|port2|
В поле команды должно находиться десятичное целое число, интерпретируемое как битовая карта состояний команд приставки:
● бит 0 (значение числа = 1) – Сброс
● бит 1 (значение числа = 2) – Power
● бит 2 (значение числа = 4) – Eject/Insert Disk
● бит 3 (значение числа = 8) – Switch Disk Side
Формат полей port0, port1 и port2 зависит от типа устройства ввода, настроенного на данный порт.
● SI_NONE: поле должно быть пустым
● SI_GAMEPAD: Поле состоит из восьми текстовых символов, соответствующих восьми кнопкам джойстика. Если символ равен " " (пробел) или "." (точка), это означает, что соответствующая кнопка на данном кадре отпущена. Любой другой символ означает, что соответствующая кнопка на данном кадре нажата. Для простоты запоминания, какой столбец какой кнопке соответствует, рекомендуется использовать символы в следующей последовательности: RLDUTSBA (Вправо, Влево, Вниз, Вверх, Start, Select, B, A).
● SI_ZAPPER: Поле состоит из последовательности текстовых символов вида XXX YYY B Q Z
● XXX: %03d – координата X мыши
● YYY: %03d – координата Y мыши
● B: %1d – 1 = кнопка мыши нажата, 0 = не нажата
● Q: %1d – значение, необходимое для эмуляции пистолета
● Z: %d – значение, необходимое для эмуляции пистолета, количество разрядов у этого числа может варьироваться
Если используется fourscore, все устройства ввода считаются геймпадами, и каждая запись представлена строкой вида:
|команды|RLDUTSBA|RLDUTSBA|RLDUTSBA|RLDUTSBA|port2|
(команды, игрок 1, игрок 2, игрок 3, игрок 4, пустота)
Двоичный формат:
Перед началом Журнала Ввода располагается символ "|".
Каждый кадр мувика представлен записью в виде последовательности байтов. Размер каждой записи одинаков и зависит от устройств ввода, настроенных на порты приставки.
В первом байте каждой записи хранится битовая карта состояний команд приставки:
● бит 0 – Сброс
● бит 1 – Power
● бит 2 – Eject/Insert Disk
● бит 3 – Switch Disk Side
Если не используется fourscore, остальное содержание записи зависит от устройств ввода, настреонных на порт 0 и порт 1:
● SI_NONE: 0 байтов добавляется к размеру записи
● SI_GAMEPAD: 1 байт добавляется к размеру записи. Каждый бит этого байта отражает состояние сооветствующей кнопки джойстика (бит 0 = A, бит 1 = B, бит 2 = Select, бит 3 = Start, бит 4 = Вверх, бит 5 = Вниз, бит 6 = Влево, бит 7 = Вправо). Если бит установлен, кнопка считается нажатой на данном кадре, иначе она считается отпущенной
● SI_ZAPPER: 12 байтов добавляется к размеру записи.
● первый байт – координата X мыши
● второй байт – координата Y мыши
● третий байт – 1 = кнопка мышки нажата, 0 = не нажата
● четвёртый байт – значение, необходимое для эмуляции пистолета
● байты с 5-го по 12-й (uint64) – значение, необходимое для эмуляции пистолета
Если используется fourscore, все устройства ввода считаются геймпадами, и к размеру записи добавляется 4 байта. Биты первого байта отражают состояние сооветствующей кнопки первого джойстика (бит 0 = A, бит 1 = B, бит 2 = Select, бит 3 = Start, бит 4 = Вверх, бит 5 = Вниз, бит 6 = Влево, бит 7 = Вправо). Биты второго байта отражают состояние сооветствующей кнопки второго джойстика, и т.д.
Данные Тасэдитора
4 байта |
unsigned int32 |
FM3 version |
4 байта |
unsigned int32 |
saved modules |
??? |
stream |
MARKERS DATA |
??? |
stream |
BOOKMARKS DATA |
??? |
stream |
GREENZONE DATA |
??? |
stream |
HISTORY DATA |
??? |
stream |
PIANO ROLL DATA |
??? |
stream |
SELECTION DATA |
Данные Тасэдитора начинаются сразу после окончания последней записи в Журнале Ввода.
Если во время загрузки fm3-файла сразу после окончания последней записи в Журнале Ввода обнаруживается конец файла, Тасэдитор воспримет этот файл как fm2-файл.
Первые 4 байта данных содержат номер версии формата проекта. Релизная версия TAS Editor 1.0 имеет версию формата под номером 1.
Следующие 4 байта содержат битовую карту, которая может использоваться для определения, какие модули Тасэдитора сохранили свои данные в этот файл:
● бит 0 – в файле сохранены Маркеры
● бит 1 – в файле сохранены Закладки
● бит 2 – в файле сохранена вся Гринзона
● бит 3 – в файле сохранен Журнал Истории
● бит 4 – в файле сохранены данные Piano Roll
● бит 5 – в файле сохранена История Выделений
При сохранении проекта Тасэдитор поочерёдно вызывает все модули, требующие сохранения данных. В зависимости от настроек компактного сохранения каждый модуль осуществляет выборочную сериализацию своих данных в файловый поток. Порядок сохранения модулей всегда одинаков (Маркеры, Закладки, Гринзона, История, 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: Free help authoring tool