Переменные

Переменная - это именованная область памяти со значением, которое может быть многократно прочитано и/или изменено. Существует два вида переменных - глобальные и локальные.

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

Глобальная переменная начинается со знака $, после которого следует комбинация латинских букв, цифр и _:

$variable1 $100 $____

Значения глобальных переменных доступны из любого места в коде.

Сохраняемые переменные

Сохраняемые переменные - это особый вид глобальных переменных, добавленный в LCS и VCS режимах. Перед их именем стоит $_, например $_var. Значение такой переменной восстанавливается при загрузке сохраненной игры. Глобальные переменные, которые начинаются только с $ (например, $var), не сохраняют свое значение и обнуляются при загрузке сохранения в LCS или VCS.

DMA переменные

Во время компиляции имена переменных заменяются на числа. Эти числа являются индексами в специальном массиве, который используется игрой для хранения значений глобальных переменных. Индекс является уникальным числом, присваиваемым конкретной переменной.

Глобальная переменная, чье имя состоит из цифр, называетсяDMA-переменная (Direct Memory Address - прямой доступ к памяти). Это имя и будет индексом, который использует игра.

См. Alloc.

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

Именем локальной переменной служит число, после которого стоит знак @.

0@ 
999@ 
56@

Значения локальных переменных доступны только в пределах текущего скрипта или миссии.

Переменные-таймеры

Каждый скрипт или миссия также имеют две особые локальные переменные, которые называются TIMERA и TIMERB. Значение переменной-таймера постоянно увеличивается с ходом игры, поэтому они обычно используются, чтобы измерять время, пройденное с определенного момента (сброса таймера).

Имена TIMERAиTIMERBдоступны начиная с Sanny Builder v3.3.0. В более ранних скриптах таймеры использовались как обычные локальные переменные 16@, 17@ (в GTA3 и VC) либо 32@, 33@ (SA).

Объявление типа переменной

Переменные обычно используются в арифметических или условных выражениях. Если в выражении правая часть является числом, опкод указывать не обязательно:

Если же обе части выражения являются переменными, компилятор не сможет подобрать нужный опкод, т.к. типы переменных неизвестны.

Например, существует два опкода, которые складывают значения двух переменных: 0058 для целых чисел и 0059 для дробных.

Если убрать опкод, как скомпилировать такое выражение?

Чтобы сообщить компилятору тип переменной, используется ключевое слово var.

Переменная - это любая допустимая глобальная или локальная переменная (см. выше).

Тип может быть одним из нижеперечисленных значений:

  • Integer, Int - целые числа

  • Float - дробные числа

  • String, ShortString - переменная, содержащая короткий строковый литерал (используется только при объявлении массивов, для одиночных переменных используются префикс s$ или суффикс @s)

  • LongString - переменная, содержащая длинный строковый литерал (используется только при объявлении массивов, для одиночных переменных используются префикс v$ или суффикс @v)

  • <Имя класса> - переменная или массив переменных членов класса

Пример:

Можно объявить несколько переменных в одной строке, разделяя их запятой:

Если вы предпочитаете многострочные определения, используйте конструкцию VAR..END:

Когда обе переменные имеют известный компилятору тип, выражение компилируется без опкода:

Как только тип переменной объявлен, он используется везде ниже по коду. Тип переменной может быть изменен, если она используется по-другому:

В скрипте'Food' 10@ является дробной переменной. В скрипте'Loop' 10@ уже целочисленная переменная.

Тип переменной может быть переобъявлен многократно.

Короткая форма объявления переменных

Начиная с версии 3.2.0 можно объявлять переменные, используя только имя типа (доступно для типов Int, Float, String, LongString).

Синтаксис:

Пример:

Начиная с версии 3.4.0 появилась возможность объявить переменную с собственным именем:

Одновременно с объявлением такой переменной можно присвоить ей начальное значение, чтобы уменьшить количество строк кода:

Компилятор связывает каждое имя с новой локальной переменной. В примере выше код будет скомпилирован примерно следующим образом:

Из-за архитектурных ограничений эта возможность доступна только в CLEO скриптах.

Начальное значение переменной

Одновременно с объявлением переменной можно задать ей начальное значение. Для этого напишите = и значение:

или

Теперь переменная $fVar объявлена как Float, и компилятор добавит в скрипт опкод 0005:

Инициализация доступна только для переменных, но не массивов.

Last updated