В скриптах игры используется такой язык программирования, как Lua.
Следует отметить его особенности:
Регистрозависимость – это означает, что слова “
word” и “
Word” будут разными, следует это уяснить раз и навсегда, иначе Вы можете долго искать свою ошибку.
Динамическая идентификация типа переменной – это означает, что нам не нужно ассоциировать переменную с ее типом, интепретатор сделает это за Вас.
Как понять “ассоциировать переменную”: Это значит, что одна переменная может воспринимать в различных ситуациях с различным типом. То есть имея переменную со значением
765 при математических выражениях (например: сложения) она будет воспринимать как
integer (целочисленное значение), а при выводе переменной, допустим, в лог, она уже будет обрабатываться как
string (строка)
В Lua функции, по строению, отличаются от процедур только наличием оператора “return” в своем теле, остальное аналогично процедурам. А по смыслу, функции возвращают информацию движку (проверка, результат подсчета), а процедуры являются последовательностью команд (создание объектов).
Давайте разберем код:
Код
-- Функция получающая 2 аргумента
function listing_script(item, item_2)
local actor = db.actor
object = actor:object(item)
return object
end
Итак, первая строка в листинге является однострочным комментарием (“
--”), есть еще и многострочные, начинаются они с “
--[[“, а заканчиваются знаками “
]]”
Далее идет создание функции
listing_script с двумя аргументами
item и
item_2,
item_2 я создал специально для того, чтобы продемонстрировать передачу нескольких аргументов. Третья строка, начинающаяся с оператора
local, будет объявлением локальной переменной объекта (эта переменная будет недоступна для внешних обращений, т.е. для внешних функций), за ней идет простое объявление переменной
object, которая вернет Булево значение (
true - истина,
false - ложь) в зависимости от наличия предмета, переданного в первом аргументе, у ГГ. Также стоит отметить, что
db.actor – вызов функции actor из файла
db.script, синтаксически это показано точкой. Двоеточие же в
actor:object() говорит о том, что вызывается метод класса
actor (функция, с помощью которой можно обращаться к параметру класса). Ну и последняя функция
вернёт наше
true или
false туда, где функция вызывалась. Пример,
local a = listing_script("af_medusa"). Переменная “
a” будет истинной, если у героя есть артефакт "Медуза" (af_medusa).
Теперь касаемо использования этих самых скриптов в игре S.T.A.L.K.E.R.:
Глобальные функции и процедуры хранятся в файле
_g.script – Глобальность этих функций состоит в том, что их можно использовать не вводя имя файла.
Функции для использования из логики объектов хранятся в файле
xr_conditions.script – Их используют в логике со специальными знаками: “
!” - отрицание (то есть неравно) и “
=” - равно
Проверка организуется в фигурных скобках (“
{” и “
}”), приведу пример на основе того-же скрипта из листинга: “
{=listing_script("af_medusa")}”. Условие выполнится только если у ГГ будет артефакт.
Процедуры для использования из логики объектов хранятся в файле
xr_effects.script – Их используют из логики со знаком “
=”
Использование процедур организуется знаками процента (“
%”), приведу пример (скрипта нету, ну ладно, главное показать использование): “
%=spawn_object("af_medusa") =spawn_object("wpn_pm")%”. Тут будут выполняться сразу 2 процедуры spawn_object с разными аргументами, конечно-же можно использовать и разные процедуры. Использование нескольких процедур будет аналогично использованию нескольких функций.
Остальные скрипты можно писать в любом файле (можно создавать и свои) и их использование будет следующим:
<имя_файла>.<имя_функции|имя_процедуры>(<передаваемые_аргументы_если_есть>) Обратите внимание, что при вызове функций и процедур из диалогов невозможно передавать аргументы, т.е. вызов будет следующим:
<имя_файла>.<имя_функции|имя_процедуры>