# Типы данных

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

## Переменные

Если перед именем переменной (комбинация букв, цифр, и `_`) стоит знак `$` - это [глобальная переменная](https://docs.sannybuilder.com/ru/variables#globalnye-peremennye).

```
0004: $MyVar = 100
```

Именем [локальной переменной](https://docs.sannybuilder.com/ru/variables#lokalnye-peremennye) может быть только число, после которого стоит `@`.  Это число является индексом в списке локальных переменных, [выделенных](https://docs.sannybuilder.com/ru/scm-documentation/gta-limits) для текущего скрипта или миссии.

```
0006: 100@ = 10
```

Переменная `ADMA` (**A**dvanced **D**irect **M**emory **A**ccess, усовершенствованный доступ к памяти) - это указатель на определенный адрес внутри файла `main.scm`. Они используются так же как глобальные переменные, но в отличие от них `ADMA` могут читать и писать значения по любому адресу в пределах `main.scm`.&#x20;

```
$myVar = &0 // прочитать первые 4 байта main.scm и записать значение в $myVar
&57 += &120(&231,4i) // также могут использоваться как элементы массива
```

`ADMA` переменные не влияют на размер буфера для глобальных переменных, выделенного в заголовке `main.scm`.

## Метки

Метки указывают на определенную строку кода и используются в условных (опкод `004D`) и безусловных переходах (опкоды `0002`, `0050`). Имя метки состоит из букв, цифр и `_` и всегда начинается с `:`

```
:MyLabel
```

Чтобы использовать такую метку в опкоде замените `:` на `@`

```
0002: jump @MyLabel
```

Если имя метки написано как самостоятельное выражение с парой скобок в конце, это представляет собой вызов подпрограммы командой `gosub`:

```
// следующие выражения эквивалентны
MyLabel()
gosub @MyLabel
```

## Строковые литералы

Текст,  обрамленный одинарными кавычками `' '`, - это короткий строковый литерал (до `15` символов).

```
03A4: script_name 'MAIN'
```

Текст,  обрамленный двойными кавычками `" "`, - это длинный строковый литерал (максимальная длина определяется опкодом).

Если внутри литерала используется кавычка, она должна быть заэкранирована при помощи обратного слэша`\`

```
0662: write_debug_message "Hello, \"world\"! \n 'Here we go!'"
```

Допускается использование пустых строк `''` или `""`.

## Строковые переменные

Глобальные переменные, содержащие короткий строковый литерал, начинаются с `s$`.

```
05A9: s$MyString = 'GLOBAL'
```

Локальные переменные, содержащие короткий строковый литерал, заканчиваются на `@s`.&#x20;

```
05AA: 1@s = 'LOCAL'
```

Глобальные переменные, содержащие длинный строковый литерал, начинаются с  `v$`.&#x20;

```
06D1: v$MyString = "LONG_GLOBAL"
```

Локальные переменные, содержащие длинный строковый литерал, заканчиваются на `@v`.&#x20;

```
06D2: 1@v = "LONG_LOCAL"
```

## Имена моделей

Вместо ID моделей из `.ide` файлов могут использоваться их имена, перед которыми стоит `#`&#x20;

```
0247: request_model #CELLPHONE
```

## Числа в 16-ричном формате <a href="#hex-numbers" id="hex-numbers"></a>

`0x` - число в шестнадцатиричном формате\
`-0x` - отрицательное число в шестнадцатиричном формате

```
0004: $var = -0xBB08
```

Разрешенный диапазон шестнадцатиричных чисел лежит между `-80000000` и `7FFFFFFF`.
