НОВЕНЬКИМ :: 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");
Удачного написания скриптов!
|