Never Let Go Of
Text adventure created in Twine 2 â—¦ 3 months â—¦ 2016
Using Conditional Logic in Narrative
Expressing subtle relationship-based consequences involved a very enmeshed approach to scripting the story. The drama of the narrative moves in a determined direction, but the reactions of the world to Kennelly based on The Reader's choices are changed in large and small ways. This can mean a change to a single adjective, a clause, a sentence, or entire paragraphs. Therefore, the code for the game is interspersed wildly throughout the text using the scripting tools of a Twine 2 story format called SugarCube.
Below is one of the crazier examples from the end of the game, a paragraph formed out of variables from the entire story. First, the game determines which character The Reader has fostered the highest relationship variable with ($GFriend), even accounting for the range between the highest friend and lowest friend. It then runs through a bit of judgmental exposition (by the game's villain) based on the choices The Reader made related to that friend. It also takes into account the thematic choices The Reader has made and relates them to that character as well.
Choices generally fell into a few broad categories, but the reality is that they could affect any sentence in the game in a countless number of ways. Few planning tools could keep track of all of these possibilities. I just had my own head and a careful attention to detail. At the least, in sections like this one I could highlight code to keep it visible, which definitely assisted in keeping the distribution of consequences consistent.
There are no code tools for Sugarcube or Twine, so code had to be manually highlighted
Twine's Widget System
Allowing for optional exposition was a big part of the design of this game, but I wanted the story formatted in a linear fashion without cross-passage hyperlinking. For this purpose, I made heavy use of Twine's "widgets" system, which essentially operate as functions that can be placed anywhere in the text.
In the below example, The Reader is given the choice to read personnel files on the main characters. Clicking on one of the options makes the clickable text disappear, replacing it with a passage about that character. The Reader can click the passages in any order, and so to keep things in linear prose, this meant changing some elements of the text to account for previous options having been chosen.
Using Scripts to Playtest Outcomes
To quickly test the game, I needed the ability to jump into any passage and have choice variables set for every preceding passage. Early on, I set up a widget I could pass a passage number into that then assigns a random value to every choice variable before that passage. Some variables are set as a consequence of multiple choices (relationship values and theme values), so I had to set up nested logic that would set these appropriately based on the choice variables that have been initialized.