Automatic Narrative Variation

Curveship is a system for automatic narrative variation: It can relate the same underlying events in different ways, expressing the same content via different narrative discourses. Curveship can tell events out of order, as with flashback. It can designate different characters as the narrator or narratee (the one telling or the one to whom the narrative is told), and, for instance, can tell the story from a standpoint before, during, or after the events themselves.

Curveship-py, the original system with (in 2019) slight changes to work in Python 3, is an interactive fiction system that provides a world model (of actors, items, rooms, and events) while also modeling the narrative discourse, so that the narration and description of the simulated world can change. This system also has a parser, and can accept typed input from a player. This system is in version 0.6, and has been used for several research and creative projects, but is not being actively updated or maintained.

Curveship-js has its own underlying representation of a storyworld (with actors, things, places, and events) and is intended to implement narrative variation online. It does not include all the aspects of an interactive fiction simulated world (testing to see if a door is locked or unlocked, for instance), and it also lacks a parser. It can, however, be used to tell the same underlying story in different ways, which was the main point of the original Curveship project. It is currently (2021) in a preliminary, pre-release state, but available: This is version 0.4.1.

The system was originally developed with advanced users, such as researchers and author/programmers, in mind. Some understanding of narrative theory, some understanding of interactive fiction, some ability to program in Python, and a willingness to use a command-line system are important to effective use of Curveship-py. While Curveship-js is now a much more preliminary implementation, it can be used for creative work and for teaching and learning about narrative theory. Programming a Curveship-js story file is less complex than writing an interactive fiction in Curveship-py. Of course, those who want to create new work in Curveship-js will need some familiarity with JavaScript (specifically, ES6) rather than Python.

Note, however, that you do not need to actually do any programming to define a Curveship-js variable narrative. You just need to follow the formal rules for defining the underlying story world and the way the narration is done. As long as you stick to the template, you never have to write a for loop, define your own class or data structure, or otherwise do real programming. In the future we hope that Curveship-js will allow advanced users to do fancy things with it (using programming) and be a nice entry point for those without previous programming experience.

Narrative Variation

Narrative variation means telling the same underlying events in different ways. It's a nice trick that writers and other storytellers have employed very effectively for thousands of years. Just as typical IF systems can model a fictional world, Curveship can apply different narrative styles—automatically, in a way that that an interactive fiction author determines and programs. Curveship can tell the following (non-interactive) story:

A bank teller reads a deposit slip.

A burly guard sleeps.

The bank teller rechecks the deposit slip.

A twitchy man puts on a Dora the Explorer mask.

The bank teller types.

She plays Solitaire a bit on her computer.

The twitchy man leaves the street.

The bank teller waves to him.

He threatens her using a gun-shaped object.

She laughs.

The burly guard wakes.

He sees the twitchy man.

He leaves the guard post.

The bank teller puts some fake money into a black bag.

The twitchy man turns to the burly guard.

He shoots him in the chest.

He shoots him in the chest.

He falls.

He dies.

The bank teller weeps.

The end.

With a particular "spin." For example, in reverse-chronological order, with an appropriate shift of tense after the first sentence, and with the bank letter made into the narrator, the “I” of the story, and with the twitchy man made into the narratee or “you”:

I weep.

You died.

You fell.

A burly guard shot you in the chest.

He shot you in the chest.

You turned to the burly guard.

I put some fake money into a black bag.

He left the guard post.

He saw you.

The burly guard woke.

I laughed.

You threatened me using a gun-shaped object.

I waved to you.

You left the street.

I played Solitaire a bit on my computer.

I typed.

You put on a Dora the Explorer mask.

I rechecked a deposit slip.

The burly guard slept.

I read the deposit slip.

The end.

See the interactive example of this story, “The Simulated Bank Robbery.” Curveship-py can do all of this and more with interactive fiction, not just with fixed representations of stories. Curveship-js is being developed to do narrative variation, and eventually to improve on some methods of text generation.

The Name

I think of the word "curveship" as meaning "the essence of curvature," just as friendship and authorship indicate the essential qualities of being a friend and author. The system Curveship is so named because it is meant to model the essential qualities of variation—the curve of a story through its telling. The word was first used by Hart Crane (1899–1932) in the last line of his poem "To Brooklyn Bridge":

O Sleepless as the river under thee,
Vaulting the sea, the prairies' dreaming sod,
Unto us lowliest sometime sweep, descend
And of the curveship lend a myth to God.

Curveship-py for Python 3

Curveship-js for ES6

. . .

—Nick Montfort
February 2, 2011–
September 21, 2021 *

* February 2, 2011 was the first free/libre/open-source software release of Curveship. The system was being developed for years beforehand, and the first publication about it was in 2006.