User Tools

Site Tools


set

<<set>>

Motivating example

Variables are a good way to keep track of what a reader has chosen in a story, or to manage some other part of the story state. For example, many gamebooks start off with something like this:

All you possess is an Axe (note under Weapons on your Action Chart) and a Backpack containing 1 Meal (note under Meals on your Action Chart).

(Joe Dever, Flight from the Dark)

You can keep track of the number of meals that the protagonist carries with the <<set>> macro, like so:

All you possess is an Axe and a Backpack containing 1 Meal.
<<set $meals to 1>>

Later on in the story, you can change the value of a variable with another «set» statement.

You are feeling tired and hungry and you must stop to eat. <<set $meals -= 1>>

If you make a mistake with «set», a pink highlighted message will appear where you invoked it. Here's a sample error message, in this case forgetting the sigil before the variable $meals:

bad expression: meals is not defined

Setter operators

The to and -= are special operators called setter operators - while expressions may contain comparison operators like + or not, setter operators are commands to modify the values of variables. The -= operator lowers the variable on the left by the value on the right. There is also a += operator that does the opposite.

The most useful setter operators are as follows:

Operator(s) Function Example
to, = Sets the variable on the left to the value on the right $bullets to 5
+= Increases the variable on the left by the number on the right, OR adds the string on the right to the end of the variable. $var += 1 is shorthand for $var to $var + 1 $dogs += 2
-= Decreases the variable on the left by the number on the right. $var -= 1 is shorthand for $var to $var - 1 $health -= 2
*= Multiplies the variable on the left by the number on the right. $var *= 2 is shorthand for $var to $var * 2 $shields *= 2
/= Divides the variable on the left by the number on the right. $var /= 2 is shorthand for $var to $var / 2 $coins /= 2

Multiple operations in one <<set>>

When you have multiple «set» macro tags next to one another, you can replace them with a shorthand that uses only one «set». Simply take the operations in each instance, and join them together using either commas or semicolons. For instance, these three macro tags:

<<set $pants = "large">>
<<set $shoes = "huge">>
<<set $spats = "classy">>

…can be changed to just this:

<<set $pants = "large"; $shoes = "huge"; $spats = "classy">>

It is easy to assume that the placement of links in a passage has some bearing on what the game's variable state will be once you click it:

/% The following code is ineffectual %/
<<set $lamp to "red">>
[[The lamp is red]]
<<set $lamp to "blue">>
[[The lamp is blue]]

But this is erroneous! All of these <<set>> macros are run as soon as the passage is displayed, in order. Clicking the “The lamp is red” link won't cause the «set $lamp to “blue”» tag to not have happened.

To achieve the desired effect in the above passage, you should use setter links:

[[The lamp is red][$lamp = "red"]]
[[The lamp is blue][$lamp = "blue"]]
set.txt · Last modified: 2014/09/20 14:20 (external edit)