DO/CTL
From Dark Omen Wiki
(→Dump of the Script Commands) |
m (→CTL Engine Control Flag) |
||
(28 intermediate revisions not shown) | |||
Line 1: | Line 1: | ||
+ | <div style="float:right; margin-left: 2em; padding: 1em; border: 1px solid black; background: rgb(225, 235, 225);"> | ||
__TOC__ | __TOC__ | ||
- | = | + | <br /> |
+ | <div style=""> | ||
+ | '''Sub-pages:''' | ||
+ | :* [[DO/CTL/OpCodes|Documentation of opcodes]] | ||
+ | :* [[DO/CTL/Flags|Unit flags in CTL code]] | ||
+ | :* [[DO/CTL/Events|Ids used in the Unit Event Handler]] | ||
+ | :* [[DO/CTL/Code examples|Example CTL scripts]] | ||
+ | </div> | ||
+ | </div> | ||
- | + | CTL is the script executed on the battlefield. It's used to control the AI and it implements the logic of all units (also of allied ones). Use [http://en.dark-omen.org/downloads/view-details/1.-modding-tools/4.-miscellaneous-tools/ctldis.html CTLdis] to modify CTL files. | |
+ | == Structure == | ||
- | + | A CTL file consists of many functions. On startup every regiment executes one of these functions. Functions starting from 100 are common functions used in all CTL files. Allied units always execute .func 100. | |
- | + | ||
- | + | ||
- | + | ||
- | + | Example of a script function: | |
- | + | .func 2 | |
- | + | init_unit 128 | |
+ | clear_ctrl_flag 32768 | ||
+ | set_label 43970 | ||
+ | #3c 240, 0 | ||
+ | set_event_handler 15 | ||
+ | #3e 13, 31 | ||
+ | wait_for_deploy | ||
+ | saveip | ||
+ | goto 7 | ||
- | + | A line always contains an opcode name (or #xy if the function is unknown) followed by an argument list. For a documentation of the known opcodes see the [[DO/CTL/OpCodes|opcodes subarticle]]. | |
- | The | + | The script is connected via ARM and BTB file (Chunk <6000>): |
- | + | [[File:Armbtbctl.png]] | |
- | + | == Unit Flags == | |
- | + | The unit flags indicate the current status of the unit, like in combat or retreating. Most flags are still unknown. See the [[DO/CTL/Flags|Flags subarticle]] for a list. | |
- | + | == Call Stack == | |
- | + | Every unit contains a call stack that can contain up to 48 elements. It's is used by call statements (to store calling function and line) and loops (to store the loop begin line). | |
+ | |||
+ | == Event handling == | ||
- | + | Every unit executes an event handler to allow communication between the regiments. It gets assigned with the command set_event_handler following the function. In the example above the handler would be function 15. | |
- | + | Everytime the regiment script executes it will check if new messages are pending. If yes it will call into the event handler (and store return func and position on the stack). After the event handling it will return to the old function if it was not altered with one of the set_event_handler_return_function commands (see also CTL Engine Control Flag below). | |
- | + | All events are stored in a global message queue and have the following structure: | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | struct EventMessage { | |
- | + | DWORD targetId; | |
- | + | DWORD eventId; | |
- | + | DWORD arg1; // usually the source | |
- | + | DWORD arg2; | |
- | + | DWORD arg3; | |
- | + | DWORD arg4; | |
- | + | DWORD arg5; | |
- | + | DWORD indexLast; // -1 if the msg was handled | |
- | + | } | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | Most functions set arg1 to the id of the sender. The id is an incrementing number starting with 0. At first the enemies get an id (in ARM-file order) followed by the allied units (only the ones available on the map). After the allied units the furniture (like destructable houses) follows. But the furniture does not execute a script function. | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | For a list of common events see the [[DO/CTL/Events|Event subarticle]]. | |
- | + | ||
- | + | ||
- | + | ||
- | + | == CTL Engine Control Flag == | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | The behaviour of the CTL-Engine can be altered by setting flags in the Control Flag. Every unit stores its own version of the control flag. | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | {|class="wikitable" | |
- | + | ! Bit !! Notes | |
- | + | |- | |
- | + | |2 | |
+ | |Indicates "true" (set by conditional commands) | ||
+ | |- | ||
+ | |3 | ||
+ | |Indicates that return_from_event_handler shall return to a different function which was set with one of the set_event_handler_return_function commands. If the new return function is the same as the old one the execution will continue at the old position (like a normal return). | ||
+ | |- | ||
+ | |5 | ||
+ | |Only works in combination with bit 3. If this flag is set the stack content is ignored, execution always continues at the beginning of the function. | ||
+ | |} |
Current revision as of 21:39, 8 April 2012
Contents |
CTL is the script executed on the battlefield. It's used to control the AI and it implements the logic of all units (also of allied ones). Use CTLdis to modify CTL files.
Structure
A CTL file consists of many functions. On startup every regiment executes one of these functions. Functions starting from 100 are common functions used in all CTL files. Allied units always execute .func 100.
Example of a script function:
.func 2 init_unit 128 clear_ctrl_flag 32768 set_label 43970 #3c 240, 0 set_event_handler 15 #3e 13, 31 wait_for_deploy saveip goto 7
A line always contains an opcode name (or #xy if the function is unknown) followed by an argument list. For a documentation of the known opcodes see the opcodes subarticle.
The script is connected via ARM and BTB file (Chunk <6000>):
Unit Flags
The unit flags indicate the current status of the unit, like in combat or retreating. Most flags are still unknown. See the Flags subarticle for a list.
Call Stack
Every unit contains a call stack that can contain up to 48 elements. It's is used by call statements (to store calling function and line) and loops (to store the loop begin line).
Event handling
Every unit executes an event handler to allow communication between the regiments. It gets assigned with the command set_event_handler following the function. In the example above the handler would be function 15.
Everytime the regiment script executes it will check if new messages are pending. If yes it will call into the event handler (and store return func and position on the stack). After the event handling it will return to the old function if it was not altered with one of the set_event_handler_return_function commands (see also CTL Engine Control Flag below).
All events are stored in a global message queue and have the following structure:
struct EventMessage { DWORD targetId; DWORD eventId; DWORD arg1; // usually the source DWORD arg2; DWORD arg3; DWORD arg4; DWORD arg5; DWORD indexLast; // -1 if the msg was handled }
Most functions set arg1 to the id of the sender. The id is an incrementing number starting with 0. At first the enemies get an id (in ARM-file order) followed by the allied units (only the ones available on the map). After the allied units the furniture (like destructable houses) follows. But the furniture does not execute a script function.
For a list of common events see the Event subarticle.
CTL Engine Control Flag
The behaviour of the CTL-Engine can be altered by setting flags in the Control Flag. Every unit stores its own version of the control flag.
Bit | Notes |
---|---|
2 | Indicates "true" (set by conditional commands) |
3 | Indicates that return_from_event_handler shall return to a different function which was set with one of the set_event_handler_return_function commands. If the new return function is the same as the old one the execution will continue at the old position (like a normal return). |
5 | Only works in combination with bit 3. If this flag is set the stack content is ignored, execution always continues at the beginning of the function. |