Variables
A variable (var) is a named storage location that contains a value and can be read/rewrite many times. There are two types of variables.
A global variable starts with
$
followed by an identifier (name). The global variable name is any combination of letters, digits and _
:$variable1 $100 $____
A global variable with the name that only consists of digits is called a
DMA
-variable (Direct Memory Address). See also Alloc.Their values are available from any place of the code.
A saved variable is a special global variable available only in
LCS
and VCS
modes. Its name is prefixed with $_
, e.g. $_var
. The value of this variable persists across saved games. Global variables denoted by $
only (e.g. $var
) are not saved and they get blank values when the LCS or VCS game loads.A local variable name may only be a number followed by
@
.Their values are available only within the current script or the mission.
Each script or a mission have 2 special local variables called
TIMERA
and TIMERB
. The value of a timer variable is increased automatically when the game clock advances, so they are commonly used to measure time elapsed since the timer reset:0006: TIMERA = 0 // reset the timer
:WAIT_2S
0001: wait 0 ms
00D6: if
0019: TIMERA > 2000 // if the timer value is > 2000, i.e. 2 seconds has passed
004D: jump_if_false @WAIT_2S
0662: printstring "2 seconds has passed" // display the message
TIMERA
and TIMERB
names are only available starting with Sanny Builder v3.3.0. In older scripts the timers are known as [email protected]
, [email protected]
(GTA3, VC) or [email protected]
, [email protected]
(SA).Variables are commonly used in the expressions. If the right operand is a number constant, the opcode can be omitted:
$var = 0
$myarray($index, 10i) >= 150
If both operands in the expression are variables, the compiler can not determine the correct opcode, because the types of the variables are unknown.
For example, there are two opcodes to increment a variable value:
0058
for integer values and 0059
for floating-point values.0058: $Var1 += $Var2 // (int)
0059: $Var1 += $Var2 // (float)
Assuming there is no opcode, which one to use?
$Var1 += $Var2 // ??
To communicate the compiler a variable type use the
VAR..END
construct.VAR..END
construct allows to declare variables and their types for the advanced use.Syntax:
var
<variable>: <type>
end
For example, if both variables are declared, the compiler is able to process the expression without opcodes:
var
$Var1 : Integer
$Var2 : Integer
end
$Var1 += $Var2 // opcode 0058
The following types of variables are supported:
Integer
,Int
- integer valuesFloat
- floating-points valuesString
,ShortString
- a variable containing a string literal with the fixed length (only for the arrays, uses$
,@s
for variables)LongString
- a variable containing a string literal with the variable length (only for the arrays, usev$
,@v
for variables)
The types of the local variables can be declared too.
Once the type of the variable is declared it is used for all the code following the declaration.
You can re-declare variables to set the new type:
script_name 'Food'
var
[email protected] : Float
$Var : Float
end
$var = 1
[email protected] = $Var
end_thread
thread 'Loop'
var
[email protected] : Int
$Var : Int
end
$var = 1
[email protected] = $Var
end_thread
In the
'Food'
script [email protected]
is the floating-point variable. In the 'Loop'
script [email protected]
is the integer variable.You can re-declare variables as many times as you need.
Since v3.2.0 it's possible to declare a variable of a built-in type (
Int
, Float
, String
, LongString
) using only the type name.Syntax:
<type> <variable name>
int [email protected] // [email protected] declared as an integer variable.
Starting from v3.4.0 it is possible to declare variables with custom names:
int a
float distance
string name
a = 1
distance = 15.5
name = 'CJ'
An initial value can follow the variable name to reduce the number of the lines of code:
int a = 1
float distance = 15.5
string name = 'CJ'
The compiler binds a new local variable to each name. In the example above one may expect a resulting code to look like:
You can specify an initial value for the variable when declaring it. Write
=
and then the value:var
$fVar: float = 1.0
end
or
float $fVar = 1.0
The variable
$fVar
is now declared as Float
and the compiler adds the opcode 0005
in the script:0005: $fVar = 1.0
Initialization is allowed for variables, but not for arrays.
Last modified 2yr ago