=CMD =COMMAND once =DESC Start a block of instructions that are executed once only for the lifetime of the tower the script is associated with. =ENDDESC =EX once trace("42") #Only prints once endonce =ENDEX =ENDCMD =CMD =COMMAND endonce =DESC Ends a block defined by once. =ENDDESC =EX once trace("42") #Only prints once endonce =ENDEX =ENDCMD =CMD =COMMAND if (bool) =DESC bool ARG1: The value to evaluate

Evaluate the first element on the stack. If True, then execute statements that follow, up to the endif or else statement. If False, execution skips to the first statement following the endif or else statement. Any nonzero value is considered True, a value of zero is False. =ENDDESC =EX if (<-var eq (1)) #Do Something endif =ENDEX =ENDCMD =CMD =COMMAND else =DESC When the if statement evaluates to False, then the statements following the else, up to the endif, are executed instead. =ENDDESC =EX if (<-var eq (1)) #Do something else #Do something else endif =ENDEX =ENDCMD =CMD =COMMAND endif =DESC Delimits the scope of an if-else-statement. Instructions between the if and endif statement are conditionally executed, depending on the results of the if evaluation. =ENDDESC =EX if (<-var eq (1)) #Do something else #Do something else endif =ENDEX =ENDCMD =CMD =COMMAND do =DESC The statements following the do, up to the loop statement, are executed repeatedly. Each iteration (loop), the initial value (Index) is incremented by one at the bottom of the loop and compared to Limit. When Index=Limit, execution will proceed at the first statement following Loop. Loops can be nested, but no more than 3 deep. See also: I, J and K

NOTE: Limit comes first, then the initial value (index). This means that the first number should usually be bigger than the second number. =ENDDESC =EX do(5 0) trace(I) loop =ENDEX =ENDCMD =CMD =COMMAND loop =DESC Terminates the 'do' instruction. Control flow will return to the 'do' instruction until the Index is equal to the Limit. =ENDDESC =EX do(5 0) trace(I) loop =ENDEX =ENDCMD =CMD =COMMAND I number =DESC Current loop Index. Pushes the value of the current loop onto the stack. Only use within loops =ENDDESC =EX do(5 0) trace(I) loop =ENDEX =ENDCMD =CMD =COMMAND J number =DESC First outer loop index. When loops are nested, this pushes the value of the first (or only) outer loop onto the stack. =ENDDESC =EX do(2 1) do(4 3) I mul(J) trace loop loop =ENDEX =ENDCMD =CMD =COMMAND K number =DESC Outer loop index. When loops are nested, this pushes the value of the outermost loop onto the stack. =ENDDESC =EX do(2 1) do(4 3) do(6 5) trace(I J K mul mul) loop loop loop =ENDEX =ENDCMD =CMD =COMMAND while =DESC Beginning of a while loop. The statements between a 'while' and a 'repeat' should ultimately push a value to the stack that will determine if the loop executes the body of the 'repeat' block. =ENDDESC =EX 5 ->y while <-y gt(0) #is y greater than zero? repeat #repeat this section of code trace(<-y) <-y sub(1) ->y #subtract 1 from y so we don't end in infinite loop endwhile =ENDEX =ENDCMD =CMD =COMMAND repeat (bool) =DESC Pops an item from the stack. If true, execute the following statements. If false, jump to the statement following 'endwhile'. =ENDDESC =EX 5 ->y while <-y gt(0) #is y greater than zero? repeat #repeat this section of code trace(<-y) <-y sub(1) ->y #subtract 1 from y so we don't end in infinite loop endwhile =ENDEX =ENDCMD =CMD =COMMAND endwhile =DESC Returns execution to the 'while' statement. Note that endwhile is only executed, if 'repeat' evaluated to true. =ENDDESC =EX 5 ->y while <-y gt(0) #is y greater than zero? repeat #repeat this section of code trace(<-y) <-y sub(1) ->y #subtract 1 from y so we don't end in infinite loop endwhile =ENDEX =ENDCMD =CMD =COMMAND break =DESC Immediately exits the body of a 'while/repeat/endwhile' block or a 'do/loop' block. =ENDDESC =EX do(5 0) if (I mod(2) eq0) #divide inner loop with modulo 2 and test if zero break endif trace(I) loop =ENDEX =ENDCMD =CMD =COMMAND return =DESC Stops execution of a function call and returns immediately. If called from some place other than a function, it will stop the script execution and 'return' immediately. Useful for aborting function execution or script execution when necessary. =ENDDESC =EX trace("42") @MyFunc :MyFunc trace("1") return trace("2") =ENDEX =ENDCMD =CMD =COMMAND delay (number) =DESC The number of game loops to wait before allowing execution to pass to the next command. Timers used via SetTimer(0-3) continue to run and expire even while the script is delayed. =ENDDESC =EX #Stop runtime of the script for 30 game ticks, equivalent of 1 second. delay(30) trace(GetUpdateCount) =ENDEX =ENDCMD