Ifvar conditions: Difference between revisions
m didn't see the ife stuff was already there |
Doom64hunter (talk | contribs) Removed comment stating "less than or equal to conditionals are unnecessary" and added the missing conditional types. |
||
Line 1: | Line 1: | ||
''' | <span {{code}}>'''if'''<'''conditional'''> <[[gamevar]]> <constant|gamevar> <then_branch> ['''[[else]]''' <else_branch>]</span> | ||
''' | |||
Ifvar conditions are | <span {{code}}>'''ifvar'''<'''conditional'''> <[[gamevar]]> <constant> <then_branch> ['''[[else]]''' <else_branch>]</span> | ||
<span {{code}}>'''ifvarvar'''<'''conditional'''> <[[gamevar]]> <[[gamevar]]> <then_branch> ['''[[else]]''' <else_branch>]</span> | |||
Ifvar conditions are [[if condition]]s that apply to [[gamevar]]s. | |||
Gamevar conditionals in CON can take only 2 arguments at a time, the first always being the variable being compared against the second operand. The second operand can be a constant, a [[define|label]] or another [[gamevar|variable]]. | |||
If the comparison returns true, the game will execute the code in the ''<then_branch>''. If false, the ''<else_branch>'' may be executed if present, otherwise the block is skipped. | |||
The branches may consist of a single command, or if multiple commands need to be executed, a block of code enclosed in curly braces ("{" and "}"). For performance reasons, do not use curly braces for single commands. | |||
To negate a conditional (e.g. you want to compute a '''nand''') place a [[nullop]] inside the ''<then>'' branch, and put the code to be executed inside the ''<else>'' branch. | |||
See also: [[Else]] | |||
== Chaining if statements == | |||
To check for more than a single condition, the '''if''' statements will need to be chained. | |||
If done without curly braces, this acts in much the same way as <code>&&</code> does in C/C++ syntax. Namely, an [[else]] branch that follows the '''if''' chain will be executed if any of the preceeding '''if''' conditionals returns false. | |||
====Example==== | |||
definequote 100 Hello World | |||
set temp 0 | |||
ife temp 1 | |||
ife temp 0 | |||
{ | |||
nullop | |||
} | |||
else | |||
{ | |||
// will be executed if either of the above conditionals returns false | |||
quote 100 | |||
} | |||
This may be counterintuitive, as C/C++ and other programming languages only associate the '''[[else]]''' statement to a single '''if''', usually the one in the same context, which is not the case in CON. | |||
== Types of ifvar conditions == | |||
{| {{prettytable}} | {| {{prettytable}} | ||
Line 11: | Line 51: | ||
|= | |= | ||
|equal to | |equal to | ||
|- | |||
|n | |||
|!= | |||
|≠ | |||
|not equal to | |||
|- | |||
|g | |||
|> | |||
|> | |||
|greater than | |||
|- | |||
|ge | |||
|>= | |||
|≥ | |||
|greater or equals | |||
|- | |||
|a | |||
| | |||
| | |||
|unsigned greater than (both operands) | |||
|- | |||
|ae | |||
| | |||
| | |||
|unsigned greater or equal (both operands) | |||
|- | |- | ||
|l | |l | ||
Line 17: | Line 82: | ||
|less than | |less than | ||
|- | |- | ||
| | |le | ||
| | |<= | ||
| | |≤ | ||
| | |less or equal | ||
|- | |||
|b | |||
| | |||
| | |||
|unsigned less than (both operands) | |||
|- | |- | ||
| | |be | ||
| | | | ||
| | | | ||
| | |unsigned less or equal (both operands) | ||
|- | |- | ||
|and | |and | ||
Line 41: | Line 111: | ||
| | | | ||
|bitwise XOR | |bitwise XOR | ||
|- | |||
|both | |||
|<nowiki>&&</nowiki> | |||
| | |||
|logical AND: both are non-zero | |||
|- | |- | ||
|either | |either | ||
Line 47: | Line 122: | ||
|logical OR: either are non-zero | |logical OR: either are non-zero | ||
|} | |} | ||
{{varsuffix}} | {{varsuffix}} |
Revision as of 05:03, 12 January 2021
if<conditional> <gamevar> <constant|gamevar> <then_branch> [else <else_branch>]
ifvar<conditional> <gamevar> <constant> <then_branch> [else <else_branch>]
ifvarvar<conditional> <gamevar> <gamevar> <then_branch> [else <else_branch>]
Ifvar conditions are if conditions that apply to gamevars.
Gamevar conditionals in CON can take only 2 arguments at a time, the first always being the variable being compared against the second operand. The second operand can be a constant, a label or another variable.
If the comparison returns true, the game will execute the code in the <then_branch>. If false, the <else_branch> may be executed if present, otherwise the block is skipped.
The branches may consist of a single command, or if multiple commands need to be executed, a block of code enclosed in curly braces ("{" and "}"). For performance reasons, do not use curly braces for single commands.
To negate a conditional (e.g. you want to compute a nand) place a nullop inside the <then> branch, and put the code to be executed inside the <else> branch.
See also: Else
Chaining if statements
To check for more than a single condition, the if statements will need to be chained.
If done without curly braces, this acts in much the same way as &&
does in C/C++ syntax. Namely, an else branch that follows the if chain will be executed if any of the preceeding if conditionals returns false.
Example
definequote 100 Hello World set temp 0 ife temp 1 ife temp 0 { nullop } else { // will be executed if either of the above conditionals returns false quote 100 }
This may be counterintuitive, as C/C++ and other programming languages only associate the else statement to a single if, usually the one in the same context, which is not the case in CON.
Types of ifvar conditions
Conditional | C/C++ | Math | Description | |
---|---|---|---|---|
e | == | = | equal to | |
n | != | ≠ | not equal to | |
g | > | > | greater than | |
ge | >= | ≥ | greater or equals | |
a | unsigned greater than (both operands) | |||
ae | unsigned greater or equal (both operands) | |||
l | < | < | less than | |
le | <= | ≤ | less or equal | |
b | unsigned less than (both operands) | |||
be | unsigned less or equal (both operands) | |||
and | & | bitwise AND | ||
or | | | bitwise OR | ||
xor | ^ | bitwise XOR | ||
both | && | logical AND: both are non-zero | ||
either | || | logical OR: either are non-zero |
Commands with an additional "var" suffix take gamevars rather than constants or defined labels for their inputs. As an alternate short form, "varvar" can be dropped from these commands; for example ife serves an an alias for ifvarvare.