{"id":2074,"date":"2015-01-06T00:01:33","date_gmt":"2015-01-06T05:01:33","guid":{"rendered":"http:\/\/www.dashjump.com\/?p=2074"},"modified":"2015-01-06T00:45:43","modified_gmt":"2015-01-06T05:45:43","slug":"writing-interactive-fiction-six-steps","status":"publish","type":"post","link":"https:\/\/www.dashjump.com\/blog\/writing-interactive-fiction-six-steps\/","title":{"rendered":"Writing Interactive Fiction in Six Steps"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2086\" src=\"http:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2015\/01\/last_monster_master.png\" alt=\"The Last Monster Master\" width=\"650\" height=\"360\" srcset=\"https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2015\/01\/last_monster_master.png 650w, https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2015\/01\/last_monster_master-300x166.png 300w, https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2015\/01\/last_monster_master-100x55.png 100w, https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2015\/01\/last_monster_master-150x83.png 150w, https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2015\/01\/last_monster_master-200x111.png 200w, https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2015\/01\/last_monster_master-450x249.png 450w, https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2015\/01\/last_monster_master-600x332.png 600w\" sizes=\"auto, (max-width: 650px) 100vw, 650px\" \/><br \/>\nWriting is hard. Writing interactive, multiple-choice games is harder.<\/p>\n<p>Good at turning a phrase? Excellent \u2013 now turn seven of them, all equally-well written, that make sense in four different contexts, as\u00a0said by\u00a0three different characters. <!--more If nothing else, writing non-linear text game dialog and narrative is an exercise in constraints, creative reuse, and conviction.-->If nothing else, writing non-linear text game dialog and narrative is an exercise in constraints, creative reuse, and conviction.<\/p>\n<p>Say you\u2019ve got an outline for a text-based game. You know what the game\u2019s about, who the main characters are, the major events of each chapter, what the player\u2019s abilities are; all of the major\u00a0pieces. Now it\u2019s time to start writing \u2013 but you\u2019re stumped. How can you write a story where anything can happen? How do you set up the player\u2019s options? Where do you even start?<\/p>\n<p>I recently released my first full-length text game for <a title=\"Choice of Games\" href=\"https:\/\/www.choiceofgames.com\/\" target=\"_blank\">Choice of Games<\/a>, titled <a title=\"The Last Monster Master\" href=\"https:\/\/www.choiceofgames.com\/last-monster-master\/\" target=\"_blank\"><em>The Last Monster Master<\/em><\/a> (clocking in at 250,000(!) words), and through the process I came up with a basic framework to help write\u00a0it chapter by chapter. I used the excellent (and free) <a title=\"Chat Mapper\" href=\"http:\/\/www.chatmapper.com\/\" target=\"_blank\">Chat Mapper<\/a>\u00a0to write each non-linear chapter before bringing the final text into ChoiceScript, Choice of Games\u2019 own writer-friendly scripting language.<\/p>\n<p>I broke the process down by taking six passes through each chapter, which helped significantly in retaining focus. What\u2019s more, Chat Mapper has a great feature that lets you change the color of each individual text node. To help track each text pass as I worked the chapters, I used this feature\u00a0to change the color of each node to mark it as finished for that pass (as in the screenshots below).<\/p>\n<p><strong>Pass \u00a01 \u2013 Stub Text (No Color)<\/strong><\/p>\n<p>The first pass is all about laying down the structure for how the chapter will play out. Instead of writing any actual dialog or descriptions, use stub dialog as placeholders to indicate who will say what and when they\u2019ll say it, and what the player\u2019s options will be.<\/p>\n<p>If there are different branches depending on stat values or other conditions, indicate the stat in question and describe the options in plain English. Don&#8217;t worry about writing any game logic yet; that&#8217;ll come later.<\/p>\n<p>Avoid excessive revisions (or any, if you can help it) in this pass \u2013 its main purpose is to get the high-level structure of the chapter down into a readable format. When you\u2019re done here, you\u2019ll have a first draft of a roadmap for everything that comes next.<\/p>\n<p>In the\u00a0below\u00a0sequence from <em>The Last Monster Master<\/em>, one of the player&#8217;s monsters is stuck in a tree during an attack. The player must choose to use their Telepathy or Body Language detection skills to help the monster\u00a0withstand the\u00a0attack, or to run over and help directly.<\/p>\n<p><a href=\"http:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/stub_text.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2075 size-full\" src=\"http:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/stub_text.png\" alt=\"stub_text\" width=\"845\" height=\"512\" srcset=\"https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/stub_text.png 845w, https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/stub_text-300x182.png 300w, https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/stub_text-100x61.png 100w, https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/stub_text-150x91.png 150w, https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/stub_text-200x121.png 200w, https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/stub_text-450x273.png 450w, https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/stub_text-600x364.png 600w\" sizes=\"auto, (max-width: 845px) 100vw, 845px\" \/><\/a><\/p>\n<p><strong>Pass 2 \u2013 Stub Text Revision (Yellow)<\/strong><\/p>\n<p>In the next pass, focus only on revising the structure you just created. You\u2019re looking only at the placement of things \u2013 don\u2019t worry about misspellings or anything related to the text, since everything you&#8217;ve written will be replaced in revisions.<\/p>\n<p>You\u2019re primarily looking for choices or option branches that don\u2019t make sense or are inconsistent with the story, edge cases that can lead to problems later, and dead ends that don\u2019t link back to the main narrative flow.<\/p>\n<p>Secondarily, you\u2019re making sure that the structure so far makes use of all of the player stats or ability options you&#8217;ve planned to use in this chapter. If it turns out that you haven\u2019t implemented as many as you would&#8217;ve liked, make a conscious decision to either amend your original plan, create new sequences or options that use these stats or make a note to utilize the forgotten stats in future chapters.<\/p>\n<p><strong>Pass 3 \u2013 First-Pass Text (Orange)<\/strong><\/p>\n<p>With the structure organized and refined, now it\u2019s time to write the actual text the player will see. This is a fairly straightforward pass, but just as before, maintaining your focus is key.<\/p>\n<p>Don\u2019t worry about setting values for variables, structuring transitions, or anything else that isn\u2019t pure writing. And just like most pure writing, this is both the most fun and the most time-intensive\u00a0part.<\/p>\n<p><a href=\"http:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/first_text_pass.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2077\" src=\"http:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/first_text_pass.png\" alt=\"first_text_pass\" width=\"845\" height=\"512\" srcset=\"https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/first_text_pass.png 845w, https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/first_text_pass-300x182.png 300w, https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/first_text_pass-100x61.png 100w, https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/first_text_pass-150x91.png 150w, https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/first_text_pass-200x121.png 200w, https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/first_text_pass-450x273.png 450w, https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/first_text_pass-600x364.png 600w\" sizes=\"auto, (max-width: 845px) 100vw, 845px\" \/><\/a><\/p>\n<p><strong>Pass 4 \u2013 Text Revision (Purple)<\/strong><\/p>\n<p>Did you survive writing the actual chapter? Great! Things start to move significantly faster now. You\u2019re about to enter editor mode.<\/p>\n<p>Read through the first-pass text you just wrote with a merciless eye. Everything related to the text itself is fair game \u2013 spelling, grammar, incorrect references to characters or places, tighter word choices, etc. Again, keep your focus on the writing. Make the text sing.<\/p>\n<p><strong>Pass 5 \u2013 Variables (Blue)<\/strong><\/p>\n<p>The structure is nailed down and the text is looking tight. Now, go through the chapter again, looking for any instance where variables are invoked, specifically anywhere where player stats are modified or referenced in order to determine outcomes. \u00a0It\u2019s likely you\u2019ll also have a few special cases for unique player items, one-off encounters and the like.<\/p>\n<p>You\u2019ll refine the values used here in subsequent revisions, gameplay balancing and playtesting. For now, set a baseline for where you think values need to be.<\/p>\n<p>Keeping an external reference document for how much of a given stat is required per chapter or before significant events can help with consistency. For example, if the player\u2019s Strength stat must be at least 45 for them to kick a wooden door down in Chapter 4, it\u2019s logical to require somewhere around 65 Strength to knock down a metal door in Chapter 6 (i.e., the requisite should go up).<\/p>\n<p>Doing this in a dedicated pass helps enforce good internal consistency for stat checks, which will help with across-the-board adjustments to values later.<\/p>\n<p><a href=\"http:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/variable_pass.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2078\" src=\"http:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/variable_pass.png\" alt=\"variable_pass\" width=\"845\" height=\"512\" srcset=\"https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/variable_pass.png 845w, https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/variable_pass-300x182.png 300w, https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/variable_pass-100x61.png 100w, https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/variable_pass-150x91.png 150w, https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/variable_pass-200x121.png 200w, https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/variable_pass-450x273.png 450w, https:\/\/www.dashjump.com\/setup\/wp-content\/uploads\/2014\/12\/variable_pass-600x364.png 600w\" sizes=\"auto, (max-width: 845px) 100vw, 845px\" \/><\/a><\/p>\n<p><strong>Pass 6 \u2013 Export and Logic (Green)<\/strong><\/p>\n<p>Finally, you need to bring your (almost) finished chapter into the development tool you\u2019re using to make the game itself. Fortunately, Chat Mapper exports to XML, JSON, Excel, and Rich Text formats, giving you plenty of options to work with. For <em>The Last Monster Master<\/em>, however, I simply went through each text node and copied it into my ChoiceScript file, adjusting for formatting and segment transitions as needed.<\/p>\n<p>If you\u2019re also writing the actual logic that happened behind the scenes, you\u2019ll need to start scripting this as you bring the text into the game. Fortunately, since you\u2019ve already resolved the questions of what needs to happen when\u00a0and where, each scripting task is handily divorced from the content for\u00a0pure problem solving.<\/p>\n<p><strong>Other Methods<\/strong><\/p>\n<p>This isn\u2019t the only way to go about writing non-linear text games, but it worked well for this project. Depending on your style of development and the tools you&#8217;re using, you could opt to export your stub text into the game early on so you can actually play through it as soon as possible. Plus, since Chat Mapper supports Lua for scripting, you could even set up all of the logic you\u2019d need directly inside the program, as long as you don\u2019t mind possibly scripting everything again in your actual development environment.<\/p>\n<p>Whatever process you choose, stay focused on one task at a time, celebrate each milestone and take notes for things you could improve upon. Wrangling non-linear narrative is not a trivial task \u2013 so why not make a game out of it?<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Writing is hard. Writing interactive, multiple-choice games is harder. Good at turning a phrase? Excellent \u2013 now turn seven of them, all equally-well written, that make sense in four different contexts, as\u00a0said by\u00a0three different characters.<\/p>\n","protected":false},"author":2,"featured_media":2086,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,90,4],"tags":[188,187,186,185],"class_list":["post-2074","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-game-design","category-game-dev-tips","category-narrative","tag-game-design","tag-narrative","tag-text","tag-writing"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.dashjump.com\/blog\/wp-json\/wp\/v2\/posts\/2074","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dashjump.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dashjump.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dashjump.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dashjump.com\/blog\/wp-json\/wp\/v2\/comments?post=2074"}],"version-history":[{"count":10,"href":"https:\/\/www.dashjump.com\/blog\/wp-json\/wp\/v2\/posts\/2074\/revisions"}],"predecessor-version":[{"id":2094,"href":"https:\/\/www.dashjump.com\/blog\/wp-json\/wp\/v2\/posts\/2074\/revisions\/2094"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dashjump.com\/blog\/wp-json\/wp\/v2\/media\/2086"}],"wp:attachment":[{"href":"https:\/\/www.dashjump.com\/blog\/wp-json\/wp\/v2\/media?parent=2074"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dashjump.com\/blog\/wp-json\/wp\/v2\/categories?post=2074"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dashjump.com\/blog\/wp-json\/wp\/v2\/tags?post=2074"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}