Difference between revisions of "Logic Syntax"

From AGI Wiki
Jump to navigationJump to search
(Created page with "This article describes the '''logic syntax''' for the C-like "official" AGI syntax described in the AGI Specs and supported by AGI Studio and Wi...")
 
(23 intermediate revisions by the same user not shown)
Line 1: Line 1:
 +
[[Tutorials and Guides|Tutorials and Guides Table of Contents]]<br />
 +
 +
<div align="center"><span style="font-size: 22pt">Logic Syntax</span><!-- <br />
 +
''By '' --></div>
 +
 +
&nbsp;
 +
 
This article describes the '''logic syntax''' for the C-like "official" AGI syntax described in the [[AGI Specs|AGI Specs]] and supported by [[AGI Studio|AGI Studio]] and [[WinAGI|WinAGI]].
 
This article describes the '''logic syntax''' for the C-like "official" AGI syntax described in the [[AGI Specs|AGI Specs]] and supported by [[AGI Studio|AGI Studio]] and [[WinAGI|WinAGI]].
  
Line 8: Line 15:
  
 
<div class="CodeBlockHeader">Code:</div>
 
<div class="CodeBlockHeader">Code:</div>
<div class="CodeBlockStyle">
+
<syntaxhighlight lang="agi">
 
assign.v(v50,0);
 
assign.v(v50,0);
  
 
program.control();
 
program.control();
</syntaxhighlight></div>
+
</syntaxhighlight>
  
 
Multiple commands may be placed on the one line:  
 
Multiple commands may be placed on the one line:  
  
 
<div class="CodeBlockHeader">Code:</div>
 
<div class="CodeBlockHeader">Code:</div>
<div class="CodeBlockStyle">
+
<syntaxhighlight lang="agi">
 
reset(f6); reset(f7);
 
reset(f6); reset(f7);
</syntaxhighlight></div>
+
</syntaxhighlight>
  
 
Substitutions for the following action commands are available:
 
Substitutions for the following action commands are available:
  
 
<div class="CodeBlockHeader">Code:</div>
 
<div class="CodeBlockHeader">Code:</div>
<div class="CodeBlockStyle">
+
<syntaxhighlight lang="agi">
 
increment(v30);      v30++;
 
increment(v30);      v30++;
 
decrement(v30);      v30--;
 
decrement(v30);      v30--;
Line 41: Line 48:
 
lindirectv(v30,v32); *v30 = v32;
 
lindirectv(v30,v32); *v30 = v32;
 
rindirect(v30,v32);  v30 = *v32;
 
rindirect(v30,v32);  v30 = *v32;
</syntaxhighlight></div>
+
</syntaxhighlight>
  
 
== If structures and test commands ==
 
== If structures and test commands ==
Line 48: Line 55:
  
 
<div class="CodeBlockHeader">Code:</div>
 
<div class="CodeBlockHeader">Code:</div>
<div class="CodeBlockStyle">
+
<syntaxhighlight lang="agi">
 
if (test commands) {
 
if (test commands) {
 
   action commands
 
   action commands
 
}
 
}
</syntaxhighlight></div>
+
</syntaxhighlight>
  
 
or like this
 
or like this
  
 
<div class="CodeBlockHeader">Code:</div>
 
<div class="CodeBlockHeader">Code:</div>
<div class="CodeBlockStyle">
+
<syntaxhighlight lang="agi">
 
if (test commands) {
 
if (test commands) {
 
   action commands
 
   action commands
Line 64: Line 71:
 
   more action commands
 
   more action commands
 
}
 
}
</syntaxhighlight></div>
+
</syntaxhighlight>
  
 
Carriage returns are not necessary:
 
Carriage returns are not necessary:
  
 
<div class="CodeBlockHeader">Code:</div>
 
<div class="CodeBlockHeader">Code:</div>
<div class="CodeBlockStyle">
+
<syntaxhighlight lang="agi">
 
if (test commands) { action Commands } else { more action commands }
 
if (test commands) { action Commands } else { more action commands }
</syntaxhighlight></div>
+
</syntaxhighlight>
  
  
Line 77: Line 84:
  
 
<div class="CodeBlockHeader">Code:</div>
 
<div class="CodeBlockHeader">Code:</div>
<div class="CodeBlockStyle">
+
<syntaxhighlight lang="agi">
 
if (isset(f5) &&
 
if (isset(f5) &&
 
     greatern(v5,6)) { ......
 
     greatern(v5,6)) { ......
</syntaxhighlight></div>
+
</syntaxhighlight>
  
 
Again, carriage returns are not necessary within the if statement:
 
Again, carriage returns are not necessary within the if statement:
  
 
<div class="CodeBlockHeader">Code:</div>
 
<div class="CodeBlockHeader">Code:</div>
<div class="CodeBlockStyle">
+
<syntaxhighlight lang="agi">
 
if (lessn(v5,6) && (greatern(v5,2)) { .......
 
if (lessn(v5,6) && (greatern(v5,2)) { .......
  
 
if (isset(f90) && equalv(v32,v34) &&
 
if (isset(f90) && equalv(v32,v34) &&
 
     greatern(v34,20)) { .......
 
     greatern(v34,20)) { .......
</syntaxhighlight></div>
+
</syntaxhighlight>
  
 
A&nbsp;! placed in front of a command signifies a NOT.
 
A&nbsp;! placed in front of a command signifies a NOT.
  
 
<div class="CodeBlockHeader">Code:</div>
 
<div class="CodeBlockHeader">Code:</div>
<div class="CodeBlockStyle">
+
<syntaxhighlight lang="agi">
 
if (!isset(f7)) {
 
if (!isset(f7)) {
 
   ......
 
   ......
</syntaxhighlight></div>
+
</syntaxhighlight>
  
 
Boolean expressions are not necessarily simplified so they must follow the rules set down by the file format. If test commands are to be ORred together, they must be placed in brackets.
 
Boolean expressions are not necessarily simplified so they must follow the rules set down by the file format. If test commands are to be ORred together, they must be placed in brackets.
  
 
<div class="CodeBlockHeader">Code:</div>
 
<div class="CodeBlockHeader">Code:</div>
<div class="CodeBlockStyle">
+
<syntaxhighlight lang="agi">
 
if ((isset(f1) || isset(f2)) {
 
if ((isset(f1) || isset(f2)) {
 
   ......
 
   ......
Line 111: Line 118:
  
 
if (isset(1) || (isset(2) && isset(3))) {    is NOT legal
 
if (isset(1) || (isset(2) && isset(3))) {    is NOT legal
</syntaxhighlight></div>
+
</syntaxhighlight>
  
 
Depending on the compiler, simplification of boolean expressions may be supported, so the above may not apply in all cases (although if these are rules are followed then the logic will work with all compilers).
 
Depending on the compiler, simplification of boolean expressions may be supported, so the above may not apply in all cases (although if these are rules are followed then the logic will work with all compilers).
Line 118: Line 125:
  
 
<div class="CodeBlockHeader">Code:</div>
 
<div class="CodeBlockHeader">Code:</div>
<div class="CodeBlockStyle">
+
<syntaxhighlight lang="agi">
 
equaln(v30,4)      v30 == 4
 
equaln(v30,4)      v30 == 4
 
equalv(v30,v32)    v30 == v32
 
equalv(v30,v32)    v30 == v32
Line 131: Line 138:
 
!lessn(v30,4)      v30 = 4
 
!lessn(v30,4)      v30 = 4
 
!lessv(v30,v32)    v30 = v32
 
!lessv(v30,v32)    v30 = v32
</syntaxhighlight></div>
+
</syntaxhighlight>
  
 
Also, flags can be tested for by just using the name of the flag:
 
Also, flags can be tested for by just using the name of the flag:
  
 
<div class="CodeBlockHeader">Code:</div>
 
<div class="CodeBlockHeader">Code:</div>
<div class="CodeBlockStyle">
+
<syntaxhighlight lang="agi">
 
if (f6) { .....
 
if (f6) { .....
  
 
if (v7 > 0 && !f6) { .....
 
if (v7 > 0 && !f6) { .....
</syntaxhighlight></div>
+
</syntaxhighlight>
  
 
which is equivalent to:
 
which is equivalent to:
  
 
<div class="CodeBlockHeader">Code:</div>
 
<div class="CodeBlockHeader">Code:</div>
<div class="CodeBlockStyle">
+
<syntaxhighlight lang="agi">
 
if (isset(f6)) { .....
 
if (isset(f6)) { .....
  
 
if (v7 > 0 && !isset(f6)) { .....
 
if (v7 > 0 && !isset(f6)) { .....
</syntaxhighlight></div>
+
</syntaxhighlight>
  
 
== Argument types ==
 
== Argument types ==
Line 156: Line 163:
  
 
{| border="1" cellpadding="5"
 
{| border="1" cellpadding="5"
! Type
+
! Type!! Prefix
! Prefix
 
 
|-
 
|-
| Number
+
| Number|| (no prefix)
| (no prefix)
 
 
|-
 
|-
|
+
|[[Variable|Variable]]||v
[[Variable|Variable]]
 
| v
 
 
|-
 
|-
|
+
|[[Flag|Flag]]|| f
[[Flag|Flag]]
 
| f
 
 
|-
 
|-
|
+
|[[Message|Message]]|| m
[[Message|Message]]
 
| m
 
 
|-
 
|-
|
+
|[[Animated Object|Object]]|| o
[[Animated object|Object]]
 
| o
 
 
|-
 
|-
|
+
|[[Inventory item|Inventory item]]|| i
[[Inventory item|Inventory item]]
 
| i
 
 
|-
 
|-
|
+
|[[String|String]]|| s
[[String|String]]
 
| s
 
 
|-
 
|-
|
+
|[[Word|Word]]|| w
[[Word|Word]]
 
| w
 
 
|-
 
|-
|
+
|[[Controller|Controller]]|| c
[[Controller|Controller]]
 
| c
 
 
|}
 
|}
  
Line 204: Line 193:
  
 
<div class="CodeBlockHeader">Code:</div>
 
<div class="CodeBlockHeader">Code:</div>
<div class="CodeBlockStyle">
+
<syntaxhighlight lang="agi">
 
move.obj(o4, 80, 120, 2, f66);
 
move.obj(o4, 80, 120, 2, f66);
  
 
if (obj.in.box(o2, 30, 60, 120, 40)) { .....
 
if (obj.in.box(o2, 30, 60, 120, 40)) { .....
</syntaxhighlight></div>
+
</syntaxhighlight>
  
For a complete list of the commands and their argument types, see [[Logic commands by name|Logic commands by name]].
+
For a complete list of the commands and their argument types, see [[Logic Commands by Name|Logic commands by name]].
  
 
Messages and inventory items may be given in either numerical or text format:
 
Messages and inventory items may be given in either numerical or text format:
  
 
<div class="CodeBlockHeader">Code:</div>
 
<div class="CodeBlockHeader">Code:</div>
<div class="CodeBlockStyle">
+
<syntaxhighlight lang="agi">
 
print("He's not here.");
 
print("He's not here.");
  
Line 224: Line 213:
 
if (has(i9)) { .....
 
if (has(i9)) { .....
  
</syntaxhighlight></div>
+
</syntaxhighlight>
 +
 
 
Messages can also be split over multiple lines:
 
Messages can also be split over multiple lines:
  
 
<div class="CodeBlockHeader">Code:</div>
 
<div class="CodeBlockHeader">Code:</div>
<div class="CodeBlockStyle">
+
<syntaxhighlight lang="agi">
 
print("This message is split "
 
print("This message is split "
 
       "over multiple lines.");
 
       "over multiple lines.");
</syntaxhighlight></div>
+
</syntaxhighlight>
  
 
Quote marks must be used around messages and inventory item names. This is important because some messages or inventory item names may contain parentheses or commas, which could confuse the compiler. This is also the case for the said command which will be described shortly.
 
Quote marks must be used around messages and inventory item names. This is important because some messages or inventory item names may contain parentheses or commas, which could confuse the compiler. This is also the case for the said command which will be described shortly.
  
 
<div class="CodeBlockHeader">Code:</div>
 
<div class="CodeBlockHeader">Code:</div>
<div class="CodeBlockStyle">
+
<syntaxhighlight lang="agi">
 
if (has("Buckazoid(s)")) { .....  // no ambiguity here about where
 
if (has("Buckazoid(s)")) { .....  // no ambiguity here about where
 
                                   // the argument ends
 
                                   // the argument ends
</syntaxhighlight></div>
+
</syntaxhighlight>
  
 
If quote marks are part of the message or inventory object, a \ should be placed in front of these. To use a \, \\ should be used. \n can also be used for a new line.
 
If quote marks are part of the message or inventory object, a \ should be placed in front of these. To use a \, \\ should be used. \n can also be used for a new line.
Line 246: Line 236:
  
 
<div class="CodeBlockHeader">Code:</div>
 
<div class="CodeBlockHeader">Code:</div>
<div class="CodeBlockStyle">
+
<syntaxhighlight lang="agi">
 
if (said(4, 80)) { .....
 
if (said(4, 80)) { .....
</syntaxhighlight></div>
+
</syntaxhighlight>
  
 
Words can also be given in place of the numbers:
 
Words can also be given in place of the numbers:
  
 
<div class="CodeBlockHeader">Code:</div>
 
<div class="CodeBlockHeader">Code:</div>
<div class="CodeBlockStyle">
+
<syntaxhighlight lang="agi">
 
if (said("look")) { .....
 
if (said("look")) { .....
  
 
if (said("open","door")) { .....
 
if (said("open","door")) { .....
</syntaxhighlight></div>
+
</syntaxhighlight>
  
 
Quote marks must also be used around the words.
 
Quote marks must also be used around the words.
Line 266: Line 256:
  
 
<div class="CodeBlockHeader">Code:</div>
 
<div class="CodeBlockHeader">Code:</div>
<div class="CodeBlockStyle">
+
<syntaxhighlight lang="agi">
 
Label1:
 
Label1:
</syntaxhighlight></div>
+
</syntaxhighlight>
  
 
The label name can contain letters, numbers, and the characters '_' and '.'. No spaces are allowed.
 
The label name can contain letters, numbers, and the characters '_' and '.'. No spaces are allowed.
  
The [[Goto|Goto]] command takes on parameter, the name of a label:
+
The [[goto|goto]] command takes on parameter, the name of a label:
  
 
<div class="CodeBlockHeader">Code:</div>
 
<div class="CodeBlockHeader">Code:</div>
<div class="CodeBlockStyle">
+
<syntaxhighlight lang="agi">
 
goto(Label1);
 
goto(Label1);
</syntaxhighlight></div>
+
</syntaxhighlight>
  
 
== Comments ==
 
== Comments ==
Line 284: Line 274:
  
 
<div class="CodeBlockHeader">Code:</div>
 
<div class="CodeBlockHeader">Code:</div>
<div class="CodeBlockStyle">
+
<syntaxhighlight lang="agi">
 
// - rest of line is ignored
 
// - rest of line is ignored
  
Line 290: Line 280:
  
 
/* Text between these are ignored */
 
/* Text between these are ignored */
</syntaxhighlight></div>
+
</syntaxhighlight>
 
 
 
The /*...*/ can be nested:
 
The /*...*/ can be nested:
  
 
<div class="CodeBlockHeader">Code:</div>
 
<div class="CodeBlockHeader">Code:</div>
<div class="CodeBlockStyle">
+
<syntaxhighlight lang="agi">
 
/* comment start
 
/* comment start
  
Line 309: Line 298:
  
 
*/                  // uncomments
 
*/                  // uncomments
</syntaxhighlight></div>
+
</syntaxhighlight>
  
 
'''Note:''' the fact that these comments can be nested is very different from almost every other language that uses these types of comments, including C, C , and Java.
 
'''Note:''' the fact that these comments can be nested is very different from almost every other language that uses these types of comments, including C, C , and Java.
Line 326: Line 315:
  
 
<div class="CodeBlockHeader">Code:</div>
 
<div class="CodeBlockHeader">Code:</div>
<div class="CodeBlockStyle">
+
<syntaxhighlight lang="agi">
 
#message 4 "You can't do that now."
 
#message 4 "You can't do that now."
</syntaxhighlight></div>
+
</syntaxhighlight>
  
 
Then you can give the message number as the parameter in commands:
 
Then you can give the message number as the parameter in commands:
  
 
<div class="CodeBlockHeader">Code:</div>
 
<div class="CodeBlockHeader">Code:</div>
<div class="CodeBlockStyle">
+
<syntaxhighlight lang="agi">
 
print(m4);
 
print(m4);
</syntaxhighlight></div>
+
</syntaxhighlight>
  
 
Or embed the message in commands as normal and the number you assigned to it before will be used:
 
Or embed the message in commands as normal and the number you assigned to it before will be used:
  
 
<div class="CodeBlockHeader">Code:</div>
 
<div class="CodeBlockHeader">Code:</div>
<div class="CodeBlockStyle">
+
<syntaxhighlight lang="agi">
 
print("You can't do that now.");
 
print("You can't do that now.");
</syntaxhighlight></div>
+
</syntaxhighlight>
  
<nowiki>#message can be used anywhere in the file, so you do not have to set the message before you use it. </nowiki>
+
<nowiki>#message can be used anywhere in the file, so you do not have to set the message before you use it.</nowiki>
  
 
For more details, see [[Message|Message]].
 
For more details, see [[Message|Message]].
Line 350: Line 339:
 
== The <code>return</code> command ==
 
== The <code>return</code> command ==
  
The [[Return|return]] command is just a normal action command (command number 0), with no arguments. This must be the last command in every [[Logic|logic resource]}.
+
The [[Return|return]] command is just a normal action command (command number 0), with no arguments. This must be the last command in every [[Logic Resource|logic resource]].
  
 
== See also ==
 
== See also ==
Line 358: Line 347:
 
== Sources ==
 
== Sources ==
  
* [[AGI Studio|AGI Studio]] help file
+
* [[agi:AGIStudioHelp|AGI Studio Help File]]
 +
 
 +
&nbsp;
 +
 
 +
[[Tutorials and Guides|Tutorials and Guides Table of Contents]]
 +
 
 +
&nbsp;
 +
 
 +
[[Category:Logic]]
 +
[[Category:Variables]]
 +
[[Category:Syntax]]

Revision as of 19:47, 17 March 2018

Tutorials and Guides Table of Contents

Logic Syntax

 

This article describes the logic syntax for the C-like "official" AGI syntax described in the AGI Specs and supported by AGI Studio and WinAGI.

Note: The WinAGI development environment supports an alternate syntax, that is based on Microsoft's Visual Basic language, rather than the C language. At this time, the C-based syntax described in this article is the most widely-supported AGI logic syntax.

Action Commands

Normal action commands are specified by the command name followed by parentheses which contain the arguments, separated by commas. A semicolon is placed after the parentheses. The parentheses are required even if there are no arguments. The arguments given must have the correct prefix for that type of argument as explained later in this document (this is to make sure the programmer does not use a variable, for example, when they think they are using a flag).

Code:
assign.v(v50,0);

program.control();

Multiple commands may be placed on the one line:

Code:
reset(f6); reset(f7);

Substitutions for the following action commands are available:

Code:
increment(v30);       v30++;
decrement(v30);       v30--;
assignn(v30,4);       v30 = 4;
assignv(v30,v32);     v30 = v32;
addn(v30,4);          v30 = v30 + 4;   or  v30 += 4;
addv(v30,v32);        v30 = v30 + v32; or  v30 += v32;
subn(v30,4);          v30 = v30 - 4;   or  v30 -= 4;
subv(v30,v32);        v30 = v30 - v32; or  v30 -= v32;
mul.n(v30,4);         v30 = v30 * 4;   or  v30 *= 4;
mul.v(v30,v32);       v30 = v30 * v32; or  v30 *= v32;
div.n(v30,4);         v30 = v30 / 4;   or  v30 /= 4;
div.v(v30,v32);       v30 = v30 / v32; or  v30 /= v32;

lindirectn(v30,4);   *v30 = 4;
lindirectv(v30,v32); *v30 = v32;
rindirect(v30,v32);   v30 = *v32;

If structures and test commands

An if structure looks like this:

Code:
if (test commands) {
  action commands
}

or like this

Code:
if (test commands) {
  action commands
}
else {
  more action commands
}

Carriage returns are not necessary:

Code:
if (test commands) { action Commands } else { more action commands }


Test commands are coded like action commands except there is no semicolon. They are separated by && or || for AND and OR, respectively:

Code:
if (isset(f5) &&
    greatern(v5,6)) { ......

Again, carriage returns are not necessary within the if statement:

Code:
if (lessn(v5,6) && (greatern(v5,2)) { .......

if (isset(f90) && equalv(v32,v34) &&
    greatern(v34,20)) { .......

A ! placed in front of a command signifies a NOT.

Code:
if (!isset(f7)) {
  ......

Boolean expressions are not necessarily simplified so they must follow the rules set down by the file format. If test commands are to be ORred together, they must be placed in brackets.

Code:
if ((isset(f1) || isset(f2)) {
  ......

if (isset(f1) && (isset(f2) || isset(f3))) {
  ......

if (isset(1) || (isset(2) && isset(3))) {    is NOT legal

Depending on the compiler, simplification of boolean expressions may be supported, so the above may not apply in all cases (although if these are rules are followed then the logic will work with all compilers).

Substitutions for the following test commands are available:

Code:
equaln(v30,4)      v30 == 4
equalv(v30,v32)    v30 == v32
greatern(v30,4)    v30   4
greaterv(v30,v32)  v30   v32
lessn(v30,4)       v30   4
lessv(v30,v32)     v30   v32
!equaln(v30,4)     v30&nbsp;!= 4
!equalv(v30,v32)   v30&nbsp;!= v32
!greatern(v30,4)   v30 = 4
!greaterv(v30,v32) v30 = v32
!lessn(v30,4)      v30 = 4
!lessv(v30,v32)    v30 = v32

Also, flags can be tested for by just using the name of the flag:

Code:
if (f6) { .....

if (v7 > 0 && !f6) { .....

which is equivalent to:

Code:
if (isset(f6)) { .....

if (v7 > 0 && !isset(f6)) { .....

Argument types

There are 9 different types of arguments that commands use:

Type Prefix
Number (no prefix)
Variable v
Flag f
Message m
Object o
Inventory item i
String s
Word w
Controller c

The said test command uses its own special arguments which will be described later.

Each of these types of arguments is given by the prefix and then a number from 0-255, e.g. v5, f6, m27, o2.

The word type represents words that the player has typed in (as opposed to words that are stored in the WORDS.TOK file). Strings are the temporary string variables stored in memory, not to be confused with messages (that are stored in the logic resources). Controllers are menu items and keys.

Compilers can enforce type checking, so that the programmer must use the correct prefix for an argument so that they know they are using the right type. Decoders should display arguments with the right type.

Code:
move.obj(o4, 80, 120, 2, f66);

if (obj.in.box(o2, 30, 60, 120, 40)) { .....

For a complete list of the commands and their argument types, see Logic commands by name.

Messages and inventory items may be given in either numerical or text format:

Code:
print("He's not here.");

print(m12);

if (has("Jetpack")) { .....

if (has(i9)) { .....

Messages can also be split over multiple lines:

Code:
print("This message is split "
      "over multiple lines.");

Quote marks must be used around messages and inventory item names. This is important because some messages or inventory item names may contain parentheses or commas, which could confuse the compiler. This is also the case for the said command which will be described shortly.

Code:
if (has("Buckazoid(s)")) { .....   // no ambiguity here about where
                                   // the argument ends

If quote marks are part of the message or inventory object, a \ should be placed in front of these. To use a \, \\ should be used. \n can also be used for a new line.

The said test command uses different parameters to all the other commands. Where as the others use 8 bit arguments (0-255), said takes 16 bit arguments (0-65535). Also, the number of arguments in a said command can vary. The numbers given in the arguments are the word group numbers from the WORDS.TOK file.

Code:
if (said(4, 80)) { .....

Words can also be given in place of the numbers:

Code:
if (said("look")) { .....

if (said("open","door")) { .....

Quote marks must also be used around the words.

Labels and the goto command

Labels are given like this:

Code:
Label1:

The label name can contain letters, numbers, and the characters '_' and '.'. No spaces are allowed.

The goto command takes on parameter, the name of a label:

Code:
goto(Label1);

Comments

There are three ways that comments can be used.

Code:
// - rest of line is ignored

[ - rest of line is ignored

/* Text between these are ignored */

The /*...*/ can be nested:

Code:
/* comment start

  print("Hello");    // won't be run

  /*                 // a new comment start (will be ignored!)

    v32 = 15;        // won't be run

  */                 // uncomments the most inner comment

  print("Hey!");     // won't be run, still inside comments

*/                   // uncomments

Note: the fact that these comments can be nested is very different from almost every other language that uses these types of comments, including C, C , and Java.

Defines

See Defines.

Including files

See Includes.

More on messages

In some cases you may want to assign a specific number to a message so you can refer to it in other places. This is done by using the #message command, followed by the number of the message then the message itself:

Code:
#message 4 "You can't do that now."

Then you can give the message number as the parameter in commands:

Code:
print(m4);

Or embed the message in commands as normal and the number you assigned to it before will be used:

Code:
print("You can't do that now.");

#message can be used anywhere in the file, so you do not have to set the message before you use it.

For more details, see Message.

The return command

The return command is just a normal action command (command number 0), with no arguments. This must be the last command in every logic resource.

See also

Sources

 

Tutorials and Guides Table of Contents