Переменные

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

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

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

$variable1 $100 $____

Глобальная переменная, чье имя состоит из цифр, называетсяDMA-переменная (Direct Memory Address). См. Alloc.

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

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

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

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

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

0@
999@
56@

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

Количество локальных переменных в одном скрипте/миссии строго ограничено.

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

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

0006: TIMERA = 0 // сброс таймера
:WAIT_2S
0001: wait 0 ms
00D6: if
0019: TIMERA > 2000 // если таймер увеличился до 2000, т.е. прошло 2 секунды
004D: jump_if_false @WAIT_2S
0662: printstring "2 seconds has passed" // показать текст

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

Конструкция VAR..END

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

$var = 0
$myarray($index, 10i) >= 150

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

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

0058: $Var1 += $Var2 // (целые числа)
0059: $Var1 += $Var2 // (дробные числа)

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

$Var1 += $Var2 // ??

Чтобы сообщить компилятору тип переменных, используется конструкция VAR..END.

Конструкция VAR..END позволяет объявлять переменные и их типы.

Синтаксис: var <переменная>: <тип> end

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

var
$Var1 : Integer
$Var2 : Integer
end
$Var1 += $Var2 // здесь будет опкод 0058

Поддерживаются следующих типы переменных:

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

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

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

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

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

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

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

thread 'Food'
var
10@ : Float
$Var : Float
end
$var = 1
10@ = $Var
end_thread
thread 'Loop'
var
10@ : Int
$Var : Int
end
$var = 1
10@ = $Var
end_thread

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

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

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

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

Синтаксис: <type> <variable name>

int 0@ // 0@ объявлена как целочисленная переменная

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

int a
float distance
string name
a = 1
distance = 15.5
name = 'CJ'

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

int a = 1
float distance = 15.5
string name = 'CJ'

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

0006: 0@ = 1
0007: 1@ = 15.5
05AA: 2@ = 'CJ'

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

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

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

var
$fVar: float = 1.0
end

или

float $fVar = 1.0

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

0005: $fVar = 1.0

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