Руководство пользователя

JASP - новый препроцессор, вносящий в язык Jass 2 компании Blizzard некоторые удобные нововведения. Синтаксис языка Jass 2 очень многословен; уже существует препроцессор cJass by ADOLF, который делает возможным написание Си-подобного кода, здорово сокращая и упрощая процесс составления систем и прочего. Я не пытаюсь изобретать велосипед: да, в cJass реализованно много классных новшеств и плюшек, но все же, как говорится, можно и проще. Скачать новые версии можно на code.google.com и sourceforge.net.



Оглавление


Установка препроцессора 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()
endglobals
JASP предлагает возможность объявление единичной глобальной переменной прямо в коде функции. К примеру, основной блок глобальных переменных и наша функция:
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