{"name":"SQS to SQF conversion","title":"SQS to SQF conversion","type":"topic","url":"https://community.bistudio.com/wiki/SQS_to_SQF_conversion","revid":377918,"updated":"2026-01-11T15:31:56Z","aliases":[],"markdown":"SQF Syntax has been introduced in Operation Flashpoint: Resistance v1.85 and is the Arma series' main scripting language until Arma 3.\nThe main differences with SQS Syntax are:\n\n- **execVM** is used (instead of exec for SQS)\n- Every command has to end with a semicolon (`;`)\n- the following commands disappeared:\n  - goto/\n    #label (Note, # is a command in itself in Arma 3)\n  - exit - a partial SQF equivalent can be found in exitWith\n- Line returns do not impact code\n- SQF can return a variable, where SQS cannot\n\n### Conversion Examples\n\n| SQS | SQF |\n|---|---|\n| **Comment** |  |\n| `; This is a comment`<br>```sqs<br>; This is a<br>; multiline<br>; comment<br>```<br>`comment \"this is a comment\";`<br>`\"this is a comment\";` | `// This is single-line comment`<br>```sqf<br>/*<br>    This is a<br>    multiline<br>    comment<br>*/<br>```<br>`comment \"this is a comment\";`<br>`\"this is a comment\";` |\n| **Conditional Wait** |  |\n| `@CONDITION`<br>`@ not alive player` | `waitUntil { CONDITION };`<br>`waitUntil { not alive player };` |\n| **Delay** |  |\n| `~DELAY`<br>`~5` | `sleep DELAY;`<br>`sleep 5;` |\n| **Conditional Command** |  |\n| `? CONDITION : COMMAND`<br>`? alive player : player setDammage 1` | `if (CONDITION) then { COMMAND };`<br>`if (alive player) then { player setDammage 1 };` |\n| **Multi-Conditional Command** |  |\n| ```sqs<br>? CONDITION : goto \"SKIP\"<br> COMMAND_2<br>goto \"END\"<br>#SKIP<br> COMMAND_1<br>#END<br>``` | ```sqf<br>if (CONDITION) then<br>{<br>    COMMAND_1<br>}<br>else<br>{<br>    COMMAND_2<br>};<br>``` |\n| **Cycle** |  |\n| ```sqs<br>#loop<br>COMMAND<br>~DELAY<br>? CONDITION : goto \"LOOP\"<br>``` | ```sqf<br>while { CONDITION } do<br>{<br>    COMMAND;<br>    sleep DELAY;<br>};<br>``` |\n| **Cycle With Step** |  |\n| ```sqs<br>_i = 0<br>#LOOP<br> COMMAND<br> _i = _i + 1;<br>? _i < COUNT : goto \"LOOP\"<br>``` | ```sqf<br>for \"_i\" from 0 to COUNT -1 do<br>{<br>    COMMAND;<br>};<br>``` |\n| **Structured Conditional Command** |  |\n| ```sqs<br>? VARIABLE == VALUE_1: goto \"SKIP_1\"<br>? VARIABLE == VALUE_2: goto \"SKIP_2\"<br> DEFAULT_COMMAND<br> goto \"END\"<br>#SKIP_1<br> COMMAND_1<br> goto \"END\"<br>#SKIP_2<br> COMMAND_2<br>#END<br>``` | ```sqf<br>switch (VARIABLE) do<br>{<br>    case VALUE_1:<br>        { COMMAND_1 };<br>    case VALUE_2:<br>        { COMMAND_2 };<br>    default<br>        { DEFAULT_COMMAND };<br>};<br>``` |\n| **Exiting** |  |\n| ```sqs<br>? CONDITION : COMMAND_2<br>? CONDITION : exit<br> COMMAND_1<br>``` | ```sqf<br>if (CONDITION) exitWith { COMMAND_2; };<br>COMMAND_1;<br>``` |\n\n### See Also\n\n- SQF Syntax\n- SQS Syntax\n- Introduction to Arma Scripting","sections":[{"heading":null,"level":1,"markdown":"SQF Syntax has been introduced in Operation Flashpoint: Resistance v1.85 and is the Arma series' main scripting language until Arma 3.\nThe main differences with SQS Syntax are:\n\n- **execVM** is used (instead of exec for SQS)\n- Every command has to end with a semicolon (`;`)\n- the following commands disappeared:\n  - goto/\n    #label (Note, # is a command in itself in Arma 3)\n  - exit - a partial SQF equivalent can be found in exitWith\n- Line returns do not impact code\n- SQF can return a variable, where SQS cannot"},{"heading":"Conversion Examples","level":3,"markdown":"| SQS | SQF |\n|---|---|\n| **Comment** |  |\n| `; This is a comment`<br>```sqs<br>; This is a<br>; multiline<br>; comment<br>```<br>`comment \"this is a comment\";`<br>`\"this is a comment\";` | `// This is single-line comment`<br>```sqf<br>/*<br>    This is a<br>    multiline<br>    comment<br>*/<br>```<br>`comment \"this is a comment\";`<br>`\"this is a comment\";` |\n| **Conditional Wait** |  |\n| `@CONDITION`<br>`@ not alive player` | `waitUntil { CONDITION };`<br>`waitUntil { not alive player };` |\n| **Delay** |  |\n| `~DELAY`<br>`~5` | `sleep DELAY;`<br>`sleep 5;` |\n| **Conditional Command** |  |\n| `? CONDITION : COMMAND`<br>`? alive player : player setDammage 1` | `if (CONDITION) then { COMMAND };`<br>`if (alive player) then { player setDammage 1 };` |\n| **Multi-Conditional Command** |  |\n| ```sqs<br>? CONDITION : goto \"SKIP\"<br> COMMAND_2<br>goto \"END\"<br>#SKIP<br> COMMAND_1<br>#END<br>``` | ```sqf<br>if (CONDITION) then<br>{<br>    COMMAND_1<br>}<br>else<br>{<br>    COMMAND_2<br>};<br>``` |\n| **Cycle** |  |\n| ```sqs<br>#loop<br>COMMAND<br>~DELAY<br>? CONDITION : goto \"LOOP\"<br>``` | ```sqf<br>while { CONDITION } do<br>{<br>    COMMAND;<br>    sleep DELAY;<br>};<br>``` |\n| **Cycle With Step** |  |\n| ```sqs<br>_i = 0<br>#LOOP<br> COMMAND<br> _i = _i + 1;<br>? _i < COUNT : goto \"LOOP\"<br>``` | ```sqf<br>for \"_i\" from 0 to COUNT -1 do<br>{<br>    COMMAND;<br>};<br>``` |\n| **Structured Conditional Command** |  |\n| ```sqs<br>? VARIABLE == VALUE_1: goto \"SKIP_1\"<br>? VARIABLE == VALUE_2: goto \"SKIP_2\"<br> DEFAULT_COMMAND<br> goto \"END\"<br>#SKIP_1<br> COMMAND_1<br> goto \"END\"<br>#SKIP_2<br> COMMAND_2<br>#END<br>``` | ```sqf<br>switch (VARIABLE) do<br>{<br>    case VALUE_1:<br>        { COMMAND_1 };<br>    case VALUE_2:<br>        { COMMAND_2 };<br>    default<br>        { DEFAULT_COMMAND };<br>};<br>``` |\n| **Exiting** |  |\n| ```sqs<br>? CONDITION : COMMAND_2<br>? CONDITION : exit<br> COMMAND_1<br>``` | ```sqf<br>if (CONDITION) exitWith { COMMAND_2; };<br>COMMAND_1;<br>``` |"},{"heading":"See Also","level":3,"markdown":"- SQF Syntax\n- SQS Syntax\n- Introduction to Arma Scripting"}],"categories":["Syntax"],"groups":["Scripting"]}