Каждому пользователю полезно узнать, как открыть файл lua, особенно если возникла необходимость просмотреть документ такого типа.
Расширение LUA
Расширение файла LUA связано с языком сценариев Lua, который используется для увеличения возможностей многих различных приложений и компьютерных игр. Язык сценариев Lua также используется в различных промышленных программах, таких как Photoshop Lightroom от Adobe Systems.
Этот язык популярен благодаря своей гибкости и универсальности. Он может работать с различными платформами, использующими стандартный компилятор для языка С.
Документы с таким расширением представляют собой исходный код и скрипт, который определяет действия, выполняемые ПК при запуске программ и приложений. Скрипт поддерживает автоматизированные процессы для операционных систем и приложений, которые на них работают.
Файлы исходного кода компактны, чтобы избежать ненужного увеличения размера приложения. Документы LUA скомпилированы в виде архива, созданного утилитой TAR. TAR – это UNIX-утилита, которая используется для упаковки нескольких элементов в одну папку.
Хотя TAR на самом деле является инструментом архивации, он также известен как архиватор с нулевым сжатием. Несколько документов могут быть заархивированы с использованием формата TAR, но они не сжимаются, как в ZIP.
Как открыть элементы в формате LUA
Поскольку файлы LUA можно открывать несколькими программами и приложениями, нужно дважды щелкнуть на элемент, чтобы увидеть, будет ли он автоматически открываться в программе по умолчанию, установленной на компьютере.
Эти файлы обычно состоят из простых текстовых типов документов, поэтому на ПК уже может быть соответствующая программа.
На ПК под управлением Windows можно открывать такие документы с помощью любого текстового редактора, такого как Блокнот или WordPad. Следует просто щелкнуть правой кнопкой мыши на иконку и выбрать «Открыть с помощью» в раскрывающемся меню.
В подменю целесообразно нажать на текстовый редактор, который можно использовать, или нажать «Обзор», если программа отсутствует в списке.
Достаточно выбрать приложение из списка установленных программ, поставить галочку в поле «Всегда использовать эту программу, чтобы открыть файл этого типа», а затем нажать «ОК». Всякий раз, когда есть необходимость открыть элемент с расширением LUA, он автоматически будет использовать выбранный текстовый редактор в качестве приложения по умолчанию.
Если элемент LUA содержит исходный код и сценарии для игровых приложений, используемых с Windows, его можно открыть с помощью набора дополнений World of Warcraft от Blizzard Entertainment или World of Warcraft AddOn Studio.
В Mac OS X есть возможность открывать документы, используя любую программу для редактирования текста, совместимую с Mac, например TextMate или Apple TextEdit. Также можно использовать компилятор C или C ++, который предоставляется проектом GNU и доступен для бесплатной загрузки на веб-сайте GNU.org.
Если файл содержит исходный код и сценарии для игр, совместимых с Mac OS X, допускается использование Rovio Mobile Angry Birds, который доступен на веб-сайте Rovio или в комплекте дополнений World of Warcraft Interface от Blizzard Entertainment.
Для операционной системы Linux можно использовать Emacs или C и C ++ Compiler. Обе программы имеют открытый исходный код и доступны для бесплатной загрузки на веб-сайте GNU.org. Кроме того имеется возможность использовать любую программу для редактирования текста для Linux, такую как gEdit, Vim или Nano Editor.
Открыть документ с подсветкой кода
Конечно, можно использовать любой текстовый редактор для просмотра элементов с таким типом. Но лучше использовать редактор с подсветкой кода. Один из них – это инструмент Sublime Text. Но можно использовать и Notepad ++.
На изображении ниже есть возможность увидеть разницу между программой с подсветкой кода и классическим блокнотом.
Таким образом, можно заметить, что некоторые ключевые слова показаны в определенных цветах. Так код стает более читабельным и можно наглядно просмотреть его структуру.
Кроме того, в программе видно количество строк. Это особенно полезно, когда в журнале ошибок появляется оповещение: «строка 23 в example.lua». Отыскать проблему можно намного быстрее.
Еще одна полезная функция: если дважды щелкнуть слово, оно выделяется во всем документе.
Опция используется для проверки написания и при просмотре игрового кода, когда есть смысл отыскать, где используется функция (например, SILVER_BIRDCAGE).
Во время поиска нужно учитывать, что код чувствителен к регистру, то есть: Silver_birdcage, silver_birdcage и SILVER_BIRDCAGE – это не одно и то же.
Другой вариант поиска, но в большем масштабе, это «Найти в файлах» (комбинация клавиш Ctrl + Shift + F). Этот вариант позволяет искать что-то во всех документах указанной папки. Почему это полезно?
Допустим, необходимо добавить функцию «onattackother» к своему персонажу или монстру и надлежит получить лучший пример того, как и что можно сделать.
Для этого подобает ввести «onattackother» и выбрать путь к папке: «C:\Steam\steamapps\common\Don’t Starve Together\data\scripts\prefabs». Результат поиска изображен ниже.
Далее просто нужно дважды щелкнуть на строку, чтобы открыть соответствующий файл и просмотреть функцию.
Следовательно, для программистов намного лучше использовать программу с подсветкой синтаксиса.
Проблемы с открытием файла
Если не получается открыть документ LUA, нелишне просмотреть перечисленные возможные причины и выяснить точную причину этой ошибки:
Если принято решение устранить проблему самостоятельно, лучше иметь базовые знания о том, как работает компьютер. Стоит быть очень осторожным и терпеливым, особенно при внесении изменений в системный реестр. В противном случае можно столкнуться с другой проблемой при попытке исправить эту.
Слишком много пользователей испытывают трудности с открытием файлов с расширением LUA. Поэтому важно внимательно искать причину возникшей ошибки.
Заключение
Элементы с расширением LUA очень популярны и существует много способов их открыть: используя любой текстовый редактор (WordPad, Блокнот, TextEdit) или с помощью редакторов подсветкой синтаксиса (Sublime Text, Notepad ++).
Информация Гайд Всё о Lua скриптинге для MoonLoader
Для лёгкой и удобной работы с кодом Lua скриптов вам понадобится настроить для себя среду разработки. Для работы с Lua достаточно любого текстового редактора, но какой-нибудь блокнот Windows для этого подходит совсем плохо, поэтому лучше использовать специализированные программы. На текущий момент полная поддержка MoonLoader есть в Atom и Notepad++, помимо этого есть пользовательские дополнения для Visual Studio Code и Sublime Text.
Проект по-умолчанию. В меню File выбираем пункт Open Folder. и указываем путь до папки moonloader, после этого она откроется как проект.
Проект по-умолчанию. Как и в Atom, здесь есть возможность показа меню проекта, а точнее «Папка как Проект». В меню «Файл» выбираем пункт «Открыть Папку как Проект» и указываем путь к папке «moonloader».
Кодировка по-умолчанию. Над лентой выбираем пункт Опции и переходим в Настройки. В меню слева выбираем пункт Новый документ и в разделе кодировки ставим флажок на список, в котором выбираем кодировку Windows-1251
После установки среды разработки, изучения основ Lua и ознакомления с документацией MoonLoader, можно приступать от теории к практике. Давайте сначала рассмотрим самое основное, на всякий случай.
В этом примере показаны не все директивы, за полным списком обращайтесь к соответствующей странице на вики.
События и колбэки Событиями, а точнее их обработчиками, в MoonLoader называются функции, вызывающиеся в скриптах автоматически при каком-либо действии в игре, требующим обработки. Обработчики событий могут иметь входящие и возвращаемые параметры: входящие передают какую-то информацию скрипту, а возвращаемые позволяют повлиять на дальнейшую обработку после совершения события. Зарегистрировать обработчик события можно двумя способами: просто добавить в скрипт функцию с соответствующим именем, либо воспользоваться функцией addEventHandler. Учтите, что первым способом обработчик может быть зарегистрирован только один раз. Скрипты с зарегистрированными событиями не завершаются самостоятельно. Пример: onScriptTerminate вызывается при завершении какого-либо скрипта
С основными принципами разработки вы теперь знакомы и при этих знаниях сможете выполнить большинство задач, однако некоторые задачи требуют применения специальных техник. Давайте рассмотрим некоторые из них.
Создание модулей Модули делятся на два типа: Lua и DLL. Lua-модули пишутся, как вы уже могли догадаться, на языке Lua и в результате представляют из себя привычные Lua-скрипты, только с некоторыми особенностями. Давайте рассмотрим пример простого модуля, назовём его example:
Double Commander может выполнять скрипты Lua с помощью команды cm_ExecuteScript.
Также на языке Lua можно писать информационные плагины, примеры можно найти в папке программы (plugins/wdx/scripts).
Более подробную информацию о языке программирования Lua можно найти на официальном веб-сайте Lua.
2. Необходимая DLL
Чтобы использовать скрипты Lua, нам требуется интерпретатор Lua версии 5.1 или выше, DLL-файл должен лежать рядом с исполняемым файлом Double Commander или в системной папке.
По умолчанию DC ищет файл с именем lua5.1.dll (Windows), liblua5.1.so.0 (Unix или GNU/Linux) или liblua5.1.dylib (Mac OS). Мы можем вручную изменить имя файла в параметре
Мы можем использовать DLL-файл проекта LuaJIT. LuaJIT сочетает в себе высокоскоростной интерпретатор, написанный на ассемблере, и JIT-компилятор. Также мы получаем библиотеку FFI: с её помощью в скриптах можно будет вызывать внешние функции C и использовать структуры данных C. DLL для Windows: 32-битная или 64-битная.
Если мы используем 64-битную версию DC, то DLL-файл также должен быть 64-битным.
Дистрибутивы DC для Windows включают в себя DLL-файл Lua (в DC 0.9.7 и новее из проекта LuaJIT), в иных случаях мы можем найти и установить его с помощью менеджера пакетов или скомпилировать.
3. Библиотеки функций Double Commander
Double Commander предлагает несколько библиотек функций для скриптов Lua, список представлен ниже.
Список библиотек
Библиотека
Имя функции
Краткое описание
3.1. Библиотека DC
Библиотека DC
Функция
Описание
DC.LogWrite(Message, MsgType, bForce, bLogFile)
Пишет сообщение в окно протокола.
Получить активную панель: возвращает 0, если активна левая панель, или 1, если правая.
Сделать активной: левую панель, если iPanel равно 0, или правую, если равно 1.
Примечание: Скрипты работают в основном потоке Double Commander, поэтому иногда последовательное выполнение команд для навигации может не сработать (например, большие каталоги, медленный диск), в этом случае попробуйте отключить Загружать список файлов в отдельном потоке в настройках.
3.1.1. Пример с DC.ExecuteCommand
В этом примере мы написали простой скрипт, который сделает следующее:
Для выполнения нашего скрипта мы можем создать кнопку на панели инструментов с внутренней командой cm_ExecuteScript.
Кроме того, для редактирования наших скриптов мы можем использовать внутренний редактор Double Commander.
3.2. Библиотека System
Библиотека System
Функция
Описание
Приостанавливает выполнение скрипта на указанное количество миллисекунд ( Milliseconds ), выполнение сценария будет продолжено после истечения указанного времени.
Возвращает количество интервалов времени (тиков) с момента старта системы. Это полезно для измерения времени, но не следует делать каких-либо предположений относительно количества времени в интервале между тиками.
Проверяет, существует ли в файловой системе определённый файл.
Проверяет существование Directory в файловой системе и что это действительно каталог.
Подробное описание возвращаемого значения смотрите здесь.
Handle, FindData = SysUtils.FindFirst(Path)
Ищет файлы, совпадающие с Path (можно использовать маски).
В случае успеха функция вернёт дескриптор поиска Handle для последующих вызовов SysUtils.FindNext и поиска других совпадений с паттерном.
Таблица FindData содержит информацию о найденном файле или каталоге.
Поля таблицы FindData :
Result, FindData = SysUtils.FindNext(Handle)
Завершает серию вызовов SysUtils.FindFirst / SysUtils.FindNext и освобождает использованную память.
Вызов этой функции абсолютно необходим, иначе могут возникнуть большие утечки памяти.
Если Recursive равно true и ссылка указывает на ссылку, то она разрешается рекурсивно до тех пор, пока не будет найдено допустимое имя файла, не являющееся ссылкой.
Позволяет получить от DC разделитель пути в системе.
В системах Unix/Linux это будет » / » и » \ » в Windows.
Возвращает имя файла из полного (имя+путь) имени файла.
Имя файла содержит все символы после последнего символа разделителя каталогов («/» или «\») или буквы диска.
Возвращает путь из полного имени файла (включая букву диска).
Путь содержит все символы до последнего символа разделителя каталогов («/» или «\»), включая сам разделитель каталогов.
Возвращает диск из полного имени файла.
Обратите внимание, некоторые операционные системы не поддерживают буквы дисков.
Возвращает расширение файла (все символы после последней точки, включая сам символ «.»).
Separator и MaskOptions (см. выше) — необязательные параметры.
3.2.1. Описание возвращаемого значения SysUtils.FileGetAttr
FileGetAttr возвращает атрибуты FileName в виде ИЛИ-совокупности следующих констант:
Константы, используемые в возвращаемом значении SysUtils.FileGetAttr
Значение
Описание
Системный файл. В Unix/Linux это может быть символьное или блочное физическое устройство, именованный канал (FIFO).
Метка тома (означает, что файл содержит идентификатор (ID) тома). Только для DOS/Windows 9x на обычной файловой системе FAT (не VFAT или FAT32).
3.2.2. Пример с SysUtils.FileGetAttr
Пример скрипта ниже использует SysUtils.FileGetAttr.
Если параметр окажется каталогом, то скрипт откроет его в новой вкладке активной панели и переключится на неё.
В приведённом выше примере params[1] является первым параметром, переданным скрипту.
При использовании внутренней команды cm_ExecuteScript это будет первый параметр, переданный после имени файла скрипта.
Итак, в нашем примере мы можем создать на панели инструментов кнопку, как показано ниже:
В этом примере скрипту будет передан параметр %»0%p : имя выделенного в активной панели файла или папки, без кавычек.
3.2.3. Пример использования FindFirst, FindNext и FindClose
В следующем примере мы просканируем содержимое каталога, переданного первым параметром, и сохраним полученные данные в текстовый файл с именем, переданным вторым параметром.
Это даст нам хорошее представление об использовании FindFirst, FindNext и FindClose.
В приведённом выше примере нам нужно передать скрипту два параметра:
Настраиваем кнопку на панели инструментов с внутренней командой cm_ExecuteScript и передаём параметрами всё необходимое:
В этом примере скрипту в качестве первого параметра будет передано %»0%Ds : имя каталога активной панели, без кавычек.
3.3. Библиотека Clipboard
Double Commander предоставляет скриптам Lua библиотеку функций для работы с буфером обмена.
Библиотека Clipboard
Функция
Описание
Очищает содержимое буфера обмена.
Добавляет в буфер обмена текст Html в формате HTML (формат буфера обмена CF_HTML ).
Содержимое может быть вставлено в приложения, поддерживающие этот формат буфера обмена, такие как MS Word, LO Writer и другие.
Например, у нас может быть следующее:
3.3.1. Пример работы с буфером обмена
Это относительно большой скрипт, но было бы неплохо собрать вместе несколько функций, с которыми мы познакомились ранее.
Предполагается, что в нашей активной панели открыт каталог с большим количеством текстовых файлов.
Также предполагается, что в настоящее время в буфере обмена одно слово и что скрипт в качестве единственного параметра получит текущий каталог активной панели.
Скрипт будет сканировать папку, читать содержимое файлов, один за другим, и искать слово из буфера обмена.
Затем имена файлов, которые содержат это словом, будут скопированы в буфер обмена.
Далее скрипт вызовет внутреннюю команду cm_LoadSelectionFromClip и все эти файлы будут выделены.
Кроме того, в конце вернём обратно в буфер обмена слово, которое мы искали.
3.4. Библиотека Dialogs
Эта библиотека позволяет нашим скриптам взаимодействовать с пользователем, показывая сообщения, выдавая запросы и т.д.
Добрый день, Хабрахабр! Решил написать этот топик на тему скриптов
Что нужно знать?
Но есть способ, на голову выше — использование скриптов.
Решение проблемы
«Окей, для таких дел хватает обычного файла с описанием характеристиков игрока. Но что делать, если в бурно развивающемся проекте почти каждый день приходится немножко изменять логику главного игрока, и, следовательно, много раз компилировать проект?» Хороший вопрос. В этом случае нам на помощь приходят скрипты, держащие именно логику игрока со всеми характеристиками либо какой-либо другой части игры. Естественно, удобнее всего держать, логику игрока в виде кода какого-нибудь языка программирования. Первая мысль — написать свой интерпретатор своего скриптового языка, выкидывается из мозга через несколько секунд. Логика игрока определенно не стоит таких жутких затрат. К счастью, есть специальные библиотеки скриптовых языков для С++, которые принимают на вход текстовый файл и выполняют его.
Об одном таком скриптовом языке Lua пойдет речь.
Как это работает?
Прежде чем начать, важно понимать, как работает скриптовый язык. Дело в том, что в скриптовых языках есть очень мало функций, при наличии конструкций for, while, if, прочих. В основном это функции вывода текста в консоль, математические функции и функции для работы с файлами. Как же тогда можно управлять игроком через скрипты?
Мы в С++-программе делаем какие-либо функции, «регистрируем» их под каким-нибудь именем в скрипте и вызываем в скрипте. То есть если мы зарегистрировали функцию SetPos(x,y) для определения позиции игрока в С++-программе, то, встретив эту функцию в скрипте, «интерпретатор» из библиотеки скриптового языка вызывает эту функцию в С++-программе, естественно, с передачей всех методов. Удивительно, да? 🙂
UPD: Внимание! Один юзер обратился мне с мейлом, что, когда я заливал код, я не полностью устранил все ошибки — habrahabr.ru/post/196272/#comment_6850016 В коде с позволения хабра проникли жучки Замените участки кода вроде
И еще вместо lua_CFunction проскакивает lua_cfunction Спасибо!
Я готов!
Когда вы поняли преимущества скриптовых языков программирования, самое время начать работать! Скачайте из репозитория на гитхабе (низ топика) lib’у и includ’ы Lua, либо возмите их на официальном сайте.
Создаем консольный проект либо Win32 (это неважно) в Visual Studio (у меня стоит версия 2012)
Заходим в Проект->Свойства->Свойства конфигурации->Каталоги VC++ и в «каталоги включения» и «каталоги библиотек» добавьте папку Include и Lib из репозитория соответственно.
Теперь создаем файл main.cpp, пишем в нем:
Как вы догадались, у меня консольное приложение.
Теперь переходим к кодингу
Обещаю, что буду тщательно объяснять каждый момент
У нас за скрипты будет отвечать класс Script. Я буду объявлять и одновременно реализовывать функции в Script.h/.cpp Создаем Script.cpp и пишем в нем
Создаем Script.h и пишем в нем
После 2 строчки и перед #endif мы определяем класс скриптов Этот код пишется для предотвращения взаимного включения файлов. Допустим, что файл Game.h подключает Script.h, а Script.h подключает Game.h — непорядок! А с таким кодом включение выполняется только 1 раз
Теперь пишем внутри этого кода вот это
Первая строчка подключает сам lua.lib из архива. Для чего нужен extern «C»? Дело в том, что lua написан на С и поэтому такой код необходим для подключения библиотек.
Дальше идет подключение хорошо известных многим файлов для работы с консолью
Теперь приступим к определению класса
Самый главный объект библиотеки Lua для C++ — lua_State, он необходим для выполнения скриптов
Дальше идут публичные функции
Эта функция инициализирует lua_State
Его определение в Script.cpp
Первой строчкой мы инициализируем наш lua_State. Потом мы объявляем список «подключенных библиотек». Дело в том, что в «чистом» виде в луа есть только функция print(). Для математических и прочих функций требуется подключать специальные библиотеки и потом вызывать их как math.foo, base.foo, io.foo. Для подключения других библиотек добавьте в lualibs, например, <«math», luaopen_math>. Все названия библиотек начинаются с luaopen_. в конце lialibs должен стоять
Просто используем lua_close()
А эта функция выполняет файл. На вход она принимает название файла, например, «C:\\script.lua». Почему она возвращает int? Просто некоторые скрипты могут содержать return, прерывая работу скрипта и возвращая какое-нибудь значение.
Как вы видите, я выполняю скрипт и возвращаю int. Но возращать функция может не только int, но еще и bool и char*, просто я всегда возвращаю числа (lua_toboolean, lua_tostring)
Теперь мы сделаем функцию, регистрирующую константы (числа, строки, функции)
Мы действуем через шаблоны. Пример вызова функции: Ее определение
Для каждого возможного значения class T мы определяем свои действия. *Капитан* последнее определение — регистрация функции Функции, годные для регистрации, выглядят так:
Где n — количество возвращаемых значений. Если n = 2, то в Луа можно сделать так:
Читайте мануалы по Луа, если были удивлены тем, что одна функция возвращает несколько значений 🙂
Следующая функция создает таблицу для Луа. Если непонятно, что это значит, то тамошная таблица все равно что массив
Следующая функция регистрирует элемент в таблице.
Если вы не знаете Lua, вы, наверное, удивлены тем, что в один массив помещается столько типов? 🙂 На самом деле в элементе таблицы может содержаться еще и таблица, я так никогда не делаю.
Наконец, заполненную таблицу нужно зарегистрировать
Ничего особенного нет
Следующие функции предназначены в основном только для функций типа int foo(lua_State*), которые нужны для регистрации в Луа.
Первая из них — получает количество аргументов
Эта функция нужна, например, для функции Write(), куда можно запихать сколь угодно аргументов, а можно и ни одного Подобную функцию мы реализуем позже
Следующая функция получает аргумент, переданный функции в скрипте
Можно получить все типы, описывавшиеся ранее, кроме таблиц и функций index — это номер аргумента. И первый аргумент начинается с 1.
Наконец, последняя функция, которая возвращает значение в скрипт
Боевой код
Пора что-нибудь сделать! Изменяем main.cpp
Компилируем. Теперь можно приступить к тестированию нашего класса
Помните, я обещал сделать функцию Write? 🙂 Видоизменяем main.cpp
А в папке с проектом создаем файл script.lua
Компилируем и запускаем проект.
Теперь изменяем script.lua
Теперь программа будет выводить по 2 строки («\n» — создание новой строки), ждать нажатия Enter и снова выводить строки.
Экспериментируйте со скриптами!
Вот пример main.cpp с функциями и пример script.lua