description |
---|
Built-in types available in the game runtime. |
Keyword | Type | Values |
---|---|---|
Keyword | Type | Values |
Bool | Boolean logic type | true false |
Keyword | Type | Range | Example |
---|---|---|---|
Keyword | Type | Range | Example |
Int8 | 8-bit Signed Integer | -128 to 127 | let a: Int8 = 161; |
Uint8 | 8-bit Unsigned Integer | 0 to 255 | let a: Uint8 = 161u; |
Int16 | 16-bit Signed Integer | -32,768 to 32,767 | let a: Int16 = 161; |
Uint16 | 16-bit Unsigned Integer | 0 to 65,535 | let a: Uint16 = 161u; |
Int32 | 32-bit Signed Integer | −2,147,483,648 to 2,147,483,647 | let a: Int32 = 161; |
Uint32 | 32-bit Unsigned Integer | 0 to 4,294,967,295 | let a: Uint32 = 161u; |
Int64 | 64-bit Signed Integer | −9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 | let a: Int64 = 161l; |
Uint64 | 64-bit Unsigned Integer | 0 to 18,446,744,073,709,551,615 | let a: Uint64 = 161ul; |
You can declare inline numbers using Cast<T>(value)
. It is useful for Int8
/Uint8
and Int16
/Uint16
for example:
// Fake function to use:
public static func UseNumber(a: Int8, ua: Uint8, b: Int16, ub: Uint16) -> Void;
// Use explicit cast
UseNumber(Cast<Int8>(127),
Cast<Uint8>(255u),
Cast<Int16>(32767),
Cast<Uint16>(65535u));
Keyword | Type | Range | |
---|---|---|---|
Keyword | Type | Range | Example |
Float | 32-bit Single-Precision | 6-9 significant decimal digits (more info) | let a: Float = 3.141592; |
Double | 64-bit Double-Precision | 15-17 significant decimal digits (more info) | let a: Double = 3.141592653589793d; |
Keyword | Type | Prefix | Example |
---|---|---|---|
Keyword | Type | Prefix | Example |
String | Mutable character string | "Hello world" | |
CName | Non-mutable string constant | n | n"VehicleComponent" |
ResRef | Resource reference path | r | r"base\\anim_cooked.cookedanims" |
TweakDBID | TweakDB Record ID | t | t"Items.RequiredItemStats" |
String
values are stored internally as a null-terminated character array, unfortunately the bytecode doesn't support accessing the individual characters as an array.
CName
values are stored in-engine as a 64-bit hash key to a interned string pool. Class, function and field names are stored in the CName pool, so any methods that need a dynamic reference a scripted component will use a CName
value.
ResRef
values are similar to CName
values, except they specifically refer to archive resource files and presumably use a separate optimized string pool. Unlike CName
, ResRef
doesn't have any defined operators.
TweakDBID
is used as the primary key for all *_Record
types stored in TweakDB, the engine's internal database.
Keyword | Type |
---|---|
Keyword | Type |
Variant | A dynamic type that can store any other type |
The RED4 scripting runtime implements most operators as native functions. Only the equals ==
and not equals !=
operators are implemented in bytecode. The redscript compiler provides a number of operator symbols as shorthand.
This table lists the available operators (in precedence block order) and what types support them.
Type | Symbol | Logical | Integer | Float | String | CName | TweakDBID |
---|---|---|---|---|---|---|---|
Type | Symbol | Logical | Integer | Float | String | CName | TweakDBID |
Negate | - | - | ✓ | ✓ | - | - | - |
Logical Not | ! | ✓ | - | - | - | - | ✓¹ |
Bitwise Not | ~ | - | ✓ | - | - | - | - |
Multiplication | * | - | ✓ | ✓ | ✓² | - | - |
Division | / | - | ✓ | ✓ | - | - | - |
Modulo | % | - | ✓ | ✓ | - | - | - |
Addition | + | - | ✓ | ✓ | ✓³ | ✓⁴ | ✓⁴ |
Subtraction | - | - | ✓ | ✓ | - | - | - |
Less Than | < | - | ✓ | ✓ | - | - | - |
Less Than or Equal | <= | - | ✓ | ✓ | - | - | - |
Greater Than | > | - | ✓ | ✓ | - | - | - |
Greater Than or Equal | >= | - | ✓ | ✓ | - | - | - |
Equals | == | ✓ | ✓ | ✓ | ✓ | ✓⁵ | ✓ |
Not Equals | != | ✓ | ✓ | ✓ | ✓ | ✓⁵ | ✓ |
Logical And | && | ✓ | - | - | - | - | - |
Logical Or | || | ✓ | - | - | - | - | - |
Bitwise And | & | - | ✓ | - | - | - | - |
Bitwise Or | | | - | ✓ | - | - | - | - |
Bitwise Xor | ^ | - | ✓ | - | - | - | - |
Assign | = | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
Assign Add | += | - | ✓ | ✓ | ✓ | - | ✓ |
Assign Subtract | -= | - | ✓ | ✓ | - | - | - |
Assign Multiply | *= | - | ✓ | ✓ | - | - | - |
Assign Divide | /= | - | ✓ | ✓ | - | - | - |
Assign Bitwise And | &= | - | ✓ | - | - | - | - |
Assign Bitwise Or | |= | - | ✓ | - | - | - | - |
-
The Logical Not
!
operator forTweakDBID
is overridden to return!TDBID.IsValid(a)
-
Strings can be multiplied by an
Int32
to repeat the string:public static func OperatorMultiply(a: String, count: Int32) -> String
-
String
addition is concatenation. There are native functions to allow most types can be concatenated withString
-
CName
andTweakDBID
addition is concatenation (and presumably involves some kind of internal lookup to a known value) -
The redscript compiler doesn't currently support the
==
and!=
symbols for theCName
type, use theEquals(a,b)
andNotEquals(a,b)
intrinsic functions for now.