JASS (JASS)
JASS | |
---|---|
Класс языка | |
Тип исполнения | интерпретируемый |
Появился в | 2001 |
Автор | Blizzard Entertainment |
Система типов | статическая |
Диалекты | vJASS, cJASS, ZINC |
JASS (англ. Just Another Scripting Syntax) — событийно-ориентированный скриптовый язык программирования, созданный компанией Blizzard Entertainment. Используется в играх, таких как Warcraft 3 и 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). С помощью этой программы можно создавать шаблоны для триггеров, функций и оптимизировать код. Кроме того, он имеет подсветку и встроенную проверку синтаксиса, позволяющую «на лету» протестировать скрипт на наличие ошибок. Также сообществом созданы расширения для популярных IDE, например Visual Studio Code.
Среди модостроителей 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. (Однако существует способ добавления собственных 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!") }
То же, но на ZINC:
function 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 или Варкрафта.[что?]
- Использованиe memhack, который позволяет исполнять произвольный код на компьютере игрока.
Ссылки
[править | править код]- Страница игры WarCraft III на сайте разработчика
- XGM.guru — русскоязычный портал, посвященный разработке и модификации игр, в частности по продуктам компании Blizzard
- Статья «Осваиваем JASS», в которой подробно описаны многие нюансы языка
- Типы данных Warcraft 3 — описание всех действующих типов данных, используемых интерпретатором
- Warcraft 3 Download Area (англ.) — база ресурсов, карт и статей для модмейкинга в WarCraft III (международное сообщество создателей карт)
- WC3Campaigns (англ.) — крупный англоязычный сайт JASS-направленности
- JASS Tools (англ.) — содержит неофициальное руководство по языку JASS и анализатор кода.