Добавлен , опубликован

JASS

Содержание:
Функции — это блоки кода, выполняющие определенные операции.

nothing

Чтоб обозначить, что функция не принимает аргументы или не возвращает значений используется синтаксическая конструкция nothing. Тобишь такого типа как nothing в игре не существует.
function MyFunc takes nothing returns nothing
	//...
endfunction

Аргументы

Указываются в блоке takes:
function MyFunc takes integer a, real b, boolean c returns nothing
	//...
endfunction
Несколько раз встречал подобные вопросы, посему уточню - аргументов может быть произвольное количество. Если их больше одного, то они разделяются запятой.

Возврат значения

Тип возвращаемого значения указывается в блоке returns:
function MyFunc takes nothing returns integer
	return 100500
endfunction

Вызов

main

Изначально игра вызывает функцию main из которой уже будут вызваны другие функции. Функция main должна ничего не принимать и ничего не возвращать. Все остальные функции так или иначе будут вызваны вследствие вызова функции main. Существует ещё функция config, вызываемая в лобби, но принцип остаётся прежним.
Важно, что могут быть вызваны только те функции, которые по коду выше функции из которой происходит вызов. Особо гениальные вспомнят про ExecuteFunc, но про это будет ниже.

call

Используется для вызова функции напрямую. Для вызова функции как выражения этот оператор опускается.
function a takes integer b, integer c returns integer
	return b + c
endfunction

function main takes nothing returns nothing
	call a(1,  a(2, 3))
endfunction

Рекурсия

В данном контексте это вызов функции из самой себя и она прекрасно работает:
function a takes integer b returns integer
	if b < 0 then
		return b
	endif
	return a(b - 1)
endfunction

function main takes nothing returns nothing
	call a(10)
endfunction

native

Они же нативки - функции, код которых не являются частью скрипта, а вшит в движок игры. Полный список эти функций можно найти в файлах common.j и common.ai.

common.ai

Файл с дополнительными функциями, которые по умолчанию отключены. Для их включения необходимо добавить их сигнатуру до объявления первой функции в war3map.j:
//...
endglobals 

native UnitAlive takes unit id returns boolean
native GetUnitGoldCost takes integer unitid returns integer
native GetUnitWoodCost takes integer unitid returns integer

//...
При использовании VJASS эти объявления автоматически переносятся в нужное место.

ExecuteFunc

native ExecuteFunc takes string funcName returns nothing
Функция, позволяющая вызвать другую функцию по её имени. Используется костылеписателями для {кавычка}оптимизации{кавычка} своего говнокода. Не используйте её, если не хотите преисполниться в своём познании потоков и прочей никому не нужной {цензура}.

ExecuteCode

native ExecuteCode takes code c returns nothing
Если вы уже перешли на UjAPI но ещё не перешли на AngelScript то это единственный адекватный способ передать функцию аргументом. Передаваемая функция по традиции должна ничего не принимать и ничего не возвращатть.
function a takes code b returns nothing
	call ExecuteCode(b)
endfunction

function c takes nothing returns nothing
	//...
endfunction

function main takes nothing returns nothing
	call a(function c)
endfunction

null

Как сказано в статье про типы, null это специально обученный ноль. Но ведёт он себя не вполне как ноль, так что будте с ним поаккуратней и чаще проверяйтесь, если не уверены. Ибо во многих нативках нет проверок и случайно переданный null вместо, к примеру, юнита может привнести многие печали.

`
ОЖИДАНИЕ РЕКЛАМЫ...
0
37
3 недели назад
0
Функция, позволяющая вызвать другую функцию по её имени. Используется костылеписателями для {кавычка}оптимизации{кавычка} своего говнокода. Не используйте её, если не хотите преисполниться в своём познании потоков и прочей никому не нужной {цензура}.
А разделять поток как будем?
Ответы (5)
0
29
3 недели назад
0
А разделять поток как будем?
Что есть поток и зачем его разделять?
0
37
3 недели назад
0
0
20
3 недели назад
Отредактирован Unryze
0
ScorpioT1000, ExecuteCode уже это выполняет. Да и на ужапи есть вот что:
native IsOperationLimitEnabled							takes nothing returns boolean
native EnableOperationLimit								takes boolean enable returns nothing
native GetOperationLimit								takes nothing returns integer
native SetOperationLimit								takes integer opLimit returns nothing
Либо ставим лимит выше в 10 или выше раз или просто его полностью снимаем и забиваем на все проблемы.
0
37
3 недели назад
0
Unryze, вроде она медленней, нет? В соседней теме тестировали
0
20
3 недели назад
0
ScorpioT1000, ExecuteCode не медленнее, ибо не нужно лишний раз искать function id по имени. Ну и ExecuteFuncEx тоже быстрее ExecuteFunc, опять же, решать выдуманную проблему костылём < снять ОП лимит и не мучаться.
0
18
3 недели назад
0
Есть ещё GetUnitBuildTime из common ai, она тоже рабочая, выдаёт время строительства юнита/здания
И GetBuilding - выдаёт последнее построенное или созданное триггерно здание
Ответы (2)
0
29
3 недели назад
0
EugeAl, это статья не про common.ai. Кому нужно, тот сам его спокойно откроет и поглядит на функции.
0
18
3 недели назад
0
Файл с дополнительными функциями, которые по умолчанию отключены. Для их включения необходимо добавить их сигнатуру после блока globals в war3map.j:
endglobals 

native UnitAlive takes unit id returns boolean
native GetUnitGoldCost takes integer unitid returns integer
native GetUnitWoodCost takes integer unitid returns integer
А это что? я в дополнение к Этому написал.
0
1
3 недели назад
0
Действительно, можно многому научится
Чтобы оставить комментарий, пожалуйста, войдите на сайт.