Arx scripting language
This article describes the scripting language used in Arx Fatalis and Arx Libertatis. Arx scripting language files use the .asl
file extension.
Syntax
Scripts are case insensitive - Arx Libertatis converts the entire script source to lowercase.
Events
- Main article: Script:Events.
Variables
- 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.
Commands
- Main article: Script:Commands.
Comments
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.
Blocks
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.
Labels
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.
Examples
See the ASL Cookbook for examples of useful commands.
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.