Руководство пользователя
JASP - новый препроцессор, вносящий в язык Jass 2 компании Blizzard некоторые удобные нововведения. Синтаксис языка Jass 2 очень многословен; уже существует препроцессор cJass by ADOLF, который делает возможным написание Си-подобного кода, здорово сокращая и упрощая процесс составления систем и прочего. Я не пытаюсь изобретать велосипед: да, в cJass реализованно много классных новшеств и плюшек, но все же, как говорится, можно и проще. Скачать новые версии можно на code.google.com и sourceforge.net.
Оглавление
- Установка
- Объявление локальных переменных
- Множественное объявление локальных переменных
- Объявление глобальных переменных
- Множественное объявление глобальных переменных
- Блоки совместимости
- Уничтожение объектов
- Обнуление переменных
- Циклы repeat until
- Нетипизированные переменные
- Благодарности
Установка препроцессора JASP
Скачайте и распакуйте архив jassnewgenpack5d.exe. Далее скачайте самую новую версию препроцессора и распакуйте все файлы в папку JASP. Все, препроцессор установлен, ниже о возможностях.Простое объявление локальных переменых
Объявление локальных переменных на классическом Jass 2 выглядит так:function someFunc takes nothing returns nothing local timer t = CreateTimer() endfunctionВ cJass это выглядело несколько проще:
void someFunc() { timer t = CreateTimer(); //без библиотеки cj_typesEx.j } void someFunc() { timer t = new timer; //с библиотекой cj_typesEx.j }JASP предлагает вам еще более упрощенный вариант объявления переменных:
function someFunc takes nothing returns nothing new timer t endfunctionПосле парсинга это превратится в:
function someFunc takes nothing returns nothing local timer t = CreateTimer() endfunction
Внимание!
Такое объявление переменных возможно только со следующими типами:timer group force region trigger dialog leaderboard multiboard quest texttag camerasetup hashtable
Множественное объявление локальных переменых
JASP предлагает вам возможность множественного объявления локальных переменных. Например, этот код:function someFunc takes nothing returns nothing new timer t, group g, force f, hashtable h endfunctionпревратится в этот:
function someFunc takes nothing returns nothing local timer t = CreateTimer() local group g = CreateGroup() local force f = CreateForce() endfunctionОднако объявление переменных одинакового типа нужно записывать так:
function someFunc takes nothing returns nothing new timer t, timer f, timer c endfunction
Объявление глобальных переменных
В vJass объявление глобальных переменных было возможно только в определенном блоке:globals hashtable hash = InitHashtable() endglobalsJASP предлагает возможность объявление единичной глобальной переменной прямо в коде функции. К примеру, основной блок глобальных переменных и наша функция:
globals //Глобалки от редактора endglobals function someFunc takes nothing returns nothing global hashtable hash = InitHashtable() endfunctionпосле парсинга превратится в
globals //Глобалки от редактора hashtable hash = InitHashtable() endglobals function someFunc takes nothing returns nothing endfunctionТак же доступна возможность короткого объявления переменных некоторого типа с их последующим созданием (как и локальные переменные):
globals //Глобалки от редактора endglobals function someFunc takes nothing returns nothing new global hashtable hash endfunctionпосле парсинга
globals //Глобалки от редактора hashtable hash = InitHashtable() endglobals function someFunc takes nothing returns nothing endfunction
Множественное объявление глобальных переменных
С помощью JASP вы можете объявить несколько глобальных переменных в коде функции или любом месте скрипта:globals //Глобалки от редактора endglobals function someFunc takes nothing returns nothing new global hashtable hash, force Team, timer Timer endfunctionтранслируется в
globals //Глобалки от редактора hashtable hash = InitHashtable() force Team = CreateForce() timer Timer = CreateTimer() endglobals function someFunc takes nothing returns nothing endfunction
Уничтожение объектов
JASP предлагает ва возможность легкого уничтожения следующих объектов:timer group force boolexpr conditionfunc defeatcondition effect filterfunc fogmodifier image itempool leaderboard lightning multiboard quest texttag timerdialog trigger ubersplat unitpool dialog destructable item location rect region unit hashtableДля уничтожения объектов вы должны воспользоваться короткой коммандой free
function someFunc takes nothing returns nothing new timer t //Код функции free t set t = null endfunctionПосле парсинга это превратится в
function someFunc takes nothing returns nothing local timer t = CreateTimer() //Код функции call DestroyTimer(t) set t = null endfunctionТак же возможно множественное уничтожение типов
function someFunc takes nothing returns nothing new timer t, group g //Код функции free t, g set t = null set g = null endfunctionТранслируется в
function someFunc takes nothing returns nothing local timer t = CreateTimer() local group g = CreateGroup() //Код функции call DestroyTimer(t) call DestroyGroup(g) set t = null set g = null endfunction
Обнуление переменных
cJass позволял короткой коммандой flush locals обнулить потенциально утекающие типы внутри одной функции. JASP дает пользователю альтернативный и более короткий вариант стандартного обнуления:function someFunc takes nothing returns nothing new timer t //Код функции free t flush t endfunctionЧто, вполне ожидаемо, превратится в
function someFunc takes nothing returns nothing local timer t = CreateTimer() //Код функции call DestroyTimer(t) set t = null endfunctionИ, как и с функциями new и free, функция flush тоже поддерживает множественные аргументы
function someFunc takes nothing returns nothing new timer t, group g //Код функции free t, g flush t, g endfunctionТранслируется в
function someFunc takes nothing returns nothing local timer t = CreateTimer() local group g = CreateGroup() //Код функции call DestroyTimer(t) call DestroyGroup(g) set t = null set g = null endfunction
repeat until
JASP вводит возможность использования циклов repeat until, которые выполняются пока верно условие. Например:function someFunc takes nothing returns nothing local unit target new group g call GroupEnumUnitsInRange(g, 1024., 1024., 300., null) repeat set target = FirstOfGroup(g) call KillUnit(target) call GroupRemoveUnit(g, target) until (target == null) free g flush g endfunctionтранслируется в
function someFunc takes nothing returns nothing local unit target; local group g = CreateGroup() call GroupEnumUnitsInRange(g, 1024., 1024., 300., null) loop set target = FirstOfGroup(g) call KillUnit(target) call GroupRemoveUnit(g, target) exitwhen (target == null) endloop call DestroyGroup(g) set g = null endfunction
Нетипизированные переменные
Используя JASP вы можете объявлять переменные, не указывая их тип - в зависимости от их значения парсер сам определит их тип. Например:function someFunc takes nothing returns nothing var i = 0 var b = false var r = .15 var s = "test" var i2 = 'Amrf' endfunctionтранслируется в
function someFunc takes nothing returns nothing local integer i = 0 local boolean b = false local real r = .15 local string s = "test" local integer i2 = 'Amrf' endfunctionПарсер способен узнавать значения стандартных функций и констант, а так же анализировать функции и методы (если вы используете vJass)пользователя:
function someFunc takes nothing returns nothing var caster = GetTriggerUnit() var dummy = CreateUnit(...) var state = UNIT_STATE_LIFE endfunctionчто ожидаемо превратится в
function someFunc takes nothing returns nothing local unit caster = GetTriggerUnit() local unit dummy = CreateUnit(...) local integer state = UNIT_STATE_LIFE endfunction
Так же JASP дает пользователю возможность объявить переменную без значения, но с условием, что в пределах данной функции переменной будет дано значение. Немного запутанно, поэтому дам пример:
function someFunc takes nothing returns nothing var target call GroupEnumUnitsInRange(temp, x, y, 300. null) repeat set target = FirstOfGroup(temp) //Actions call GroupRemoveUnit(temp, target) until target == null endfunctionчто ожидаемо превратится в
function someFunc takes nothing returns nothing local unit target call GroupEnumUnitsInRange(temp, x, y, 300. null) loop set target = FirstOfGroup(temp) //Actions call GroupRemoveUnit(temp, target) exitwhen (target == null) endloop endfunction
При помощи JASP вы можете перечислить переменные с их значениями, парсер услужливо превратит их в переменные нужного типа (не работает с переменными, значения которых - функции или методы). Пример:
function someFunc takes nothing returns nothing var i = 0, r = .15, s = "test", b = false //Так можно var e = AddSpecialEffect(...), u = CreateUnit(...) //Так нельзя endfunctionЕсли вы дадите переменной значение null, ей автоматически присвоится тип handle
Благодарности
Simplar aka [DUOS] aka bowser499 - научил меня Jass, давал ценные советы и поддерживал во всех ситуациях. Родная душа, словомSirNikolas - дал кучу полезной информации, советов. Да и просто отличный человек и друг :3
Borland Company - за Borland Delphi 2005, на котором и написан JASP
Shadow Flare - за библиотеку SFMpq