Talk:DO/CTL/OpCodes
From Dark Omen Wiki
(stack machine?) |
m (had an outdated version of ctldis. code updated) |
||
Line 22: | Line 22: | ||
Basic Unit activation (Trading Post Goblins), not always used: | Basic Unit activation (Trading Post Goblins), not always used: | ||
- | + | clear_unit_flag2 2048 ; Activates the Banner graphic (not needed but really useful ;)) | |
#53 24 ; Teleport node (see above) | #53 24 ; Teleport node (see above) | ||
#71 ; Normal Teleport | #71 ; Normal Teleport | ||
- | #50 ; | + | #50 ; Unknown |
- | #3c 240, 0 | + | #3c 240, 0 ; Unknown |
- | + | wait_unit_flag1_clear 8 | |
Typical way to block a regiment until the player reaches a special point: | Typical way to block a regiment until the player reaches a special point: | ||
Line 45: | Line 45: | ||
test_r_eq_i 6, 0 ; If one of the two above events happened the unit will be spawned | test_r_eq_i 6, 0 ; If one of the two above events happened the unit will be spawned | ||
whilenot | whilenot | ||
- | + | clear_unit_flag2 2048 (rest see above) | |
The above code is often shared for lots of regiments to allow simultanious spawning of them (at different node id of course ;)) | The above code is often shared for lots of regiments to allow simultanious spawning of them (at different node id of course ;)) |
Revision as of 17:35, 23 February 2010
Contents |
Raising and teleporting
Will be added later to the table:
#b5 0, nodeid, 8192
True if one of the players regiments is in the circle defined by nodeid.
What the 0 and 8192 (a flag?) checks is unknown. Only tested in B1_07 (Attack Helmgart). Every #b5 uses 0 and 8192 there...
#53 nodeid
(necromancer in helmgart has #54 nodeid, not tested if this is the same)
Teleports a regiment. This is used as a part of unit activation (=teleport on the map)
Attention: #53 must be followed by either #55 or #71 or the unit will glitch to the node!
#71 does a simple teleport and #55 does a zombie-raise-animation (only works for zombie sprite)
Basic Unit activation (Trading Post Goblins), not always used:
clear_unit_flag2 2048 ; Activates the Banner graphic (not needed but really useful ;)) #53 24 ; Teleport node (see above) #71 ; Normal Teleport #50 ; Unknown #3c 240, 0 ; Unknown wait_unit_flag1_clear 8
Typical way to block a regiment until the player reaches a special point:
set_r_i 6, 1 ; Set register 6 to 1 do set_wait_time 6 wait #b5 0, 15, 8192 ; Check if player hit node 15 iftrue set_r_i 6, 0 endif #d6 0 ; Unknown, but works with only #b5 of course too... iffalse set_r_i 6, 0 endif test_r_eq_i 6, 0 ; If one of the two above events happened the unit will be spawned whilenot clear_unit_flag2 2048 (rest see above)
The above code is often shared for lots of regiments to allow simultanious spawning of them (at different node id of course ;))
Hm stupid wiki converts # to a enumeration... (1., 2., 3.)
--Ghabry 02:02, 23 February 2010 (UTC)
CTL is a stack machine?
Checking the opcodes and reading the snippets, I get the feeling that CTL is a stack machine, that is, all operations are pushed and popped through the stack. Therefore, all operations push their result to the stack, and f.i. while and whilenot does not check the last operation, as said in the article, but rather the top item of the stack (which usually is the same thing as the last operation, though). I don't know, just thought I'd throw it here and see what you think. So the last code example would be interpreted like this:
do set_wait_time 6 wait #b5 0, 15, 8192 ; Check if player hit node 15, push result iftrue ; ?pop stack?, cmp value set_r_i 6, 0 endif #d6 0 ; ? cmp current value ? iffalse set_r_i 6, 0 endif test_r_eq_i 6, 0 ; Test reg6 against false (0) ; ? Does this push result or set current value ? whilenot ; if ??stack top or current value?? is false goto do
--Mikademus 11:06, 23 February 2010 (UTC)