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
  • FOR..END
  • WHILE..END
  • REPEAT..UNTIL
  • Continue and Break
  1. Language
  2. Control Flow

Loops

PreviousConditionsNextSwitch

Last updated 1 year ago

A loop is a statement which allows code to be repeatedly executed. Sanny Builder supports three kinds of controls loops: for, while, repeat.

FOR..END

The FOR loop has a strictly certain number of iterations (repetitions).

Syntax: FOR <loop variable> = <initial value> TO/DOWNTO <final value> [step = 1] <the loop body> END

<loop variable> - a variable used as a counter for iterations <initial value> - a value of the loop variable before the first iteration (any value including a ) TO or DOWNTO - increment or decrement the loop variable between iterations <final value> - a value of the loop variable after the last iteration (any value including a model identifier) <step> - an optional value the loop variable will be incremented or decremented with between iterations. By default it is equal to 1.

var
    $value: int = 0
    $final: int = 100
end

FOR $MyCounter = 1 to $final step 2
    $value += $mycounter
end

If the loop variable is not with any type before the loop it gets the Integer type. If initial value, final value or step are variables, they get the same type the loop variable has To use floating-point numbers for the initial and final values, declare the loop variable with the Float type.

var
    $MyCounter: float
end

FOR $MyCounter = 1.0 to $final step 2.0
end

Variables $MyCounter and $final both have the Float type after the loop.

WHILE..END

Syntax: WHILE <loop condition> <the loop body> END

loop condition - a single conditional opcode loop body - commands to execute on each iteration; can be omitted

while not #AK47.Available
    wait 0
end

The WHILE loop works while the loop condition is true. The condition is evaluated before a loop iteration. Hence, if the condition is false, the loop body never gets executed.

$var = 10

while $var > 11
    inc($var)
end

// as the loop condition is false, inc($var) never gets executed

Constants True and False can be used as a loop condition.

while true
    <loop body>
end

This loop body executes infinitely until the loop is stopped with the Break command.

while false
    <loop body>
end

This loop is ignored by the compiler as the condition is never met.

Currently the compiler accepts only one opcode in the loop condition, but you can check more conditions before the loop body and use the commands Break and Continue.

while true
    if and
       $var >= 0
       $var <= 100
    then
       Break
    end
    // loop executes while $var is in the range [0...100]
      
    <loop body>
end

REPEAT..UNTIL

Syntax: REPEAT <the loop body> UNTIL <loop condition>

loop body - commands to execute on each iteration; can be omitted loop condition - a single conditional opcode

The REPEAT..UNTIL loop executes until the loop condition returns false. The condition is evaluated after iteration therefore the loop is guaranteed to be executed at least once.

Constants True and False can be used as the loop condition.

repeat
  // the loop has the only iteration
until true 
repeat
  // the loop executes infinitely until it's stopped with the Break command
until false

Currently the compiler accepts only one opcode in the loop condition, but you can check more conditions after the loop body and use the commands Break and Continue.

repeat  
   <loop body>
   if and
     $var >= 0
     $var <= 100
   then
     Break
   end
  // loop executes while $var is in the range [0...100]      
until false

Continue and Break

If you want to skip the current iteration and proceed to the next one, use the Continue command.

The Break command causes the loop to stop immediately and proceed to the command after the loop body.

They can substitute an opcode parameter (e.g., jf Continue) or serve as a standalone statement.

while true
  if
    not $currentactor.dead
  jf Break // exit the loop

  if
    $currentactor.dead
  then
    Continue // go to the next iteration
  end
end
declared
model identifier