Общее

Чтобы добавить 'жизни' в мир, Diku-based МАДы используют так называемые специальные процедуры. На данный момент в Адамант Адан МАДе есть три основных типа игровых 'объектов' которые могут использовать специальные процедуры. Это монстры, предметы и комнаты.
Эти спец-процедуры написаны на С, и требуют хорошего понимания кода игры для написания. Так как у многих МАДов недостаточно квалифицированных кодеров и спец-процедуры требуют много времени для написания и отладки, билдеры (составители зон) были бы не в состоянии реализовать многие идеи в своих зонах.
Триггера - это решение дефицита спец-процедур. Язык триггеров достаточно прост для изучения и позволяет всем билдерам реализовать многие свои идеи. Он позволяет писать аналоги спец-процедур - триггера для мобов, комнат и предметов. Триггера можно изменять и добавлять прямо в процессе игры. Хотя с помощью триггеров невозможно сделать все что возможно с помощью спец-процедур, большинство идей билдеров все же могут быть реализованы.


Обзор

Каждый объект в игре (моб, комната или предмет) может иметь один или несколько триггеров которые работают совместно определяя комплекс действий игрового объекта. Триггер это определение события на которое он отреагирует, и список команд которые будут выполнены при наступлении данного события.
Есть несколько типов триггеров. Каждый тип триггера определяет тип события на которое триггер отреагирует и будет выполнен. Например, триггер монстра speech проверяется каждый раз, когда игрок находящийся в одной с монстром, у которого есть такой триггер, комнате использует команду говорить. Триггер комнаты enter проверяется каждый раз когда игрок входит в комнату. Есть два параметра триггера определяющие будут ли выполнены команды этого триггера - аргумент и числовой аргумент. Некоторые триггера используют оба аргумента, некоторые могут использовать только один из них, или не использовать их вовсе. Содержание аргументов триггера зависит от типа триггера и описывается детально в разделе Триггера.
Когда наступает какое-либо событие, все триггера в комнате (на монстрах или предметах находящихся в этой комнате) в которой произошло это событие проверяются, должны ли они реагировать на него. Триггер, исполняющийся в этот момент (например, ожидающий окончания wait команды) прерывается. Только один триггер объекта может выполняться в один момент. Например, если у объекта есть два триггера, и оба одинакового типа и с одинаковыми аргументами, только второй триггер будет выполнен, если первый не закончил свою работу.
У объекта может быть несколько триггеров разных типов. Например, чтобы 'симулировать' проклятый предмет, можно 'повесить' на этот предмет триггера drop, give и remove.
Другой компонент триггера - это список команд. Это команды, которые будут выполнены триггером. Команды бывают двух типов: специальные команды триггеров и игровые команды. Специальные команды триггеров - это команды, которые могут быть выполнены только интерпретатором триггеров. Они включают в себя команды работы с переменными (такие как set, eval, unset и global) и команды управления процессом (такие как if, elseif, else, end, halt, wait и др.) Игровые команды - это команды которые игроки могут использовать из их командной строки и специальные команды для монстров, комнат и предметов.


Выражения

Оператор Название Пример
|| логическое ИЛИ 0 || ( ) = 0; 5 || 0 = 1
&& логическое И 1 && 0 = 0; 5 && 3 = 1
== равенство 5 == 3 = 0; dog == DoG = 1
!= неравенство 0 != Z = 0; dog != d = 1
< меньше чем 4 < 3 = 0; 4 < 5 = 1
> больше чем 4 > 3 = 1; 4 > 4 = 0
<= меньше или равно 4 <= 3 = 0; 4 <= 5 = 1
>= больше или равно 4 >= 3 = 1; 4 >= 4 = 1
/= подстрока "concatenate" /= "cat"
- вычитание 15 - 10 = 5
+ сложение 10 + 15 = 25
* умножение 10 * 20 = 400
/ деление 100 / 20 = 5
! отрицание !() = 1; !0 = 1; !dog = 0;


Специальные символы

Эти символы можно использовать в Описании при Действии предмета.

В триггерах их можно тоже использовать, примеры:
mecho %actor.name% поднатужил%actor.u% и достал%actor.y% с неба луну.

т.е, каждый символ предсталяется как %char.CHARACTER%

Каждый управляющий символ должен начинаться знаком '$' или '~'.
'~' - для предметов.

$n - Вывести имя, короткое описание, или "кто-то", для персонажа,
в зависимости от того, PC персонаж или NPC или невидим-ли он.
$r - n в родительном падеже.
$d - n в дательном падеже.
$v - n в винительном падеже.
$t - n в творительном падеже.
$p - n в предложном падеже.

$N - Как и $n, но текст будет браться для жертвы_персонажа.
$R - N в родительном падеже.
$D - N в дательном падеже.
$V - N в винительном падеже.
$T - N в творительном падеже.
$P - N в предложном падеже.

$[~]m - "его(him)", "ее(her)", "его(it)" или 'их', в зависимости от пола персонажа.
Просьба не путать с $s так как они хоть и одинаковые по написанию,
но разные по смыслу!
$M - Как и $m, но для жертвы_персонажа.

$[~]s - "его(his)", "ее(her)", "его(it)" или "их", в зависимости от пола персонажа.
Просьба не путать с $m.
$S - Как и $s, но для жертвы_персонажа.

$[~]e - "он", "она", "оно","они" в зависимости от пола персонажа.
$E - Как и $e, но для жертвы_персонажа.

$q - "", "ла", "ло", "ли" [~q]
$Q - ...

$w - "ый", "ая", "ое", "ые" [~w]
$W - ...

$y - "", "а", "о", "и" [~y]
$Y - ...

$u - "ся", "ась", "ось", "ись" [~u]
$U - ...

$i - "ел", "ла", "ло", "ли" [~i]
$I - ...

$g - "ым", "ой", "ым", "ыми" [~g]
$G - ...

$h - "ему", "ей", "ему", "им" [~h]
$H - ...

$j - "ним", "ней", "нем" [~j]
$J - ...

$k - "нем", "ней", "нем" [~k]
$K - ...

$a - Имя или "что-то" для предмета, в зависимости от видимости.
$A - Как и $a, но для жертвы_предмета.

$o - Короткое описание или "что-то" для предмета.
$1 - o в родительном падеже.
$2 - o в дательном падеже.
$3 - o в винительном падеже.
$4 - o в творительном падеже.
$5 - o в предложном падеже.

$O - Как и $o, но для жертвы_предмета.
$6 - O в родительном падеже.
$7 - O в дательном падеже.
$8 - O в винительном падеже.
$9 - O в творительном падеже.
$0 - O в предложном падеже.

$$ - Печатает символ '$'.

$B (было $T)


Общее

Триггера задаются в специальном файле зоны, который состоит из номера зоны и расширения .trg.
Например, 021.trg. Формат файла триггеров следующий:

#vnum [версия]
Название триггера~
<класс_триггера> <тип_триггера> <числовой_аргумент>
аргумент~
команды
~
[следующий триггер]
$

vnum - номер триггера. Состоит из номера зоны и номера триггера. Например, #2101, триггер зоны 21 с номером 1.
Необязательный параметр [версия] обозначает номер версии триггера
Название триггера - Произвольная фраза, практического значения не имеет, несколько упрощает бессмертным пользование командами tlist и stat. Обязательно наличие символа '~' после этого параметра.

класс_триггера - 0 если это триггер монстра, 1 если триггер предмета, и 2 в случае если это триггер комнаты.

тип_триггера - собственно определяет какой именно это триггер. Задается одним или несколькими символами (флагами)
(см. Триггера монстров, Триггера предметов, Триггера комнат)

числовой_аргумент - числовой аргумент триггера.

аргумент - аргумент. Обязательно наличие символа '~' после него.

команды - список команд, которые будут выполнены если триггер будет инициирован. Обязательно наличие символа '~' после последней команды триггера.


Триггера монстров (класс триггера 0)

Флаг | Название | Назначение
a | Global | проверяется даже если зона пуста
b | Random | проверяется раз в определенный промежуток времени
c | Command | проверятся когда кто-то ввел комманду
d | Speech | проверяется когда кто-то сказал фразу
e | Act | слово или строка через функцию act()
f | Death | проверяется когда монстр умер
g | Greet | проверяется когда кто-то вошел в комнату с монстром и монстр его видит
h | Greet All | проверяется когда кто-то вошел в комнату
i | Entry | проверяется когда монстр с этим триггеров переходит в другую комнату
j | Receive | проверяется когда монстру дают предмет
k | Fight | проверяется каждый раунд боя
l | Hit Percent | проверяется каждый раунд боя и если кол-во HP меньше заданного, запускается
m | Bribe | монстру дали денег
n | Load | монстр загрузился в игру
o | Memory | выполняется когда монстр встречает персонажа которого помнит
p | Reset VAR | выполняется когда происходит сброс переменной принадлежащей этому монстру


Act

Триггер монстра: Act

Описание : Этот триггер запускается когда аргумент - подстрока строки текста, которую видит монстр. Текст обрабатывается не во всех случаях. (только тот, который посылается функцией act() из игры). В обрабатываемые строки входят такие сообщения как социалы, сообщения об ударах и от скиллов и другие. Не проверяется текст от игроков, полученный от команд эхо, емота, говорить и сказать. Если Вам нужно точно узнать, проверяется ли данное сообщение командой Act, спросите это у имплементора.
Аргумент : Фраза или список слов для сравнения. В качестве аргумента может использоваться регулярное выражение (см. раздел регулярные выражения)
Числовой аргумент : Если он 0, аргумент это фраза. Если 1, аргумент это список слов.
Возвращаемое значение : Не используется.

Переменные : Не все перечисленные переменные будут установлены. Они зависят от сообщения. Если у Вас проблемы с переменными, напишите имплементору. Переменные всегда устанавливаются на правильного персонажа или предмет, даже если в тексте использовался заменитель имени 'кто-то' или 'что-то'.
actor установлена на первичного персонажа в тексте.
victim установлена на вторичного персонажа в тексте.
object установлена на первичный объект в тексте.
target установлена на вторичный объект в тексте.
arg установлена на часть строки, где была использована переменная, например имя двери.

см. Триггера монстров


Bribe

Триггер монстра: Bribe

Описание : Этот триггер проверяется когда монстру дали деньги.
Деньги у монстра окажутся в инвентаре в виде "кучки". Не забывайте ее удалять, если
не нужно, чтобы она оставалась.
Аргумент: Не используется.
Числовой аргумент: Это минимальное количество монет, которое нужно дать монстру чтобы активировался триггер.
Возвращаемое значение: Не используется.

Переменные:
actor установлен на персонажа, дающего монстру монеты.
amount это количество монет, которые дали монстру.

см. Триггера монстров


Command

Триггер монстра: Command

Описание : Этот триггер проверяется когда персонаж ввел команду, в той же комнате, где и монстр с этим триггером. Если введенная команда является подстрокой аргумента, триггер будет вызван. Если аргумент состоит всего лишь из одного символа '*', то триггер сработает на любую команду.
Аргумент : Имя команды. В качестве аргумента может использоваться регулярное выражение (см. раздел регулярные выражения)
Числовой аргумент : Не используется.
Возвращаемое значение : Если триггер возвращает 0, персонаж получит то-же сообщение, как будто триггера не существует и любые другие триггеры типа Command будут проверены.

Переменные:
actor установлена на персонажа, вводившего команду.
arg установлена на аргумент команды.
cmd установлена на команду введенную персонажем.

см. Триггера монстров


Death

Триггер монстра: Death

Описание : Этот триггер проверяется когда монстр умирает.
Аргумент : Не используется.
Числовой аргумент : Это процентные шансы того, что триггер будет запущен после проверки.
Возвращаемое значение : Если возвращаемое значение это 0, предсмертного крика монстра (например 'Ваша кровь застыла в жилах от предсмертного крика собаки.') не будет. Для любого другого значения будет монстр выполнит и предсмертный крик.

Переменные:
actor будет установлена на убийцу, если он есть.

см. Триггера монстров


Entry

Триггер монстра: Entry

Описание : Этот триггер проверяется каждый раз когда монстр входит в комнату.
Аргумент : Не используется.
Числовой аргумент : Процентные шансы того, что триггер будет запущен после проверки.
Возвращаемое значение: Не используется.

Переменные: Нет.

см. Триггера монстров


Fight

Триггер монстра: Fight

Описание : Этот триггер проверяется каждый раунд боя после того как монстр нанес свой primary удар (удар первой рукой).
Аргумент: Не используется.
Числовой аргумент : Процентные шансы того, что триггер будет запущен после проверки.
Возвращаемое значение: Не используется.

Переменные:
actor это персонаж, с которым дерется монстр.

см. Триггера монстров


Global

Триггер монстра: Global

Описание : Это не триггер сам по себе, но используется вместе с другими типами триггеров. Триггер который определен как глобальный (global) проверяется даже если в зоне с монстром нет ни одного игрока.
Аргумент: Не используется.
Числовой аргумент : Не используется.
Возвращаемое значение : Не используется.
Переменные : Нет.

см. Триггера монстров


Greet

Триггер монстра: Greet

Описание : Этот триггер проверяется когда кто-то входит в комнату и монстр с триггером может видеть его.
Аргумент : Не используется.
Числовой аргумент : Процентные шансы того, что триггер будет запущен после проверки.
Возвращаемое значение : Не используется.

Переменные:
actor установлена на персонажа, входящего в комнату.
direction установлена на название направления, откуда пришел actor. (Точнее направление обратное тому куда ушел actor.)

см. Триггера монстров


Greet All

Триггер монстра: Greet All

Описание : Этот триггер делает то же что и Greet trigger, только монстр при этом не обязательно должен видеть входящего.
Аргумент : Не используется.
Числовой аргумент : Процентные шансы того, что триггер будет запущен после проверки.
Возвращаемое значение : Не используется.

Переменные:
actor установлена на персонажа, входящего в комнату.
direction установлена на название направления, откуда пришел actor. (Точнее направление обратное тому куда ушел actor.)

см. Триггера монстров


Hit Percent

Триггер монстра: Hit Percent

Описание : Этот триггер проверяется во время боя когда hit points монстра упадут ниже процента, указанного в числовом аргументе.
Аргумент : Не используется.
Числовой аргумент : Это процент, ниже которого должны упасть hit points монстра чтобы этот триггер был проверен.
Возвращаемое значение: Не используется.

Переменные:
actor это персонаж, с которым дерется монстр.

см. Триггера монстров


Load

Триггер монстра: Load

Описание : Триггер проверяется в момент загрузки монстра в игру.
Аргумент: Не используется.
Числовой аргумент : Процентные шансы того, что триггер будет запущен после проверки.
Возвращаемое значение: Не используется.

Переменные: Нет.

см. Триггера монстров


Memory

Триггер монстра: Memory

Описание : Этот триггер проверяется когда моб встречает персонажа помещенного в его 'память командой mremember, и при этом командой mremember не определена команда. Каждый моб использующий команду mremember ДОЛЖЕН иметь memory триггер, даже если он никогда не будет запущен.
Аргумент : Не используется.
Числовой аргумент : Процентные шансы того, что триггер будет запущен после проверки.
Возвращаемое значение : Не используется.

Переменные:
actor это персонаж, который будет 'запомнен'.

см. Триггера монстров


Random

Триггер монстра: Random

Описание : Этот триггер проверяется периодически (примерно каждые 11 секунд). Триггер не проверяется если нет ни одного игрока в зоне с монстром, за исключением триггеров типа Global (см выше).
Аргумент : Не используется.
Числовой аргумент : Это процентные шансы того, что триггер будет запущен в момент проверки.
Возвращаемое значение : Не используется.
Переменные : Нет.

см. Триггера монстров


Receive

Триггер монстра: Receive

Описание : Этот триггер проверяется когда монстру дали предмет.
Аргумент : Не используется.
Числовой аргумент : Процентные шансы того, что триггер будет запущен после проверки.
Возвращаемое значение : Если 0 возвращен, предмет не будет передан монстру. Для любого другого числа произойдет нормальный результат.

Переменные:
actor установлена на персонажа, дающего монстру предмет.
object установлена на предмет, который дают.

см. Триггера монстров


Reset VAR

Триггер монстра: Reset VAR

Описание : Этот триггер вызывается когда происходит сброс (ресет) переменной принадлежащей данному монстру.
Аргумент : Не используется.
Числовой аргумент : Процентные шансы того, что триггер будет запущен после проверки.
Возвращаемое значение : Не используется.

Переменные:
var это имя переменной которая сбросилась.
msg это имя события-причины сброса переменной. Может быть одно из:
round, reset_zone, die_pc, die_mob, extract_obj, rent_pc. Подробнее об этих событиях и расширенных переменных можно прочитать в соответствующем разделе.

см. Триггера монстров


Speech

Триггер монстра: Speech

Описание : Этот триггер проверяется когда кто-то скажет что-то в одной комнате с монстром. Если числовой аргумент это 0, триггер проверит, является ли аргумент подстрокой того что было сказано. Если числовой аргумент это 1, триггер проверит, совпадает ли любое слово в аргументе со словом, которое было сказано, и если это так, триггер будет вызван.
Аргумент : Фраза или список слов, которые нужно проверить на совпадение. В качестве аргумента может использоваться регулярное выражение (см. раздел регулярные выражения)
Числовой аргумент : Если он 0, аргумент это фраза. Если 1, аргумент это список слов.
Возвращаемое значение : Не используется.

Переменные:
actor установлена на персонажа, который говорит.
speech установлена на весь текст, который был произнесен.

см. Триггера монстров


Триггера предметов (класс триггера 1)

Флаг | Название | Назначение
a |  | не используется
b | Random | проверяется раз в определенный промежуток времени
c | Command | проверятся когда кто-то ввел комманду
d |  | не используется
e |  | не используется
f |  | не используется
g | Get | предмет подбирают из комнаты
h | Drop | предмет пытаются выбросить
i | Give | предмет пытаются кому-то отдать
j | Wear | предмет пытаются надеть
k |  | не используется
l | Remove | предмет пытаются снять
m |  | не используется
n | Load | предмет загрузился в игру
o | Reset VAR | выполняется когда происходит сброс переменной принадлежащей этому монстру


Command

Триггер предмета: Command

Описание : Этот триггер проверяется когда персонаж ввел команду, в комнате с этим предметом. Если введенная команда является подстрокой аргумента, триггер будет вызван.
Аргумент : Имя команды. В качестве аргумента может использоваться регулярное выражение (см. раздел регулярные выражения)
Числовой аргумент: Определяет, где должен находиться предмет, чтобы триггер сработал. 1 - в equipment персонажа. 2 - в inventory персонажа. 4 - в комнате с персонажем. Чтобы позволить предмету находиться сразу в нескольких местах, сложите между собой нужные числа. Например, если числовой аргумент будет 3, триггер сработает если предмет будет в inventory или equipment персонажа. Если установлено число 7, триггер сработает в inventory, equipment, или в комнате.
Возвращаемое значение : Если триггер вернул значение 0, персонаж получит сообщение, которое он получил бы, если бы триггер не
существовал и все остальные командные триггеры будут проверены.

Переменные:
actor установлена на персонажа, вводившего команду.
arg установлена на аргумент команды.
cmd установлена на команду введенную персонажем.

см. Триггера предметов


Drop

Триггер предмета: Drop

Описание : Этот триггер проверяется, когда персонаж пытается выкинуть предмет с этим триггером.
Аргумент : Не используется.
Числовой аргумент : Процентные шансы того, что триггер будет запущен после проверки.
Возвращаемое значение : Если возвращен 0, предмет не будет выкинут. Для любого другого числа, предмет уйдет в комнату как обычно.

Переменные:
actor установлена на персонажа, попытавшегося выкинуть предмет.

см. Триггера предметов


Get

Триггер предмета: Get

Описание : Этот триггер проверяется, когда предмет подобрали.
Аргумент : Не используется.
Числовой аргумент : Процентные шансы того, что триггер будет запущен после проверки.
Возвращаемое значение : Если возвращен 0, предмет не будет подобран. Для любого другого числа, предмет уйдет в inventory персонажа как обычно.

Переменные:
actor установлена на монстра, который подобрал предмет.

см. Триггера предметов


Give

Триггер предмета: Give

Описание : Этот триггер проверяется, когда кто-то пытается дать кому-то предмет.
Аргумент : Не используется.
Числовой аргумент : Процентные шансы того, что триггер будет запущен после проверки.
Возвращаемое значение : Если возвращаемое значение это 0, предмет не будет отдан жертве. Для любого другого возвращаемого значения, передача пройдет как обычно.

Переменные:
actor это персонаж, который отдает предмет.
victim это персонаж, который принимает предмет.

см. Триггера предметов


Load

Триггер предмета: Load

Описание : Триггер проверяется в момент загрузки предмета в игру.
Аргумент: Не используется.
Числовой аргумент : Процентные шансы того, что триггер будет запущен после проверки.
Возвращаемое значение: Не используется.

Переменные: Нет.

см. Триггера предметов


Random

Триггер предмета: Random

Описание : Этот триггер проверяется периодически (на данный момент каждые 11 секунд).
Аргумент: Не используется.
Числовой аргумент : Процентные шансы того, что триггер будет запущен после проверки.
Возвращаемое значение : Не используется.

Переменные : Нет.

см. Триггера предметов


Remove

Триггер предмета: Remove

Описание : Этот триггер проверяется, когда кто-то пытается снять предмет.
Аргумент : Не используется.
Числовой аргумент : Не используется.
Возвращаемое значение : Если возвращен 0, предмет не снимается.

Переменные:
actor установлена на персонажа, пытающегося снять предмет.

см. Триггера предметов


Reset VAR

Триггер предмета: Reset VAR

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

Переменные:
var это имя переменной которая сбросилась.
msg это имя события-причины сброса переменной. Может быть одно из:
round, reset_zone, die_pc, die_mob, extract_obj, rent_pc. Подробнее об этих событиях и расширенных переменных можно прочитать в соответствующем разделе.

см. Триггера предметов


Wear

Триггер предмета: Wear

Описание : Этот триггер проверяется когда, кто-то пытается надеть предмет.
Аргумент : Не используется.
Числовой аргумент : Не используется.
Возвращаемое значение : Если возвращен 0, предмет не надевается.

Переменные:
actor установлена на персонажа, пытающегося надеть предмет.

см. Триггера предметов


Триггера комнат (класс триггера 2)

Флаг | Название | Назначение
a | Global | проверяется даже если зона пуста
b | Random | проверяется раз в определенный промежуток времени
c | Command | проверятся когда кто-то ввел комманду
d | Speech | проверяется когда кто-то сказал фразу
e |  | не используется
f | Reset | ресет зоны с этой комнатой
g | Enter | кто-то пытается войти в эту комнату
h | Drop | кто-то пытается выбросить какой-то предмет в этой комнате
i | Reset VAR | выполняется когда происходит сброс переменной принадлежащей этому монстру


Command

Триггер комнаты: Command

Описание : Этот триггер проверяется когда персонаж ввел команду, в комнате с триггером. Если введенная команда является подстрокой аргумента, триггер будет вызван.
Аргумент : Имя команды. В качестве аргумента может использоваться регулярное выражение (см. раздел регулярные выражения)
Числовой аргумент : Не используется.
Возвращаемое значение : Если триггер вернул значение 0, персонаж получит сообщение, которое он получил бы, если бы триггер не существовал и все остальные командные триггеры будут проверены.

Переменные:
actor установлена на персонажа, вводившего команду.
arg установлена на аргумент команды.
cmd установлена на команду введенную персонажем.

см. Триггера комнат


Drop

Триггер комнаты: Drop

Описание : Этот триггер проверяется, когда персонаж пытается выкинуть что-то в комнате. Проверка происходит до того, как персонаж на самом деле выкинет предмет.
Аргумент : Не используется.
Числовой аргумент : Процентные шансы того, что триггер будет запущен после проверки.
Возвращаемое значение : Если 0 возвращен, предмет не будет выкинут. В противном случае предмет будет выкинут как обычно.

Переменные:
actor установлена на персонажа, выкидывающего предмет.
object установлена на предмет, который выкидывают.

см. Триггера комнат


Enter

Триггер комнаты: Enter

Описание : Этот триггер проверяется, когда кто-то входит в комнату. Проверка происходит сразу до того, как персонаж зашел в комнату и если Вы хотите чтобы действие произошло в комнате, в которую входит персонаж, используйте wait или телепортируйте персонажа. (Смотрите Команды Скриптов для дополнительной информации про wait и teleport.)
Аргумент : Не используется.
Числовой аргумент : Процентные шансы того, что триггер будет запущен после проверки.
Возвращаемое значение : Если возвращаемое значение это 0, персонаж не зайдет в комнату. Для любых других возвращаемых значений, персонаж зайдет в комнату как обычно.

Переменные:
actor установлена на персонажа, который входит в комнату.
direction установлена на направление откуда пришел персонаж. (Точнее на направление противоположное тому куда он ушел).

см. Триггера комнат


Global

Триггер комнаты: Global

Описание : Это не триггер сам по себе, но используется вместе с другими типами триггеров. Триггер который определен как глобальный (global) проверяется даже если в зоне нет ни одного игрока.
Аргумент : Не используется.
Числовой аргумент : Не используется.
Возвращаемое значение : Не используется.

Переменные : Нет.

см. Триггера комнат


Random

Триггер комнаты: Random

Описание : Этот триггер проверяется периодически (примерно каждые 11 секунд). Триггер не проверяется если нет ни одного игрока в зоне, за исключением триггеров типа Global
Аргумент : Не используется.
Числовой аргумент : Процентные шансы того, что триггер будет запущен после проверки.
Возвращаемое значение : Не используется.

Переменные : Нет.

см. Триггера комнат


Reset

Триггер комнаты: Reset

Описание : Триггер вызывается каждый раз при ресете зоны, к которой принадлежит комната, у которой есть данный триггера.
Удобно использовать, например, для создания каких-нибудь динамических свойств зоны, которые задаются при ресете.
Аргумент : Не используется.
Числовой аргумент : Процентные шансы того, что триггер будет запущен после проверки.
Возвращаемое значение : Не используется.

Переменные : Нет.

см. Триггера комнат


Reset VAR

Триггер комнаты: Reset VAR

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

Переменные:
var это имя переменной которая сбросилась.
msg это имя события-причины сброса переменной. Может быть одно из:
round, reset_zone, die_pc, die_mob, extract_obj, rent_pc. Подробнее об этих событиях и расширенных переменных можно прочитать в соответствующем разделе.

см. Триггера комнат


Speech

Триггер комнаты: Speech

Описание : Этот триггер проверяется когда кто-то скажет что-то в комнате с этим триггером. Если числовой аргумент это 0, триггер проверит, является ли аргумент подстрокой того что было сказано. Если числовой аргумент это 1, триггер проверит, совпадает ли любое слово в аргументе со словом, которое было сказано, и если это так, триггер будет вызван.
Аргумент : Фраза или список слов для сравнения. В качестве аргумента может использоваться регулярное выражение (см. раздел регулярные выражения)
Числовой аргумент : Если он 0, аргумент это фраза. Если 1, аргумент это список слов, Если аргумент регулярное выражение, то
числовой аргумент не используется.
Возвращаемое значение : Не используется.

Переменные:
actor установлена на персонажа, который говорит.
speech установлена на весь текст, который был произнесен.

см. Триггера комнат


Игровые

Обычные игровые команды могут быть использованы в триггерах.
Каждый тип игрового объекта (моб, комната или предмет) может пользоваться всеми доступными ему командами.

Примеры:

триггер монстра:

говорить Привет тебе путник!
..
г Пойдука я отсюда
восток


Общие

Общие команды триггеров работают во всех классах триггеров.


* комментарий

Символ '*' в начале строки означает комментарий. Вся строка игнорируется интерпретатором триггеров.

Пример:

if (%actor.unique_id% == %self.get_var("var_100")%)
* если игрок, который принес нам шмотку именно тот, которому выдавался квест
* то выдадим ему награды
mload obj 100
give obj_100 %actor.unique_id%
end


break

Прекращает выполнение switch блока.

см. switch


calcuid <переменная> <vnum> <type>

Создает новую переменную, которая идентифицирует моба, предмет или комнату с vnum номером. Все поля этой переменной устанавливаются в значения соответствующие этому мобу, предмету или комнате.

type один из:
mob
obj
room

Пример: нужно получить кол-во жизни монстра с номером 4413

if (%exist.mob(4413)%)
calcuid mob4413 4413 mob
set hits %mob4413.hitp%
end


case <условие>

Определяет группу команд внутри switch блока.

см. switch


default

Используется в switch блоке.
Определяет группу команд, которая будет выполнена если switch-выражение не совпало ни с одним case-условием.

см. switch


detach <vnum> <id>

Убирает триггер с номером vnum с объекта (моба, предмета или комнаты) с номером id.

ps. Старайтесь не использовать. Лучше воспользоваться Расширениями скриптов


done

Завершает switch или while блок

см. switch, while


eval <переменная> <выражение>

Эта команда вычисляет значение выражения и устанавливает значение переменной в результат. О том как производятся вычисления выражения смотрите в разделе Выражения.

Пример:

eval foobar 15 - 5

устанавливает переменную foobar в значение 10.

eval value %actor.get_var("var_100_%actor.unique_id%")%

устанавливает переменную value в значение возвращаемое функцией get_var у данного actor


extract <переменная> <номер_слова> <текст>

Устанавливает значение переменной (если такой не существует - создается новая) в слово номер номер_слова из текста. Имя переменной не заключается в %.

ps. Лучше воспользуйтесь регулярными выражениями.


global <переменная>

Команда global делает переменную глобальной. Заметим, что эта переменная является глобальной только в рамках одного скрипта, в котором она была объявлена глобальной.

ps. Для создания глобальных переменных лучше использовать Расширенные переменные. Эта команда сохранена в основном
для обратной совместимости со старыми версиями.


halt

Эта команда прекращает выполнение триггера.
Триггер возвратит значение 1, если другое значение не было задано командой return.


if elseif else

if (выражение1)
...
elseif (выражение2)

...
else
...
end

Команда if должна предшествовать командам elseif (необязательная команда), else (необязательная команда), и end.
· Если выражение1 является истиной, то выполняются все команды между if и следующим elseif, else или end.
· Если выполнение команд остановилось на elseif или else - ищется следующая команда end и выполнение команд продолжается с этой точки.
· Если выражение1 является ложью ищется следующая команда elseif, else или end.
· Если встречается команда else - выполняются все команды следующие за else до команды end.
· Если встречается команда elseif - проверяется значение выражения2.
· Если выражение2 равняется истине - то выполняются все команды между elseif и следующим elseif, else или end и затем ищется конец блока - (end).
· Если выражение2 является ложью ищется следующая команда elseif, else или end и тд.


makeuid <переменная> <id>

Создает новую переменную, которая идентифицирует игрока, моба или предмет с этим id-номером. Все поля этой переменной устанавливаются в значения соответствующие этому игроку, мобу или предмету.

Пример: все монстры в комнате идут на восток, а игроки на запад
Триггер комнаты (класс триггера 2), команды начинаются на w (wforce и тп)

set firstchar %self.people%

while (%firstchar%)

set pc %firstchar.next_in_room%

if (%firstchar.vnum% == -1)
wforce %firstchar% west
wforce %firstchar% look
elseif
wforce %firstchar% east
wforce %firstchar% look
end

if (%pc%)
makeuid firstchar %pc.id%
else
set firstchar 0
end
done


return <значение>

return изменяет возвращаемое значение триггера.
Значение возвращается после выполнения всех команд триггера, или при выполнении команд wait или halt.
В отличие от большинства языков программирования, return не прекращает выполнение триггера.


set <переменная> <выражение>

Устанавливает значение переменной в выражение без вычисления значения выражения.

Примеры: set foobar 15 - 5
Устанавливает значение переменной foobar в "15 - 5"

set str "arg1 arg2"


switch <выражение>

case условие1
...
break
case условие2
...
break
case условие3
...
break
default
...
done

Switch начинает блок выбора по условию.
Среди условий (условие1, условие2, условие3 ...) ищется равное выражению.
· Если такое найдено, то выполняется список команд между этой командой case и командой break или done.
· Если такого не найдено, то выполняется список команд между командами default и break или done.
Пример:
* Сначала выберем число между 1 и 3
eval number %random.3%
* Теперь произведем некоторые действия в зависимости от того, чему равно значение переменной number
switch %number%
case 3
say number равен трем
break
case 2
say number равен двум
break
default
say очевидно, что number равен одному
break
done
Обратите внимание, что только команда break прерывает выполнение списка команд. То есть, если например %number% будет равен 3-м, и мы не поставим команду break перед командой 'case 2', то команда 'say number равен двум' тоже будет отработана.


unset <переменная>

Уничтожает переменную если она существует.


wait

wait <продолжительность>
wait until <время>

Приостанавливает выполнение триггера на определенный промежуток времени.
· Если продолжительность - просто число, то пауза будет равна такому количеству так называемым игровым пульсам (примерно 0.1 секунды).
· Если за параметром продолжительность стоит символ 's' - пауза будет равна такому количеству секунд.
· Если за параметром продолжительность стоит символ 't' - пауза будет равна такому количеству игровых тиков.
· Если используется wait until - триггер будет приостановлен до времени. Время может задаваться в двух форматах: HH:MM или HHMM (14:30 или 1430).

Примеры:
wait 1 подождать 100 мс
wait 1s подождать 1 секунду
wait until 5:0 ждать 5 утра


while (выражение)

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


%log% <сообщение>

Добавляет сообщение в сислог. Используется в основном для отладки скриптов.

Примеры:

%log% Quest 22101 completed by %actor.name%


dg_cast

формат команды:

dg_cast '<заклинание>' <жертва> [параметры] [процент_умения] [уроверь_заклинания]

Параметры:
Необязательный параметр. Может быть только строкой
noresists - не учитывать сопротивления стихиям при колдовании заклинания
т.е вероятность наложить спелл == 100%

Функция работает так:
Если она вызывается из триггера монстра, то заклинание кастуется от него
Если из триггера другого типа, то загружается временный монстр от имени
которого кастуется спелл.

Примеры:

dg_cast 'исцеление' %actor.alias% 100 25

Если эта команда вызывается в триггере монстра, то
этому монстру временно устанавливается значение заклинания 'исцеление'
в 100% (эксперт), уровень монстра в 25 и от его имени кастутеся
заклинание 'исцеление'.

Если эта команда вызывается в триггере предмета, то загружается
временный монстр, которому ставится уровень 25 и уровень владения
заклинанием 'исцеление' 100%, после чего кастуется спелл.

dg_cast 'сф х' %actor.alias% 80

Эта команда кастует сферу холода на %actor.alias% с уровнем
владения 80% от текущего уровня монстра.

dg_cast 'защита' %actor.alias%

Эта команда кастует заклинание с параметрами по умолчанию.

dg_cast 'паралич' %actor.alias% noresists 100 25

Эта команда кастует 'паралич' на %actor.alias% с уровнем владения
заклинания 100%, уровень 25й.
Спелл проходит в любом случае т.к установлен параметр - noresists


dg_affect

Формат команды:

dg_affect <жертва> <имя_аффекта> <значение> <время>

Примеры:

dg_affect %actor.alias% броня 10 10

Эта команда вешает +10 к брони на %actor.alias% на 10+1 тиков

dg_affect %actor.alias% освящение 0 10

Эта команда устанавливает аффект освящение на 10+1 тиков

Аффекты установленные этой командой не отображаются по команде аффект

Возможные значения параметра <имя_аффекта> указаны в файлах редакторов:
(Те которые большими буквами)

Bonus
Affect

например: ADD_SLOT_C6
dg_affect %actor.alias% add_slot_c6 1 10


Монстров

Мобы могут использовать любые игровые команды, доступные игроку такого же класса и уровня, а так же команды приведенные в этом разделе.


masound <сообщение>

Выдает сообщение во все комнаты соединенные выходами с комнатой в которой находится моб,
которому принадлежит этот триггер.

Пример:

msound Вы услышали звук падающих камней.


mat <цель> <команда>

Команда выполняется мобом на (в) указанной цели. Целью может быть номер комнаты (vnum), имя игрока или предмета. Командой может быть любая доступная мобу команда.

Пример:

mat %actor.name% г Заходите, я давно вас жду.
mat 4409 mforce %actor.name% look

ps. Лучше использовать номер комнаты, это самая быстрая работа команды.


mdamage <жертва> <кол-во>

Повреждает (или лечит) жертву на заданное кол-во хитов.

Примеры:

mdamage %actor.unique_id% 100
mdamage %self% -100


mdoor <аргументы>

Команда аналогична wdoor, только работает в триггерах мобов.

см wdoor.


mecho <сообщение>

Посылает сообщение всем не спящим персонажам в комнате, в которой нахидится моб.

Пример:

mecho Вы услышали какой-то странный скрежет.


mechoaround <цель> <сообщение>

Посылает сообщение всем в комнате кроме цели и самого моба.

Пример:

mechoaround %actor.alias% %actor.name% поднатужил%actor.u% и поднял решетку.


mexp <жертва> <количество>

Выключена на данный момент. Пользуйтесь функцией func.exp()


mforce <жертва> <команда>

Моб заставляет жертву выполнить команду. Если жертва это all - все игроки (которые со связью) в комнате будут заставлены выполнить команду. На бессмертных эта команда не действует. Жертве не посылается никаких сообщений, кроме тех, которые вызваны исполнением команды.

Примеры:

mforce %actor.unique_id% бросить obj_4409

*!disable output
mforce all сесть
*!enable output


mforget <жертва>

Выключена.

Используйте команду .memory() в сумме с флагом моба MOB_MEMORY


mgoto <цель>

Перемещает моба к цели. Целью может быть предмет, комната или персонаж. Сообщение не выдается.

Пример:

mgoto 4400
mgoto %actor.unique_id%

ps. Лучше использовать номер комнаты, это самая быстрая работа команды.


mhunt <жертва>

Выключена.

Используйте команду .memory() в сумме с флагом моба MOB_MEMORY


mjunk <предмет>

Убирает предмет из инвентори моба. Mjunk all убирает все предметы из инвентори моба.

Примеры:

mjunk all


mkill <жертва>

Mkill заставляет моба атаковать жертву. Работает так же как и команда убить.

Примеры:

mkill %actor.unique_id%
mkill %self.people%


mload <obj | mob> vnum

Эта команда загружает моба или предмет с номером vnum в игру. Мобы загружаются в ту же комнату, в которой находится моб, чей триггер выполнил эту команду. Предметы загружаются в инвентори моба. No-take (тяжелые или не берущиеся) предметы загружаются в комнату в которой находится моб. Сообщение не выдается.


mlog <сообщение в лог>

см. %log%


mpurge [цель]

Удаляет цель (предмет или моб) из игры.

Предмет может находится или в инвентаре этого монстра или в комнате где этот монстр находится.

Монстр по имени удаляется только из текущей комнаты, если монстр задан через его специальный id, то удаляется
в любой комнате.

Если цель не задана, все предметы и мобы удаляются из комнаты в которой находится моб. Игроки не могут быть удалены этой командой.

Сообщения не выдаеются.


mremember <жертва> [команда]

Выключена.

Используйте команду .memory() в сумме с флагом моба MOB_MEMORY


msend <жертва> <сообщение>

Жертве будет послано сообщение

Примеры:

msend %actor.unique_id% Вы поднатужились и подняли решетку.


mteleport <жертва> <цель>

Переносит жертву к цели. Жертва не обязательно должна находиться в той же комнате что и моб. Если жертва это 'all' - все персонажи в комнате с мобом будут перенесены к цели. Цель - это vnum комнаты куда бедет осуществляться перенос. Сообщение не выдается.

Примеры:

mteleport %actor% 4401
mteleport all mob_4402


mtransform vnum

Отключена.


Предметов

Предметы могут использовать только команды приведенные в этом разделе, а также функции DG и переменные.


odamage <жертва> <кол-во>

см. mdamage


odoor <аргументы>

см. wdoor


oecho <сообщение>

Посылается сообщение всем не спящим персонажам в комнате в которой находится этот предмет. Если этот предмет одет на ком-то, или находится в чьем-то инвентори, сообщение посылается всем не спящим в комнате в которой находится моб или игрок у которого находится этот предмет.


oechoaround <жертва> <сообщение>

Посылается сообщение всем в комнате кроме жертвы.


oexp

Отключена. Используйте команду func.exp()


oforce <жертва> <команда>

Объект заставляет жертву выполнить команду. Если жертва это 'all' - все персонажи в комнате будут заставлены выполнить эту команду. На бессмертных эта команда не действует. Жертве не посылается никаких сообщений, кроме тех, которые вызваны исполнением команды.


oload <obj | mob> vnum

Команда загружает моба или предмет с номером vnum в комнату, в которой находится предмет. Обязательно указывать vnum предмета или моба, имя не будет работать. Сообщения не выдаются.


olog

см. %log%


opurge [цель]

Удаляет цель (предмет или моб) из игры. Если цель не указана, все предметы или мобы находящиеся в комнате удаляются из игры. Игроки не могут быть удалены этой командой. Сообщение не выдается.

Предмет в другой комнате по имени этой командой не может быть удален. Воспользуйтесь командой func.purge()


osend <жертва> <сообщение>

Сообщение посылается жертве.


osetval <номер> <значение>

value[номер] = значение


oteleport <жертва> <цель>

Перемещает жертву к цели. Цель не обязательно должна находиться в той же комнате что и предмет или владелец предмета. Если жертва это 'all' - все персонажи находящиеся в комнате будут перенесены к цели. Сообщение не выдается.

Примеры:

oteleport %actor% 4401
oteleport all mob_4402


otimer <значение>

Устанавливает таймер объекта в значение. Как только таймер обнулится timer-триггер предмета будет выполнен.


otransform vnum

Отключена.


Комнат

Комнаты могут использовать только команды приведенные в этом разделе, а также функции DG и переменные.


wasound <сообщение>

Wasound посылает сообщение во все прилегающие к этой комнате комнаты.


wat

см. mat


wdamage <жертва> <количество>

Нанести вред (или исцелить, если количество отрицательное число) жертве.


wdoor комната направление поле [значение]

Эта команда используется для добавления, удаления и модифицирования дверей в комнате (указывать vnum комнаты). Направление определяет, какая дверь будет изменена и может быть север, юг, восток, запад, вверх, или вниз.
Если дверь не существует, новая дверь будет создана. Поле определяет какой параметр двери будет изменен.

Допустимые поля:
purge Удаляет дверь полностью. Значение не используется.
description Значение будет новым описанием выхода комнаты.
flags Значение будет новыми флагами двери.
Вот список букв, который представляет все флаги двери.
a - У выхода есть дверь открывается/закрывается.
b - Дверь закрыта.
c - Дверь заперта.
d - Замок нельзя взломать.
e - Дверь секретная

Например, " wdoor 100 север abe " создает закрытую секретную дверь на севере в комнате 100.

key Значение - vnum предмета, который будет новым ключом к двери.
name Значение - новое имя двери.
room Значение - комната, к которой будет подсоединена эта дверь.


wecho <сообщение>

Wecho посылает сообщение всем кто не спит в комнате.


wechoaround <жертва> <сообщение>

Посылает сообщение всем в комнате кроме жертвы.


wexp <жертва> <количество>

Отключена. Используйте func.exp()


wforce <жертва> <команда>

Заставляет жертву выполнить команду. Если жертва это 'all', все персонажи в комнате выполнят эту команду. Wforce не влияет на Бессмертных. Никаких сообщений не посылается, кроме тех, которые были вызваны выполненной командой.


wload <obj | mob> vnum

Эта команда загружает монстра или предмет в игру в комнату, выполняющую команду. Вы должны задать vnum монстра или предмета. Имя не сработает. При выполнении не показывается никаких сообщений


wlog

см. %log%


wpurge [цель]

Wpurge убирает предметы или монстров из игры. Если цель не задана, все предметы и монстры в этой комнате будут удалены. Если цель задана, только указанный монстр или предмет будет удален. Игроки не могут быть удалены этой командой. При выполнении не показывается никаких сообщений.


wsend <жертва> <сообщение>

Сообщение будет послано жертве


wteleport <жертва> <цель>

Wteleport переместит жертву к цели. Жертва не должна обязательно находиться в этой комнате. Если жертва это all или все, все персонажи в комнате будут телепортированы в комнату-цель. При выполнении не показывается никаких сообщений.


wzoneecho <номер зоны> <сообщение>

Посылает сообщение всем игрокам, которые находятся в зоне с данным номером.


Переменные/Функции

Переменные имеют вид имен, окруженных символами '%', например %actor%.
Перед обработкой команды, строка сканируется и все переменные заменяются на их значения. Сначала проверяется список локальных переменных. Если такой переменной не найдено, проверяются глобальные переменные. Если переменная все еще не найдена, проверяется список 'встроенных' переменных (не тех, которые определяются скриптом). Если переменная не найдена, она будет замещена пустой строкой (строка с процентами будет убрана из текста и ничего не останется на ее месте). Два знака '%', следующих сразу друг за другом будут интерпретированы как одиночный '%'.
Есть два типа переменных, локальные и глобальные. Все локальные переменные удаляются когда триггер заканчивает работу и могут использовать только этим триггером. Глобальные переменные остаются пока их не уберут командой unset или не будет удален скрипт.
У глобальных переменных есто так же параметр context. Параметр context есть так же и у скрипта. По умолчанию он равен нулю. С помощью команды 'context <value>' можно установить context скрипта в любое целое положительное значение. Сontext глобальной переменной всегда устанавливается в текущее (в момент объявления ее глобальной) значение context'a скрипта.
Если context глобальной переменной равен нулю или текущему значению context'a скрипта - она будет 'видна'. В противном случае она будет недоступна для работы с ней.
Имена и поля переменных чувствительны к регистрам.


Персонажа

name Именительный падеж
rname Родительный падеж
alias Алиас (mob_4401, pc_23424)
unique_id Уникальный идентификатор, гарантирует уникальность имени в пределах 1го ребута
dname Дательный падеж
vname Винительный падеж
tname Творительный падеж
pname Предложный падеж
<спец символы> Динамические окончания, подробнее см. Специальные символы
id Номер персонажа или моба
<ext vars> Подробнее см. Расширенные переменные
ac AC чара
armour БРОНЯ чара
level Уровень чара
position Позиция чара (стоит, спит и тп)
ip IP адрес текущий
is_horse Лошадь ли это? (т.е имеет ли моб флаг MOB_MOUNTING)
hitp Выдает текущее кол-во хитов
hitp(число) Устанавливает текущее кол-во хитов в число (с апдейтом позиции)
maxhitp Кол-во максимальных хитов
move Кол-во энергии
maxmove Кол-во максимальной энергии
align Цифра, обозначающая наклонности жертвы (см. Наклонности)
gold Выдает кол-во монет в инвентаре
gold(число) Добавляет число к кол-ву монет в инвентаре и возвращает новое значение.
bank Выдает кол-во денег на счету в банке.
bank(число) Устанавливает кол-во денег на счету в банке в число.
loadroom Выдает vnum комнаты в которую загружается чар при входе в игру.
loadroom(vnum) Устанавливает комнату загрузки чара в vnum
sex Пол чара (текстовая строка)
weight Общий вес чара
c_weight Вес переносимых вещей
e_weight Вес надетых вещей
f_weight Полный вес чара (сумма предыдущих)
size Размер
damroll Кол-во текущих дамролов
hitroll Кол-во текущих хитроллов
canbeseen Видит ли self чара
class Профессия чара (текстовая строка)
race Раса чара (число)
fighting Выдает указатель на персонажа с кем сражаемся или пусто.
is_killer 1 - Есть флаг УБИЙЦЫ, 0 - нет
is_killer(on|off) Включить/выключить флаг УБИЙЦЫ
lag Выдает кол--во задержки в пульсах
lag(число) Устанавливает лаг в значение число раундов боя. Команда выполняется независимо есть лаг или нет. (Удобная для снятия баш-лага например у моба)
riding Указатель на лошадь если есть
riding_by Указатель на седока
master Указатель на лидера (за кем следуем) если есть
owner Дает указатель на хозяина если есть или на лидера
is_pet 1- животное 0-нет
vnum vnum моба, -1 игрок
str Сила
trains Кол-во свободных тренировок
int Интеллект
wis Мудрость
dex Ловкость
con Телосложение
cha Харизма
slava Кол-во славы
clannum Номер клана
room vnum комнаты в которой находится чар
skill(имя) Выдает уровень владения скиллом спеллом. (Пример: %actor.skill(придержать персону)%)
eq(позиция) Выдает указатель на надетый предмет в позиции или -1 (позиция может быть числом или названием)
next_in_room Указатель на следующего в комнате чара
people Указатель на первого персонажа в комнате
is_weared(vnum) Номер позиции куда надет редмет с номером vnum или -1
haveobj(vnum) Ищет предмет с данным vnum у чара, предметы в предметах не находит
возвращает inv если предмет найден в инвентаре, eq если предмет найден в экипировке
и none если не найден.


.memory()

**** %X.memory(params) ****

Функция для работы с памятью монстров

Для работы этих функций необходим установленный флаг MOB_MEMORY у монстра
который запоминает

params:
<команда> <кто> <кого> [длительность]

команда:
remember - функция для запоминания
forget - функция для забывания
is_remember - функция проверки памяти

кто - идентификатор монстра который будет запоминать
кого - идентификатор чара которого монстр будет запоминать
длительность - время втечении которого помнит монстр в тиках

Примеры:

%self.memory("remember" "%self.unique_id%" "%actor.unique_id%" "40")%

%self.memory("forget" "%self.unique_id%" "%actor.unique_id%")%

--
set var %self.get_var("var_0000")%
set var1 %self.get_var("var_0001")%

%self.memory("remember" "%var%" "%var1%")%

--

%self.memory("remember" "mob_4409" "%actor.unique_id%")%

--

if (%self.memory("is_remember" "mob_4409" "%actor.unique_id%")%==1)
%echo% АХ, Я тебя помню %actor.name%
end

--

if (%self.memory("is_remember" "%self.unique_id%" "%actor.unique_id%")% == 0)
%self.memory("remember" "%self.unique_id%" "%actor.unique_id%" "100")%
%echo% SETS
else
%self.memory("forget" "%self.unique_id%" "%actor.unique_id%")%
%echo% REMOVE
end


.look_around

%self.look_around%

Заставляет монстра оглядеться в комнате. Если монстр агрессивный, то он без задержки нападет на игроков.

Примеры:

заставим моба с vnum=4413 выполнить оглядку по комнате

calcuid mob4413 4413 mob
%mob4413.look_around%


.set()

%X.set(params)%

Функция позволяет изменять некоторые хар-ки.

3 параметра в params
("что" "тип" "значение")

тип один из:
"set" - установить заменой
"plus" - прибавить значение
"minus" - вычесть значение

что:
resist_fire
resist_water
resist_air
resist_earth
resist_mind
drunk
hunger
thirst

Пример:

(увеличить сопротивление огню на 1)

%actor.set("resist_fire" "plus" "1")%


.guildtraining()

*** Интерфейс к функции learnskill(): обучение в гильдии ***

%self.guildtraining("actor" "skill name")%

Описание:
заставляет %self% обучить умению skill name актора.
Впринципе можно заставить обучить умению и игрока, т.е сделать из него гилду :)
т.к это простой интерфейс, то все сообщения стандартной гильдии выводятся
как обычно. ("Вы успешно потренировали ..." и тп). Если вам это не нужно, используйте
блокировку вывода: *disable/enable output

Возвращаемые значения:
-4 char not found
-3 skill not found
-2 not enough params
-1 params syntax error
0 OK
1 skillnum incorrect
2 это умение уже >= 100% или еще нет гильдии (*)
3 это заклинание и оно <= 0 (профейлено или не заучено из книги)
4 гилдмастер не знает такого умения
5 гилдмастер не может учить, т.к чар знает это умение лучше или также
6 У вас не хватает мудрости постигнуть секреты мастерства этого уровня.
7 это заклинание 1го круга, учимое в первый раз

Пример:
if (%self.guildtraining("%actor.unique_id%" "%arg%")% == 0)
say Вы успешно поучили умение %arg%.
end


.affected()

*** Функция affected(spell) ***

%actor.affected(spell)%

Описание:
Проверяет действует ли на чаре такой аффект (спелл/скилл) или
автоаффект, если спелл его имеет.

!!Дописать _еще не работает!!: Если у спелла есть автоаффект, то он тоже проверяется

Возвращаемые значения:
1, если аффект есть
0, если нет

Пример:
if (%actor.affected("полет")%)
say actor в полете!!
end


.save()

Записывает игрока на диск. Бывает необходимо в некоторых случаях.

Пример:

%actor.save%


Предмета

name Список алиасов предмета. НЕ! именительный падеж
rname Родительный падеж
dname Дательный падеж
vname Винительный падеж
tname Творительный падеж
pname Предложный падеж
alias Алиас предмета (obj_vnum: obj_4401)
unique_id Уникальный идентификатор предмета
id Номер предмета
<ext vars> Подробнее см. Расширенные переменные
shortdesc Именительный падеж предмета
vnum vnum предмета
type Тип предмета (текстовая строка)
xtype Тип предмета (номер)
timer таймер (GET_OBJ_TIMER)
val0 значение 0
val1 значение 1
val2 значение 2
val3 значение 3
is_corpse 1 - труп, 0 - нет
corpse_vnum vnum моба из которого получился этот труп или -1
carried_by Указатель на чара который несет этот предмет
worn_by Указатель на чара на котором надет этот предмет


Комнаты

name Название комнаты
<ext vars> Подробнее см. Расширенные переменные
north Флаги выхода
east
south
west
up
down
vnum vnum комнаты
people Указатель на первого чара в комнате


Текстовые переменные

Это переменная %speech% или любая переменная созданная в триггере и содержащая текст.

Поле Описание поля
strlen Возвращает количество символов в тексте
trim Возвращает текст без пробелов в начале и конце.
car Возвращает первое слово из текста. Например для %text% ="Это текстовая переменная" %text.car% вернет значение "Это"
cdr Возвращает текст без первого слова и с обрезанными пробелами в начале и конце. Например для %text%="Это текстовая переменная" %text.cdr% вернет значение "текстовая"
mudcommand Возвращает полное имя команды. Пример:
if (%arg.mudcommand% == спать) ...
Условие выполнится и на сокращения "спа", "спат"


Специальные переменные

self Объект (моб, предмет или комната) которому принадлежит скрипт. Все поля для переменной соответствующего типа могут быть использованы.
time.<поле> Полем может быть hour, day, month, year или time. Возвращает час, день, месяц, год текущего времени МАДа. %time.time% возвращает timestamp реального времени в UNIX формате (число секунд от 1970го года)
people.room Подсчитывает кол-во персонажей в данной комнате. (считаются как игроки так и мобы)
(пример: %people.4401%)
people.room(pc) Подсчитывает кол-во персонажей в данной комнате. (считаются _только_ игроки)
(пример: %people.4401(pc)%)
random.число Выдает случайное число в диапазоне 1 ... число. (Пример: set rnd %random.10%)
random.char Выдает случайного чара/моба в текущей комнате объекта.

Другие специальные переменные, которые в основном носят характер функций, вы можете найти в подветках.


func.exp()

Начисление игроку или группе опыта с учетом ограничений.

%func.exp("solo | group" "actor" "exp" ["params"])%

solo - опыт дается только одному чару
group - опыт дается группе чара которая с ним в комнате
actor - чар
exp - кол-во опыта, может быть меньше нуля
params - доп. параметры
формат: "max=<number> max_ident=<identifier> max_type=<type> devide=<number>"
max - число через которое начнется максится опыт
max_ident - идентификатор макса, должен быть уникален. по нему происходит макс
max_type - тип замаксивания:
0 - макс случайному согрупнику если группа (правила муда)
1 [по умолчанию] - равномерный замакс если группа
devide - 0 опыт не делится на группу
1 опыт делится на группу [по умолчанию]

Примеры:
%func.exp("solo" "%actor%" "1000")%
игрок actor получит 1000 опыта если может, если не может получит 1/20 дсу
%func.exp("solo" "%actor%" "-1000")%
игрок actor получит -1000 опыта, если -1000 больше чем дсу, то игрок
потерят полный дсу (1 уровень)
%func.exp("group" "%actor%" "1000")%
игрок и его группа получат по 1000 опыта
если кто-то в группе не может получить 1000 опыта, то получит 1/20 дсу
%func.exp("group" "%actor%" "-1000")%
игрок и его группа получат по -1000 опыта

%func.exp("group" "%actor%" "1000" "max_ident=trig_22101_1 max=5")%
включает замаксивание по идентификатору trig_22101_1
игрок получит этой функций 5 раз 1000 опыта, потом будет делится на опыт/1+(кол-во - 5)
т.е на 6 раз будет 1000/2
7 раз будет 1000/3
и тд


func.purge()

*** Удаление предмета/монстра где угодно в мире ***

%func.purge("type" "alias")%

alias это или алиас объекта или его уникальный алиас (unique_id)

Пример:
%func.purge("obj" "obj_22101")%
%func.purge("mob" "mob_22100")%


func.is_grouped()

%func.is_grouped("<char>")%

Функция возвращает 0 если actor не в группе, 1 если в группе

Пример:

if (%func.is_grouped(%actor%)%)
..
end


func.is_have_followers()

%func.is_have_followers("<char>")%

Функция возвращает 0 если actor не имеет следующих за ним иначе 1.

Пример:

if (%func.is_have_followers("%actor.unique_id%")% == 1)
..
end


func.is_alone()

%func.is_alone("<char>")%

Если actor не в группе и за ним нет последователей, то функция возвращает 1 иначе 0

Пример:

if (%func.is_alone("%actor.unique_id%")%)
..
end


func.count_group()

%func.count_group("<char>")%

Функция возвращает кол-во согрупников actor. actor считается. Выдает кол-во всех согрупников, не учитывая
их местоположения.

Пример:

set count %func.count_group(%actor%)%


func.count_followers()

%func.count_followers("<char>")%

Функция возвращает кол-во следующих за char. Считает всех последователей не зависимо от их местаположения.

Пример:

set num %func.count_followers(%actor%)%


func.get_horse()

%func.get_horse("<char>")%

Функция возвращат указатель на первую лошадь char.

Пример:

set horse %func.get_horse("%actor.unique_id%")%

if (%horse%)

say Хорошо, вот моя долговая расписка в получении.
say Предъяви ее когда тебе снова понадобится твоя лошадь.

mjunk all
mload obj 2527
give obj_2527 %actor.unique_id%
drop all

%func.purge("mob" "%horse.unique_id%")%

else
say Но где же ваша лошадь?
end


func.is_have_max_horses()

%func.is_have_max_horses("<char>")%

Функция возвращает "1" если char уже имеет максимально допустимое кол-во лошадей.

Пример:

if (%func.is_have_max_horses("%actor.unique_id%")% == 1 )
say %actor.name%, у тебя уже достаточно лошадей.
return 0
else
mjunk all

set vnum %random.7%
eval vnum %vnum%+7

mload mob %vnum%

say Вот твоя лошадь, %actor.name%.
mforce mob_%vnum% follow %actor.unique_id%
return 1
end


func.create_money()

*** Интерфейс к функции create_money() ***

%func.create_money("%target.unique_id%" "%amount%")%
или
%func.create_money("room_vnum" "%amount%")%

создает кучку монет с заданным числом и помещает ее в инвентори указаного
таргета или в комнату с vnum

Пример:

%func.create_money("%self.unique_id%" "50")%
%func.create_money("22314" "50")%


func.act()

*** Интерфейс к функции act(). Вывод сообщений с учетом инвиза, пола и пр ***

%func.act("сообщение" "hide_invisible" "actor" "obj" "vict_obj" "type")%

собщение строится по таким же правилам как и социалы, например:
$n медленно появил$u из портала.

hide_invisible определяет показывается ли сообщение если не видно actor
0 - да
1 - нет

actor это объект персонажа на котрого можно ссылаться символами $n, $y и др
vict_obj если это персонаж, то на него можно ссылаться символами $N, $Y и др
если это предмет, то на него можно ссылаться символами $O, ~Y и др
obj предмет, на который можно ссылаться симовалми $o, ~y и др
type один из:
TO_CHAR сообщение отправляется actor
TO_ROOM сообщение отправляется всем в комнате actor кроме actor
TO_VICT сообщение отправляется vict_obj
TO_NOTVICT сообщение отправляется всем в комнате actor кроме actor и vict_obj

Примеры:

%func.act("Мощная волна энергии подхватила $v и унесла прочь." "0" "%actor%" "0" "0" "TO_ROOM")%
%func.act("Мощная волна энергии подхватила вас и унесла прочь." "0" "%actor%" "0" "0" "TO_CHAR")%

см. Специальные символы


func.get_random_obj()

*** Функция get_random_obj ***

%func.get_random_obj("%actor%")%

Описание:
Возвращает случайный предмет из инвентаря actor.

Возвращаемые значения:
указатель на предмет
пустое значение если предметов нет

Пример:

set tmp_obj %func.get_random_obj("%actor%")%


exist.X() :: Проверка на существование мобов/предметов

%exist.<mob | obj>(vnum)%

Проверяет существует ли в игре на данный момент данный моб или предмет.
принимает значения:
"1" существует
"0" не существует

Пример:

if (%exist.mob(3005)% == 0)
return 0
end

Возможны так же следующие комбинации:

%exist.<mobsand | objsand>(vnum1 vnum2 ... vnumN)%

Проверяет существуют ли на данный момент в мире _все_ монстры/предметы из списка.
1 - существуют
0 - нет

Пример:

if (%exist.mobsand(4401 4402 4403)% == 1)
halt
end

%exist.<mobsor | objsor>(vnum1 vnum2 ... vnumN)%

Проверяет существуют ли на данный момент в мире хотя бы один монстр/предмет из списка
1 - существует
0 - нет


world.curobjs()

%world.curobjs(vnum)%

возвращает существующее кол-во данных предметов вообще.

Пример:

Создадим динамический макс вещи:

if (%world.curobjs(4401)% < 5)
say Прими это в знак моей благодарности
mload obj 4401
give obj_4401 %actor.unique_id%
else
say Спасибо тебе, но вот дать мне тебе него увы
end


world.curmobs()

%world.curmobs(vnum)%

Возвращает кол-во данных монстров в мире.

Пример:

%world.curmobs(4400)%


Расширения скриптов


Прекращение выполнения триггера

*!stop "<expression>" - установить условие
*!stop "" - убрать условие

задает условие прекращения выполнения триггера
expression может быть по идее такой же как и в разных условиях типа if
expression не может быть командой, условием, блоками цикла и тп
expression вычисляется _перед_ выполнением каждой из выполняемых строк триггера и
если результат отличен от "", "0" то триггер прекращает свое выполнение.
Условие начинает действовать на следующей команде идущей после *!stop

Если написать эту команду в начале триггера, то возникает следствие - условие запуска триггера
если оно false, то триггер запускается.

Примеры:
*!stop "%self.fighting%"
*!stop "%self.fighting% || (%actor.room% != %self.room%)"


Разрешение/Запрет вывода

Иногда нужно чтобы результат выполнения команды не отображался игроку.
Для этого служат данные флаги.

*!disable output
..
*!enable output

Пример:
#11
obj~
1 c 100
тест~

%echo% триггер >%self.alias%< работает

*!disable output
oforce %actor% remove obj_15
*!enable output

~


Разрешение/Запрещение запуска триггера

Часто необходимо запретить выполнение какого-то триггера или группы триггеров,
пока выполняется некоторый код в другом триггере

*!disable trigger 22008

...

*!enable trigger 22008

Команда disable запрещает выполнение триггера с номером #22008, enable разрешает


Расширенные переменные

Расширенные переменные собственная разработка Адамант Адан Мада.


create_var()

** Создать переменную **

create_var(name flags)

name:
имя переменной

flags:
c VAR_FLG_NODECAY Не удалять перменную из памяти после ресета
d VAR_FLG_PERMANENT переменная постоянная (сохраняется между ребутами)

Возвращаемые значения:
0 - переменная создана
1,2 - неверно заданные параметры
3 - переменная не создана (такая уже есть в локальном списке)
4 - переменная не создана (такая уже есть в глобальном списке)
5 - не создана

Примеры:

%actor.create_var("var_23101" "c")% - создает переменную с именем var_23101
при ресете не удаляется из памяти
%actor.create_var("var_111")% - никаких флагов нет

%actor.create_var("pvar_22101_%actor.id%" "d")% - создает постоянную переменную, которая
не удаляется при ребутах. Очень полезно для создания долгих квестов, одноразовых квестов и тп.


set_var()

** Установить значение переменной **

set_var(name value)

name:
имя переменной
value:
значение переменной (старое удаляется и замещается новым)

Возвращаемые значения:
not_found - Неременная не найдена или не существует
err_no_params - Неверно заданы параметры функции
err_params_empty - Неверно заданы параметры функции
err_type_unknown - Ошибка в коде. Неверный тип вызова.

Пример:

%actor.set_var("var_23101" "value11")%


set_var_reset()

** УСТАНОВКА ПАРАМЕТРОВ РЕСЕТА **

set_var_reset(name xtype param)

#Функция не работает с переменными с флагом VAR_FLG_PERMANENT
#После установки новых параметров признак ресета переменной принудительно очищается

name:
имя переменной

xtype:
round
reset_zone
die_pc
die_mob
extract_obj
rent_pc

param (число):
round - кол-во раундов до ресета
reset_zone - VNUM зоны
die_pc - IDNUM чара
die_mob - VNUM монстра
extract_obj - VNUM предмета
rent_pc - IDNUM чара

Возвращаемые значения:
not_found - Неременная не найдена или не существует
err_no_params - Неверно заданы параметры функции
err_params_empty - Неверно заданы параметры функции
err_type_unknown - Ошибка в коде. Неверный тип вызова.
msg_type_unknown - Неизвестный тип сообщения
var_is_permanent - Попытка изменить параметры сброса постоянной переменной

Пример:
1:
set VAR var_0001
%self.set_var_reset("%VAR%" "round" "10")%

2:
if (%actor.vnum==-1)
%self.set_var_reset("%VAR%" "rent_pc" "%actor.id%")%
end


get_var()

** Получить значение переменной **

get_var(name)

name:
Имя переменной

Возвращаемые значения:
not_found - Неременная не найдена или не существует
err_no_params - Неверно заданы параметры функции
err_params_empty - Неверно заданы параметры функции
err_type_unknown - Ошибка в коде. Неверный тип вызова.
msg_type_unknown - Неизвестный тип сообщения
или значение переменной

Примеры:

if (%actor.get_var(%var%)%==load)
say LOAD
end


get_var_reset()

** ЧТЕНИЕ ПАРАМЕТРОВ РЕСЕТА **

get_var_reset(name param)

name:
имя переменной

param:
round
reset_zone
die_pc
die_mob
extract_obj
rent_pc

Возвращаемые значения:
not_found - Неременная не найдена или не существует
err_no_params - Неверно заданы параметры функции
err_params_empty - Неверно заданы параметры функции
err_type_unknown - Ошибка в коде. Неверный тип вызова.
msg_type_unknown - Неизвестный тип сообщения

Примеры:
%self.get_var_reset("var_001" "die_pc")% - возвращает значение IDNUM чара
если при событии die_pc оно совпадет
с idnum чара который умер, то переменная
поресетится.

eval %rounds% %self.get_var_reset("var_001" "round")%
if (%rounds%!=not_found)
say кол-во раундов боя до ресета переменной %rounds%.
end


delete_var()

** УДАЛЕНИЕ ПЕРЕМЕННОЙ **

delete_var(name)

name:
Имя переменной

Возвращаемые значения:
not_found - Неременная не найдена или не существует
err_no_params - Неверно заданы параметры функции
err_params_empty - Неверно заданы параметры функции
err_type_unknown - Ошибка в коде. Неверный тип вызова.
msg_type_unknown - Неизвестный тип сообщения

Примеры:
%actor.delete_var("var_0001")%


is_var_reseted()

** ПРОВЕРКА НА РЕСЕТ ПЕРЕМЕННОЙ **

is_var_reseted(name)

name:
Имя переменной

Возвращаемые значения:
not_found - Неременная не найдена или не существует
err_no_params - Неверно заданы параметры функции
err_params_empty - Неверно заданы параметры функции
err_type_unknown - Ошибка в коде. Неверный тип вызова.
msg_type_unknown - Неизвестный тип сообщения
0 - Переменная не поресетилась еще
1 - Переменная поресетилась


is_var_exist()

** ПРОВЕРКА НА СУЩЕСТВОВАНИЕ ПЕРЕМЕННОЙ **

is_var_exist(name)

name:
Имя переменной

Возвращаемые значения:
0 - Переменная не существует
1 - Переменная существует


Обзор

В качестве регулярных выражений в нашем маде реализованы регулярные выражения в стиле perl на свободно распространяемой библиотеке PCRE (www.pcre.org)
На данный момент поддерживается только проверка на совпадение (match), возможно в будущем будет реализована такая удобная команда как замена.

Подробную информацию о работе регулярных выражений вы можете найти в любой книге по языку типа Perl.


Регулярные выражения в триггерах

Регулярное выражение в триггерах выделяется косыми скобками (//).
В теле триггера оно должно быть заключено в двойные кавычки.
В качестве аргумента триггера регулярное выражение НЕ должно быть заключено в кавычки.

Пример:

#100
тестовый триггер~
0 c 0
/^копать/~

if (%arg% => "/яму/")
say "Хотите копать яму?"
end
~


Оператор =>

Оператор сопоставления "=>" указывает, что правая часть выражения является регулярным выражением.
Результаты сопоставления (части строки) последнего выражения доступны по числовым переменным: %1%, %2%, и.т.д.


Пример

В качестве примера рассмотрим задачу, когда в триггере монстра типа act, нужно определить, что на монстра посмотрели. Здесь нужно учесть как пол персонажа, так и на кого смотрят для корректного анализа.
Без применения регулярных выражений для решения этой задачи нужно было бы писать несколько однотипных триггеров, что не рационально.
Вот данный триггер:

#12
mob act~
0 e 0
/^(.+)\sпосмотрел(а|о|и)?\sна\s(.+)\./~

%echo% >%1%< посмотрел>%2%< на >%3%<.

if (%3% => "/[Вв]ас/")
%echo% АААА, посмотрели на нас, нужно что-то сделать. :)
end

~

Рассмотрим подробнее данный триггер. В качестве аргумента задано регулярное выражение "/^(.+)\sпосмотрел(а|о|и)?\sна\s(.+)\./", в соответствии с ним триггер срабатывает на следующие строки:
Он посмотрел на кого-то.
Он посмотрел на вас.
Она посмотрела на кого-то.
Она посмотрела на вас.
Оно посмотрело на вас.
Оно посмотрело на кого-то.
Они посмотрели на вас.
Они посмотрели на кого-то.

Получить содержимое круглых скобок можно в соответствующих переменных. Скобка с порядковым номером 2, переменная %2% и так далее.

Строка " %echo% >%1%< посмотрел>%2%< на >%3%<." выводит исходную строку, но только составленную из частей:
>Она< посмотрел>а< на >кого-то<.

Далее, строчка "if (%3% => "/[Вв]ас/")" проверяет содержимое 3й скобки (на кого смотрят) на соответствие регулярному выражению "/[Вв]ас/", под которое подходят фразы "Вас" и "вас". Если посмотрели на монстра с триггером, то выполняется строчка "%echo% АААА, посмотрели на нас, нужно что-то сделать. :) "


About

Версия: 1.02

Эта справка поддерживается имплементором Адамант Адан МАДа Линдиром. По всем вопросам
вы можете писать по e-mail: lindir@adan.ru


Общее

Все параметры функций отделяются друг от друга пробелами и заключаются в двойные кавычки.

События

Все переменные с флагом VAR_FLG_PERMANENT игнорируются

msg_round наступает перед каждым раундом боя
и если targets[VAR_MSG_ROUND] > 0, происходит уменьшение на 1
При достижении нуля происходит
ресет переменной (функция reset())
вывоз триггера соответствующего типа
удаление переменной из памяти если не установлен флаг VAR_FLG_NODECAY

msg_reset_zone Наступает до ресета зоны
Если targets[VAR_MSG_RESET_ZONE] == VNUM(zone) то ресет переменной

msg_die_pc Наступает перед вызовом death_trigger
Если targets[VAR_MSG_DIE_PC] == IDNUM(char) то ресет переменной
msg_die_mob Наступает перед вызовом death_trigger
Если targets[VAR_MSG_DIE_MOB] == GET_MOB_VNUM(char) то ресет переменной

msg_extract_obj Наступает перед удалением предмета из памяти.
Если targets[VAR_MSG_EXTRACT_OBJ] == GET_OBJ_VNUM(obj) то ресет переменной
(триггер не вызывается если переменная принадлежит удаляемому объекту)

msg_rent_pc Наступает перед рентой или авторентой чара
Если targets[VAR_MSG_RENT_PC] == IDNUM(char) то ресет переменной

ресет перменной:
1. вызывается VAR.reset()
2. вызывается триггер
3. удаляется из памяти