Skip to content
Kit Oliynyk edited this page Oct 14, 2021 · 22 revisions

Скриптовый язык Fenia

В Мире Мечты есть свой собственный скриптовый язык для описания сложных моделей поведения. Язык событийно-ориентированный, нетипизированный, с поддержкой многопоточности. Синтаксис его отдаленно напоминает JavaScript.

На этом языке у нас написаны как простые сценарии (различные триггера на предметах и мобах), так и сложные: большинство умений, глобальные квесты, новые профессии, арийные квесты, и даже процедура создания нового персонажа.

Документация


Работа с редактором скриптовых сценариев

Для работы со сценариями используется команда codesource (cs). Подробный синтаксис можно посмотреть, набрав ее изнутри мира. Исторически было много разных способов добавить сценарий в мир, и все они поддерживаются, но на сегодня самой удобной является подкоманда cs web. Для ее использования необходимо присоединиться через веб-клиент:

Сперва посмотрим, какие сценарии уже есть в мире, командой cs list. Много рабочих примеров можно найти в каталоге fenia.local репозитория dreamland_world. Некоторые из них снабжены комментариями.

Осторожно: Файлы могут быть в кодировке KOI8-R. Откройте их в сыром виде (кнопка Raw) и выберите нужную кодировку в браузере.

cs list output

Начнем добавлять новый сценарий.

cs web

cs web empty

Открывшийся терминал подсвечивает синтаксис (разные элементы языка разными цветами), сам закрывает фигурные скобки и делает отступы. Самые грубые ошибки подсветятся красным.

Составим новый сценарий для такой задачи: адепт Дваркина в 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

cs list again