Lua скрипты в Remixed Pixel Dungeon. ====== Вступление ====== Скрипты в rpd реализованы с помощью [[http://www.luaj.org/luaj/3.0/README.html|luaj 3.0.1]] - реализации языка [[https://www.lua.org/manual/5.2/|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", } Посмотрите для примера на код файла [[https://github.com/NYRDS/remixed-dungeon/blob/master/RemixedDungeon/src/main/assets/scripts/traps/Message.lua|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"))'' А вот и пример [[https://github.com/NYRDS/remixed-dungeon/blob/master/RemixedDungeon/src/main/assets/scripts/actors/Burn.lua|scripts/actors/Burn.lua]] ====== Мобы ====== Мобы ( а с ними и NPC ) в обилии населяют город и подземелье. Для некоторых из них ( [[custommob|для кастомных]] ) можно задавать скрипты описывающие некоторые события в его жизни. Сейчас это: * Смерть ( пример - [[https://github.com/NYRDS/remixed-dungeon/blob/master/RemixedDungeon/src/main/assets/scripts/mobs/Hydra.lua|Hydra]] ) * Взаимодействие с героем ( пример - [[https://github.com/NYRDS/remixed-dungeon/blob/master/RemixedDungeon/src/main/assets/scripts/mobs/Talkie.lua|Talkie]] ) * Добавление моба на уровень (spawn) * Получение урона * Перемещение моба (move) - (пример - [[https://github.com/NYRDS/remixed-dungeon/blob/master/RemixedDungeon/src/main/assets/scripts/mobs/NatureAura.lua|NatureAura]]) * Задание характеристик (stats) (пример - [[https://github.com/NYRDS/remixed-dungeon/blob/master/RemixedDungeon/src/main/assets/scripts/mobs/NatureAura.lua|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 классов можно увидеть по [[https://nyrds.github.io/RemixedDocs/|ссылке]] === Блобы === Блобы - это жидкости, газы и что-то непонятное что можно выставить на карту вызовом: ''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(ключ)'' - возвращает ранее сохранённое значение для игровой сессии Ключом - может быть строка или число, значением же строка, число или же таблица Данные сохраняются в тех же файлах что и сейвы, а значит подчиняются всем правилам связанным классами и модами. Для сериализации/десериализации сейчас используется библиотека [[https://github.com/pkulchenko/serpent|serpent]] В качестве примера давайте рассмотрим [[https://github.com/NYRDS/remixed-dungeon/blob/master/RemixedDungeon/src/main/assets/scripts/traps/Counter.lua|ловушку]], которая считает сколько на неё раз наступили и показывает соответствующий текст. ===== Quest ===== Модуль ''scripts/lib/quest'' существует для облегчения подготовки квестов. ===== Mob ===== Модуль ''scripts/lib/mob'' содержит методы позволяющие создавать собственных мобов.