This project is an attempt to take all commands from the Arma 3 wiki, and save them in a consistent XML format for use in syntax checking.
Each command is manually converted to XML, with help of a Java-written tool (the tool is not publicly available).
All commands up through Arma 3 version 1.82 have been converted (2188 total conversions). Phew.
The contents of each command xml doesn't need to be strictly followed, however, it is meant to be as rigorous and strict as possible to maximize type matching.
To retrieve a syntax for a command, the related file name will be commandname.xml
. If the file does not exist, there is
no syntax available for the command. Please report any instances where a command is not supported.
The name of the file will always the command name in lower case with .xml
concatenated. In Java code, it is commandName.toLowerCase() + ".xml"
.
- File name for command
WFSideText
:wfsidetext.xml
- File name for command
createVehicle
:createvehicle.xml
All xml files will have something like <?xml version='1.0' encoding='UTF-8'?>
. If you are using an XML parsing library,
this tag should be handled already (it is recommended to use a library for XML parsing for proper encoding handling).
The root tag name will always be command
. The attributes for the root tag are as follows:
name
: Command name in how it is written in the wiki (i.e. createVehicle, WFSideText). Essentially, it is the xml file name without .xml and not in all lowercase.version
: The version of the game that it was introduced in. This value can be anything and will most likely be a number like 1.00 or 1.56.format
: As of right now, you can completely disregard this value. The format of the .xml file (currently "1"). This value isn't ever expected to change, however, if a time comes that the format of the xml for command syntaxes becomes insufficient, the value will change from "1" to "2" or the like. It's really there to provide backwards compatibility if the format changes in the future.game
: The game that the command was introduced in. The command may be supported in more than just this game! The text value of this attribute will be non-user-friendly. The values are the "Image Link Prefix" values described here. Here is a table that correlates the values:
User-friendly name | game attribute value |
---|---|
Arma 2: Army of the Czech Republic | arma2acr |
Arma 2: British Armed Forces | arma2baf |
Arma 2: Private Military Company | arma2pmc |
Arma 2 | arma2 |
Arma 2: Operation Arrowhead | arma2oa |
Arma 3 | arma3 |
Arma 3: Zeus | zeus |
Arma 3 Development Branch | arma3dev |
Take On Helicopters | TKOH |
Operation Flashpoint | ofp |
Australians in Vietnam | aiv |
Take On Mars | TKOM |
Bohemia Interactive | bi |
Operation Flashpoint: Elite | ofpe |
Armed Assault | arma |
Virtual Battlespace 3 | vbs3 |
Operation Flashpoint: Resistance | ofpr |
Virtual Battlespace 1 | vbs1 |
Virtual Battlespace 2 | vbs2 |
The deprecated
tag has no attributes and is a child of the command
tag. If this tag exists (not guaranteed to exist), the command
is deprecated (no longer supported by Bohemia).
Example:
<command name='fakeCommand' version='1.56' game='arma3' format='1'>
<deprecated/>
...syntax tags, return tags, other things...
</command>
The uncertain
tag has no attributes and is a child of the command
tag. If this tag exists (not guaranteed to exist), the return type or
at least 1 syntax is uncertain to be correct and has been estimated (this usually happens with very poor documentation).
Example:
<command name='fakeCommand' version='1.56' game='arma3' format='1'>
<uncertain/>
...syntax tags, return tags, other things...
</command>
The syntax
tag is a nested tag in the root tag command
. This tag can occur multiple times. If there is more than one
syntax
tag, it means there is more than 1 syntax for the command. The syntax
tag has no attributes.
The parameters for the command will be nested inside a syntax
tag. All commands can have a prefix argument or a postfix
argument (prefixArgument COMMAND postfixArgument
). To access a syntax's parameters, collect all child elements of syntax
,
excluding return
.
All child elements described will either be an array
tag or a param
tag. Both tags will have an order
attribute.
The order
attribute determines whether or not the parameter is a prefix argument or a postfix argument. The order
attribute will either be "0", denoting prefix argument, or "1", denoting postfix argument.
The param
tag will have the following attributes: type
, name
, optional
, and order
. The type
attribute will be
one of the Types described below. The name
attribute will describe the parameter (e.g. vehicle, text, object) and can be
thought of as a legitimate SQF code parameter variable name (because it is). The optional
tag denotes whether or not
the parameter is optional; this attribute will have a "t" (meaning true) or "f" (meaning false) value.
The text content of the param
tag is a description about the parameter.
The optional
attribute is especially useful when the param
tag is nested in an array
tag. All optional parameters
don't need to exist. It should NEVER EVER EVER be the case that a required parameter follows an optional one! It
should always be something like as follows:
[required, required]
[required, optional]
[optional, optional]
AND NOT LIKE THIS:
[optional, required]
[optional, required, optional]
[required, optional, required]
As with return value
, the param
tag has the option for literals. The literal
tag isn't guaranteed to exist however.
See Literals for more information.
For more information on the array
tag, see Array Tag below.
Example- param
tag:
<param type='OBJECT' name='objectName' optional='f' order='0'>HI! I'm the description!</param>
Here, it is clear that the parameter is a prefix parameter since order=0 or is the first element of an array.
The return
tag describes the return type (see Types below) of the command and the tag itself has no attributes.
The return
tag has 2 possible child tags: array
and value
. The array
tag will have 2 attributes: unbounded
and order
. The value
tag will have 2 attributes: type
(see Types below), and order
.
The value
tag can be alone in the return
tag or will be nested in an array
tag. The text content of the tag will be
a description about the value. This is very useful for when the return
tag is an array
and you need descriptions
about each index.
Here are descriptions of the value
tag's attributes:
type
: The type of the value.order
: The order in which it occurs in an array if nested in anarray
tag. If thevalue
tag is not nested in anarray
tag, this attribute can be ignored.
As with params, the value
tag has the option for literals. The literal
tag isn't guaranteed to exist however.
See Literals for more information.
Example- value
tag:
<value type='NOTHING' order='0'>Description...</value>
For more information on the array
tag, see Array Tag below.
The array
tag can occur in both the return
tag and command's parameters. Both cases of the tag will have the same
attributes, except the command's parameters case will have an additional tag called optional
(see Command Parameters for more information).
The unbounded
tag will either be "t" or "f", which means true or false respectively. Unbounded arrays (unbounded
="t")
have an indeterminate length (it can be 0,1,2,3,...,50 etc). A bounded array (unbounded
="f") will have a fixed and expected
length. This length should match the number of value
tags nested in the array
tag.
This is where things begin to get tricky, because an indeterminate array may or may not conform to a possible command's argument count (a command may require 5 prefix arguments and the array may only provide 2). This is not something to worry about. It is recommend to just assume the argument count is matched when dealing with unbounded arrays.
It is often the case that an array
tag is unbounded and has a child element. This means that the command is returning an
array of that type that is unbounded. If the array
tag has more than one child, the last child is the unbounded element.
Example 1- array1
tag nested in return
:
<array unbounded='t' order='0'>
<value type='NUMBER' order='0'></value>
</array>
Here, the return type is an unbounded array of numbers (may be []
, may be [1, 2]
, may be [3.6, 9.8,1455]
, who knows).
Example 2- different unbounded:
<array unbounded='t' order='0'>
<value type='NUMBER' order='0'></value>
<value type='STRING' order='1'></value>
</array>
Here, the return type is an unbounded array of numbers and strings. The number is guaranteed to exist, however the string isn't.
Possible values: [1]
,[1, "hello"]
, [3.6,"hello","hello2"]
, etc.
Wrong values: []
, ["hi"]
,[0,0,"string"]
,etc.
Example 3- array tag with unbounded array of bounded arrays: For this example, an unbounded array of bounded arrays is expected
<array unbounded='t' order='0'>
<array unbounded='f' order='0'>
<value type='NUMBER' order='0'></value>
<value type='STRING' order='1'></value>
</array>
</array>
Possible values: []
, [[0,""]]
, [[0,""],[1,"hi"]]
Example 4- array tag nested in syntax
:
<array unbounded='f' optional='f' order='1'>
<param type='STRING' name='name1' optional='f' order='0'></param>
<param type='STRING' name='name2' optional='f' order='1'></param>
</array>
Here the array is fixed. It it is clear that this is a postfix argument (as an array) for a command with precisely 2 strings required.
The array
tag means the parameters/values are determined. The ARRAY
type described in Types is equivalent to:
<array unbounded='t'><value type='ANYTHING'></array>
or the param
tag equivalent. So, the ARRAY
type is an
unbounded array of ANYTHING. Any time you expect an array and no array
tag is present, but a value
or param
tag
type is ARRAY
, just assume it's correct.
Example- both ARRAY
type and array
tag in the same command:
The apply command xml is as follows:
<?xml version='1.0' encoding='UTF-8'?>
<command name='apply' version='1.56' game='arma3' format='1'>
<syntax>
<return>
<value type='ARRAY' order='0'>resulting array</value>
</return>
<param type='ARRAY' name='array' optional='f' order='0'>array of Anything</param>
<param type='CODE' name='code' optional='f' order='1'>code to be executed on each element of the array. Current
element value is stored in variable _x
</param>
</syntax>
</command>
You can see that it returns a value
tag, but not an array
tag. The command also takes in ARRAY
prefix parameter.
So, any time a type check happens, you could match either an array
tag from a different command or an ARRAY
type.
The alt-types
tag is meant to provide multiple return or parameter types. There are t
tags inside
the alt-types
tag, which the type
attribute of each t
tag describes the alternate type.
The alt-types
tag is not guaranteed to exist. If it doesn't exist, there is only 1 type for the return value or parameter.
Example 1- multiple return types: The return type below returns a Number, String, or Code.
<return>
<value type='NUMBER' order='0'>
returns a number, code, or string
<alt-types>
<t type='STRING'/>
<t type='CODE'/>
</alt-types>
</value>
</return>
Example 2- multiple parameter types: The parameter below returns a Number, String, or Code.
<param type='NUMBER' name='p' optional='f' order='0'>
returns a number, code, or string
<alt-types>
<t type='STRING'/>
<t type='CODE'/>
</alt-types>
</param>
Anywhere a CODE
type is specified (param t='CODE'
for example), the tag can provide a child tag code-handler
which specifies what the return type of the CODE
must be. This tag (code-handler
) is optional.
There should be only 1 code-handler
tag present. If there is more than 1, there is no guarantee of which one will be used. To provide
what the CODE
return type should be in the code-handler
tag, specify a t
attribute assigned to another Type.
The code-handler
tag only is for CODE
return types. If a Type or alternative Type doesn't actually specify a CODE
type,
the code-handler
tag will have no effect.
Note that this is a recursive definition. It is legal to do the following:
<param type='CODE' name='p' optional='f' order='0'>
<code-handler t='CODE'><code-handler t='NUMBER'/></code-handler>
<!--
Param p should return a code that returns a code that returns a number.
In SQF:
a = {
thing = {0};
thing //return thing
};
COMMAND_THAT_REQUIRES_A_CODE_PARAMETER a
-->
</param>
Example 1 - Return Type Code Handler: The return type can be a CODE
that itself should return a boolean. Notice the alternative types as well.
<return>
<value type='CODE' order='0'>
<alt-types>
<t type='STRING'/>
</alt-types>
<code-handler t='BOOLEAN'/>
</value>
</return>
Example 2- In a Parameter: should return a CODE
that itself should return a NUMBER
<param type='CODE' name='p' optional='f' order='0'>
<code-handler t='NUMBER'/>
</param>
Example 3- alt-types
tag wrong placement: notice that the code-handler
isn't in the t
tag. Due to specification, it will be ignored
because it must be a child of the owner type tag.
<param type='NUMBER' name='p' optional='f' order='0'>
<code-handler t='CONFIG'/>
<alt-types>
<t type='CODE'/>
</alt-types>
</param>
Example 4- alt-types
tag correct placement: notice that there are 2 code-handler
tags. The one in the t
tag is the one that will be used. Therefore, the CODE
type itself should return a NUMBER
and not a CONFIG
.
<param type='NUMBER' name='p' optional='f' order='0'>
<code-handler t='CONFIG'/>
<alt-types>
<t type='CODE'>
<code-handler t='NUMBER'/>
</t>
</alt-types>
</param>
Example 5- Duplicate: notice that there are 2 code-handler
tags and the param type='CODE'
is present. Which one that will be used is ambiguous.
<param type='CODE' name='p' optional='f' order='0'>
<code-handler t='CONFIG'/>
<alt-types>
<t type='CODE'>
<code-handler t='NUMBER'/>
</t>
</alt-types>
</param>
Example 6- Duplicates Again: notice that there are 2 code-handler
tags. Which one that will be used is ambiguous.
<param type='CODE' name='p' optional='f' order='0'>
<code-handler t='CONFIG'/>
<code-handler t='NUMBER'/>
</param>
The literal
tag has no attributes and the text body is the value.
Example 1- special param for createVehicle:
<param type='STRING' name='special' optional='f' order='4'>
"NONE", "FLY", "FORM", "CAN_COLLIDE". "CAN_COLLIDE" creates the vehicle exactly where asked,
not checking if others objects can cross its 3D model.
<literal>"NONE"</literal>
<literal>"FLY"</literal>
<literal>"FORM"</literal>
<literal>"CAN_COLLIDE"</literal>
</param>
This list comes from primarily here.
Any input into these types is much appreciated!
Here are all the types possible:
Type name | Presentable name | Notes |
---|---|---|
ANYTHING | Anything | Literally accept any type. Can accept Boolean, Code, anything. This is basically shorthand for an alt-types tag filled with all available types. |
ARRAY | Array | Used for when the elements in the array can't be determined. |
BOOLEAN | Boolean | |
CODE | Code | |
CONFIG | Config | |
CONTROL | Control | |
DISPLAY | Display | |
EDEN_ENTITY | Eden Entity | |
EXCEPTION_TYPE | Exception Type | |
GROUP | Group | |
LOCATION | Location | Wiki article |
NAMESPACE | Namespace | |
NET_OBJECT | NetObject | |
NUMBER | Number | |
NOTHING | Nothing | No type/value. |
OBJECT | Object | |
SCRIPT_HANDLE | Script (Handle) | |
SIDE | Side | |
STRING | String | |
STRUCTURED_TEXT | Structured Text | |
TASK | Task | |
TEAM_MEMBER | Team Member | |
VOID | Void | Differs in nothing as this is an assignable value, where nothing is no return type/value. |
IF | If Type | Created from if command. Used with do command. |
FOR | For Type | Created from for command. Used with do command. |
SWITCH | Switch Type | Created from switch command. Used with do command. |
WHILE | While Type | Created from while command. Used with do command. |
WITH | With Type | Created from with command. Used with do command. |
See this wiki article for more information on positions.
Type name | Presentable name | Array Format | Notes |
---|---|---|---|
COLOR | Color | [r:Number, g:Number, b:Number, a:Number] | Wiki article |
COLOR_RGB | Color RGB | [r:Number, g:Number, b:Number] | Notice no alpha value |
ARRAY_OF_EDEN_ENTITIES | Array of Eden Entities | See wiki article. | Wiki article |
POSITION | Position | [x:Number, y:Number, z:Number?] | Unclear what this is, but for simplicity, assume that z is optional. |
POSITION_2D | Position 2D | [x:Number, y:Number] | |
POSITION_3D | Position 3D | [x:Number, y:Number, z:Number] | |
POSITION_ASL | Position ASL | [x:Number, y:Number, z:Number] | |
POSITION_ASLW | Position ASLW | [x:Number, y:Number, z:Number] | |
POSITION_ATL | Position ATL | [x:Number, y:Number, z:Number] | |
POSITION_AGL | Position AGL | [x:Number, y:Number, z:Number] | |
POSITION_AGLS | Position AGLS | [x:Number, y:Number, z:Number] | |
POSITION_WORLD | Position World | [x:Number, y:Number, z:Number] | |
POSITION_RELATIVE | Position Relative | [x:Number, y:Number, z:Number] | |
POSITION_CONFIG | Position Config | [x:Number, z:Number, y:Number] | Notice that z and y are swapped |
VECTOR_3D | Vector 3D | [x:Number, y:Number, z:Number] | This type exists to clarify that it is a vector rather than a static position. From a type checking standpoint, it makes no difference. |
WAYPOINT | Waypoint | See Wiki | (Wiki doc)[https://community.bistudio.com/wiki/Waypoint] |
This is the xml for abs.
<?xml version='1.0' encoding='UTF-8'?>
<command name='abs' version='1.00' game='ofp' format='1'>
<syntax>
<return>
<value type='NUMBER' order='0'></value>
</return>
<param type='NUMBER' name='n' optional='f' order='1'></param>
</syntax>
</command>
This is the xml for actionKeys.
<?xml version='1.0' encoding='UTF-8'?>
<command name='actionKeys' version='1.00' game='arma' format='1'>
<syntax>
<return>
<array unbounded='t' order='0'>
<value type='NUMBER' order='0'></value>
</array>
</return>
<param type='STRING' name='userAction' optional='f' order='1'></param>
</syntax>
</command>
This is the xml for animate. This command has both a prefix argument and a postfix argument.
<?xml version='1.0' encoding='UTF-8'?>
<command name='animate' version='1.75' game='ofpr' format='1'>
<syntax>
<return>
<value type='NOTHING' order='0'></value>
</return>
<param type='OBJECT' name='objectName' optional='f' order='0'></param>
<array unbounded='f' optional='f' order='1'>
<param type='STRING' name='animationName' optional='f' order='0'>name of the animation. This is the
class-name of the animation defined in the config.
</param>
<param type='NUMBER' name='phase' optional='f' order='1'>range 0 (start point of the animation) to 1 (end
point of the animation). The speed, in which the animation is processed, is defined in the addon's
config.cpp and cannot be changed during running missions.
</param>
<param type='BOOLEAN' name='speed' optional='f' order='2'>When true animation is instant. Since Arma 3
v1.65.138459 Number > 0 is treated as config speed value multiplier
<alt-types>
<t type='NUMBER'/>
</alt-types>
</param>
</array>
</syntax>
</command>
This is the xml for actionIDs. This command has an unbounded return.
<?xml version='1.0' encoding='UTF-8'?>
<command name='actionIDs' version='1.63' game='arma3' format='1'>
<syntax>
<return>
<array unbounded='t' order='0'>
<value type='NUMBER' order='0'></value>
</array>
</return>
<param type='OBJECT' name='entity' optional='f' order='1'>entity with added user actions</param>
</syntax>
</command>