АрдаАрда


Новости

Арда

Карта мира

Кладезь знаний

Библиотека

Творцам

Беседы у огня

Бессмертные

На распутьи

Фото

Кто есть кто



Алиасы. Продвинутые возможности.

Алиасы в TinTin были бы слишком примитивны, если бы представляли собой простую макрозамену набора фиксированных команд одним словом.

Параметры алиасов.

Одной из могучих возможностей алиаса является использование входных параметров. Если командную строку, начинающуюся именем алиаса, продолжить, то слова (разделенные пробелами наборы букв), следующие за именем алиаса в строке, могут рассматриваться как его параметры. Первое слово за именем алиаса является первым параметром, второе слово - вторым, и так далее. Обращение к параметру может осуществляться по его номеру, которому предшествует знак '%' (в настройках zMUD по умолчанию). К примеру, атакующий алиас лекаря.

alias harm {cast harm %1}

При вводе harm drunk на сервер будет отправлена команда cast harm drunk. Или, к примеру, алиас с двумя параметрами, предназначенный для ремонта вещей у кузнеца. Как известно, некоторые вещи могут надеваться на несколько слотов... К примеру - легкий щит.

#alias ремонт { remove %1 // Снимаем вещь repair %1 // Отдаем вещь кузнецу на ремонт wear %1 %2 // Надеваем вещь на слот }

В том случае, если дать команду ремонт лампа, второй параметр будет пустым, и на сервер соответственно будут отправлены команды remove лампа; repair лампа;wear лампа, однако, в случае команды ремонт щит спину получим remove щит; repair щит; wear щит спину. Что предпринять, если команда remove щит снимает не легкий щит со спины, а основной, к примеру, щит, окованный серебром? Если дать команду ремонт легкий щит спину, то первым параметром будет легкий, а вторым - щит, и опять команда будет неправильной. Для того, чтобы передать в алиас параметр, состоящий больше, чем из одного слова, необходимо указывать этот параметр в кавычках: ремонт "легкий щит" спину.

Многие игроки допускают классическую ошибку в использовании алиаса, эффект которой, так нелюбимый Аспером, выражается в наличии пробела перед фразой при расцветке каналов. Вот пример ошибочного алиаса, в котором производится попытка раскрасить канал OOC в красный цвет.

#alias мечтать {ooc &R}

Посмотрим, что происходит, когда игрок дает команду мечтать о тике. MUD-клиент находит в начале команды алиас мечтать, разворачивает его (заменяет на ooc &R), и продолжает проверять строку... остаток - ' о тике' остается неизменным. Обратите внимание, что перед буквой 'о' в фразе есть пробел, и между командой MUD ooc и цветом &R также есть пробел. Отсюда и получается лишний пробел ooc &R о тике. Правильным вариантом будет такой.

#alias мечтать {ooc &R%1}

Таким образом, про вводе мечтать о тике первым параметром будет буква 'о', а пробел между именем алиаса и первым параметром не будет отправлен ooc &Rо тике. Правда, при таком раскладе, сколько бы пробелов ни поставить перед буквой 'о', их все равно не будет в начале строки. Еще один минус такого подхода - после ваших высказываний в канале цвет следующей строки, полученной всеми игроками, останется красным, что, согласитесь, не может не злить. Попытка решения, обрамляющая единственный параметр цветами, выглядит простой в реализации, но весьма сложной при использовании.

#alias мечтать {ooc &R%1&w}

Дело в том, что при использовании такого алиаса придется всю фразу заключать в кавычки, иначе красным цветом выделится только первое слово. Естественно, что передать кавычки в этой фразе будет еще труднее - для этого придется каждую кавычку предварять знаком тильды:  мечтать "о слове ~"в кавычках~"". Однако, даже эта проблема отлично обходима, но об этом позже, в рассказе про триггеры.

Ветвления по условию.

Замечательное свойство алиаса - возможность выполнять разные действия в зависимости от значений параметров или других внешних условий. Для ветвления выполнения используется конструкция #if.

#if (<условие>) {<действия_истина>} [{<действия_ложь>}]

Условие - это любая логическая величина. Знакомые с языком C тут же увидят родную конструкцию. Для остальных поясню. Условие считается истинным, если значение, вычисленное в качестве условия является непустым или не равно нулю. То есть, это может быть либо значение параметра алиаса или переменной, результат вычисления встроенной функции или логического оператора. Логические операторы в Tintin, как и в C, возвращают числовое значение. Если оператор выполняется, значение отлично от нуля, если же нет - это ноль. Набор команд действия_истина будет выполнен в том случае, если условие истинно, необязательный набор команд действие_ложь будет выполнен только тогда, когда условие считается ложным. В случае, если условие не выполнено, а набор команд действие_ложь опущен, не будет выполнено никаких команд.

В zMUD есть следующие логические операторы (большинство из которых работает и в других МАД-клиентах).

// Операторы сравнения числовых значений a=b - параметр а равен параметру b a!=b - параметр a не равен параметру b a<>b - параметр a не равен параметру b (только zMUD) a<b - параметр a меньше параметра b a<=b - параметр a меньше или равен параметру b a>b - параметр a больше параметра b a>=b - параметр a больше или равен параметра b // Оператор сравнения по маске (zMUD) a=~b - строковый параметр a удовлетворяет строковой маске b (см. триггеры) // Оператор отрицания not a // Логические операторы объединения условий a or b, a | b - логическое или, истина, если выполняется либо a, либо b, либо и а, и b a and b, a & b - логическое и, истина, если выполняются одновременно и a, и b. a xor b - логическое исключение... истина, если выполняется только одно, либо a, либо b.

Операторы сравнения не стоит использовать для строковых значений. Для этого лучше использовать встроенные функции zMUD. В приведенных описаниях логических операторов a и b - это либо непосредственные значения, либо результаты каких-то вычислений. К примеру, c+d. В случае, если при вычислении условия используются арифметические операторы (+,-,*,/), выражения с операторами следует заключать в скобки.

#if ((1+2)<=3) and ((3+4)<=7)) {....}

Можно объединять последовательно несколько логических операторов объединения условий, однако, стоит помнить, что операторы вычисляются не в порядке следования, а с учетом приоритетов. В первую очередь вычисляются операторы NOT, пары XOR, затем AND, и лишь затем OR.

Представим себе шуточный алиас, написанный неким орком, для формирования поздравления (на самом деле, использование алиасов, а, паче чаяния, триггеров, для поздравлений - не самая нравственная вещь).

!a - не a, истина, если a не выполняется, ложь, если a выполняется #alias пздр { #if ((%begins(%1,'Альба')) or (%begins(%1,'Имри'))) { // Таких орки поздравлять не любят chat Орки все равно победят, фиг тебе, %1! } { #if ((%begins(%1,'Загр')) or (%begins(%1,'Гродер'))) { // Таких орки поздравляют особо chat Орки, Хой! Давай, %1! } { // Остальные ни рыба, ни мясо chat Gratz, %1 } } }

Теперь достаточно набрать пздр Имя, и получим соответствующее сообщение. Здесь для сравнения строковых параметров используется встроенная функция zMUD %begins(a,b), которая возвращает истину только в том случае, если строка a начинается с подстроки b.

Циклическое повторение действия.

В алиасах zMUD (не уверена насчет классического Tintin) есть возможность повторить одно и то же действие несколько раз.

loop [<нижний_предел>,]<верхний_предел> {<действия>}

Необязательный числовой параметр нижний_предел определяет, с какого значения начнется выполнение цикла.  Числовой параметр верхний_предел - до какого значения он будет выполняться. В случае, если нижний_предел опущен, цикл будет выполняться с нуля. Цикл прекращается, как только значение переменной цикла превосходит верхний предел. Для того, чтобы определить, на какой итерации находится цикл, необходимо воспользоваться встроенной переменной zMUD %i. Простой пример иллюстрирует, как взять все книги из нескольких трупов, валяющихся в комнате (параметром алиасу необходимо указать количество тел в комнате).

alias взятькнигиструпов { #loop 1,%1 { get book %{i}.corpse // Переменная i в фигурных скобках, поскольку это связано с особенностями работы zMUD. // В случае, если %i является параметром функции или другого алиаса, а не нумератором // объекта в Арде, фигурные скобки можно опустить. } } // Результат выполнения алиаса будет выглядеть так взятькнигиструпов 5 get book 1.corpse
get book 2.corpse
get book 3.corpse
get book 4.corpse
get book 5.corpse

Не рекомендуется применять вложенные алиасы с циклами.

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

Ну и теперь несколько общих рекомендаций.

  • Называйте ваши алиасы так, чтобы легко было понять, какие функции выполняет алиас, особенно если он вызывается только из других алиасов, а не из командной строки. Длинное имя алиаса в командной строке можно дописывать по TAB AUTOCOMPLETE (об этом позже).
  • Помните, что алиасы можно назначать горячим клавишам, обработчику таймера, а также употреблять в других алиасах и телах триггеров.
  • Группируйте ваши алиасы по смыслу в классы zMUD.
  • Избегайте повторяющихся имен алиасов в разных классах - отследить такую ошибку очень трудно.
  • Не создавайте слишком длинных тел алиасов - с ними трудно работать. Отдавайте предпочтение вызову одних алиасов из других с передачей параметров.

В оглавление