Making Interactive Fiction: Using Generative Prose

2018-05-08 · by Bruno Dias
tagged Blog / Columns

Generative prose is the technique of dynamically generating text from smaller chunks of writing. This can look like the adaptive, variable prose functionality in Inform; like using Twinecery to add procedural text to a Twine story; or like Ink’s text-variation capabilities. Given a deep enough body of text to pull from, generative systems can spit out hundreds or thousands of variations on an idea.


How, when, and where to use generative text is a complicated question. Some IF is built entirely around a generative idea, like Epitaph or Begscape. Sometimes generative prose is used more sparingly or almost invisibly, like the way Savoir-Faire carefully supports the player’s ability to THROW any object in the game at anything else.

There’s a lot of mysticism and misconception, in games, around procedural generation and procedural prose in particular. People who are encountering procedural generation for the first time often approach it as a labor-saving device, as a way of getting a lot of “content” into a game without a whole lot of effort.

This isn’t a very useful way of thinking about it. Procedural generation, really, is a way of getting 200% as much content with 400% as much work. It’s easy to look at something like Spelunky’s level generator and see an “easy” path to giving players “infinite levels,” but this is very misleading. Level generators take an enormous amount of effort to build, tune, and iterate on before they consistently generate levels that are functional, let alone fun and engaging for the player. And levels in Spelunky are still built out of individually-authored “chunks;” often, in procedural generation, you’re still authoring everything that goes into the game, only at a more micro scale suitable for later recombination.

Voyageur, for example, contains thousands of words of hand-written prose. Writing that prose was very different from writing static descriptions in a purely authored game; I was writing loose sentences and phrases that the game would recombine later. This was, however, more work than simply writing descriptions. Each sentence had to operate within a myriad different contexts and variations, and had to come loaded with machine-readable metadata that ensured the game would use it correctly. And that’s not counting the work of programming that system in the first place.

So, given that it’s so much work, why would you use generative prose in your game? Why not just write everything by hand? There are some good reasons. A very direct one is simple responsiveness, the ability to adapt what the game is writing to the player’s actions; THROWing objects in Savoir-Faire is a classic example. This really helps an interactive story involve the player; it makes the story feel responsive to what the player is doing, aware of its underlying reality.

Another reason to use generative prose is replayability. Randomized elements allow for a story that can be run through multiple times with surprising circumstances each time. Generative prose is a way of expressing those variations, making them readable to the player.

But I enjoy using generative text for its aesthetics. Generative text has a specific valence to it; it can suggest a vast space of possibilities, hint at the interchangeable nature of something (imagine a game set in a major city, where you’re constantly bumping into procedurally-generated pedestrians), or simply offer up imagery and subtext, invite interpretation genuinely detached from trying to guess at authorial intent.

This “generative aesthetic,” however, brings up another major caution: Don’t make generative text into a lesser option that competes with fully authored material. Machine writing really flourishes when allowed to stand in its own context; like anything else, it looks better in flattering lighting.

(Visited 983 times, 1 visits today)

Please read our comments policy before posting.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.