User Tools

Site Tools


displaying_text_conditionally

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
displaying_text_conditionally [2013/11/13 00:28]
klembot created
displaying_text_conditionally [2017/10/09 20:39] (current)
Line 1: Line 1:
-===== Displaying Text Conditionally ===== +#​redirect ​if
- +
-Variables can be very handy, but they would be much more useful ​if they could directly affect the text the reader sees. Consider a passage like this: +
- +
-> You return to Selator'​s hut. A merry fire is crackling in the kitchen, and something is cooking that smells delicious. He greets you warmly and asks, "Have you got the berry?"​ If you have got the purple berry of the Antherica plant, turn to 175. If not, turn to 52. +
- +
-(Steve Jackson and Ian Livingstone,​ //Scorpion Swamp//) +
- +
-It would be nice if the story could track whether the protagonist found the berry or not, and branch accordingly. In order to do this, we need to use conditions. A condition is a kind of expression that evaluates to either true or false. We can use these truth values directly to indicate whether the protagonist found the berries: +
- +
-<​code>​ +
-You have no doubt, from Selator'​s description,​ that you have found the +
-Antherica plant. Half your mission is completed. Now you must return to the +
-village with the precious berry. <<set $foundBerry = true>>​ +
-</​code>​ +
- +
-Then we can use the ''<<​if>>''​ macro to display a passage indicating victory: +
- +
-<​code>​ +
-You return to Selator'​s hut. A merry fire is crackling in the kitchen, and +
-something is cooking that smells delicious. He greets you warmly and asks, +
-"Have you got the berry?"​ +
- +
-<<if $foundBerry>>​ +
-"​Wonderful!"​ he exclaims... +
-<<​endif>>​ +
-</​code>​ +
- +
-Anything in between the initial ''<<​if>>''​ and ''<<​endif>>''​ is displayed if the condition is true. You may also include macros inside ''<<​if>>''​ statements, so we could display a longer victory message this way: +
- +
-<​code>​ +
-You return to Selator'​s hut. A merry fire is crackling in the kitchen, and +
-something is cooking that smells delicious. He greets you warmly and asks, +
-"Have you got the berry?"​ +
- +
-<<if $foundBerry>>​ +
-<<​display "​Victory">>​ +
-<<​endif>>​ +
-</​code>​ +
- +
-Our only remaining issue is that if the reader hasn't found the berry, nothing is displayed at all. To remedy this, we can use an ''<<​else>>''​ clause like this: +
- +
-<​code>​ +
-You return to Selator'​s hut. A merry fire is crackling in the kitchen, and +
-something is cooking that smells delicious. He greets you warmly and asks, +
-"Have you got the berry?"​ +
- +
-<<if $foundBerry>>​ +
-<<​display "​Victory">>​ +
-<<​else>>​ +
-"​That'​s too bad," he says. "I had such high hopes for you..."​ +
-<<​endif>>​ +
-</​code>​ +
- +
-''<<​else>>''​ clauses do the exact opposite as ''<<​if>>''​ ones; they are only displayed if the condition is false. In either case, it's important to remember the ''<<​endif>>''​ at the end; otherwise, it won't be clear where the story should resume. +
- +
-Let's revisit the example of meals from the previous section. We had this passage: +
- +
-<​code>​ +
-You are feeling tired and hungry and you must stop to eat. <<set $meals = $meals - 1>> +
-</​code>​ +
- +
-Obviously, if the protagonist doesn'​t have any meals left, they can't eat. Let's fix this with <<​if>>​. +
- +
-<​code>​ +
-You are feeling tired and hungry and you must stop to eat. +
- +
-<<if $meals eq 0>> +
-<<​display "Dying of hunger">>​ +
-<<​else>>​ +
-You continue on your journey... <<set $meals = $meals - 1>> +
-<<​endif>>​ +
-</​code>​ +
- +
-''​eq''​ is a logical operator that's short for '​equals.'​ Just like + adds two numbers together, ''​eq''​ compares two things together and returns whether they are identical. It works equally well with strings and numbers, but beware -- the string "​2"​ is not equal to the number 2. +
- +
-There are several logical operators available:​ +
- +
-^ Operator ​   ^ Function ​                                          ^ Example ^ +
-| eq          | Evaluates to true if both sides are equal. ​        | ''​$bullets eq 5''​ | +
-| neq         | Evaluates to true if both sides are not equal. ​    | ''​$friends neq $enemies''​ | +
-| gt          | Evaluates to true if the left side is greater than the right side. | ''​$money gt 3.75''​ | +
-| gte         | Evaluates to true if the left side is greater than or equal to the right side. | ''​$apples gte $carrots + 5''​ | +
-| lt          | Evaluates to true if the left side is less than the right side. | ''​$shoes lt $people * 2''​ | +
-| lte         | Evaluates to true if the left side is less than or equal to the right side. | ''​65 lte $age''​ | +
-| and         | Evaluates to true if both sides evaluates to true. | ''​$hasFriends and $hasFamily''​ | +
-| or          | Evaluates to true if either side is true.          | ''​$fruit or $vegetable''​ | +
-| not         | Flips a true value to a false value, and vice versa. | ''​(not $hungry) or ($location eq "​restaurant"​)''​ | +
- +
-Conditions can quickly become complicated. The best way to keep things straight is to use parentheses to group things: +
- +
-<​code>​ +
-<<if ($master eq '​Selator'​) and ($foundBerry)>>​ +
-The walk back to the village is a happy one... +
-<<​else>>​ +
-Well, you may not have succeeded in your mission, but at least you're alive... +
-<<​endif>>​ +
-</​code>​+
displaying_text_conditionally.1384320493.txt.gz · Last modified: 2017/10/09 20:37 (external edit)