Как сделать файл luac

Обновлено: 07.07.2024

-- Cortex Command Lua Scripting Tutorial --
___________________________________________

Автор - Ken "CaveCricket48" Do
Переводчик - Программист/ximximik

Владельцем всех прав на перевод является ximximik, поэтому любое копирование, распространение и изменение перевода без согласия владельца (ximximik) запрещено.

Вступление
Этот учебник научит вас, как использовать Lua в Cortex Command. Он написан для людей, которые не встречилались раньше с программированием совсем, и поэтому в нем не будут использованы сложные слова, которые есть в других учебниках. Лучше будет, если вы уже будете знать как работать с ini-кодом, прежде чем приступите к изучению программирования.

1.0 - Начало
-> 1.1 Создание Lua файла
-> 1.2 Прикрепление скрипта к объекту

2.0 - Основы Lua
-> 2.1 Комментарии
-> 2.2 Типы данных
-> 2.3 Переменные
-> 2.4 Операторы
-> 2.5 Таблицы
-> 2.6 Оператор "For"

3.0 - Cortex Command Lua stuff
-> 3.1 Этапы скрипта
-> 3.2 Функции
-> 3.3 Указатели

4.0 - Функции и свойства в Вики

5.0 - Пример скрипта
-> 5.1 Мина

----- 1.0 - Начало -----
________________________

В Cortex Command, Lua позволяет объектам делать то, что они обычно не были бы в состоянии сделать или создать особенные эффекты.

- 1.1 Создание Lua файла-

Принцип работы скриптов Lua в Cortex Command состоит в том, что скрипты присоединены к объектам, созданным с помощью ini. Чтобы сделать файл Lua в простом блокноте в Windows, просто создайте новый текстовый файл, перейдити в меню "Файл", "Сохранить Как. ", измените "Тип файла:" на "Все файлы" , и измените ".txt" в имени файла на ".lua". Если нет никакого расширения, просто добавьте ".lua" в конце имени файла. Потом нажмите "Сохранить". Вы создали файл Lua.

Совет от переводчика: Используйте Notepad++ вместо стандартного блокнота, так как в нем показывается весь синтаксис Lua, и вообще в нем легче работать.

- 1.2 Прикрепление скрипта к объекту -

Чтобы прикрепить Lua скрипт к объекту, созданному в ini файле, просто поместите "ScriptPath = " в блоке кода объекта с соответствующим табулированием.

----- 2.0 - Основы программирования Lua -----
________________________

--- 2.1 Комментарии ---

Комментарии в скрипте Lua - строки текста, которые не читаются игрой/программой, и в основном используются, чтобы аннотировать скрипт. Чтобы аннотировать, сделайте 2 дефиса, и что-нибудь после них на той же самой строке - комментарий.

--- 2.2 Типы данных ---

Типы данных - типы данных, которые используются для переменных и свойств. В CC есть 5 основных типов данных: числа, текст, boolean (логическая переменная), вектор, и ноль (nil). Первые 2 - понятно из названия то это. boolean - логическая переменная, т.е. её значения это истина (true) или ложь (false). Вектор в CC - координаты (X, Y). Числовые данные используются, печатая только числа. Текст используется при наличии пары кавычек ("") с текстом между ними. Вектор используется, следуя за словом "Vector " 2 числами разделенными запятой в двух круглых скобках. Ноль - обозначается как "nil" (чтобы не быть перепутанным с числом ноль).

--Логическая переменная
true
false

--- 2.3 Переменные ---

Переменные - это то в Lua, чему Вы можете дать значение. Они используются для того, чтобы хранить информацию, чтобы Вы могли снова вызвать это позже. Переменная состоит из своего имени, одного знака " bbCodeBlock">

Чтобы изменить переменную, просто напечатайте ту же самую переменную снова с новым значением:

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

В результате X будет равен 5.

Есть 2 типа переменных в CC: глобальная переменная и локальная. Глобальные переменные могут быть изменены скриптом любого объекта, вновь меняющие значение, и только одна переменная с таким именем может существовать. Глобальные переменные похожи на те выше в примерах.

Локальные переменные - переменные, у которых могут быть множественные копии, каждая из них привязана к объекту со скриптом, который создал их. Чтобы создать локальную переменную, напечатайте "local" перед именем переменной, разделив их пробелом. Установка значения локальной переменной равного значению другой локальной переменной работает подобным способом как и у глобальных переменных.

Это действие сделало переменную "varB" равной 5. Заметьте, что слово "local" не использовалось, когда мы выбирали переменную "varA".

Другое полезное свойство переменных - то, что Вы можете использовать переменные, чтобы установить определенное свойство в объект, и хранить объект в переменной. Храня объект в переменной, с ним легче взаимодействовать и легче вызывать указателем. Чтобы использовать переменные, для изменения свойства объекта, Вы нуждаетесь в переменной, которая является определенным указателем на объект (мы разберем это позже), сопровождающаяся точкой, названием свойства, знаком " bbCodeBlock">

"thing" это указатель на объект, "GetsHitByMOs" это свойство объекта в ini, и "false" это значение.

Обычно используют указатель, который уже определен как "self". Указатель всегда обращается к объекту, к которому присоединен скрипт.

--- 2.4 Операторы ---

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

Этот код проверяет, если переменная "X" равна "1", то совершает "содержимое" (" " не фактическое действие, только указатель места заполнения для других команд, до которых мы доберемся позже), если оператор будет истиной. Обратите внимание на "end" внизу блока кода, который говорит, что " ", часть этого оператора, закончено. Если Вы не напечатаете "end" после оператора (конец оператора после тоже), то Вы получите ошибку. Также заметьте, что есть 2 знака "=" в "строке "if". "==" нужно для того, чтобы проверить равенство, и " bbCodeBlock">

Внутри операторов "if", могут находится операторы "else". Эти операторы проверяют, выполняется ли условие оператора "if", и если оно не истинно (не выполняется), то
тогда совершаются действия в их содержимом.

Условие "Elseif" похоже на второй "if" оператор и работает также:


if X == 1 then
<содержимое>
elseif X == 2 then
<содержимое>
end

В операторе могут быть много условий "elseif", но только одно "else".

Списки (также называемые как таблицы и массивы) похожи на переменные, у которых могут быть множество значений. Чтобы создать список, напечатайте название списка сопровождаемое знаком " bbCodeBlock">

Добавление значения к списку подобно присвоению/изменению значения переменной. Вы должны напечатать имя списка, сопровождаемое парой квадратных скобок с заданным номером в списке, знаком " bbCodeBlock">

Числовой символ с именем списка перед этим, говорит число элементов в списке.

Тот же самый список как в вышеупомянутых примерах, имеет значение переменной "numbercheck" равное 2.

Чтобы очистить все значения списка, напечатайте имя списка, знак " bbCodeBlock">

-- Очистка всего списка
thelist = <>

Списки могут быть глобальными и локальными, как переменные.

--- 2.6 Оператор For ---

Поскольку операторы используются, чтобы сделать множество повторяющихся действий в одном коротком участке памяти скрипта. Формат написания оператора "For" ниже.

Пример использования оператора "for".

Давайте рассмотрим каждую часть подробно:

for
- Стартовое ключевое слово

i = 1
- "i" - временная переменная, которая используется оператором "for", для сохранения, сколько раз он совершил действия (включая 1). "i" может быть изменен на любое имя как переменная. "1" это начальное значение для отсчета.

5
- Кол-во повторений " ".

Чтобы прервать оператор "for", включите "break" в оператор "if", который проверяет значение оператора "for" для соблюдения условия.

----- 3.0 - Cortex Command Lua stuff -----
________________________

--- 3.1 Этапы скрипта ---

Этапы скрипта - это части скрипта, которые выполняются только, когда объект был создан, когда он существует, или когда уничтожен. Этапы скрипта тоже требуют "end" как и операторы условий.

Функции - часть Lua, которые уже встроены в игру и взаимодействуют с содержимым в Cortex Command. Формат функции - название группы функции, двоеточие, имя функции, и её параметры (нужные данные для этого, чтобы это работало) разделяются запятыми в круглой скобке. Большинство названий групп функции Cortex Command могут быть заменены указателем чем-нибудь на то, с чем они смогут взаимодействовать. Пример функции ниже:

Информация о функции из Википедии Cortex Command Lua:

"anactor" - указатель на актора, "AddImpulseForce" - название функции, и содержимое круглой скобки - данные, необходимые для работы функции. В блоке информации о функции, "Return value", - это то, что выводит функция, когда она выполняется.
Большинство функций в Cortex Command может быть найдено в wiki, так что убедитесь проверив это.

--- 3.3 Указатели ---

Хорошо, мы наконец добрались до указателей!
В Cortex Command указатели - переменные, которые "хранят" объект в себе. Или Вы можете представить это, как гигантскую стрелку, указывающую на объект. независимо от того, что свойства Вы устанавливаете на указатель или используете функцию на нем, это произведет эффект на тот объект, на который он "казывает.

Есть несколько способов создать указатели. Обычно используют специальный оператор "for", который проверяет все объекты определенного типа и является оператором, который проверяет, является ли объект тем, который вам нужен. Кусок кода скрипта ниже присоединен к объекту, который ищет актора, с именем "Dummy" и затем устанавливает на него указатель, названный "local pointer".

for actor in MovableMan.Actors do
if actor.PresetName == "Dummy" then
local pointer = actor
break
end
end

Что делает вышеупомянутый кусок - проверяет всех акторов в игре, пока он не находит агента с "PresetName" как "Dummy". Тогда это устанавливает указатель на этого актора как "local pointer" и останавливает оператор "for" с "break". Термин "актор" является указателем на актора, и передан "local pointer" для более простой справочной информации.

Здесь 2 других строки "for", которые получают указатели на устройствах и частицах.


-- Указатель устройств
for item in MovableMan.Items do
end

-- Указатель частиц
for particle in MovableMan.Particles do
end

----- 4.0 - Функции и свойства в Cortex Command Wiki -----
________________________

----- 5.0 - Пример скрипта -----
________________________

--- 5.1 Mine ---
Этот скрипт для простой мины, которая взрывается, когда акторы находятся в пределах определенного расстояния объекта со скриптом.

-- Проверка всех акторов
for actor in MovableMan.Actors do

-- Остановка оператора
break

-- Конец оператора "if".
end

-- Конец оператора "for".
end

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

function Create(self)
self.killdist = 50;
end

function Update(self)
if math.random() <= .03 then
local part = CreateMOPixel("Spark Green");
part.Pos = self.Pos + Vector(math.random(-5,5), math.random(-15,5));
MovableMan:AddParticle(part);
for actor in MovableMan.Actors do//все последующие строчки до local curdist;
if actor.PresetName == "Browncoat Light" then
if actor.PresetName == "Browncoat Heavy" then
if actor.PresetName == "Skeleton" then
if actor.PresetName == "Thin Culled Clone" then
if actor.PresetName == "Zombie Thin Walk Path" then
if actor.PresetName == "Fat Culled Clone" then
if actor.PresetName == "Jumper" then
if actor.PresetName == "Green Clone" then
if actor.PresetName == "Blue Clone" then
if actor.PresetName == "Brain Case" then
if actor.PresetName == "Brain Robot" then
if actor.PresetName == "Soldier Light" then
if actor.PresetName == "Soldier Heavy" then
local curdist;
curdist = math.sqrt(math.pow(self.Pos.X - actor.Pos.X,2) + math.pow(self.Pos.Y - actor.Pos.Y,2))
if curdist <= self.killdist and actor:IsInGroup("Tiberium") == false then
if actor.ClassName

= "ACraft" then
actor.Health = actor.Health - 20
else
actor.Health = actor.Health - 2
end
local i = 0;
while i <= 2 do
local part = CreateMOPixel("Spark Green");
part.Pos = actor.Pos + Vector(math.random(-15,15), math.random(-15,15));
MovableMan:AddParticle(part);
i = i + 1;
end
local part = CreateMOPixel("Spark Green Glow");
part.Pos = actor.Pos + Vector(math.random(-15,15), math.random(-15,15));
MovableMan:AddParticle(part);
end
if actor.Health <= 30 and actor.Health > 0 and curdist <= self.killdist then
actor.Health = -10;
local part = CreateMOSRotating("Tiberium Debris Mini");
part.Pos = actor.Pos + Vector(math.random(-35,35), math.random(-10,0));
part.Vel = Vector(0,-15);
MovableMan:AddParticle(part);
end
end
end
end


Сама лень с вами.

Что ты хочешь изменить в коде тиберия?
Моддинг - это сезонное. По крайней мере, у меня.

Этот учебник научит вас, как использовать Lua в Cortex Command. Он написан для людей, которые не встречилались раньше с программированием совсем, и поэтому в нем не будут использованы сложные слова, которые есть в других учебниках. Лучше будет, если вы уже будете знать как работать с ini-кодом, прежде чем приступите к изучению программирования.

Начало

В Cortex Command, Lua позволяет объектам делать то, что они обычно не были бы в состоянии сделать или создать особенные эффекты.

Создание Lua файла

Принцип работы скриптов Lua в Cortex Command состоит в том, что скрипты присоединены к объектам, созданным с помощью ini. Чтобы сделать файл Lua в простом блокноте в Windows, просто создайте новый текстовый файл, перейдити в меню "Файл", "Сохранить Как. ", измените "Тип файла:" на "Все файлы" , и измените ".txt" в имени файла на ".lua". Если нет никакого расширения, просто добавьте ".lua" в конце имени файла. Потом нажмите "Сохранить". Вы создали файл Lua.

Совет от переводчика: Используйте Notepad++ вместо стандартного блокнота, так как в нем показывается весь синтаксис Lua, и вообще в нем легче работать.

Прикрепление скрипта к объекту

Чтобы прикрепить Lua скрипт к объекту, созданному в ini файле, просто поместите "ScriptPath = <путь к файлу Lua>" в блоке кода объекта с соответствующим табулированием.

Основы программирования Lua

Комментарии

Комментарии в скрипте Lua - строки текста, которые не читаются игрой/программой, и в основном используются, чтобы аннотировать скрипт. Чтобы аннотировать, сделайте 2 дефиса, и что-нибудь после них на той же самой строке - комментарий.

Типы данных

Основная статья: Типы Данных

Типы данных - типы данных, которые используются для переменных и свойств. В CC есть 5 основных типов данных: числа, текст, boolean (логическая переменная), вектор, и ноль (nil). Первые 2 - понятно из названия то это. boolean - логическая переменная, т.е. её значения это истина (true) или ложь (false). Вектор в CC - координаты (X, Y). Числовые данные используются, печатая только числа. Текст используется при наличии пары кавычек ("") с текстом между ними. Вектор используется, следуя за словом "Vector " 2 числами разделенными запятой в двух круглых скобках. Ноль - обозначается как "nil" (чтобы не быть перепутанным с числом ноль).

Переменные

Переменные - это то в Lua, чему Вы можете дать значение. Они используются для того, чтобы хранить информацию, чтобы Вы могли снова вызвать это позже. Переменная состоит из своего имени, одного знака " local" перед именем переменной, разделив их пробелом. Установка значения локальной переменной равного значению другой локальной переменной работает подобным способом как и у глобальных переменных.

Это действие сделало переменную "varB" равной 5. Заметьте, что слово "local" не использовалось, когда мы выбирали переменную "varA".

Другое полезное свойство переменных - то, что Вы можете использовать переменные, чтобы установить определенное свойство в объект, и хранить объект в переменной. Храня объект в переменной, с ним легче взаимодействовать и легче вызывать указателем. Чтобы использовать переменные, для изменения свойства объекта, Вы нуждаетесь в переменной, которая является определенным указателем на объект (мы разберем это позже), сопровождающаяся точкой, названием свойства, знаком " thing" это указатель на объект, "GetsHitByMOs" это свойство объекта в ini, и "false" это значение.

Обычно используют указатель, который уже определен как "self". Указатель всегда обращается к объекту, к которому присоединен скрипт.

Операторы

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

Этот код проверяет, если переменная "X" равна "1", то совершает "содержимое" ("<содержимое>" не фактическое действие, только указатель места заполнения для других команд, до которых мы доберемся позже), если оператор будет истиной. Обратите внимание на "end" внизу блока кода, который говорит, что "<содержимое>", часть этого оператора, закончено. Если Вы не напечатаете "end" после оператора (конец оператора после <содержимого> тоже), то Вы получите ошибку. Также заметьте, что есть 2 знака "=" в "строке "if". "==" нужно для того, чтобы проверить равенство, и " if", могут находится операторы "else". Эти операторы проверяют, выполняется ли условие оператора "if", и если оно не истинно (не выполняется), то тогда совершаются действия в их содержимом.

Условие "Elseif" похоже на второй "if" оператор и работает также:

В операторе могут быть много условий "elseif", но только одно "else".

Таблицы

Списки (также называемые как таблицы и массивы) похожи на переменные, у которых могут быть множество значений. Чтобы создать список, напечатайте название списка сопровождаемое знаком " numbercheck" равное 2.

Чтобы очистить все значения списка, напечатайте имя списка, знак " mw-headline" > Оператор For

Поскольку операторы используются, чтобы сделать множество повторяющихся действий в одном коротком участке памяти скрипта. Формат написания оператора "For" ниже.

for <переменная> = <начальное число>, <число как много раз совершать действия> do

Пример использования оператора "for".

Давайте рассмотрим каждую часть подробно:

for - Стартовое ключевое слово

i = 1 - "i" - временная переменная, которая используется оператором "for", для сохранения, сколько раз он совершил действия (включая 1). "i" может быть изменен на любое имя как переменная. "1" это начальное значение для отсчета.

5 - Кол-во повторений "<содержимого>".

Чтобы прервать оператор "for", включите "break" в оператор "if", который проверяет значение оператора "for" для соблюдения условия.

Cortex Command Lua stuff

Функции скрипта

Функции скрипта - это части скрипта, которые выполняются только, когда объект был создан, когда он существует, или когда уничтожен. Функции тоже требуют "end" как и операторы условий.

Команды

Команды - часть Lua, которые уже встроены в игру и взаимодействуют с содержимым в Cortex Command. Формат команды - название группы команды, двоеточие, имя команды, и её параметры (нужные данные для этого, чтобы это работало) разделяются запятыми в круглой скобке. Большинство названий групп команд Cortex Command могут быть заменены указателем чем-нибудь на то, с чем они смогут взаимодействовать. Пример команды ниже:

Информация о команде из Википедии Cortex Command Lua:

"anactor" - указатель на актора, "AddImpulseForce" - название команды, и содержимое круглой скобки - данные, необходимые для работы команды. В блоке информации о команде, "Return value", - это то, что выводит команда, когда она выполняется. Большинство команд в Cortex Command может быть найдено в wiki, так что убедитесь проверив это.

Указатели

Хорошо, мы наконец добрались до указателей! В Cortex Command указатели - переменные, которые "хранят" объект в себе. Или Вы можете представить это, как гигантскую стрелку, указывающую на объект. независимо от того, что свойства Вы устанавливаете на указатель или используете функцию на нем, это произведет эффект на тот объект, на который он "казывает.

Есть несколько способов создать указатели. Обычно используют специальный оператор "for", который проверяет все объекты определенного типа и является оператором, который проверяет, является ли объект тем, который вам нужен. Кусок кода скрипта ниже присоединен к объекту, который ищет актора, с именем "Dummy" и затем устанавливает на него указатель, названный "local pointer".

Что делает вышеупомянутый кусок - проверяет всех акторов в игре, пока он не находит агента с "PresetName" как "Dummy". Тогда это устанавливает указатель на этого актора как "local pointer" и останавливает оператор "for" с "break". Термин "актор" является указателем на актора, и передан "local pointer" для более простой справочной информации.

Здесь 2 других строки "for", которые получают указатели на устройствах и частицах.

Функции и свойства в Cortex Command Wiki

Это - ссылка на раздел Cortex Command wiki, который содержит документацию для многих функций и свойств. Список всех Lua функций

Пример скрипта

Этот скрипт для простой мины, которая взрывается, когда акторы находятся в пределах определенного расстояния от объекта со скриптом.

Файл Luac содержит две части: заголовок файла и тело функции.

Формат заголовка файла

Первое поле ** signature ** Он определен в заголовочном файле lua.h, это LUA_SIGNATURE, а значение равно "\ 033Lua", где \ 033 представляет ключ. LUA_SIGNATURE - это 4 байта в начале файла Luac, это магический номер Luac, который используется для идентификации его как файла байт-кода Luac. Магическое число относительно распространено в различных двоичных форматах файлов: это первые несколько байтов определенного файла, которые указывают конкретный формат файла.

version Поле указывает версию формата файла Luac, а его значение соответствует скомпилированной версии Lua. Для файла Luac, созданного в версии 5.2 Lua, его значение равно 0x52.

** format ** Поле является идентификатором формата файла. Значение 0 представляет официальный формат, указывая, что это официально определенный формат файла. Значение этого поля не равно 0, что указывает на то, что это измененный формат файла Luac и может не загружаться обычной официальной виртуальной машиной Lua.

** endian ** Указывает порядок байтов, используемый Луаком. В настоящее время порядок байтов в основных компьютерах в основном включает LittleEndian и BigEndian. Если значение этого поля равно 1, это означает LittleEndian, а если оно равно 0, используется BigEndian.

** size_int Поле ** указывает размер байтов, занятых типом int. Поле size_size_t указывает размер байтов, занятых типом size_t. Существование этих двух полей должно быть совместимо с процессорами различных ПК и мобильных устройств, а также с их 32-разрядными и 64-разрядными версиями, поскольку на конкретном процессоре размер байтов, занимаемый этими двумя типами данных Отличается.

** size_Instruction Поле ** указывает размер одной инструкции в блоке кода байтового кода Luac. В настоящее время размер, занимаемый инструкцией инструкции, составляет фиксированные 4 байта, что означает, что Luac использует тот же формат инструкции длины, что, очевидно, обеспечивает удобство для хранения и декомпиляции команд Luac.

** size_lua_Number ** Поле идентифицирует размер данных типа lua_Number. lua_Number представляет тип числа в Lua, который может хранить целочисленные типы и типы с плавающей запятой. В коде Lua он использует LUA_NUMBER, его размер зависит от типа и размера данных с плавающей запятой, используемых в Lua, для плавающей запятой одинарной точности, LUA_NUMBER определяется как float, то есть 32-битный размер, для двойного Для точности с плавающей запятой она определяется как double, что означает длину 64 бита. В настоящее время Lua, скомпилированный на macOS, имеет размер 64 бита.

** lua_num_valid ** Поле обычно 0, используется для определения того, может ли тип lua_Number работать нормально.

** luac_tail ** Поля используются для сбора данных для ошибок преобразования. В Lua он использует LUAC_TAIL, который является фиксированной строкой содержимого: "\ x19 \ x93 \ r \ n \ x1a \ n".

После заголовка файла следует тело функции. В файле Luac вверху находится тело функции верхнего уровня. Тело функции может содержать несколько подфункций. Подфункции могут быть вложенными функциями или замыканиями. Они состоят из констант, инструкций кода, значений Upvalue и номеров строк. Локальные переменные и другая информация.

Тело функции

** ProtoHeader ** глава Прото. Его определение таково:

** code ** код операции lua vm
constants Оператор lua фактически удаляет логотип, соответствующий ключевому слову

Это оператор lua, поэтому его можно увидеть в файле luac, и можно предположить, что примерный оператор lua

** protos ** Следующее тело функции хранится в цепочке
** lines ** Сколько строк выражения lua существует в этой функции
** loc_vars ** Количество локальных переменных внутри функции
** names ** Имя локальной переменной внутри функции

Luac.exe хранится анализ процесса luac

Тело функции luac разделено на основную функцию и общую функцию в luac.exe.
1. Сохраните заголовок основной функции, код и строку оператора lua для хранения
2. Храните обычные функции
2.1, хранить тело обычной функции
2.2. Просматривать связанный список обычных функций до конца
3. Сохраните количество строк основных функций, параметров и имен параметров

Lua исходный код luac.c, DumpHeader Формат заголовка luac сохраняется и в ** DumpFunction ** Тело функции сохраняется.

** DumpHeader ** Формат заголовка байта LUAC_HEADERSIZE (12) сохраняется.

Процесс рекурсивного обхода тела хранимой функции.

Луак декомпиляция

Получить lua51 VM

функция lua_execute

В lua vm luac объясняет, что функцией для выполнения кода операции luac является luaV_execute, но некоторые скрывают имя функции lua_execute. Ниже приведена функция execute, найденная с помощью lua_resume.

Вызовите функцию luaD_rawrunprotected в lua_resume, передайте указатель функции resum в качестве параметра

Вызовите luaV_execute в функции resum

В luaV_execute есть 38 случаев переключения, а затем в lua vm игры также находится функция исполнения, что также составляет 38 случаев переключения. Анализируется таблица сравнения кодов операций:

За Lua прочно закрепилась слава полуязыка — инструмента, который при случае можно встроить, чтобы заскриптовать приложение, написанное на компилируемом языке вроде С++. Тем не менее Lua является вполне самостоятельным языком, имеющим свой интерпретатор, возможность создания модулей, большое число библиотек, и при этом данный ЯП обладает минимальным размером среди аналогов. Проще говоря у нас есть все, чтобы создавать такие же приложения как на perl, python, и вообще любом другом распространенном языке программирования.

  • — приложения будут легко переносимы между Windows и Linux (не факт что код будет работать без изменений, но портирование правда пройдет безболезненно, если не были использованы платформоспецифичные библиотеки)
  • — малый оверхед создаваемых программ
  • — высокая скорость работы и загрузки приложений
  • — возможность оперативно «приклеить» к вашему приложению любую С-библиотеку — лучшего «клея» для библиотек вы не найдете
  • — приятный минималистичный синтаксис языка, с возможностью реализации на нем современных парадигм программирования
  • — программы на Lua очень легко развертывать
  • — малое потребление памяти

Чтобы продемонстрировать возможности Lua, я покажу как с его использованием создать небольшую программу для построения графиков по точкам с возможностью сохранения графика в виде файла изображения.

В качестве графического тулкита будем использовать iup — кроссплатформенную библиотеку, изначально созданную с расчетом использования из Lua.

Установка Lua SDK

В рамках идеи использования Lua как самостоятельного ЯП, была создана сборка Lua for Windows, которая содержит себе библиотеки, необходимые в повседневных задачах, возникающих при программировании под указанную ОС: работы с БД, GUI, парсинг XML и т.д. Пусть вас не смущает, что версия Lua в сборке 5.1, а не 5.2 — особой разницы в нашем случае между ними нет.

Скачайте и установите сборку.

Краткое описание концепции iup
  • — iup.dialog является корневым элементом интерфейса программы — в этом контейнере размещаются все элементы
  • — позиционирование элементов в контейнере производится при помощи layout-ов: задания правил размещения элемента в контейнере. Iup сам расположит и отрисует элемент согласно правилам. Основные контейнеры — фрейм, вертикальный сайзер, горизонтальный сайзер.
  • — обработчики событий задаются в виде функций, прикрепленных к виджету
  • — после создания диалога запускается цикл обработки событий
Код программы
Пара слов о развертывании

Скрипт можно запустить при помощи команды:

В данном случае библиотеки будут подключаться из поддиректории clibs/, которая находится в директории, куда был установлен Lua for Windows. Чтобы максимально компактно упаковать скрипт и библиотеки для переноса на другую машину, достаточно скопировать в одну папку следущие файлы(указаны с относительными путями от директории установки Lua):

Не забудьте поместить в эту папку и сам скрипт с программой. Теперь вы можете перенести эту папку на другую машину и запустить вашу программы командой, указанной выше. При этом никакие другие действия по установке библиотек и рантайма не нужны.

К сожалению файлы cd.dll, cdluad51.dll и iupcd.dll в данной версии Lua for Windows могут работать некорректно, поэтому рекомендую взять их из архива по ссылке ниже.

Итоги

Архив с рабочей версией тут, для удобства добавлена пускалка app.bat.



В результате получили, пусть и неказистую, утилиту, имеющую такой же функционал, как и если бы она была написана на «серьезном» языке программирования. При этом простую в развертывании и суммарным весом менее 2 мб. Потребление памяти — около 7 мб. Исходный код доступен для редактирования, сам Lua интерактивно понятен, что упрощает доработку подобного софта на местах.

На мой взгляд, это отличный выбор для написания учебного софта для школ и институтов, а также для внутреннего использования на предприятиях. Так как слабые машины до сих пор в изобилии присутствуют в подобных местах по всему СНГ, то использование Luа подобным образом целесообразно, особенно в свете постепнного прихода Linux на десктопы. К тому же тенденцию потери исходников самописного софта при жуткой его же забагованности можно приравнять к национальному бедствию.

Читайте также: