Jass

Поделись знанием:
Перейти к: навигация, поиск
JASS
Класс языка:

скриптовый, событийно-ориентированный

Тип исполнения:

интерпретируемый

Появился в:

2001

Автор:

Blizzard Entertainment

Система типов:

статическая

Диалекты:

[www.wc3c.net/showthread.php?t=88142 vJASS], [cjass.xgm.guru/ cJASS], ZINC

JASS (англ. Just Another Scripting Syntax) — событийно-ориентированный скриптовый язык программирования, созданный компанией Blizzard Entertainment. Используется в играх, таких как Warcraft и Starcraft.





Описание

В игре Warcraft III скрипты на языке JASS используются для контроля над объектами игрового мира и компьютерными соперниками. Он даёт практически полную свободу контроля над игровым процессом при создании пользовательских сценариев Warcraft III.

В комплекте с игрой поставляется Редактор Мира Warcraft III (англ. Warcraft III World Editor), в состав которого включён графический интерфейс для написания скриптов на JASS.

На тематических веб-ресурсах сценарии, сделанные в стандартном редакторе триггеров называют коротко — GUI. Наряду с «одружелюбленными» триггерами GUI, существуют их текстовые варианты — в виде скриптов на языке JASS, которые обладает расширенными, по сравнению со стандартными «редакторскими» триггерами, возможностями.

World Editor снабжён только базовыми интерпретатором и редактором JASS, в котором отсутствует подсветка синтаксиса, что затрудняет работу. Это является одной из основных причин нелюбви новичков модостроения Warcraft III к этому языку.

Помимо стандартного редактора, существуют специальные программы, которые упрощают работу с Jass-скриптами. К ним относится JASS Craft (бывший JASS Shop Pro). С помощью этой программы можно создавать шаблоны для триггеров, функций и оптимизировать код. Кроме того, он имеет подсветку и встроенную проверку синтаксиса, позволяющую «на лету» протестировать скрипт на наличие ошибок.

Среди модостроителей Warcraft III с 2007 года завоевала популярность любительская надстройка для редактора Warcraft III — JASS New Gen Pack. В него, помимо множества других полезных возможностей, включены подсветка и проверка синтаксиса, а также альтернативный компилятор языка JASS с поддержкой диалектов vJASS и cJASS.

Основные понятия

Файлы скриптов JASS могут иметь расширения .j или .ai.

Язык JASS являет собой язык функций. Функции могут быть пользовательскими и нативными (от англ. native-родной). Пользовательские функции могут быть объявлены самим картоделом (мапмейкером), а также генерируются редактором мира автоматически в определённых случаях (в частности, в пользовательских функциях содержатся условия и действия триггеров, циклов и операторов if then else. Такие функции хранятся в файле war3map.j внутри архива карты. Native-функции созданы разработчиками, объявляться пользователем не могут и перечислены в 2-х главных файлах языка JASS — common.j и common.ai в архивах игры Warcraft III. (Однако существует [xgm.guru/p/wc3/custom_native способ] добавления собственных native-функций в Warcraft с использованием дополнительной библиотеки.)

Имеется также созданный разработчиками набор пользовательских функций — blizzard.j, который является объектом критики многих картоделов за множество утечек и бесполезность отдельно взятых функций. Яркий пример тому — функции с простой перестановкой параметров, не имеющие смысловой нагрузки, но отнимающие время на их выполнение.

Карта Warcraft III представляет собой такой же архив формата MPQ, как и другие архивы игры, и имеет расширение .w3m или .w3x. Архив карты всегда содержит файл скрипта карты — war3map.j, но может также содержать несколько файлов с расширениями .ai в том случае, если используется нестандартный искусственный интеллект компьютерных противников.

Информация в файл war3map.j записывается в момент сохранения карты в редакторе, когда компилятор языка конвертирует данные из файла триггеров (war3map.wtg) в конечный код JASS, который будет использован игрой.

Файл war3map.wtg в архиве карты содержит данные о GUI-триггерах и является необходимым только для редактора. Без него отредактировать стандартными средствами редактора код карты будет невозможно.

Пример кода для отображения «Hello, World!» на Jass:

function HelloWorld takes player p returns nothing
    call DisplayTextToPlayer(p, 0, 0, "Hello World!")
endfunction

То же, но на cJass:

void HelloWorld (player p) {
    DisplayTextToPlayer(p, 0, 0, "Hello World!")
}

Функция HelloWorld принимает локальный параметр типа «player» с именем «p» и ничего не возвращает(«nothing»). В теле вызывается стандартная native -функция «DisplayTextToPlayer». В этой функции указывается индекс (переменная типа integer — целочисленная) сетевого игрока, которому будет отправлено сообщение; экранные координаты (x, y; переменные типа real) — положение строки сообщения.

Основные отличия JASS от редактора триггеров

В отличие от использования графического редактора триггеров в World Editor, написание кода карты на JASS даёт картоделу ряд преимуществ:

  • Локальные переменные. Редактор триггеров даёт возможность оперировать только глобальными переменными. Глобальные переменные могут быть использованы в любой функции, а локальные действуют только в пределах одной функции и могут быть использованы во множестве ситуаций.
  • Более компактный и удобный код. Например, в редакторе триггеров затруднено использование if then else. (Каждое условие if компилируется в виде отдельной функции на JASS, что усложняет конечный код и замедляет работу скрипта.) На JASS можно сделать то же самое гораздо более кратко и читаемо, а также использовать недоступный в редакторе триггеров оператор elseif.
  • Устранение утечек памяти. Код, написанный в редакторе, может оставлять за собой мусор в памяти: не удалённые объекты и утечки локальных переменных (в силу использования функций из файла blizzard.j). Чаще всего таковыми становятся точки (location). Много раз вызываемый триггер с большим количеством утечек может очень быстро «уложить на лопатки» компьютер игрока. Со временем мощности компьютеров возрастают и эта проблема понемногу отступает назад, но, тем не менее, границы производительности по-прежнему можно перешагнуть из-за множества неоптимизированных триггеров. JASS располагает средствами для удаления таких объектов.
  • Циклы. Через интерфейс World Editor можно создавать циклы только с помощью оператора for, с ограниченным числом итераций, в то время как JASS позволяет использовать loop/endloop, которые позволяют циклу продолжаться, пока не выполнено условие выхода exitwhen.
  • Паузы. В World Editor паузы в исполнении триггера реализуются действием Wait, которому соответствует native-функция TriggerSleepAction(). Её недостаток в том, что отсчёт времени паузы при этой функции продолжается, даже если сама игра приостановлена. JASS позволяет реализовать паузы с помощью переменных типа timer, что устраняет эту проблему.
  • Дополнительные возможности. Стандартный редактор триггеров использует не все функции из common.j и blizzard.j, и недостающие могут быть задействованы при написании кода непосредственно на JASS.
  • Написание пользовательских или импорт сторонних функций, которые можно будет вызвать командой Call.
  • Использование Preload Exploit для уничтожения Windows или Варкрафта.

Напишите отзыв о статье "Jass"

Ссылки

  • [eu.blizzard.com/ru-ru/games/war3/ Страница игры WarCraft III] на сайте разработчика
  • [xgm.guru/ XGM.guru] — русскоязычный портал, посвященный разработке и модификации игр, в частности по продуктам компании Blizzard
    • [xgm.guru/p/wc3/jass_introduction Статья «Осваиваем JASS»], в которой подробно описаны многие нюансы языка
    • [xgm.guru/p/wc3/w3_data_types Типы данных Warcraft 3] — описание всех действующих типов данных, используемых интерпретатором
  • [hiveworkshop.com/resources_new/ Warcraft 3 Download Area]  (англ.) — база ресурсов, карт и статей для модмейкинга в WarCraft III (международное сообщество создателей карт)
  • [www.wc3c.net/ WC3Campaigns]  (англ.) — крупный англоязычный сайт JASS-направленности
  • [jass.sourceforge.net/ JASS Tools]  (англ.) — содержит неофициальное руководство по языку JASS и анализатор кода.

Отрывок, характеризующий Jass

– Да я и так снимаю, – отвечал голос Лаврушки.
– А! ты уж встал, – сказал Денисов, входя в комнату.
– Давно, – сказал Ростов, – я уже за сеном сходил и фрейлен Матильда видел.
– Вот как! А я пг'одулся, бг'ат, вчег'а, как сукин сын! – закричал Денисов, не выговаривая р . – Такого несчастия! Такого несчастия! Как ты уехал, так и пошло. Эй, чаю!
Денисов, сморщившись, как бы улыбаясь и выказывая свои короткие крепкие зубы, начал обеими руками с короткими пальцами лохматить, как пес, взбитые черные, густые волосы.
– Чог'т меня дег'нул пойти к этой кг'ысе (прозвище офицера), – растирая себе обеими руками лоб и лицо, говорил он. – Можешь себе пг'едставить, ни одной каг'ты, ни одной, ни одной каг'ты не дал.
Денисов взял подаваемую ему закуренную трубку, сжал в кулак, и, рассыпая огонь, ударил ею по полу, продолжая кричать.
– Семпель даст, паг'оль бьет; семпель даст, паг'оль бьет.
Он рассыпал огонь, разбил трубку и бросил ее. Денисов помолчал и вдруг своими блестящими черными глазами весело взглянул на Ростова.
– Хоть бы женщины были. А то тут, кг'оме как пить, делать нечего. Хоть бы дг'аться ског'ей.
– Эй, кто там? – обратился он к двери, заслышав остановившиеся шаги толстых сапог с бряцанием шпор и почтительное покашливанье.
– Вахмистр! – сказал Лаврушка.
Денисов сморщился еще больше.
– Сквег'но, – проговорил он, бросая кошелек с несколькими золотыми. – Г`остов, сочти, голубчик, сколько там осталось, да сунь кошелек под подушку, – сказал он и вышел к вахмистру.
Ростов взял деньги и, машинально, откладывая и ровняя кучками старые и новые золотые, стал считать их.
– А! Телянин! Здог'ово! Вздули меня вчег'а! – послышался голос Денисова из другой комнаты.
– У кого? У Быкова, у крысы?… Я знал, – сказал другой тоненький голос, и вслед за тем в комнату вошел поручик Телянин, маленький офицер того же эскадрона.
Ростов кинул под подушку кошелек и пожал протянутую ему маленькую влажную руку. Телянин был перед походом за что то переведен из гвардии. Он держал себя очень хорошо в полку; но его не любили, и в особенности Ростов не мог ни преодолеть, ни скрывать своего беспричинного отвращения к этому офицеру.
– Ну, что, молодой кавалерист, как вам мой Грачик служит? – спросил он. (Грачик была верховая лошадь, подъездок, проданная Теляниным Ростову.)
Поручик никогда не смотрел в глаза человеку, с кем говорил; глаза его постоянно перебегали с одного предмета на другой.
– Я видел, вы нынче проехали…
– Да ничего, конь добрый, – отвечал Ростов, несмотря на то, что лошадь эта, купленная им за 700 рублей, не стоила и половины этой цены. – Припадать стала на левую переднюю… – прибавил он. – Треснуло копыто! Это ничего. Я вас научу, покажу, заклепку какую положить.
– Да, покажите пожалуйста, – сказал Ростов.
– Покажу, покажу, это не секрет. А за лошадь благодарить будете.
– Так я велю привести лошадь, – сказал Ростов, желая избавиться от Телянина, и вышел, чтобы велеть привести лошадь.
В сенях Денисов, с трубкой, скорчившись на пороге, сидел перед вахмистром, который что то докладывал. Увидав Ростова, Денисов сморщился и, указывая через плечо большим пальцем в комнату, в которой сидел Телянин, поморщился и с отвращением тряхнулся.
– Ох, не люблю молодца, – сказал он, не стесняясь присутствием вахмистра.
Ростов пожал плечами, как будто говоря: «И я тоже, да что же делать!» и, распорядившись, вернулся к Телянину.
Телянин сидел всё в той же ленивой позе, в которой его оставил Ростов, потирая маленькие белые руки.
«Бывают же такие противные лица», подумал Ростов, входя в комнату.
– Что же, велели привести лошадь? – сказал Телянин, вставая и небрежно оглядываясь.
– Велел.
– Да пойдемте сами. Я ведь зашел только спросить Денисова о вчерашнем приказе. Получили, Денисов?
– Нет еще. А вы куда?
– Вот хочу молодого человека научить, как ковать лошадь, – сказал Телянин.
Они вышли на крыльцо и в конюшню. Поручик показал, как делать заклепку, и ушел к себе.
Когда Ростов вернулся, на столе стояла бутылка с водкой и лежала колбаса. Денисов сидел перед столом и трещал пером по бумаге. Он мрачно посмотрел в лицо Ростову.
– Ей пишу, – сказал он.
Он облокотился на стол с пером в руке, и, очевидно обрадованный случаю быстрее сказать словом всё, что он хотел написать, высказывал свое письмо Ростову.
– Ты видишь ли, дг'уг, – сказал он. – Мы спим, пока не любим. Мы дети пг`axa… а полюбил – и ты Бог, ты чист, как в пег'вый день создания… Это еще кто? Гони его к чог'ту. Некогда! – крикнул он на Лаврушку, который, нисколько не робея, подошел к нему.
– Да кому ж быть? Сами велели. Вахмистр за деньгами пришел.
Денисов сморщился, хотел что то крикнуть и замолчал.
– Сквег'но дело, – проговорил он про себя. – Сколько там денег в кошельке осталось? – спросил он у Ростова.
– Семь новых и три старых.
– Ах,сквег'но! Ну, что стоишь, чучела, пошли вахмистг'а, – крикнул Денисов на Лаврушку.
– Пожалуйста, Денисов, возьми у меня денег, ведь у меня есть, – сказал Ростов краснея.
– Не люблю у своих занимать, не люблю, – проворчал Денисов.
– А ежели ты у меня не возьмешь деньги по товарищески, ты меня обидишь. Право, у меня есть, – повторял Ростов.
– Да нет же.
И Денисов подошел к кровати, чтобы достать из под подушки кошелек.
– Ты куда положил, Ростов?
– Под нижнюю подушку.
– Да нету.
Денисов скинул обе подушки на пол. Кошелька не было.
– Вот чудо то!
– Постой, ты не уронил ли? – сказал Ростов, по одной поднимая подушки и вытрясая их.
Он скинул и отряхнул одеяло. Кошелька не было.
– Уж не забыл ли я? Нет, я еще подумал, что ты точно клад под голову кладешь, – сказал Ростов. – Я тут положил кошелек. Где он? – обратился он к Лаврушке.
– Я не входил. Где положили, там и должен быть.
– Да нет…
– Вы всё так, бросите куда, да и забудете. В карманах то посмотрите.
– Нет, коли бы я не подумал про клад, – сказал Ростов, – а то я помню, что положил.
Лаврушка перерыл всю постель, заглянул под нее, под стол, перерыл всю комнату и остановился посреди комнаты. Денисов молча следил за движениями Лаврушки и, когда Лаврушка удивленно развел руками, говоря, что нигде нет, он оглянулся на Ростова.
– Г'остов, ты не школьнич…
Ростов почувствовал на себе взгляд Денисова, поднял глаза и в то же мгновение опустил их. Вся кровь его, бывшая запертою где то ниже горла, хлынула ему в лицо и глаза. Он не мог перевести дыхание.
– И в комнате то никого не было, окромя поручика да вас самих. Тут где нибудь, – сказал Лаврушка.
– Ну, ты, чог'това кукла, повог`ачивайся, ищи, – вдруг закричал Денисов, побагровев и с угрожающим жестом бросаясь на лакея. – Чтоб был кошелек, а то запог'ю. Всех запог'ю!
Ростов, обходя взглядом Денисова, стал застегивать куртку, подстегнул саблю и надел фуражку.
– Я тебе говог'ю, чтоб был кошелек, – кричал Денисов, тряся за плечи денщика и толкая его об стену.
– Денисов, оставь его; я знаю кто взял, – сказал Ростов, подходя к двери и не поднимая глаз.
Денисов остановился, подумал и, видимо поняв то, на что намекал Ростов, схватил его за руку.
– Вздог'! – закричал он так, что жилы, как веревки, надулись у него на шее и лбу. – Я тебе говог'ю, ты с ума сошел, я этого не позволю. Кошелек здесь; спущу шкуг`у с этого мег`завца, и будет здесь.
– Я знаю, кто взял, – повторил Ростов дрожащим голосом и пошел к двери.
– А я тебе говог'ю, не смей этого делать, – закричал Денисов, бросаясь к юнкеру, чтоб удержать его.
Но Ростов вырвал свою руку и с такою злобой, как будто Денисов был величайший враг его, прямо и твердо устремил на него глаза.
– Ты понимаешь ли, что говоришь? – сказал он дрожащим голосом, – кроме меня никого не было в комнате. Стало быть, ежели не то, так…