summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'content/learn/04.sequences/default.md')
-rw-r--r--content/learn/04.sequences/default.md123
1 files changed, 123 insertions, 0 deletions
diff --git a/content/learn/04.sequences/default.md b/content/learn/04.sequences/default.md
new file mode 100644
index 0000000..cecbff8
--- /dev/null
+++ b/content/learn/04.sequences/default.md
@@ -0,0 +1,123 @@
+---
+menuTitle: Sequences
+title: "Introducing Sequences"
+weight: 4
+---
+In [the previous step](/learn/variables), we introduced variables. The story is
+starting to have branches, but writing them from within a `player_choice`
+construct is awkward. To resolve this, *sequences* are introduced.
+
+Sequences are named lists of instructions. They do *not* have to be defined
+before being used, but the definition must be found at some point. Since
+instructions do not return any value, neither do sequences.
+
+Sequences define their own context, meaning that `local` variables from outside
+the sequence cannot be accessed and, conversely, `local` variables from the
+sequence cannot be accessed outside of it.
+
+Entering a sequence can be done in two ways:
+* By visiting, in which case the sequence is executed and the story continues.
+* By jumping, in which case the sequence replaces the current story execution.
+
+When in doubt, prefer visiting to jumping, as the latter is mainly intended for
+optimization purposes.
+
+Sequences can be entered again from themselves, making recursion possible.
+
+Sequences can take parameters.
+
+
+**main.fate:**
+
+ (fate_version 1)
+
+ (global int hero_money)
+
+ (set hero_money 42)
+
+ Once upon a time, starting a story with these words wasn't considered
+ a cliche. Starting in a tavern might also not be seen as very
+ original. Having the main character be an street orphan, raised by
+ some mysterious sage all to end up as a mercenary with an uncommonly
+ strong sense of honor probably isn't going to lead to any praises for
+ novelty either. Maybe you should drink to that.
+ (newline)
+ Or maybe you shouldn't. This isn't your first mug. Not your second
+ either. Drinking to forget that you are a stereotypical hero isn't
+ going to solve anything. Worse, the alcoholic trait is part of the
+ image.
+ (newline)
+ As you contemplate your own pointless description, your gaze leaves
+ what turns out to be an already empty glass in your hand and finds the
+ barman.
+
+ (player_choice
+ (
+ ( Ask the barman for a refill )
+ (visit get_a_refill)
+ )
+ (
+ ( Fall asleep )
+ (jump_to fall_asleep)
+ )
+ )
+
+ (define_sequence pay ( (int cost) )
+ (set hero_money
+ (- (var hero_money) (var cost))
+ )
+ )
+
+ (define_sequence get_a_refill ()
+ (local int price_of_booze)
+
+ (set price_of_booze 12)
+
+ Staring straight at the barman, you raise your glass and proclaim:
+ (newline)
+ "This soon-to-be world savior needs more booze!"
+ (newline)
+ The barman's lack of reaction is disappointing, but seeing the beer
+ being poured does help improve the mood.
+ (newline)
+ Satisfied, you hand the barman (var price_of_booze) copper coins.
+ (visit pay (var price_of_booze))
+ )
+
+ (define_sequence fall_asleep ()
+ Deciding to break away from the expected storyline, you promptly
+ fall asleep.
+ (newline)
+ ...
+ (newline)
+ Upon waking up, your hard-trained reflexes inform you that someone
+ stole all your money.
+ (set hero_money 0)
+ (newline)
+ This set-back was more than you could take. You give up on this
+ barely coherent story.
+ (end)
+ )
+
+ (end)
+
+* `(visit get_a_refill)` makes a visit to the sequence `get_a_refill`. Since
+ that sequence does not take parameters, none need to be provided.
+* `(jump_to fall_asleep)` stops the execution of the main instruction list and
+ proceeds to using the sequence `fall_asleep` instead. Here again, no
+ arguments are expected by `fall_asleep`. Notice how the `fall_asleep` sequence
+ ends with `(end)`: since there is no return from it, the original `(end)`
+ would not be reached and thus a new one is required to end the story.
+* `(visit pay (var price_of_booze))` makes a visit to the `pay` sequence, which
+ does require a parameter.
+* `(global int hero_money)` has replaced `(local int hero_money)`, because that
+ variable needs to be accessible from within the sequences.
+* `(local int price_of_booze)` has been moved to the `get_a_refill` sequence,
+ as there is no reason to have it be defined across the whole story.
+* The `pay` sequence cannot directly access the `price_of_booze` variable, as
+ it is `local` and from another sequence, hence the use of a parameter to
+ communicate the correct amount.
+
+With this, the `player_choice` have become much more readable. However, the file
+itself is starting to become hard to read. The solution is then to [split the
+content into multiple files](/learn/files).