Инструменты пользователя

Инструменты сайта


ru:rpd:mods_scripts

Это старая версия документа!


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 - класс блоба.

Где оно будет (или нет) как-то взаимодействовать с героем, мобами или с другими блобами.

Список блобов: <spoiler>

  • Fire
  • Foliage
  • ConfusionGas
  • LiquidFlame
  • ParalyticGas
  • Darkness
  • Web
  • ToxicGas
  • Regrowth

</spoiler>

Storage

Модуль scripts/lib/storage позволяет сохранять данные привязанные к уровню, или же игровой сессии в целом.

Для этого он предоставляет 4 метода:

  • put(ключ, значение) - сохраняет значение для текущего уровня
  • gamePut(ключ, значение) - сохраняет значение для игровой сессии
  • get(ключ) - возвращает ранее сохранённое значение для текущего уровня
  • gameGet(ключ) - возвращает ранее сохранённое значение для игровой сессии

Ключом - может быть строка или число, значением же строка, число или же таблица

Данные сохраняются в тех же файлах что и сейвы, а значит подчиняются всем правилам связанным классами и модами. Для сериализации/десериализации сейчас используется библиотека serpent

В качестве примера давайте рассмотрим ловушку, которая считает сколько на неё раз наступили и показывает соответствующий текст.

Quest

Модуль scripts/lib/quest существует для облегчения подготовки квестов.

Mob

Модуль scripts/lib/mob содержит методы позволяющие создавать собственных мобов.

ru/rpd/mods_scripts.1578940689.txt.gz · Последнее изменение: 2020/01/13 18:38 — mike