Операторы
Sanny Builder поддерживает запись многих стандартных операций без опкодов. Компилятор анализирует обе стороны выражения и оператор между ними, чтобы подобрать правильный опкод.
В связи с особенностями языка, разные типы данных требуют разных опкодов. Например, в операции сложения двух целых чисел используется опкод, отличный от аналогичной операции с дробными числами. В некоторых случаях это требует предварительного объявления типа переменных, участвующих в выражении.
Большинство поддерживаемых операций в Sanny Builder используют лишь два операнда: один слева от оператора (LHS), и один - справа (RHS).
Присваивание
LHS = RHS
- операция присваивания.RHS
- число, переменная или строка. В присваиванииLHS
всегда является переменной.LHS += RHS
- операция сложения с присваиванием.LHS
иRHS
должны быть одного типа, целого или дробного. ЗначениеLHS
увеличивается на соответствующее значениеRHS
.LHS -= RHS
- операция вычитания с присваиваниемLHS *= RHS
- операция умножения с присваиваниемLHS /= RHS
- операция деления с присваиванием
Нижеперечисленные операции требуют расширения CLEO ({$USE CLEO}
или {$CLEO}
).
LHS = value1 + value2
- сложить два целых числа и записать результат вLHS
LHS = value1 - value2
- вычесть одно целое число из другого и записать результат вLHS
LHS = value1 * value2
- перемножить два целых числа и записать результат вLHS
LHS = value1 / value2
- разделить одно целое число на другое и записать результат вLHS
Сравнение
LHS == RHS
- операция "равно". Стороны должны иметь одинаковое значение, чтобы результат был истиной (true).LHS > RHS
- операция "больше чем"LHS >= RHS
- операция "больше либо равно"LHS < RHS
- операция "меньше чем"LHS <= RHS
- операция "меньше либо равно"LHS <> RHS
- операция "не равно". Стороны должны иметь разные значения, чтобы результат был истиной (true).
В языке нет отдельного типа Boolean. Результат каждого сравнения имеет значение только в пределах текущего условного выражения.
Побитовые операции
Игра не поддерживает побитовые операции, поэтому для их использования нужен особый плагин CLEO. Кроме того, в исходном коде при помощи директивы {$USE bitwise}
должно быть подключено соответствующее расширение.
Операция | Опкод | Пример |
---|---|---|
AND | 0B10 | 0@ = 1@ & 2@ |
OR | 0B11 | 0@ = 1@ | 2@ |
XOR | 0B12 | 0@ = 1@ ^ 2@ |
NOT | 0B13 | 0@ = ~1@ |
MOD | 0B14 | 0@ = 1@ % 2@ |
Shift Right | 0B15 | 0@ = 1@ >> 2@ |
Shift Left | 0B16 | 0@ = 1@ << 2@ |
AND (с присваиванием) | 0B17 | 0@ &= 1@ |
OR (с присваиванием) | 0B18 | 0@ |= 1@ |
XOR (с присваиванием) | 0B19 | 0@ ^= 1@ |
NOT (унарный) | 0B1A | ~0@ |
MOD (с присваиванием) | 0B1B | 0@ %= 1@ |
Shift Right (с присваиванием) | 0B1C | 0@ >>= 1@ |
Shift Left (с присваиванием) | 0B1D | 0@ <<= 1@ |
FPS-независимое сложение и вычитание
Игра поддерживает операции сложения и вычитания, которые не зависят от FPS. Прочитайте статью на GTAMods.com чтобы узнать больше.
Команда | Опкод | Пример |
---|---|---|
ADD_TIMED_VAL_TO_FLOAT_VAR | 0078 | $var +=@ 5.0 |
ADD_TIMED_VAL_TO_FLOAT_LVAR | 0079 | 0@ +=@ 5.0 |
ADD_TIMED_FLOAT_VAR_TO_FLOAT_VAR | 007A | $var1 +=@ $var2 |
ADD_TIMED_FLOAT_LVAR_TO_FLOAT_LVAR | 007B | 0@ +=@ 1@ |
ADD_TIMED_FLOAT_VAR_TO_FLOAT_LVAR | 007C | 0@ +=@ $var |
ADD_TIMED_FLOAT_LVAR_TO_FLOAT_VAR | 007D | $var +=@ 1@ |
SUB_TIMED_VAL_FROM_FLOAT_VAR | 007E | $var -=@ 5.0 |
SUB_TIMED_VAL_FROM_FLOAT_LVAR | 007F | 0@ -=@ 5.0 |
SUB_TIMED_FLOAT_VAR_FROM_FLOAT_VAR | 0080 | $var1 -=@ $var2 |
SUB_TIMED_FLOAT_LVAR_FROM_FLOAT_LVAR | 0081 | 0@ -=@ 1@ |
SUB_TIMED_FLOAT_VAR_FROM_FLOAT_LVAR | 0082 | 0@ -=@ $var |
SUB_TIMED_FLOAT_LVAR_FROM_FLOAT_VAR | 0083 | $var -=@ 1@ |
Конвертация типов
Некоторые значения могут быть сконвертированы в другой тип. Игра поддерживает перевод между типами Integer
и Float
.
Использование оператора =#
требует, чтобы тип обеих переменных был объявлен заранее.
Команда | Опкод | Пример |
---|---|---|
CSET_VAR_INT_TO_VAR_FLOAT | 008C | $i =# $f |
CSET_VAR_FLOAT_TO_VAR_INT | 008D | $f =# $i |
CSET_LVAR_INT_TO_VAR_FLOAT | 008E | 0@ =# $f |
CSET_LVAR_FLOAT_TO_VAR_INT | 008F | 1@ =# $i |
CSET_VAR_INT_TO_LVAR_FLOAT | 0090 | $i =# 1@ |
CSET_VAR_FLOAT_TO_LVAR_INT | 0091 | $f =# 0@ |
CSET_LVAR_INT_TO_LVAR_FLOAT | 0092 | 0@ =# 1@ |
CSET_LVAR_FLOAT_TO_LVAR_INT | 0093 | 1@ =# 0@ |
Last updated