Sanny Builder
In English
In English
  • Introduction
  • Credits
  • Version History
  • Language
    • Data Types
      • Constants
      • Variables
      • Arrays
    • Instructions
      • Opcodes
      • Keywords
      • Classes
      • Expressions
      • Built-in Commands
      • HEX..END
    • Control Flow
      • Labels
      • Conditions
      • Loops
      • Switch
    • Functions
    • Import/Export
    • Directives
    • Comments
  • Edit Modes
    • CustomLabels.ini
    • Code Templates
    • Enums.txt
    • Extensions
    • Opcodes List (SCM.INI)
  • Editor
    • Features
    • Options
      • General
      • Formats
      • Editor
      • Theme Editor
      • Hotkeys
      • Debugger
      • Edit modes
    • Console
    • Hotkeys
    • Opcode Search Tool
    • Command Line Interface
    • Language Service
    • SCM Debugger
  • SCM Documentation
    • GTA Limits
    • GTA III
      • Ped Types
      • Radar Icons
    • Vice City
      • Button IDs
      • Gang IDs
      • Garage IDs
      • Interiors
      • Ped Types
      • Radar Icons
      • Weapon IDs
    • San Andreas
      • Button IDs
      • Gang IDs
      • Garage IDs
      • Haircuts
      • Interiors
      • Particle Effects
      • Ped Types
      • Player Clothes
      • Player Body Parts
      • Special Actors
      • Statistics ID
      • Tattoos
      • Train Types
      • Vehicle Variations
      • Weapon IDs
      • Weather IDs
      • Zones
    • Liberty City Stories
      • Gang IDs
      • Model IDs
      • Player Clothes
      • Special Actors
      • Weapon IDs
      • Weather IDs
    • Vice City Stories
      • Gang IDs
      • Player Clothes
      • Weather IDs
  • Troubleshooting
    • Error Messages
      • 0001: INI file not found
      • 0002: Unknown array type
      • 0003: Error reading script.img
      • 0004: Unknown parameter type
      • 0005: Invalid edit mode
      • 0006: Unknown file header
      • 0007: File not found
      • 0008: Error reading opcodes list
      • 0009: Opcodes list not found
      • 0010: Unknown opcode
      • 0011: Unknown opcode
      • 0012: Incorrect jump instruction
      • 0013: Unknown directive
      • 0014: Incorrect expression
      • 0016: Script not found
      • 0017: Unknown type of variable
      • 0018: Invalid array size
      • 0019: Unknown array type
      • 0020: Variable is not declared as array
      • 0021: Incorrect variable name
      • 0022: Loop counter is not a variable
      • 0023: Unexpected instruction
      • 0024: Error reading integer number
      • 0025: Incorrect counter range
      • 0026: Error reading floating-point number
      • 0027: String is too long
      • 0028: Unterminated string
      • 0029: Invalid debug script ID
      • 0031: Invalid total number of elements
      • 0032: Invalid value in the header
      • 0033: Invalid local variable name
      • 0034: Local variable is out of range
      • 0035: Expected word
      • 0036: Local mission variable is out of range
      • 0037: Debug script not found
      • 0038: Unknown type of array
      • 0039: Invalid element definition
      • 0040: Constant name or value not found
      • 0041: Invalid mission id
      • 0042: Duplicate external script name
      • 0043: Invalid array index
      • 0044: Invalid array name
      • 0045: Invalid array syntax: variable name is missing
      • 0046: Invalid array syntax
      • 0047: Invalid array size
      • 0048: Error reading array size
      • 0049: Not enough parameters for opcode
      • 0050: Not enough parameters for command
      • 0051: Error writing script.img header
      • 0052: Error writing script.img
      • 0053: Recursive include
      • 0054: Label not found
      • 0055: Identifier not found
      • 0056: Label redeclared
      • 0057: Internal label not found
      • 0058: Invalid parameter
      • 0059: Invalid opcode definition
      • 0060: No input file
      • 0061: Empty source
      • 0062: IDE file not found
      • 0063: Mission label expected
      • 0064: Mission label not found
      • 0065: External script label not found
      • 0067: Forbidden character in external script name
      • 0068: Forbidden character in identifier
      • 0069: Forbidden character in object name
      • 0071: Incorrect number of conditions
      • 0072: Missing logical operator
      • 0073: Redundant logical operator
      • 0074: Disabled option
      • 0075: Incorrect hexadecimal value
      • 0076: Condition expected
      • 0079: Invalid parameter in Alloc command
      • 0080: Non-negative integer number expected
      • 0081: Too many actual parameters
      • 0082: Invalid syntax
      • 0083: Unknown model ID
      • 0084: Jump to offset 0
      • 0086: Invalid array index
      • 0087: Invalid variable
      • 0088: Global variable is out of range
      • 0089: Opcode not found
      • 0090: Duplicate constant
      • 0091: Not enough memory to allocate a local variable
      • 0092: Incorrect export symbol
      • 0093: Only headless scripts can export code
      • 0094: Duplicate export name
      • 0095: Incorrect import name
      • 0096: Incorrect import path
      • 0097: Too many actual parameters
      • 0098: Unknown operator
      • 0099: Left-hand side of the assignment must be a variable
      • 0100: Invalid operator
      • 0101: Variable is not a class instance
      • 0102: Switch statement needs a variable
      • 0103: Expected a switch case
      • 0104: Expected a value for the switch case
      • 0105: Expected a function argument name
      • 0106: Expected a function argument type
      • 0107: Expected function return type
      • 0108: Unsupported argument type
      • 0109: Expected variables to store function result
      • 0110: Function must return N values
      • 0111: Function not found in current scope
      • 0113: Duplicate function declaration
      • 0115: Invalid variable name. Name is reserved by another class or function
      • 0116: Invalid variable name
      • 0117: Invalid function name
      • 0118: Unexpected value to return
      • 0119: Unsupported type of argument
      • 0120: Expected calling convention type
      • 0121: Expected function's static address
      • 0122: A non-static function can't be called by name
      • 0123: A 'thiscall' function requires a pointer
      • 0124: Foreign functions can't return more than one value
      • 0125: Unexpected return type in function
      • 0126: Can't export a foreign function definition
      • 0127: Unexpected mission label in function
Powered by GitBook
On this page
  • $INCLUDE
  • $INCLUDE_ONCE
  • $EXTERNAL
  • $CLEO
  • $NOSOURCE
  • $OPCODE
  • $USE
  • $VERSION
  • $VERSION_RESTORE
  1. Language

Directives

Preprocessing directives are unique keywords that alter the compiler's behavior. They start with a dollar sign $ and enclosed within curly braces{}.

$INCLUDE

Allows to insert the content of an external text file in the current file. If the compiler finds this directive it opens the file at the location provided as the parameter and proceeds from the code written in the included file. When it reaches the end of the included file it returns back to the previous file.

Syntax:

{$INCLUDE path\to\file}
{$INCLUDE loadwav.txt}
{$INCLUDE C:\dev\getarrayindex.txt}

If the file path is relative, the compiler scans directories in the following order to find the file:

  1. directory of the file with the directive

  2. data folder for the current edit mode

  3. Sanny Builder root directory

  4. the game directory

If none of these directories contains a requested file the compiler throws an exception.

You may use this directive unlimited number of times. The included files may contain this directive too.

A shorter form of this directive is $I.

$INCLUDE_ONCE

Similar to {$INCLUDE}, with the only difference being that if the code from a file has already been included, it will not be included again, and the directive is silently ignored.

$EXTERNAL

Syntax:

{$EXTERNAL}

A shorter form of this directive is $E.

$CLEO

An analogue of the $E one, but the compiler automatically copies an output file to the game\CLEO directory. The file also gets an extension provided as the directive parameter.

Syntax:

{$CLEO <extension>}

extension is an optional parameter specifying the file extension of the output file. It starts with the period character .. If no extension is present, the compiler uses the default value .cs

{$CLEO .cm} // the file gets the extension .cm
{$CLEO} // the file gets the default extension .cs

So this directive is the perfect solution to make a CLEO script.

{$CLEO} also implies {$USE CLEO}

$NOSOURCE

Prohibits the compiler from including a source code of the script.

Syntax:

{$NOSOURCE}

$OPCODE

Registers a custom opcode via the script.

Syntax:

{$OPCODE <opcode definition>}

or

{$OPCODE <path\to\file>}

or

{$OPCODE}
{$OPCODE 0CCC=1,my_new_opcode %1d%}
{$OPCODE additional_opcodes.ini}

When used without any parameter, this directive reloads the original opcodes definitions file and reverts all changes made.

{$OPCODE}

A shorter form of this directive is $O.

$USE

{$USE CLEO+}

You can enable multiple extensions by separating them with commas.

{$USE ini, bitwise, CLEO+}

$VERSION

This directive is deprecated since v3.1.0

Syntax:

{$VERSION x.y.zzzz}
  • y - parameters order

    • 0 - original: 0, 1, 2, etc

    • 1 - custom order, some parameters reordered

  • zzzz - opcodes version

By default the compiler uses the version current_edit_mode.1.0000.

$VERSION_RESTORE

This directive is deprecated since v3.1.0

Restores the version to the value prior to using $VERSION.

Syntax:

{$VERSION_RESTORE}
PreviousImport/ExportNextComments

Last updated 1 year ago

Makes the compiler to treat the file as an external script. Meaning, the resulting output file will be header-less and with relative offsets, as an .scm file from the script.img. Using this directive requires that the file contains only one script or a single mission.

An alternative way to get such file is the debug SKIP_SCM_HEADER. This option could be enabled in the console or from the dropdown list on the main toolbar.

Without this directive when either the directive $EXTERNAL or $CLEO is present and the Add extra info to SCM is enabled, Sanny Builder adds the source code into an output file.

All the opcodes definitions are contained in a , one for each supported game. But sometimes it's necessary to add a custom opcode to use in the current script. $OPCODE makes it possible without touching the INI file.

opcode definition - it accepts an definition in the same as the INI file.

path\to\file - this directive also accepts a file name as its parameter. This file must contain only opcodes definitions to be loaded. If a relative path is provided, the compiler scans directories using the same rules as for .

Allows the compiler to use a custom instruction set (an ).

Sets what version of to use during compilation.

X- ID

special file
extension
opcodes
edit mode
$INCLUDE
format
option
option
label