Ресивер FU (функция)
!!FU#:XXXX;
- ресивер функции – передаёт контроль ERM-коду функции.
# = 1..30000
Используется для создания специальной секции кода, к которой можно получить доступ из нескольких мест, и использовать повторно.
Функции вызываются ресивером FU. А триггер функции (!?FU) определяет начало кода функции.
Комментарии (показать)
Если вы вызываете функцию инструкцией, функция должна быть описана ДО инструкции. Например, если вы хотите
вызвать функцию FU100 в начале карты, вы можете поместить её как инструкцию
!#FU100:P;
но она не будет работать, если функция не была описана ранее. Так что триггер функции (и её код) должны быть первыми.
Пример выше работает отлично, но если
!#FU100:P; поставить на первое место
(прямо после ZVSE), она не будет работать. Вы не получите сообщения об ошибке, но функция не будет выполняться.
Вы можете использовать переменные в ресивере функции. Так, вы можете, к примеру, использовать такой код:
!!FUv10:P; и функция под номером, равном числу, записанному
сейчас в v10,
начнёт работу (если триггер этой функции существует).
Примеры функций (показать)
Пример 1
Пример 2
В этом примере функция будет иметь номер 5 и заработает, только если триггер !?FU5 существует.
Каждая функция имеет 100 уникальных переменных (y1..y100). Вы можете устанавливать, проверять и получать эти переменные.
Каждый вызов создаёт индивидуальные переменные, которые после выполнения функции опять обратятся в нули.
Так что все операции над локальными переменными могут иметь место только в теле функции.
Пример 3
Здесь, если вы вызовете функцию с параметрами, переменные x1…x16 в теле функции будут иметь соответственные значения.
Переменные y1..y100 служат локальными переменными. Вы можете использовать их внутри функции для любых нужд.
Все функции имеют свои собственные уникальные локальные переменные, даже если вы вызываете новые функции.
Когда функция оканчивается, y-переменные сбрасываются на 0.
Вы можете добавлять код (ресиверы) к уже существующему триггеру функции,
используя одинаковые триггеры два или более раз.
Пример 4
Последний вызов выполнит все ресиверы 1 и затем все ресиверы 2 в том же порядке.
A?$
Возвращает кол-во x-аргументов (не включая x16 для DO:P), полученных функцией.
Комментарий (показать)
Т.е. даёт возможность запрашивать кол-во аргументов функций, вызываемых через FU:P, FU:D, DO:P.
Такой механизм позволяет писать функции с необязательными параметрами (параметры со значениями по умолчанию) и
функции с переменным числом аргументов.
Пример 1:
Пример 2:
C$
Проверить на неправильные y-переменные. Можно использовать без
параметров, что равнозначно !!FU:C0;
$ = 0 – разрешить проверку (можно просто FU:C)
$ =1 – запретить проверку (установлено по умолчанию на старте)
Команда лишь проверит, использовали ли вы y-переменные вне тела функции (во время выполнения),
ведь зачастую это главный источник проблем. Наиболее логично использовать эту команду как инструкцию и она может
быть полезна при тестировании скриптов.
Пример (показать)
В этом примере, когда таймер начнёт свою работу, вы получите сообщение, что
y-переменная используется вне тела функции.
D$1[/$2/$3/…/$16]
Поддержка сетевых игр. Вызывает функцию на стороне сетевого оппонента.
Синтаксис такой же, как и FU:P, и, соответственно, особенности
такие же. Для получения доступа к параметрам используйте синтаксис x# (# =
1..16). Они могут быть использованы где угодно (внутри функции) как обычные
переменные. Когда вы вызываете функцию, все параметры, которые не были
установлены, будут наследованы.
Примечание: параметр D$1 должен быть помещён в вызове !!FU (даже если
нет значений, необходимых для передачи в функцию) для корректной работы команды.
Пример 1 (показать)
Скажем, вы используете некоторые специфические команды, которые возымеют эффект на поле боя (например, кастование заклинаний с
помощью ERM). Опять же, если вы проведете действия на одной стороне, возникнет проблема, потому что ничего не произошло на другой стороне.
Теперь вы можете использовать дистанционный вызов для таких случаев. Это означает, что вы вызываете функцию,
но она запускается не на этом, текущем, компьютере, а на втором (компьютере оппонента). Передаётся до 16 параметров.
К примеру, на своей стороне вы имеете:
Для корректного выполнения вы должны проделать некоторые вещи:
Это всё. Принцип работы: FU:D немедленно передаёт все
x-параметры на другой
компьютер и вызовет там функцию 12345. Так команда
!!BMv10:M...; будет работать на
одном компьютере и команда
!!BMx1:M...; на другом. Если вы сделаете всё правильно,
то получите одинаковый эффект на обеих сторонах.
Заметьте, что вы можете передать значения некоторых переменных командой
IP:V и затем
вызвать FU:D для передачи более, чем 16
x-параметров на другой компьютер.
Пример 2 (показать)
Вы увидите сообщение "Привет!" при любом действии стека, далее увидите сообщение
"V99=99, V100=100, V101=0, X1=1, X2=2, X3=3, X4=4, X5=5" на другом компьютере.
Затем вы получите сообщение "Привет!" на другом компьютере.
Если вы продолжите, следующее полученное вами сообщение будет "V99=99, V100=100,
V101=101, X1=1, X2=2, X3=3, X4=4, X5=5". Так, изменилась v101. Это потому что вы
отправили v99 и v100 через сеть и вызвали функцию, которая покажет сообщение
(поэтому v101 = 0). Но затем триггер !?BG0 сработал на стороне защищающегося и
v101 была установлена на значение 101.
Этот пример лишь демонстрация действий, потому что этот скрипт:
… будет работать одинаково на обеих сторонах. Но, если вы запустите скрипт как
реакцию на действие человека (обычно клик мыши), вам нужно будет продумать
передачу изменений на другой компьютер.
См. также:
ресивер IP
E
Эта команда немедленно выходит из последней запущенной функции или
триггера.
Вы можете использовать эту команду для избежания
перезапуска функции.
Пример 1 (показать)
Было:
Теперь вы можете использовать следующий способ:
Пример 2 (показать)
Вы получите следующие сообщения:
P$1[/$2/$3/../$16]
Означает старт функции, позволяет получить доступ к параметрам x1..x16.
Опция P всегда должна существовать для старта функции:
S#/?$
Даёт возможность запрашивать синтаксис, который использовался для определённого параметра функции.
# – индекс аргумента
$ – тип синтаксиса:
0 - получить: например !!FU..:P?y1;
1 - установить: например !!FU..:P10;
2 - добавить: применяется через префикс "d", например !!FU..:Pd200;
Комментарий: используя эту команду, скриптеры смогут писать функции, которые будут действовать так же, как обычные команды ERM. Например, одна функция для получения/установки/добавления рекрутов в жилище существ.