# Lua-функции

Lua-функции

TAS Editor 1.0 предоставляет библиотеку из 24 функций, доступных для использования в Lua-скриптах, запускаемых в эмуляторе FCEUX. С помощью Lua-скриптов вы можете автоматизировать некоторые аспекты работы в Тасэдиторе и даже создать свои инструменты для обработки мувика.

В папке FCEUX есть папка /luaScripts, в которой находится подпапка /taseditor. Там можно найти несколько скриптов с примерами использования функций этой библиотеки.

Если вы не знаете, как создавать и запускать Lua-скрипты в эмуляторах, прочитайте раздел Продвинутые возможности , а также соответствующий раздел в документации FCEUX .

Полный список функций:

taseditor.registerauto(function func)

taseditor.registermanual(function func, [string name])

bool taseditor.engaged()

bool taseditor.markedframe(int frame)

int taseditor.getmarker(int frame)

int taseditor.setmarker(int frame)

taseditor.removemarker(int frame)

string taseditor.getnote(int index)

taseditor.setnote(int index, string newtext)

int taseditor.getcurrentbranch()

string taseditor.getrecordermode()

int taseditor.getsuperimpose()

int taseditor.getlostplayback()

int taseditor.getplaybacktarget()

taseditor.setplayback(int frame)

taseditor.stopseeking()

table taseditor.getselection()

taseditor.setselection(table new_set)

int taseditor.getinput(int frame, int joypad)

taseditor.submitinputchange(int frame, int joypad, int input)

taseditor.submitinsertframes(int frame, int number)

taseditor.submitdeleteframes(int frame, int number)

int taseditor.applyinputchanges([string name])

taseditor.clearinputchanges()

taseditor.registerauto(function func)

Регистрирует функцию ("Auto Function", Автофункция), которая будет периодически вызываться эмулятором. Можно зарегистрировать и исполнять Автофункцию, даже когда Тасэдитор не запущен.

Когда FCEUX эмулирует игру, Автофункция запускается по окончании каждого кадра (то есть 60 раз в секунду в NTSC-играх и 50 раз в PAL).

Когда FCEUX стоит на паузе, Автофункция запускается 20 раз в секунду.

Пользователь может включать и отключать вызовы Автофункции с помощью галочки "Auto function" в интерфейсе Тасэдитора.

Как и в случае с остальными регистрируемыми Луа-функциями в FCEUX, одновременно может быть зарегистрирована только одна Автофункция. Если вы зарегистрируете две Автофункции, вторая заменит первую, причём второй вызов taseditor.registerauto() возвратит ссылку на код старой Автофункции. Вы можете удалить зарегистрированную Автофункцию, вызвав taseditor.registerauto(nil).

Если скрипт заканчивает свою работу, а зарегистрированные функции остались, FCEUX не удаляет скрипт из памяти, чтобы была возможность вызывать эти функции. Скрипт завершается, если пользователь останавливает его вручную, или же если все зарегистрированные функции оказываются удалены.

taseditor.registermanual(function func, [string name])

Регистрирует функцию ("Manual Function", Ручная функция), которая может быть вызвана пользователем Тасэдитора вручную. Можно зарегистрировать Ручную функцию даже когда Тасэдитор не запущен.

Ручная функция не зависит от состояния паузы эмуляции. Она будет вызвана в конце кадра, в течение которого пользователь нажал кнопку Run function в интерфейсе Тасэдитора.

Вы можете указать название, которое будет отображаться на кнопке вместо текста "Run function".

Ручную функцию невозможно вызвать чаще, чем частота обновления окна Тасэдитора (60/50 FPS или 20FPS во время паузы).

Выполнение Ручной функции расположено в коде FCEUX сразу после выполнения Автофункции.

С помощью регистрации Луа-функций вы можете создавать новые инструменты для Тасэдитора. Например, можно написать скрипт, который инвертирует выделенный Ввод, так что пользователь сможет в любой момент выделить регион мувика и нажать кнопку Run function для инвертирования Ввода в этом регионе.

Как и в случае с остальными регистрируемыми Луа-функциями в FCEUX, одновременно может быть зарегистрирована только одна Ручная функция. Если вы зарегистрируете две Ручные функции, вторая заменит первую, причём второй вызов taseditor.registermanual() возвратит ссылку на старую Ручную функцию. Вы можете удалить зарегистрированную Ручную функцию, вызвав taseditor.registermanual(nil).

Если скрипт заканчивает свою работу, а зарегистрированные функции остались, FCEUX не удаляет скрипт из памяти, чтобы была возможность вызывать эти функции. Скрипт завершается, если пользователь останавливает его вручную, или же если все зарегистрированные функции оказываются удалены.

bool taseditor.engaged()

Возвращает true, если Тасэдитор в данный момент запущен, иначе возвращает false.

Кроме того, когда Тасэдитор запущен, вызов функции movie.mode() возвращает строку "taseditor".

bool taseditor.markedframe(int frame)

Возвращает true, если в текущем мувике на указанном кадре установлен Маркер, иначе возвращает false.

Если Тасэдитор не запущен, возвращает false.

int taseditor.getmarker(int frame)

Возвращает порядковый номер Маркера, под которым находится указанный кадр.

Если Тасэдитор не запущен, возвращает -1.

int taseditor.setmarker(int frame)

Устанавливает Маркер на указанный кадр. Возвращает порядковый номер установленного Маркера.

Если на этом кадре уже есть Маркер, никаких изменений не производится, будет возвращён номер существующего Маркера на указанном кадре.

Можно устанавливать Маркеры даже за пределами Ввода.

Если Тасэдитор не запущен, возвращает -1.

taseditor.removemarker(int frame)

Удаляет Маркер с указанного кадра. Если на этом кадре не было Маркера, никаких изменений не производится.

Если Тасэдитор не запущен, никаких изменений не производится.

string taseditor.getnote(int index)

Возвращает строку с текстом Заметки указанного Маркера.

Если Тасэдитор не запущен, возвращает nil.

Если указанный Маркер не существует, возвращает текст Заметки нулевого Маркера.

taseditor.setnote(int index, string newtext)

Изменяет текст Заметки указанного Маркера.

Если указанный Маркер не существует, никаких изменений не производится.

Если Тасэдитор не запущен, никаких изменений не производится.

int taseditor.getcurrentbranch()

Возвращает число от 0 до 9, представляющее собой номер текущего ответвления.

Если в проекте отсутствуют ответвления, возвращает -1.

Если Тасэдитор не запущен, возвращает -1.

string taseditor.getrecordermode()

Возвращает строку, соответствующую текущему режиму Рекордера:

- "All"
- "1P"
- "2P"
- "3P"
- "4P"

Если Тасэдитор не запущен, возвращает nil.

Когда вам требуется узнать состояние Записи (Read-only или Read+Write), воспользуйтесь функцией emu.readonly().

int taseditor.getsuperimpose()

Возвращает текущее состояние галочки "Superimpose" в интерфейсе Тасэдитора.

0 – галочка не установлена (пустой чекбокс)

1 – галочка установлена

2 – неопределённое состояние (можно трактовать это как "галочка наполовину установлена")

Если Тасэдитор не запущен, возвращает -1.

int taseditor.getlostplayback()

Возвращает номер кадра, на котором находился Курсор Проигрывателя до изменения Ввода.

Если Курсор Проигрывателя не терял позицию при усечении Гринзоны, возвращает -1.

Если Тасэдитор не запущен, возвращает -1.

int taseditor.getplaybacktarget()

Если Проигрыватель Тасэдитора в данный момент добегает (seek) к целевому кадру, эта функция возвращает номер целевого кадра.

Если же Проигрыватель не занят добеганием, возвращает -1.

Если Тасэдитор не запущен, возвращает -1.

taseditor.setplayback(int frame)

Посылает Курсор Проигрывателя на указанный кадр.

Если указанный кадр не находится в Гринзоне, Проигрыватель Тасэдитора начинает добегание к этому кадру.

Если Тасэдитор не запущен, ничего не производится.

taseditor.stopseeking()

Прекращает добегание и ставит эмулятор на паузу.

Если Проигрыватель не занят добеганием, просто ставит эмулятор на паузу.

Если Тасэдитор не запущен, ничего не производится.

table taseditor.getselection()

Возвращает таблицу (массив), содержащую номера выделенных в данынй момент кадров. Эти номера отсортированы по возрастанию.

Если выделенных кадров в данный момент нет, возвращает nil.

Если Тасэдитор не запущен, возвращает nil.

taseditor.setselection(table new_set)

Изменяет текущее Выделение на указанный набор кадров. Номера кадров в вашей таблице не обязательно отсортировывать.

Если нужно очистить Выделение, используйте taseditor.setselection(nil).

Если Тасэдитор не запущен, ничего не производится.

int taseditor.getinput(int frame, int joypad)

Возвращает число, представляющее собой Ввод указанного джойстика на указанном кадре.

Если указан отрицательный номер кадра, возвращает -1.

Если указан номер кадра за пределами текущего Ввода мувика, возвращает 0, что может трактоваться как отсутствие нажатий на этом кадре.

Указываемое вами значение джойстика (joypad) должно быть одним из следующих чисел:

0 – если нужно получить приставочные команды (бит 0 = сброс, бит 1 = включение консоли, бит 2 = вставка диска FDS, бит 3 = смена стороны диска FDS)

1 – чтобы получить кнопки 1 пада (бит 0 = A, бит 1 = B, бит 2 = Select, бит 3 = Start, бит 4 = Вверх, бит 5 = Вниз, бит 6 = Влево, бит 7 = Вправо)

2 – чтобы получить кнопки 2 пада

3 – чтобы получить кнопки 3 пада

4 – чтобы получить кнопки 4 пада

Возвратившееся число (если оно не равно -1) следует рассматривать как байт, каждый бит которого отвечает за одну кнопку (например, если младший бит установлен, это означает, что кнопка A нажата). Используйте битовые операции, чтобы получить состояние нужных кнопок.

Если указанный джойстик не является числом в пределах [0-4], возвращает -1.

Если Тасэдитор не запущен, возвращает -1.

taseditor.submitinputchange(int frame, int joypad, int input)

Отправляет запрос Тасэдитору, требуя изменить Ввод указанного джойстика на указанном кадре.

Сам Ввод мувика будет изменён только после вызова taseditor.applyinputchanges().

Таким образом вы можете изменить сразу несколько кадров мувика, сделав несколько последовательных вызовов taseditor.submitinputchange(), а затем применив все накопившиеся запросы к мувику одним вызовом taseditor.applyinputchanges().

В момент применения списка запросов Тасэдитор исполняет их в порядке поступления.

Если указан отрицательный номер кадра, Тасэдитор проигнорирует этот запрос.

Если указан номер кадра за пределами Ввода мувика, Тасэдитор расширит границы мувика во время applyinputchanges() до указанного кадра.

Если указанный джойстик не является числом в пределах [0-4], Тасэдитор проигнорирует этот запрос.

Указанный Ввод должен быть числом, которое Тасэдитор сможет представить в виде последовательности битов, отражающих состояние соответствующих кнопок указанного джойстика (бит 0 = A, бит 1 = B, бит 2 = Select, бит 3 = Start, бит 4 = Вверх, бит 5 = Вниз, бит 6 = Влево, бит 7 = Вправо).

Если Тасэдитор не запущен, ничего не производится.

taseditor.submitinsertframes(int frame, int number)

Отправляет запрос Тасэдитору, требуя вставить указанное количество пустых кадров перед указанным номером кадра мувика.

Сам Ввод мувика будет изменён только после вызова taseditor.applyinputchanges().

Вставка пустых кадров сдвигает вниз часть старого Ввода, а также сдвигает вниз часть Маркеров (если установлена галочка " Bind Markers to Input ").

Если указанное количество кадров для вставки меньше или равно нулю, Тасэдитор проигнорирует этот запрос.

Если указан отрицательный номер кадра, Тасэдитор проигнорирует этот запрос.

Если указан номер кадра за пределами Ввода мувика, Тасэдитор расширит границы мувика во время applyinputchanges() до указанного кадра.

Если Тасэдитор не запущен, ничего не производится.

taseditor.submitdeleteframes(int frame, int number)

Отправляет запрос Тасэдитору, требуя удалить из мувика указанное количество кадров, начиная с указанного кадра.

Сам Ввод мувика будет изменён только после вызова taseditor.applyinputchanges().

Удаление кадров сдвигает вверх часть старого Ввода, а также сдвигает вверх часть Маркеров (если установлена галочка " Bind Markers to Input ").

Если указанное количество кадров для удаления меньше или равно нулю, Тасэдитор проигнорирует этот запрос.

Если указан отрицательный номер кадра, Тасэдитор проигнорирует этот запрос.

Если указан номер кадра за пределами Ввода мувика, Тасэдитор расширит границы мувика во время applyinputchanges() до указанного кадра.

Если Тасэдитор не запущен, ничего не производится.

int taseditor.applyinputchanges([string name])

Моментально применяет список накопившихся запросов к текущему мувику. Если эти запросы действительно внесли какие-то изменения во Ввод мувика, в Журнале Истории появится новый пункт (чтобы пользователь мог откатить эти изменения), как следствие, Гринзона может быть усечена, Курсор Проигрывателя может отступить назад и запустить автоматическое добегание.

Возвращает номер кадра, на котором были обнаружен первый факт изменения Ввода.

Если изменений не обнаружено (например, вы запросили Тасэдитор установить нажатия для кнопок, которые и так уже нажаты), возвращает -1.

Если список запросов был пуст, возвращает -1.

Вы можете указать имя, которое будет присвоено найденным изменениям Ввода. Это имя отразится в Журнале Истории. Если вы не указываете имя, Тасэдитор использует имя по умолчанию ("Change").

После применения всех запросов Тасэдитор очищает список запросов.

Если Тасэдитор не запущен, ничего не производится.

taseditor.clearinputchanges()

Очищает список накопившихся запросов, позволяя отменить их до вызова applyinputchanges().

Рекомендуется вызывать эту функцию перед формированием нового списка запросов, чтобы быть уверенным, что в список не попадут какие-нибудь старые запросы.

Если Тасэдитор не запущен, ничего не производится.

Created with the Personal Edition of HelpNDoc: Full-featured Documentation generator