<pclass="rvps10"><spanclass="rvts22">Формат FM3 является расширенной версией старого формата FM2. В FM2 хранятся данные, необходимые для воспроизведения мувика, а FM3 добавляет к ним данные о состоянии рабочего процесса в Тасэдиторе.</span></p>
<pclass="rvps10"><spanclass="rvts22">Спецификации формата FM2 можно прочитать в Справке FCEUX, а также </span><aclass="rvts28"href="http://www.fceux.com/web/FM2.html"target="_blank">на официальном сайте эмулятора</a><spanclass="rvts22">.</span></p>
<pclass="rvps10"><spanclass="rvts22">Символом перевода строки может быть как </span><spanclass="rvts72">\r\n</span><spanclass="rvts22">, так и </span><spanclass="rvts72">\n</span><spanclass="rvts22">.</span></p>
<pclass="rvps10"><spanclass="rvts22">Если в начале очередной строки идёт символ "|" (вертикальная черта), это значит, что Заголовок закончился, и начался Журнал Ввода.</span></p>
<pclass="rvps10"><spanclass="rvts22">В начале каждой строки Заголовка находится ключевое слово, после которого стоит пробел, а затем идёт текстовое представление значения.</span></p>
<pclass="rvps10"><spanclass="rvts22">В первой строке Заголовка должно идти ключевое слово </span><spanclass="rvts26">version</span><spanclass="rvts22">, остальные ключевые слова могут располагаться в какой угодно последовательности.</span></p>
<pclass="rvps10"><spanclass="rvts22">Значение заканчивается переводом строки.</span></p>
<pclass="rvps10"><spanclass="rvts22">Значение следует разбирать в зависимости от ключевого слова – либо как целочисленное значение, либо как строку текста.</span></p>
<pclass="rvps10"><spanclass="rvts22">(включая значения для переменных типа Boolean, где 1 = </span><spanclass="rvts72">true</span><spanclass="rvts22">, 0 = </span><spanclass="rvts72">false</span><spanclass="rvts22">)</span></p>
<pclass="rvps10"><spanclass="rvts22">(числовое значение должно умещаться в переменную типа </span><spanclass="rvts72">int32</span><spanclass="rvts22">)</span></p>
<liclass="rvps10"><spanclass="rvts26">version</span><spanclass="rvts22"> (наличие обязательно) – номер версии формата мувика; на данный момент это </span><spanclass="rvts26">3</span></li>
<liclass="rvps10"><spanclass="rvts26">emuVersion</span><spanclass="rvts22"> (обязательно) – версия эмулятора, в котором был создан этот файл (например, </span><spanclass="rvts26">21060</span><spanclass="rvts22">)</span></li>
<liclass="rvps10"><spanclass="rvts26">rerecordCount</span><spanclass="rvts22"> (наличие не обязательно) – счётчик перезаписей</span></li>
<liclass="rvps10"><spanclass="rvts26">palFlag</span><spanclass="rvts22"> (</span><spanclass="rvts72">bool</span><spanclass="rvts22">) (не обязательно) –</span><spanclass="rvts72">true</span><spanclass="rvts22">, если мувик использует тайминг PAL, а по умолчанию используется NTSC</span></li>
<liclass="rvps10"><spanclass="rvts26">NewPPU</span><spanclass="rvts22"> (</span><spanclass="rvts72">bool</span><spanclass="rvts22">) (не обязательно) –</span><spanclass="rvts72">true</span><spanclass="rvts22">, если мувик использует New PPU</span></li>
<liclass="rvps10"><spanclass="rvts26">FDS</span><spanclass="rvts22"> (</span><spanclass="rvts72">bool</span><spanclass="rvts22">) (не обязательно) –</span><spanclass="rvts72">true</span><spanclass="rvts22">, если мувик создан для игры с Famicom Disk System</span></li>
<liclass="rvps10"><spanclass="rvts26">fourscore</span><spanclass="rvts22"> (</span><spanclass="rvts72">bool</span><spanclass="rvts22">) –</span><spanclass="rvts72">true</span><spanclass="rvts22">, если мувик создан с использованием устройства fourscore. Если fourscore не использовалось, то в Заголовке обязательно наличие значений для ключевых слов </span><spanclass="rvts26">port0</span><spanclass="rvts22"> и </span><spanclass="rvts26">port1</span><spanclass="rvts22">.</span></li>
<liclass="rvps10"><spanclass="rvts26">port0</span><spanclass="rvts22">– тип устройства ввода, настроенного на порт 0 приставки. Возможны следующие значения:</span></li>
<liclass="rvps10"><spanclass="rvts26">port1</span><spanclass="rvts22">– тип устройства ввода, настроенного на порт 1 приставки. Возможны следующие значения:</span></li>
<liclass="rvps10"><spanclass="rvts26">port2</span><spanclass="rvts22"> (обязательно) – тип устройства ввода, настроенного на порт FCExp приставки. Возможны следующие значения:</span></li>
<liclass="rvps10"><spanclass="rvts26">binary</span><spanclass="rvts22"> (</span><spanclass="rvts72">bool</span><spanclass="rvts22">) (не обязательно) –</span><spanclass="rvts72">true</span><spanclass="rvts22">, если Журнал Ввода сохранён в двоичном формате. FM2-файлы обычно хранят Ввод в текстовом формате, чтобы его было удобно редактировать в текстовых редакторах. FM3-файлы обычно хранят Ввод в двоичном формате, чтобы сэкономить место на диске</span></li>
<liclass="rvps10"><spanclass="rvts26">length</span><spanclass="rvts22"> (обязательно для fm3) – размер мувика (количество кадров в сохранённом Журнале Ввода). Если в Заголовке есть это ключевое слово, и его значение >= 0, то Журнал Ввода оканчивается после означенного количества записей, а затем следуют данные Тасэдитора. Именно наличие этого ключевого слова в Заголовке отличает FM3-файлы от FM2-файлов.</span></li>
<pclass="rvps10"><spanclass="rvts22">(эти строки не могут содержать символ перевода строки, так как он служит индикатором окончания значения)</span></p>
<pclass="rvps10"><spanclass="rvts26">romFilename</span><spanclass="rvts22"> (обязательно) – имя файла, использованного при создании проекта</span></p>
<pclass="rvps10"><spanclass="rvts26">romChecksum</span><spanclass="rvts22"> (обязательно) – MD5-чексумма РОМа, использованного при создании мувика</span></p>
<pclass="rvps10"><spanclass="rvts26">comment</span><spanclass="rvts22"> (не обязательно) – комментарий. По традиции автор мувика обозначается комментарием вида "author имя". Пример: "comment author AnS"</span></p>
<pclass="rvps10"><spanclass="rvts26">subtitle</span><spanclass="rvts22"> (не обязательно) – сообщение, которое будет выводиться на экран эмулятора во время проигрывания этого мувика. Сразу после слова subtitle через пробел должно следовать целочисленное значение, определяющее номер кадра, на котором должно появиться сообщение. После этого числа через пробел следует текст выводимого сообщения. Пример: "subtitle 100 Level Two" – на сотом кадре мувика появится сообщение "Level Two"</span></p>
<pclass="rvps10"><spanclass="rvts26">guid</span><spanclass="rvts22"> (обязательно) – уникальный идентификатор мувика, сгенерированный при его создании</span></p>
<pclass="rvps10"><spanclass="rvts22">Журнал Ввода состоит из последовательности записей о состоянии Ввода на каждом кадре мувика. Эти записи могут храниться в виде текстовых строк или в виде двоичных данных.</span></p>
<pclass="rvps10"><spanclass="rvts22">В поле </span><spanclass="rvts26">команды</span><spanclass="rvts22"> должно находиться десятичное целое число, интерпретируемое как битовая карта состояний команд приставки:</span></p>
<pclass="rvps10"><spanclass="rvts22">Формат полей </span><spanclass="rvts26">port0</span><spanclass="rvts22">, </span><spanclass="rvts26">port1 </span><spanclass="rvts22">и </span><spanclass="rvts26">port2 </span><spanclass="rvts22">зависит от типа устройства ввода, настроенного на данный порт.</span></p>
<liclass="rvps10"><spanclass="rvts22">SI_NONE: поле должно быть пустым</span></li>
<liclass="rvps10"><spanclass="rvts22">SI_GAMEPAD: Поле состоит из восьми текстовых символов, соответствующих восьми кнопкам джойстика. Если символ равен " " (пробел) или "." (точка), это означает, что соответствующая кнопка на данном кадре отпущена. Любой другой символ означает, что соответствующая кнопка на данном кадре нажата. Для простоты запоминания, какой столбец какой кнопке соответствует, рекомендуется использовать символы в следующей последовательности: RLDUTSBA (</span><spanclass="rvts32">Вправо</span><spanclass="rvts22">, </span><spanclass="rvts32">Влево</span><spanclass="rvts22">, </span><spanclass="rvts32">Вниз</span><spanclass="rvts22">, </span><spanclass="rvts32">Вверх</span><spanclass="rvts22">, </span><spanclass="rvts32">Start</span><spanclass="rvts22">, </span><spanclass="rvts32">Select</span><spanclass="rvts22">, </span><spanclass="rvts32">B</span><spanclass="rvts22">, </span><spanclass="rvts32">A</span><spanclass="rvts22">).</span></li>
<liclass="rvps10"><spanclass="rvts22">SI_ZAPPER: Поле состоит из последовательности текстовых символов вида </span><spanclass="rvts26">XXX YYY B Q Z</span></li>
<liclass="rvps10"style="text-indent: 60px"><spanclass="rvts26">Q</span><spanclass="rvts22">: %1d – значение, необходимое для эмуляции пистолета</span></li>
<liclass="rvps10"style="text-indent: 60px"><spanclass="rvts26">Z</span><spanclass="rvts22">: %d – значение, необходимое для эмуляции пистолета, количество разрядов у этого числа может варьироваться</span></li>
<pclass="rvps10"><spanclass="rvts22">Если используется fourscore, все устройства ввода считаются геймпадами, и каждая запись представлена строкой вида:</span></p>
<pclass="rvps10"><spanclass="rvts22">Перед началом Журнала Ввода располагается символ "|".</span></p>
<pclass="rvps10"><spanclass="rvts22">Каждый кадр мувика представлен записью в виде последовательности байтов. Размер каждой записи одинаков и зависит от устройств ввода, настроенных на порты приставки.</span></p>
<pclass="rvps10"><spanclass="rvts22">Если не используется fourscore, остальное содержание записи зависит от устройств ввода, настреонных на порт 0 и порт 1:</span></p>
<liclass="rvps10"style="text-indent: 60px"><spanclass="rvts22">байты с 5-го по 12-й (</span><spanclass="rvts72">uint64</span><spanclass="rvts22">) – значение, необходимое для эмуляции пистолета</span></li>
<pclass="rvps10"><spanclass="rvts22">Если используется fourscore, все устройства ввода считаются геймпадами, и к размеру записи добавляется 4 байта. Биты первого байта отражают состояние сооветствующей кнопки первого джойстика (бит 0 = </span><spanclass="rvts32">A</span><spanclass="rvts22">, бит 1 = </span><spanclass="rvts32">B</span><spanclass="rvts22">, бит 2 = </span><spanclass="rvts32">Select</span><spanclass="rvts22">, бит 3 = </span><spanclass="rvts32">Start</span><spanclass="rvts22">, бит 4 = </span><spanclass="rvts32">Вверх</span><spanclass="rvts22">, бит 5 = </span><spanclass="rvts32">Вниз</span><spanclass="rvts22">, бит 6 = </span><spanclass="rvts32">Влево</span><spanclass="rvts22">, бит 7 = </span><spanclass="rvts32">Вправо</span><spanclass="rvts22">). Биты второго байта отражают состояние сооветствующей кнопки второго джойстика, и т.д.</span></p>
<pclass="rvps10"><spanclass="rvts22">Данные Тасэдитора начинаются сразу после окончания последней записи в Журнале Ввода. Если сразу после окончания последней записи обнаруживается конец файла, Тасэдитор воспримет этот файл как fm2-файл.</span></p>
<pclass="rvps10"><spanclass="rvts22">Первые 4 байта данных содержат номер версии формата проекта. Релизная версия TAS Editor 1.0 имеет версию формата под номером 3.</span></p>
<pclass="rvps10"><spanclass="rvts22">Следующие 4 байта содержат битовую карту, которая может использоваться для определения, какие модули Тасэдитора сохранили свои данные в этот файл:</span></p>
<pclass="rvps10"><spanclass="rvts22">Следующие 4 байта содержат общее число сохраняемых модулей, в версии 3 это число всегда должно быть равно 6.</span></p>
<pclass="rvps10"><spanclass="rvts22">Затем располагаются шесть четырёхбайтных смещений на данные каждого модуля. Смещения отсчитываются от начала файла.</span></p>
<pclass="rvps10"><spanclass="rvts22">При сохранении проекта Тасэдитор поочерёдно вызывает все модули, требующие сохранения данных. Каждый модуль сначала сохраняет текущую позицию записи в файл (смещение), а затем в зависимости от настроек компактного сохранения осуществляет выборочную сериализацию своих данных в файловый поток. Порядок сохранения модулей всегда одинаков (Маркеры, Закладки, Гринзона, История, Piano Roll, Выделение). При загрузке проекта Тасэдитор вызывает модули в той же очерёдности, и они переходят по нужному смещению и загружают свои данные из файлового потока.</span></p>
<pclass="rvps10"><spanclass="rvts22">Чтобы оценить целостность загружаемых данных, каждый модуль при сохранении записывает в файл строку-идентификатор своих данных. И если перед началом загрузки своих данных модуль не обнаружит эту строку на текущей позиции в файловом потоке, он откажется от загрузки и создаст данные по умолчанию, передав Тасэдитору сообщение об ошибке загрузки. Кроме того, если вместо строки-идентификатора сохранения он обнаружит строку-идентификатор отсутствия данных, он откажется от загрузки и создаст данные по умолчанию, без генерации сообщения об ошибке.</span></p>
<pclass="rvps8"><spanclass="rvts18">Created with the Personal Edition of HelpNDoc: </span><aclass="rvts19"href="http://www.helpndoc.com/help-authoring-tool">Single source CHM, PDF, DOC and HTML Help creation</a></p>