Arx scripting language

From Arx Libertatis Wiki
Jump to navigation Jump to search

This article describes the scripting language used in Arx Fatalis and Arx Libertatis.


Scripts are case insensitive - Arx Libertatis converts the entire script source to lowercase.


Main article: Script:Events.


Main article: Script:Variables.

Arx scripts know three basic data types: int, number and string. Variables can be either global (shared between all entities) or entity-specific. There are also special system variables than can only be read. The variable type is defined by the first character of the variable name.

Char Byte Scope Type
# 0x23 global int
& 0x26 global number
$ 0x24 global string
§ 0xA7 entity int
@ 0x40 entity number
£ 0xA3 entity string
^ 0x5E system (mixed)

While variables in Arx scripts are typed, there are no type restrictions for where variables are used: the types are converted automatically.


Main article: Script:Commands.


Comments start with // and go until the end of the line. Because scripts are not properly parsed, // in unquoted parameters will be treated as a comment. There are no multi-line comments, but two tricks can be used to skip multiple lines of code:

Because delayed command execution requires the byte position of these commands to no change to preserve save file compatibility, Arx Fatalis scripts will often contain events or labels with the first character of the name changed to _.

Another way to unconditionally skip execution of some code is to surround it with else { and } without any preceding if or other conditional command.

Control flow

Main article: Category:Script control flow.

Execution of the current event is terminated with the accept or refuse commands. For entity instance scripts, refuse ends event execution completely while accept allows execution to continue in the entity class script.


The if, else, random, ifvisible and ifexistinternal commands will skip the next block under certain conditions. A block is either a series of commands on the same line { followed by all commands until the next matching }. If the next command after a skipped block is else, that command will be skipped as well and the following block (which would normally be skipped by else) will be executed.


The two characters >> followed directly by a name define a label. These are skipped when encountered during normal execution but can serve as the target to jump to for a goto or gosub command. Execution of the next command after gosub can be resumed using the return command

Arx Libertatis ignores labels inside comments while Arx Fatalis 1.21 will happily jump to them.

Commands as parameters

Main article: Script:Commands#Other commands as parameters.

Some commands take another command as their last parameter. For such commands all following commands on the same line will be skipped during normal execution. Then after some action started by the command is completed these commands will be executed using the special executeline event.

Search script files

mkdir assets
cd assets
arxunpak ~/.local/share/arx/{data,loc,data2,sfx,speech}.pak
grep -rP -ia 's_*p_*e_*c_*i_*a_*l_*f_*x' graph/obj3d/interactive/

Arx Libertatis comes with the find-script-command helper in the scripts directory to allow searching for script commands without manually creating a grep expression like the one above.