Fenia
В Мире Мечты есть свой собственный скриптовый язык для описания сложных моделей поведения. Язык событийно-ориентированный, нетипизированный, с поддержкой многопоточности. Синтаксис его отдаленно напоминает JavaScript.
На этом языке у нас написаны как простые сценарии (различные триггера на предметах и мобах), так и сложные: большинство умений, глобальные квесты, новые профессии, арийные квесты, и даже процедура создания нового персонажа.
- Много примеров и образцов кода
- Логи обучающих бесед о Фене
- Феневое API — все поля и методы, доступные из скриптов
- Триггеры всех событий
- Работа с умениями и навыками
- Формальное описание грамматики
Для работы со сценариями используется команда codesource
(cs
). Подробный синтаксис можно посмотреть, набрав ее изнутри мира. Исторически было много разных способов добавить сценарий в мир, и все они поддерживаются, но на сегодня самой удобной является подкоманда cs web
. Для ее использования необходимо присоединиться через веб-клиент:
Сперва посмотрим, какие сценарии уже есть в мире, командой cs list
. Много рабочих примеров можно найти в каталоге fenia.local
репозитория dreamland_world. Некоторые из них снабжены комментариями.
Осторожно: Файлы могут быть в кодировке KOI8-R. Откройте их в сыром виде (кнопка
Raw
) и выберите нужную кодировку в браузере.
-
Кубики из казино - простой пример триггера
onDrop
-
Чертик из коробочки - простой пример триггера
onOpen
иonClose
- Школьный учитель и тренер - пример триггера на мобе, препятствующий выполнению команды
-
Учитель профессии татуировщик - пример триггеров моба
onGreet
иonSpeech
-
Татуировочный нож - очень детальное, но почти линейное поведение ножа для татуажа, пример триггера
onUse
(postUse
) и потоков -
Поезд - поезд, ездящий по расписанию между несколькими станциями; это более сложный пример периодических действий с предметом, заданных через триггера
onSpec
иonArea
- Еврей из Конторы Рестрингов в Мидгаарде - хороший пример сложного поведения моба, с ветвлениями диалогов и потоками
- Архивариус: создание новых персонажей и вход старых - еще один пример сложного диалогового поведения
-
Ария 'Машинные мечты' - сбор комплекта брони, спецэффекты. Примеры триггера комнаты
onDescr
, реакции моба на социалы и эмоции (postSocial
,postEmote
) -
Игры с огнем - реализованная с нуля поддержка костров и спичек. Примеры
onUse
для предметов, а также триггера для контейнеров.
Начнем добавлять новый сценарий.
cs web
Открывшийся терминал подсвечивает синтаксис (разные элементы языка разными цветами), сам закрывает фигурные скобки и делает отступы. Самые грубые ошибки подсветятся красным.
Составим новый сценарий для такой задачи:
адепт Дваркина в MUD-школе тренирует только до 20го уровня, хотя заходить к нему могут все. Он должен отказывать в услуге по достижению персонажем 20го уровня. Триггер onCantTrain вызывается, когда набрали команду тренировать
(train
).
Вобьем что-нибудь осмысленное в поле Subject, а в основном окне редактора введем такой сценарий:
.apply(function() {
// Dwarking adept: no training after 20 level.
.get_mob_index(3718).onCantTrain = function(adept, client) {
if (client.getModifyLevel() >= 20) {
adept.recho("%^C1 сокрушенно цокает языком.", adept);
adept.say("Ты уже взросл%1$Gое|ый|ая, %1$C1, поищи себе другого тренера.", client);
return true;
}
return false;
};
// NoFate adept: no practicing after 20 level.
.get_mob_index(3719).onCantTeach = function(adept, client, skillName) {
if (client.getModifyLevel() >= 20) {
var skill;
skill = .Skill(skillName);
adept.say("Извини, %1$^C1, но теперь тебе придется искать себе другого учителя.", client);
adept.say("Учителя для этого умения можно найти в справке по умению.", client);
return true;
}
return false;
};
})
По нажатию на кнопку Run этот сценарий попытается выполниться (кнопка Run - аналог подкоманды cs post
). Если сценарий не содержит ошибок, то соответствующие тригера onTrain присвоятся прототипам мобов-адептов, и сценарий станет видно в списке.
Метод .apply(...)
принимает в параметры функцию, которая вызовется при вызове .apply()
. А сам .apply()
, в свою очередь, вызовется по нажатию на кнопку Run. Таким образом удается удобно выполнить все необходимые присваивания.
Cписок активных триггеров на прототипе моба можно отпечатать себе так:
eval ptc(.get_mob_index(3718).rtapi())
Runtime fields:
onCantTrain
Наконец, по команде cs web номер
можно начать редактировать новый сценарий, при этом тема и тело сценария будет скопировано из существующего сценария с указанным номером. После выполнения инициализирующей функции, новый сценарий займет место предыдущего.
cs list