Пользовательские переменные. Работа со строками.



Содержание:

1. Что такое переменная
2. Локальные переменные. TAGs
3. Глобальные переменные. VARs
4. Работа со строками. Функции EVAL, STRCMPI, HVAL
5. Заключение

1. Что такое переменная

Эта статья будет достаточно короткой, но информация, которую она в себе несет едва ли не самая важная в скриптинге для эмулятора Sphere.

Итак - что же такое пользовательские переменные? Если вы знакомы с языками программирования, то вы несомненно знаете что это, но для несведующих поясняю: понятие переменная употребляется для обозначения области памяти, обращение к которой производится через ее наименование, заранее определенное пользователем и которая может принимать различные значения (а не одно единственное значение как константа). Как правило во всех языках программирования переменные бывают двух видов - "локальные" и "глобальные". Локальные переменные используются в определенных, ограниченных частях программы. Так например, если описана и используется локальная переменная в одной функции, то вы не можете использовать эту же переменную в другой функции. Голбальные же переменные могут быть определены и использоваться в любой части программы. Переменные в Sphere тоже разделяются на локальные и глобальные. Естественно сразу возникает вопрос - зачем пользоваться локальными, если глобальные гораздо более функциональны? Ответ прост: первые,
в отличие от вторых "съедают" гораздо меньше памяти, что применительно к сфере означает меньшие лаги. И все равно - всякая переменная отнимает память - именно поэтому после завершения работы с каждой переменной ее надо удалять. Но об этом позже...

2. Локальные переменные. TAGs

Рассмотрим сначала локальные переменные (TAGs). Чтобы определить TAG вам достаточно лишь присвоить ему какое либо значение (сразу бросается в глаза отличие скрипт-языка Sphere от многих других языков, где для определения переменных используются ключевые слова вроде var или varuable). Так же в языках высокого уровня переменные могут быть различных типов (например "int"/"integer" - переменной можно присвоить только целые числа, "char" - только символ, "float" - только дробные числа). В скриптах Sphere же и локальные и глобальные переменные по своему типу являются "строкой" ("string"). Вот несколько примеров определения TAG'ов:

SRC.TAG.VAR1=9
SRC.TAG.VAR2=10
SRC.TAG.VAR3=+
ACT.TAG.STRG=This is string.
CONT.TAG.STRG2=This is string with 0987654321

[ITEMDEF i_test_item]
ID=01ce1

ON=@CREATE
TAG.ITEM_TAG=16A

В описанном примере мы определили 6 переменных. Тут следует сделать пояснения: если вывести , то вы увидете число 9; - вы увидете число 0А в шестнадцетеричном виде. Но почему? Ведь в TAG'ах же хранятся строки?! Да - строки. Но отсутствие гибкой системы типов разработчики Sphere решили компенсировать тем, что числа, занесенные в переменную будут рассматриваться как десятичные числа, далее они будут переведены интерпретатором в шестнадцатиричную систему и в самой переменной будет храниться уже шестнадцатиричное число. Следовательно, если вывести то вы увидете число 19 (25 в десятичной системе). В - соответственно строка This is string. В - строка This is string with 0987654321 (Если вы присваиваете переменной как некую строку символов, так и числа в месте с этими символами, то эти числа уже не будут переведены в шестнадцатиричную систему, а будут восприниматься интерпретатором как часть строки). - тут теперь храниться
строка 16A (а никак не число 16А в шестнадцетиричной системе, так как переменной были присвоены как числа, так и символы).

Внимание! Не забывайте удалять переменные после использования! Например, если у вас была определена переменная SRC.TAG.NAME, то чтобы удалить ее вам достаточно использовать такую конструкцию:

SRC.TAG.NAME=

Теперь переменная SRC.TAG.NAME не определена.

Так же вам следует знать, что TAG'и можно использовать только в следующих случаях:

1) На любых ПС (через SRC, ACT и т.д.) и на любых NPC.
2) На любых предметах, у которых определен тип t_script или t_eq_script (тут я не уверен - возможно это не обязательно)
3) На любых регионах. (Пример: REGION.TAG.NUM=15)

Если вы используете переменную в операторе IF или присваиваете другой переменной значение этой, вобщем во всех случаях когда вы пользуетесь значением, помещенным в переменную, всегда используйте конструкцию 0<>. Например:

vIF (0==5)
SRC.KILL
ENDIF

MORE=0

Иначе, может получиться, что перемнная, которую вы присваиваете не определена и тогда Sphere вернет ошибку: Undefined value ' ', а скрипт будет работать некорректно.

3. Глобальные переменные. VARs

Теперь рассмотрим глобальные переменные (VARs). Как я уже писал к глобальным переменным можно обращаться из любого скрипта. Чтобы определить VAR вам достаточно присвоить ей какое либо значение. Но вот тут то и возникает различие с TAG'ами - тогда как локальные переменные "вешаются" на предметы/PC/NPC/регионы, VAR'ы так "повесить" нельзя! Примеры ошибочного определения:

SRC.VAR.NAME=Rig
CONT.VAR.LOGIC=16
ACT.VAR.NOISE=255

И так далее:

Вот несколько примеров граммотного определения глобальных переменных:

VAR.NAME=Rig
VAR.NUM_RAR_TMP_MEMORY=0
VAR.STRG=This is string
VAR.STRG2=0

Работа с числами в VAR'ах организована так же как и в TAG'ах. Как вы можете видеть, при работе со значениями хранящимися в переменной, с теми же целями используется конструкция 0<>. Имя переменной может быть совершенно любым, только есть ограничение на длинну имени - 255 символов. Во всем остальном работа с глобальными переменными осуществляется так же как и с локальными. Не забывайте удалять глобальные переменные, если уверены, что он вам более не понадобятся:

VAR.NAME=

Это сэкономит вам память.

4. Работа со строками. Функции EVAL, STRCMPI, HVAL

Например, вы хотите работать с десятичными числами через переменые. И вот незадача - а в переменной-то шестнадцатиричные! Имено для таких ситуаций и была введена функция EVAL. Эта функция переводит шестнадцатиричные значения в десятиричные. Пример:

[ITEMDEF i_test_item]
ID=01ce1

ON=@CREATE
TAG.BUFFER=12

ON=@DCLICK
SRC.SYSMSSAGE There is in TAG.BUFFER!
SRC.SYSMSSAGE There is > in TAG.BUFFER!

Теперь, если вы создадите этот предмет в игре и дважды кликните по нему мышкой, то снизу слева у вас выведется два сообщения. Первое: There is 0C in TAG.BUFFER! Второе: SRC.SYSMSSAGE There is 12 in TAG.BUFFER! Заметте если после операторов типа MESSAGE и SYSMESSAGE вы не ограничиваете переменную скобками <>, то тогда интерпритатор воспринимает имя переменной, а не содержимое, как часть строки на вывод. Так же стоит заметить еще один важный момент: во избежание ошибок следует пользоваться функцией EVAL во всех возможных случаях!

ACT.TAG.STRG=This is string.
SRC.SYSMESSAGE >

В данном примере функция EVAL вернет 0, так как ее аргументом не может быть строка символов, которая не является шестнадцатиричным/десятичным числом.

Вмете с функцией EVAL я хочу затронуть еще две полезных функции.

STRCMPI(,) - эта функция сравнивает две строки и возвращает 1 - если строки различны, 0 - если одинаковы.

Например:

SRC.NAME=Rig
IF (, Rig)>==1)
SRC.KILL
ENDIF

В этом примере команда SRC.KILL не будет выполнена, т.к. функция вернет 0. Запомнете: функция STRCMPI не различает регистры букв! Следовательно:

SRC.NAME=RIG
IF (, rig)>==1)
SRC.KILL

Функция снова вернет значение 0.

Существует еще одна функция - HVAL. Эта функция обладает всеми свойствами EVAL, только она возвращает значения в шестнадцатиричном виде. Эту функцию удобно использовать для отладки скриптов, в квестах и еще много для чего - на что у скриптера хватит фантазии.

Замечание: в Sphere при выводе числа очень легко понять - является ли оно десятичным или шестнадцатиричным. Перед шестнадцатиричным числом всегда стоит 0 (ноль). Пример:

SRC.TAG.NUM=99
SRC.SYSMESSAGE
SRC.SYSMESSAGE >

Первым выведется число 063, вторым 99 (без нуля!).

5. Заключение

Вот и все что я хотел рассказать вам в этой статье. Если она получилось черезчур громоздкой для такой небольшой темы - извеняюсь, я пишу для новичков и хочу, чтобы у читателей осталось как можно меньше вопросов и больше понимания. Я не стал приводить какой либо общий пример на использование переменных или функций работы со строками, так как я не вижу в этом смысла. Практически в любом скрипте используется то о чем я писал и если вам так уж необходим пример для полного закрепления материала, вы всегда можете рассмотреть чей нибудь скрипт.
Hosted by uCoz