Вступление
Скрипты это одна из самых сложных, но при этом и одна из самых интересных фич движка. При помощи скриптов можно сделать заставки, состоящие из больше, чем одной картинки, диалоги, менять местоположение объектов, иными словами, при помощи скриптов можно делать очень много. Вследствие этого данная глава является самой большой из всех.
Внимание, неправильное использование скриптов может потенциально сломать весь геймплей, используйте с умом и всегда тестируйте правильность выполнения скриптов!
Итак, Вы решили использовать скрипты. Здорово. Что же нужно для того, чтобы они заработали? На самом деле не так и много: всего лишь создать в папке Data/Scripts текстовый файл с расширением .script (для этого придется либо сохранить такой файл через, хотя бы, блокнот, или включить отображение расширений зарегистрированных файлов в настройках папки, а затем сменить его вручную). Название файла может быть следующим:
- НазваниеКарты.script - данный скрипт будет использован перед запуском соответствущей карты и заменит заставку (ставить ее в настройках карты, соответственно, не надо)
- НазваниеДекорации.script - данный скрипт будет использоваться, если подойти к соответствущей декорации и нажать кнопку использования.
- Скрипты с любым другим названием будут загружены только если они были указаны в триггерах или терминалах (см. главу "Триггеры")
Но мало просто загрузить скрипты, надо их еще и написать! Для этого движок имеет собственный, очень простой, скриптовый язык. Принцип написания скриптов таков:
Есть набор определенных команд, которые следует записывать на отдельной строке. Эти команды могут требовать параметров для полноценного функционирования, они записываются через пробел после названия команды. В общем-то все. Вся сложность лишь в правильной последовательности выполнения команд. Если не использовать процедуры, то проблем не возникнет абсолютно никаких - команды просто выполняются друг за другом сверху вниз.
Пример простого скрипта:
image Character Sprites/Characters/Character.png
show Character 0 0 2
text "Привет, Мир!"
hide Character 2
timeout 2
map start
Данный скрипт загрузит картинку и присвоит ей имя Character, отобразит ее в координатах 0, 0 за 2 секунды, покажет на экране текст, а затем скорет картинку за 2 секунды, после чего запустит карту.
Переменные
Переменная, это имя, для которого можно сохранить определенное значение, чтобы потом использовать его в командах. Есть три вида переменных:
- Глобальные - доступны во всей игре, вне зависимости от того, на какой карте находится игрок.
- Переменные карты - доступны только на текущей карте, после перехода на другую удаляются.
- Локальные переменные - доступны только в текущем скрипте, после его завершения удаляются.
Для записи переменной достаточно написать ее имя (с указанием вида, здесь - глобальная, карты и локальная, соответственно) и значение (без пробелов, может быть либо строкой с кавычками, либо числом):
global.value=10
map.value="Character"
value=10
Для использования переменной необходимо использовать символ $ перед ее названием:
text "$global.value"
image $map.value Sprites/Characters/Character.png
text "$value"
Если необходимо произвести арифметические действия, то следует использовать следующие операторы (разумеется, только если переменная - число):
value+=2 //Сложение
value-=2 //Вычитание
value*=2 //Умножение
value/=2 //Деление
value++ //Инкремент (увеличение на 1)
value-- //Декремент (уменьшение на 1)
Условные ветвления
Условные ветвления - это очень важная вещь, если необходимо сделать, например, переход на другой уровень, в зависимости от того, прошел игрок через триггер, или нет. Делаются они следующим образом (обратите внимание, пробелы ОБЯЗАТЕЛЬНЫ, поскольку технически if - тоже команда):
if $value == 1 {
map next
} else {
map goto 3
}
Код в кавычках после if будет выполнен, если переменная value равна 1, а код после else если не равна 1. Весь блок else может быть опущен, если нужно проверить только выполнение условия:
if $value == 1 {
map next
}
Вместо == можно использовать следующие операторы:
- != - условие выполняется, если переменная не равна значению
- <= - условие выполняется, если переменная меньше или равна значению
- >= - условие выполняется, если переменная больше или равна значению
- < - условие выполняется, если переменная меньше значения
- > - условие выполняется, если переменная больше значения
Процедуры
Процедуры, это куски кода, которые могут быть выполнены в любой момент. В целом их единственное назначение - сокращение строк кода, в случае, когда один и тот же кусок требуется в нескольких разных местах (впрочем, процедуры используются еще и для кнопок). Ключевое слово end означает конец процедуры. Процедур может быть несколько, в таком случае необходимо следить за тем, что у каждой из них есть соответствующий end:
procedure helloworld
text "Hello World!"
end
procedure helloworld2
text "Hello World 2!"
end
Вызов процедуры осуществляется командой call:
call helloworld
call helloworld2
Процедуры существуют только в рамках одного скриптового файла. Если процедура необходима в другом файле, ее придется скопировать вручную.
Комментарии
Комментарии это поясняющие строки, никак не участвующие в процессе выполнения кода. Они призваны лишь помочь Вам разобраться в коде, если Вы что-то забыли, или же для временного отключения строк кода, без их удаления. Для установки комментариев достаточно поставить // в начале строки.
//Это комментарий
//call helloworld
Импорт процедур
Импорт процедур необходим для того, чтобы не копировать вручную процедуры, которые используются на нескольких картах. Иными словами, это просто вставка вместо команды процедур из другого файла (тоже в папке Data/Scripts). Для импорта достаточно написать знак # и название файла со скриптом:
Список команд (если команда требует координаты тайлов - и можно посмотреть в редакторе в нижней строке состояния):
map
map start [keepmusic] - Запускает карту после завершения скрипта-заставки. Команда должна использоваться только в заставках перед началом карты. Если значение keepmusic 1 - музыка, проигрывающаяся на данный момент в заставке будет играть и на уровне. Если значение 0 или опущено, будет играть музыка карты. В основном нужно для смены музыки во время игры.
map next - Переходит на следующую по списку карту.
map return - Возвращает в игру. Команда должна использоваться только в триггерах, терминалах или скриптах декораций.
map goto [index] - Переходит на указанную карту. index - номер карты в списке (начиная с 0).
player
player retro [0/1] - Отключает вертикальное прицеливание и покачивание оружия
player turn [0/1] - Включает режим танка, поворот идет вместо стрейфа
player steps [0/1] - Включает или отключает звук шагов
player heal [amount] - Вылечить персонажа на указанное количество здоровья
player hurt [amount] - Ранить игрока на указанное количество здоровья
player teleport [tileX] [tileY] - Перемещает персонажа в тайл с указанными координатами (от 0 до 63)
player move [shiftX] [shiftY] - Сдвигает персонажа на указанное количество единиц, т.е если указать 10, то персонаж СДВИНЕТСЯ на 10 единиц
player rotation [angleX] [angleY] - Устанавливает поворот камеры. angleX - по вертикали (0 - прямо, 90 - вверх), angleY - по горизонтали (0 - вправо, если смотреть по карте, 90 - вверх).
entity
entity delete [tilex] [tiley] - Удаляет декорацию в указанном тайле.
entity delete me - Удаляет декорацию, которая вызвала скрипт (декорация, которую использовал игрок).
entity move [tilex] [tiley] [offsetX] [offsetY] - Сдвигает декорацию в указанном тайле на указанное количество единиц.
entity spawn [enemyname/decorationname/Key1-3/Hp1-3] [tileX] [tileY] - Cоздает декорацию, врага, ключ или патроны в указаном тайле.
door
door [open] [tileX] [tileY] - Открывает дверь в указанном тайле. При открытии двери через скрипт она не закроется сама.
door [close] [tileX] [tileY] - Закрывает дверь.
door [lock] [tileX] [tileY] - Закрывает дверь на замок. Открыть ее из игры нельзя, только из скрипта.
door [unlock] [tileX] [tileY] - Убирает замок с двери.
sound
sound [name] [path] - Загружает звук и присваивает ему имя. Путь может быть любым в пределах папки Data/ (часть с Data/ следует опустить)
play
play sound [name] - Проигрывает звук с указанным именем.
play music [path] - Проигрывает музыку, по указанному пути. Путь может быть любым в пределах папки Data/ (часть с Data/ следует опустить)
stop
stop music - Останавливает музыку (только ту, которая играет в катсцене. Музыку уровня остановить невозможно).
image
image [name] [path] - Загружает изображение и присваивает ему имя. Путь может быть любым в пределах папки Data/ (часть с Data/ следует опустить)
show
show [imageName] [x] [y] [time] - Отображает изображение с указанным именем в указанных координатах экрана за указанное время. Если time опущено, то изображение выведется моментально.
bg
bg [imageName] [time] - Отображает бэкграунд за указанное время (в секундах). От обычного изображения отличается тем, что растягивается (или ужимается) на весь экран.
button
button [imageName] [x] [y] [procedurename] - Ставит кнопку, при нажатии на которую будет выполняться процедура. Если time опущено, то кнопка выведется моментально. Изображение должно состоять из трех изображений кнопки, друг за другом по горизонтали. Первое изображение - кнопка, пока она не нажата и на нее не указывает курсор. Второе - кнопка, пока на нее указывает курсор. Третье - кнопка, пока она нажата.
move
move [imageName] [x] [y] [time] - Двигает изображение в указанные координаты, за указанное время. Если time опущено, то изображение переместится моментально.
hide
hide [imageName] [time] - Скрывает изображение с указанным именем за указанное время, в том числе бэкграунд и кнопки. Если time опущено, то изображение скроется моментально.
front
front [imageName] - Передвигает картинку поверх остальных.
back
back [imageName] - Передвигает картинку под все остальные.
vn
vn [1/0] - Включает или выключает режим визуальной новеллы.
preload
preload [1/0] - Включает или выключает предзагрузку изображений. Необходимо для экономии памяти, если катсцена очень длинная или требует большого количества изображений.
status
status [string] [time] - Отображает текст в левом нижнем углу экрана на указанное количество секунд.
give
give [weapon] [slot] - Дает оружие для указанного слота (1 - 8).
give [ammo] [slot] [amount] - Дает патроны для указанного слота.
take
take [weapon] [slot] - Забирает оружие из слота (1 - 8).
take [ammo] [slot] - Забирает все патроны из слота.
text
text [string] [r g b] - Выводит текст на экран (или в текстбокс, если установлен режим визуальной новеллы) с указанным цветом (если не указать цвет, текст будет белым).
font
font [size] - Устанавливает размер шрифта в катсценах.
auto
auto [0/1] - Включает или отключает авто воспроизведение.
pause
pause - Приостанавливает выполнение скрипта до следующего нажатия на кнопку мыши или клавиатуры.
halt
halt - Полностью останавливает выполнение скрипта.
timeout
timeout [time] - Ставит таймаут, во время которого игрок не может ничего делать. По завершении вызовется следующая строка скрипта.
bind
bind [button] [scriptname] - Закрепляет за кнопкой скрипт для выполнения при нажатии на эту кнопку. scriptname - название файла со скриптом (без расширения), который будет выполняться при нажатии на кнопку. Файл должен лежать в папке Data/Scripts. Выполняться скрипт будет только, пока игрок имеет возможность двигаться. Эту команду следует использовать только в файле Data/Scripts/Menu.script (см. Настройка пунктов меню).
shader
shader set [name] - Устанавливает шейдер с указанным именем, как текущий. Имя стандартного шейдера - default.
shader set [name] [path] - Загружает шейдер с указанным названием (файлы вершинного и пиксельного шейдеров должны находиться в папке Data/Shaders), присваивает ему имя, и устанавливает как текущий.
call
call [procedurename] - Выполняет процедуру.
cursor
cursor [1/0] - Показывает или скрывает курсор. Изначально при открытии катсцены курсор скрыт и отображается только в режиме визуальной новеллы или после отображения текста.