* DF2 - лучший МАД (MUD) рунета, он-лайн игра в стиле кибер-панк (by GrayMage) * ПОИСК   
 Реклама на ДФ2
 Новости
 | 
 История
 | 
 Новеньким
 | 
 МУД-Жизнь
 | 
 Инфо
 | 
 Файлы
 | 
 Поиск
 | 
 Форум
НОВЕНЬКИМ :: JS

Вам надоело дикое количество триггеров в клиенте? Вам не хватает стандартных операторов солидных языков программирования для написания Ваших скриптов? Тогда эта статья для Вас. В ней я постараюсь рассказать о работе JMC с различными интерпретаторами. Какой язык выбрать? Самое простое - JavaScript, ибо он уже установлен, и не придется что-то докачивать.

Сначала проведем некоторую подготовительную работу. У JMC есть одна плохая особенность - если ее распаковать из zip-архива (без installer'a), то она не устанавливает свои объекты, и использование JS накрывается медным тазом, поэтому для начала проверим, все ли у нас работает. Идем в Options->Options...->Scripting, в "Script language" выбираем "JScript", ставим галку на "Allow debug", тыкаем "OK". Теперь самая простенькая программка на JS:

#script jmc.showme("It works!", "light red");

Работает? Если JMC выполнила недопустимую операцию, то я советую скачать installer и установить клиент нормально (предварительно сделайте backup имеющегося конфига). Итак, поехали=)

Работа с JS представляет из себя работу с объектами и их методами (хорошо, если вы знаете эти понятия, если же нет, то объект, в двух словах, - это что-то, обладающее свойствами и методами, где методы - это действия объекта.). Помимо стандартных объектов языка (Math - математические операции, Date - работа со временем и т.п.), у нас появляется дополнительный объект - jmc, именно работе с ним мы и посвятим большую часть времени.

Стоит отменить, что свои скрипты нужно сохранять не в .set файле, а в <PROFILE_NAME>.scr, лежащем в директории Settings.

Для вызова скриптов мы будем пользоваться командой #script, которая позволяет сразу же обработать вводимый текст.

Возвращаемся к нашей первой программке, в ней мы обращаемся к методу showme() объекта jmc. Этот метод позволяет вывести на экран сообщение определенного цвета, если быть точнее, то описание метода:

showme([, color]);
Соответственно, "text" - это выводимый текст, а "color" - цвет, записанный либо в текстовом формате, либо просто номером.

Теперь немного о структуре языка. В основном мы будет разбирать примеры, которые в зависимости от входных параметров выдают разные выходные, поэтому сразу хочу отметить, что текстовые (строковые) параметры передаются всегда в ковычках, числовые - без, если передать числовой параметр в ковычках, он будет воспринят как строковой. Я не хочу останавливаться на синтаксисе JS, потому что статей на эту тему море, если Вы сталкиваетесь с этим языком впервые, сходите на CitForum и почитайте что-нибудь про него.

Теперь давайте уже перейдем к самому интересному - к написанию скриптов. Допустим, нам хочется насладиться фразой "It works!" в разных цветах - не писать же 10 раз #script jmc.showme... Открывает наш .scr файл и вносим туда такие строки:

function test(num) {
  for(i = 1; i < num; i++) {
    jmc.showme("It works!!!", i);
  }
}
Мы завели функцию с названием test и с входным параметром num. Далее мы выводим num раз строку "It works!!!" в различных цветах. По-моему, примитивно просто =) Теперь перезапускаем JMC и вводим:
#script test(5)

Класс? Теперь разберем более полезные примеры. Скажем вам хочется обезопасить себя от введения команды delete. Проще простого!

function OnInput() {
  if(jmc.event == "delete") {
    jmc.showme("Фиг тебе, а не delete!");
    jmc.DropEvent();
  }
}
Теперь надо связать работу функции OnInput() с обработкой текста, введенного с клавиатуры:
#script jmc.RegisterHandler("Input", "OnInput()")
Метод RegisterHandler() как раз позволяет привязать выполнение той или иной функции на событие клиента. DropEvent() позволяет сбросить то или иное действие.

Теперь обратимся к ticker'у. Тикер - это очень удобный таймер обратного отсчета. Его используют, чтобы узнать, сколько секунд до "тика". Например, зная, что до тика 3 секунды, можно прилечь постать и восстановить куда больше маны и хп, чем если бы Вы стояли. К сожалению, тикер всегда сбивается, т.к. не в каждом тике ровно 51 секунда. Иногда больше иногда меньше. Подводить тикер можно командой #tickset на смену погоды, например. Я же рассмотрю более красивый способ, который основан на том, что у Вас пополняется мана. Итак, что мы имеем? У нас есть промпт, в котором всегда показывается текущая мана, этим мы воспользуемся. Далее параметры можно передавать в функцию, и если текущая мана больше предыдущей, то, вероятно, произошел рестор, а значит наступил тик. К сожалению, способ этот не самый идеальный, т.к. мана ресторится не только в тик, но и с помощью специальных заклинаний, но если у Вас таких нет, то алгоритм вполне неплохо работает =)

#action {%1/%2hp %3/%4m %5mv} {#scri manacheck("%%3", "%%4")}

Добавим этот триггер, который будет передавать в функцию manacheck текущую ману и максимальную. Теперь сам скрипт:

var manalast = 0;
function manacheck(manacur, manamax) {
  if (manacur > manalast) {
    jmc.Parse("#tickset");
    jmc.Showme("*** TIME SYNCHRONIZED ***", "light cyan");
    tmp = manacur - manalast;
    tmp = parseInt(tmp * 100 / manamax);
    jmc.Showme(tmp + "% mana restored!", "light cyan");
  }
  manalast = manacur;
} 

Метод Parse() - аналог ввода текста из командной строки. Функция parseInt() - стандартная функция языка, позволяющая округлить число до целого.

Поговорим немного о совсем необязательных, но весьма приятных штуках, которые позволяет написать JS. Допустим у Вас много свободного времени, когда Вам нечем заняться. Можно ведь попробовать развлечь себя и других, ведя какую-нибудь из старых добрых игр =) Например, наперстки. Если мне не изменяет память, то правила такие: берутся 3 наперстка, под один кладется горошина, потом наперсти двигают, а игроки угадывают, под каким же лежит горошина. Сие можно делать руками, но это не наш путь. Напишем простой скриптик, используя генератор случайных чисел, но сначала триггеры.

#var startgame 0

#action {произносит: 'Поехали!'} {#if {$startgame != 1} {#scri start_thimble()}} {games}
#action {/^(\w+) произносит: '1'$/} {#if {$startgame == 1} {#scri check_thimble(1, "$0")}} {games}
#action {/^(\w+) произносит: '2'$/} {#if {$startgame == 1} {#scri check_thimble(2, "$0")}} {games}
#action {/^(\w+) произносит: '3'$/} {#if {$startgame == 1} {#scri check_thimble(3, "$0")}} {games}
#action {дает тебе %0 золотых.} {#scri get_gold(%0)} {games}

Триггеры все примитивные. Чтобы начать игру кто-то должен сказать "Поехали!", также группа триггеров "games" должна быть включена (#group enable games). Теперь сам скрипт.

var readygame = 0;
var thimble = 0;

function start_thimble() {
  if (readygame <= 0) {
    jmc.send("say Дня начала игры дайте мне 20 голда");
  }
  else {
    readygame = readygame - 1;
    jmc.SetVar("startgame", "1");
    randomize_thimble();
  }
}

function get_gold(num) {
  num = parseInt(num);
  if (num >= 20) {
    num = num / 20;
    num = parseInt(num);
    readygame = readygame + num;
    jmc.send("nod");
  }
  else {
    jmc.send("say Not enough :)");
  }
}

function randomize_thimble() {
  var a = 0;
  a = Math.random();
  a = a*100;
  a = parseInt(a);
  a = a%3;

  if (a == 0) {
    jmc.send("emo кладет горошину под первый наперсток.");
    thimble = 0;
  }
  if (a == 1) {
    jmc.send("emo кладет горошину под второй наперсток.");
    thimble = 1;
  }
  if (a == 2) {
    jmc.send("emo кладет горошину под третий наперсток.");
    thimble = 2;
  }

  for (i = 0; i < 10; i++) {
    a = Math.random();
    a = a*1000;
    a = parseInt(a);
    a = a%2;
    
    if (thimble == 0) {
      if (a == 0) {
        thimble = 1;
        jmc.send("emo передвигает все наперстки на один.");
      }
      if (a == 1) {
        thimble = 2;
        jmc.send("emo меняет местами крайние наперстки.");
      }
    }
    else if (thimble == 1) {
      if (a == 0) {
        thimble = 0;
        jmc.send("emo хитрым движением передвигает средний и крайний наперстки.");
      }
      if (a == 1) {
        thimble = 2;
        jmc.send("emo передвигает средний и крайний наперстки.");
      }
    }
    else {
      if (a == 0) {
        thimble = 1;
        jmc.send("emo быстро шевелит руками, передвигая все наперстки на один.");
      }
      if (a == 1) {
        thimble = 0;
        jmc.send("emo меняет местами крайние наперстки.");
      }
    }
  }

  jmc.send("say Где же горошина?");
  a = thimble + 1;
  jmc.showme("Горошина:" + a + " наперсток");
}

function check_thimble(num, name) {
  a = num - 1;
  if (a == thimble) {
    thimble = -1;
    jmc.send("emo поднимает указанный наперсток... Вот она горошинка!");
    jmc.send("say You win, " + name + "!");
    a = Math.random();
    a = a + 1;
    count = 20 * a;
    count = parseInt(count);
    jmc.send("giv " + count + " gold " + name);
    jmc.SetVar("startgame", "0");
  }
  else {
    a = thimble;
    thimble = -1;
    jmc.SetVar("startgame", "0");
    if (a == 0) {
      jmc.send("emo поднимает указанный наперсток... Пусто \:\(");
      jmc.send("emo поднимает первый наперсток... Удача была так близка \:\)");
      jmc.send("say " + name + ", Вы проиграли! Она была под первым наперстком.");
    }
    if (a == 1) {
      jmc.send("emo поднимает указанный наперсток... Пусто \:\(");
      jmc.send("emo поднимает второй наперсток... Удача была так близка \:\)");
      jmc.send("say " + name + ", Вы проиграли! Она была под вторым наперстком.");
    }
    if (a == 2) {
      jmc.send("emo поднимает указанный наперсток... Пусто \:\(");
      jmc.send("emo поднимает третий наперсток... Удача была так близка \:\)");
      jmc.send("say " + name + ", Вы проиграли! Она была под третим наперстком.");
    }
  }
}

Начнем по порядку. readygame - вспомогательная переменная, в ней мы будем хранить количество оплаченных игр (зачем же давать играть на халяву?:)). thimble - переменная, которая хранит значение наперстка, под которым лежит горошина. thimble_start() начинает игру, если есть оплаченные игры, если их нету - она просит денег. get_gold() проверяет достаточно ли Вам дали денег, и если дали более 20, то, при условии, что хватит на пару игр, прибавляет эти самые игры. Мы подошли к самому интересному - к генератору - randomize_thimble() :) Записываем в переменную a случайное число в интервале от 0 до 1 с помощью стандартной функции языка Math.random(), далее у нас три варианта под какой наперсток положить, берем остаток от деления a на 3, т.е. получаем целое число от 0 до 2 - это и будет наш наперсток, куда мы положим горошину. Далее "мешаем" наперстки с помощью того же рандома. У нас есть всегда 2 варианта, куда можно подвинуть, проверяем куда нельзя и двигаем туда, куда можно (хорошая фраза получилась). Так мы поступаем 10 раз, скрипт показывает Вам, под каким наперстком лежит горошина. Ждем ответа от игроков просто say'ем (say 1 или say 2 или say 3). Вступает в работу функция check_thimble(), которая просто проверяет угадал игрок или нет. Если он угадал, ему выдается заслуженная награда в размере от 20 до 40 голда. Все честно:) На мой взгляд, это достаточно объемистый пример, но хорошо иллюстрирующий те или иные возможности языка.

Теперь описание некоторых полезных методов и свойств объекта jmc.

Свойства объекта JMC:

    • IsConnected - Возвращает True, если JMC подключено к серверу, и False, если не подключено.
    • Event - содержит параметр события. Для событий "Incoming" и "Input" содержит данную строку.
    • Profile - возвращает имя текущего профайла.

Методы объекта JMC:

    • [ShowMe (text, [color]) - выводит текст в главное окно JMC.
    • Send(text) - отправляет текст непосредственно в MUD.
    • Parse(command_text) - Проверяет текст (аналог ввода текста в командной строке).

    • Пример:
      jmc.Parse("#alias pk {#var target}");
      jmc.Parse ("kill GrayMage");
      jmc.Parse("#scri MayProc()");
    • Output(text, [color]) - выводит текст в окошко "output".
    • RegisterHandler(EventName, Code) - Метод, позволяющий получать события из JMC.

    • Пример:
      Jmc.RegisterHandler("Incoming", "OnIncoming()");
      Jmc.RegisterHandler("Timer", "OnTimer()");
    • Connect(Address, Port) - подключиться к удаленному серверу.
    • DropEvent() - событие "Incoming" или "Input" типа не будет обработано JMC.
    • Disconnect() - разрывает связь с сервером.
    • SetVar(VarName, Value, bGlobal) - устанавливает переменную, доступную JMC.

    • Пример:
      jmc.SetVar("food", "bread");
      #var food
    • GetVar(VarName,) - возвращает значение переменной JMC.

    • Пример:
      food = jmc.getvar("food");

Удачного написания скриптов!

Пишите мне письма, ваш GrayMage      

Дизайн: Алексей Крючков
Strategy Gamez by GrayMage
Powered by Degtyarev Dmitriy
  Эта руна тейваз перемещает в самый верх страницы!