Содержание
Lua скрипты в Remixed Pixel Dungeon.
Вступление
Скрипты в rpd реализованы с помощью luaj 3.0.1 - реализации языка lua 5.2 в jvm.
Благодаря библиотеке luajava ( её реализации в luaj ) с помощью скриптов можно менять всё, однако такой подход потребует хорошего знания java, lua и всей кодовой базы rpd, наша же цель сделать моддинг (процесс создания модов ) - максимально простым (насколько это возможно при разумных затратах времени на создание инструментов).
Общая структура скриптов в моде:
- корневая папка мода
- scripts - корневая папка для скриптов
- lib - библиотеки RPD и другие, как правило модам здесь менять ничего не нужно
- actors - тут лежат уже готовые акторы
- traps - тут лежат уже готовые ловушки
Скрипты основных библиотек имеют имена файлов в camelCase, пользовательские же скрипты предпочтительно именовать в CamelCase.
Все файлы скриптов должны быть в кодировке UTF-8 без BOM.
Ниже последует описание некоторых уже реализованных возможностей скриптинга:
Ловушки (Они же триггеры)
Ловушка ( LevelObject - Trap ) объект, который активируется когда на него наступает герой (или моб, или падает предмет в зависимости от параметров). При активации Trap может имитировать поведение одной из базовых ловушек или выполнить скрипт.
На вход скрипт получает индекс клетки где должен сработать, существо, которое привело триггер в действие и строку указанную в описании ловушки.
Например так будет выглядеть описание триггера который просто покажет текст:
{ "kind":"Trap", "x":9, "y":9, "uses":1, "trapKind":"scriptFile", "script":"scripts/TrapMessage", "data":"This is test Message", }
Посмотрите для примера на код файла scripts/traps/Message.lua
Акторы
Актор - это такая бесплотная сущность которая существует на уровне и периодически что-то делает.
В отличие от ловушки актор может реализовывать 3 метода:
- act - собственно действие, метод возвращает true - если другие акторы ( в том числе и встроенные ) действовать или же им нужно ждать.
- actionTime - возвращает время через которое актор активируется ещё раз
- activate - выполняется один раз при добавлении актора на уровень
Актора можно подцепить к уровню в Dungeon.json например так:
"hotLevel":{"kind":"PredesignedLevel", "depth":0, "file":"levelsDesc/TestLevelSewers.json","script":"scripts/actors/Burn"} "script":"scripts/actors/Burn"
Или же можно подцепить актора к уровню из любого другого скрипта ( например активируемого триггером ) примерно так:
RPD.Dungeon.level:addScriptedActor(RPD.new(RPD.Objects.Actors.ScriptedActor,«scripts/actors/Burn»))
А вот и пример scripts/actors/Burn.lua
Мобы
Мобы ( а с ними и NPC ) в обилии населяют город и подземелье.
Для некоторых из них ( для кастомных ) можно задавать скрипты описывающие некоторые события в его жизни.
Сейчас это:
- Смерть ( пример - Hydra )
- Взаимодействие с героем ( пример - Talkie )
- Добавление моба на уровень (spawn)
- Получение урона
- Перемещение моба (move) - (пример - NatureAura)
- Задание характеристик (stats) (пример - NatureAura)
Библиотеки
В этом разделе будут описаны встроенные библиотеки облегчающие жизнь мододела
CommonClasses
Модуль scripts/lib/commonClasses
- содержит в себе объект RPD, а в нем привязки и id java классов, доступ к которым нам понадобится. Причём RPD.Objects содержит классы экземпляры которых можно создавать с помощью метода RPD.new
Например: local msgWnd = RPD.new(RPD.Objects.Ui.WndMessage,«Message Text»)
Остальные элементы RPD содержат привязки классов которые интересны для скриптов только статическими методами и/или членами.
Списки некоторых классов приведены ниже:
Основные классы RPD
Общий список доступных для lua классов можно увидеть по ссылке
Блобы
Блобы - это жидкости, газы и что-то непонятное что можно выставить на карту вызовом:
RPD.Blobs.Blob:seed(cell,amount, blob )
- где cell - куда, amount сколько, а blob - класс блоба.
Где оно будет (или нет) как-то взаимодействовать с героем, мобами или с другими блобами.
Список блобов:
- Fire
- Foliage
- ConfusionGas
- LiquidFlame
- ParalyticGas
- Darkness
- Web
- ToxicGas
- Regrowth
Storage
Модуль scripts/lib/storage
позволяет сохранять данные привязанные к уровню, или же игровой сессии в целом.
Для этого он предоставляет 4 метода:
put(ключ, значение)
- сохраняет значение для текущего уровняgamePut(ключ, значение)
- сохраняет значение для игровой сессии
get(ключ)
- возвращает ранее сохранённое значение для текущего уровняgameGet(ключ)
- возвращает ранее сохранённое значение для игровой сессии
Ключом - может быть строка или число, значением же строка, число или же таблица
Данные сохраняются в тех же файлах что и сейвы, а значит подчиняются всем правилам связанным классами и модами. Для сериализации/десериализации сейчас используется библиотека serpent
В качестве примера давайте рассмотрим ловушку, которая считает сколько на неё раз наступили и показывает соответствующий текст.
Quest
Модуль scripts/lib/quest
существует для облегчения подготовки квестов.
Mob
Модуль scripts/lib/mob
содержит методы позволяющие создавать собственных мобов.