Это старая версия документа!
Lua скрипты в Remixed Pixel Dungeon.
Вступление
Скрипты в rpd реализованы с помощью luaj 3.0.1 - реализации языка lua 5.2 в jvm.
Благодаря библиотеке luajava ( её реализации в luaj ) с помощью скриптов можно менять всё, однако такой подход потребует хорошего знания java, lua и всей кодовой базы rpd, наша же цель сделать моддинг (процесс создания модов ) - максимально простым (насколько это возможно при разумных затратах времени на создание инструментов).
Ниже последует описание некоторых уже реализованных возможностей скриптинга:
Ловушки (Они же триггеры)
Ловушка ( LevelObject - Trap ) объект который активируется когда на него наступает герой (или моб, или падает предмет в засимости от параметров). При активации Trap может имитировать поведение одной из базовых ловушек или выполнить скрипт.
На вход скрипт получает индекс клетки где должен сработать, существо которое привело тригер в действие и строку указанную в описании ловушки.
Например так будет выглядеть описание тригера который просто покажет текст:
{
"kind":"Trap",
"x":9,
"y":9,
"uses":1,
"trapKind":"scriptFile",
"script":"scripts/TrapMessage",
"data":"This is test Message",
}
А код файла scripts/TrapMessage.lua будет таким:
local RPD = require "scripts/commonClasses"
local trap = require"scripts/TrapCommon"
--
return trap.init(
function (cell, char, data)
local wnd = RPD.new(RPD.Objects.Ui.WndMessage,data)
RPD.GameScene:show(wnd)
end
)
Акторы
Актор - это такая бесплотная сущность которая существует на уровне и переодически что-то делает.
В отличие от ловушки актор может реализовывать 3 метода:
- act - собственно действие, метод возвращает true - если другие акторы ( в том числе и встроенные ) действовать или же им нужно ждать.
- actionTime - возвращает время через которое актор активируется ещё раз
- activate - выполняется один раз при добавлении актора на уровень
Актора можно подцепить к уровню в Dungeon.json например так:
"hotLevel":{"kind":"PredesignedLevel", "depth":0, "file":"levelsDesc/TestLevelSewers.json","script":"scripts/Burn"}
"script":"scripts/Burn"
Или же можно подцепить актора к уровню из любого другого скрипта ( например активируемого триггером ) примерно так:
RPD.Dungeon.level:addScriptedActor(RPD.new(RPD.Objects.Actors.ScriptedActor,"scripts/Burn"))
Сам же scripts/Burn.lua выглядет так:
local RPD = require "scripts/commonClasses"
local actor = require "scripts/ActorCommon"
return actor.init({
act = function()
local levelSize = RPD.Dungeon.level:getLength()
local cell = math.random(levelSize)-1
if not RPD.Dungeon.level.solid[cell] then
RPD.GameScene:add( RPD.Blobs.Blob:seed(cell,10, RPD.Blobs.Fire ))
end
return true
end,
actionTime = function()
return 1
end,
activate = function()
local wnd = RPD.new(RPD.Objects.Ui.WndStory,"It gonna be hot here...")
RPD.GameScene:show(wnd)
end
})
Библиотеки
В этом разделе будут описаны встроенные библиотеки облегчающие жизнь мододела
CommonClasses
Модуль scripts/commonClasses - содержит в себе объект RPD, а в нем привязки и id java классов, доступ к которым нам понадобится. Причём RPD.Objects содержит классы экземпляры которых можно создавать с помощью метода RPD.new
Например: local msgWnd = RPD.new(RPD.Objects.Ui.WndMessage,«Message Text»),
Storage
Модуль scripts/lib/storage позволяет сохранять данные привязанные к уровню, или же игровой сессии в целом.
Для этого он предоставляет 4 метода:
put(ключ, значение)- сохраняет значение для текущего уровняgamePut(ключ, значение)- сохраняет значение для игровой сессии
get(ключ)- возвращает ранее сохранённое значение для текущего уровняgameGet(ключ)- возвращает ранее сохранённое значение для игровой сессии
Ключом - может быть строка или число, значением же строка, число или же таблица
Данные сохраняются в тех же файлах что и сейвы, а значит подчиняются всем правилам связанным классами и модами. Для сериализации/десериализации сейчас используется библиотека serpent
В качестве примера давайте рассмотрим ловушку которая считает сколько на неё раз наступили и показывает соответствующий текст
