Console Script Grammar: Difference between revisions
(Adds difference) |
|||
Line 46: | Line 46: | ||
== <code>include</code> and <code>run</code> == | == <code>include</code> and <code>run</code> == | ||
Both <code>include</code> and <code>run</code> trigger the interpretation of another .con file. They also have the ability to set ''arguments'', which are a special type of mutable variable. For example: | Both <code>include</code> and <code>run</code> trigger the interpretation of another .con file. | ||
They also have the ability to set ''arguments'', which are a special type of mutable variable. For example: | |||
run test.con 1 2 3 | run test.con 1 2 3 | ||
Runs test.con. In test.con, the variables <code>v_arg1</code>, <code>v_arg2</code> and <code>v_arg3</code> are set to <code>1</code>, <code>2</code> and <code>3</code> respectively. | Runs test.con. In test.con, the variables <code>v_arg1</code>, <code>v_arg2</code> and <code>v_arg3</code> are set to <code>1</code>, <code>2</code> and <code>3</code> respectively. |
Revision as of 08:08, 12 August 2022
Con files are the core of how Battlefield 2 (and 1942 before it) configures its weapons, maps, objects, players and other game assets. These files can be run by the engine or from within the in-game console. The in-game console uses the exact same syntax with the notable difference that multi-line commands like beginRem
do not work. With Battlefield 2, the console grammar has extended into a rudimentry scripting language, with loops and full conditionals. Battlefield 1942 had only very rudimentry conditionals.
Comments
There exist two classes of comments, block:
beginRem this text is ignored endRem
and line:
rem this text is ignored
Statements
Statements are a command followed by a number of optionally "quoted", whitespace-seperated arguments. The number of arguments may be variable or strictly limited by the command in use. The available commands is beyond the scope of this page, but a good portion of them are included with the editor. A full list is available by running GNU strings
against your bf2.exe ;)
Variables
Variables must be predefined, and have a strict naming system. All mutable variables must begin with v_
whereas all immutable variables or constants must begin with c_
. It's a simple form of wikipedia:Hungarian Notation.
Mutable Variables
The code:
var v_dongs = test
Defines a new variable called dongs or v_dongs depending on your point of view with the value "test". When defining a variable you can omit the default value however:
var v_dongs
is a value construct for example.
Immutable Variables
const c_butts = test
Defines a constant called, again, butts or c_butts with the value "test". Obviously, this variable cannot be changed.
const
vs. var
and assignments
Assigning to a variable is as simple as appending -> v_varname
to any command. However, many commands do not return a value. The ones that do generally return either a boolean value (0
or 1
) or a simple string.
Clearly, trying to assign to a const
variable is an error and will not work.
Conditionals
Conditionals include the standard if ... endIf
, if ... elseIf ... endIf
and while ... endWhile
constructs. These evaluate an expression.
Expressions
The grammar of an expression is roughly:
<variable> <comparator> <value>
Where
- variable is any variable name beginning with
v_
orc_
. - comparator is one of
==
,!=
,>
,>=
,<
or<=
or their textual equivalents:lessOrEqualThan
,lessThan
,greaterOrEqualThan
,greaterThan
,notEquals
,equals
. - value is any literal string, quoted if neccessary.
Return
You may cease interpretation of the current .con file by using the command return
. This resumes interpretation from the calling file. It is an error to use this unless the file was called with...
include
and run
Both include
and run
trigger the interpretation of another .con file.
They also have the ability to set arguments, which are a special type of mutable variable. For example:
run test.con 1 2 3
Runs test.con. In test.con, the variables v_arg1
, v_arg2
and v_arg3
are set to 1
, 2
and 3
respectively.
Typically this is used along with a conditional to do something for the editor mode, or to do something different for single player mode (a common use in BF1942, where this method also existed).
As for differences, run
seems to create a new scope while include
does not.
An Example
var v_tst fileManager.fileExists movies/menu.bik -> v_tst if v_tst == 0 fileManager.copyFile ../../mods/bf2/movies/menu.bik movies/menu.bik fileManager.copyFile ../../mods/bf2/movies/menu_loggedin.bik movies/menu_loggedin.bik endIf
This example checks if movies/menu.bik exists, and if it doesn't copies two files from the bf2
mod to the current mod.