Skip to main content

"Tamara" as a concurrent trace

My last post described the idea of concurrent storytelling to encapsulate the idea of narrative structures where simultaneous action can lead to multiple experiences of a story, either through nondeterminism or through differing sequential traversals of the story graph.

Since then, I have obtained a copy of the Tamara script (which is written like a really bizarre choose-your-own-adventure book) and begun transcribing its scene structure as a deterministic Celf program such that the output trace models the scene dependency graph.

To do this, I model each of the 10 characters as a predicate over a location and a scene identifier, e.g.

tamara : scene -> location -> type.

The scene IDs roughly correspond to the letter-and-numbered scenes in the script, except that they are slightly finer grained to accommodate the different perspectives induced by character entrances and exits, although those entrances/exits are contained within a single script-scene.

In the simple case, a rule describing a scene's structure would take its required characters (indexed by the corresponding scene number and location) as premises and spit out those same characters as conclusions, but now indexed by their new scenes and locations. For example:

b8_emilia_carlotta
: emilia b8 leda * carlotta b8 leda 
-o {emilia c12 diningroom * carlotta c12 atrium}.

This rule describes the script scene B8, a dialogue between Emilia and Carlotta, after which Emilia exits to the dining room and Carlotta exits to the atrium (both of which are part of scene C12). I coded up sections A through C this way.

The resulting output is this big sequence of let-bindings, which I drew out on paper to visualize the dependencies:


To figure out whether my idea for compiling this structure into a Twine passage graph made sense, I did this example by hand. The basic translation was variable Xi in the CLF trace (which represent characters in certain states) would turn into passages named Xi, whose contents are purely [[links]] to scenes that the character transitions to at that state. Scenes are also passages, named e.g. b8, which contain the text of the scene as well as <<display>>ed variable passages representing the characters who are part of the scene. In cute mnemonic form: characters "link" the viewer to a scene; scenes "display" characters to the viewer.

For example, the scene passage corresponding to the CLF trace line

let {[X46, X47]} = b8_emilia_carlotta [X43, X45]

would have the title "b8_emilia_carlotta", and contain the text

<<display "x46">>
<<display "x47">>

while the *variable* passages X43 and X45 would contain the text

[[Stay with Emilia.|b8_leda]]
and
[[Follow Carlotta.|b8_leda]]

respectively.

The resulting Twine passage graph then has isomorphic structure:


...and you can play it, choosing who to follow as you would in the original performance. Though please note that I've elided a huge amount of text, including introductory context, so it may not be too meaningful for someone unfamiliar with the play. Doing this compilation by hand is hugely labor-intensive, so think of this as a teaser that you may choose to ignore until I've written the compiler and produced the story in full.

Comments

Popular posts from this blog

Using Twine for Games Research (Part II)

This preliminary discussion introduced my thoughts on using Twine as a tool for creating prototypes for games research. I'll start with documenting my first case study: a hack-and-slash RPG-like setting where the player character has a record of attributes ("stats") that evolve through actions that turn certain resources (money, health, items) into others. I've selected this hack-and-slash example because it falls outside the canonical "branching story" domain thought to be Twine's primary use case, but it is not too much trickier to implement. It relies crucially on the management of state in ways that simple branching stories would not, but it does so in a fairly straightforward way.

If all goes well, this post may also serve as a tutorial on the "basics" of Twine (links + variables + expressions). In particular, I'll be using Twine 2/Harlowe, and I haven't seen many tutorials for this new version published yet.

To me, the main "…

Using Twine for Games Research (Part III)

Where we last left off, I described Twine's basic capabilities and illustrated how to use them in Twine 2 by way of a tiny hack-and-slash RPG mechanic. You can play the result, and you should also be able to download that HTML file and use Twine 2's "import file" mechanism to load the editable source code/passage layout.

Notice that, in terms of game design, it's not much more sophisticated than a slot machine: the only interesting decision we've incorporated is for the player to determine when to stop pushing her luck with repeated adventures and go home with the current spoils.

What makes this type of RPG strategy more interesting to me is the sorts of decisions that can have longer-term effects, the ones where you spend an accumulation of resources on one of several things that might have a substantial payoff down the road. In a more character-based setting, this could be something like increasing skill levels or adding personality traits.

Often, the game-…

Why I don't like the term "AI"

Content note: I replicate some ableist language in this post for the sake of calling it out as ableist.

In games research, some people take pains to distinguish artificial intelligence from computational intelligence (Wikipedia summary), with the primary issue being that AI cares more about replicating human behavior, while CI is "human-behavior-inspired" approaches to solving concrete problems. I don't strongly identify with one of these sub-areas more than the other; the extent to which I hold an opinion is mainly that I find the distinction a bit silly, given that the practical effects seem mainly to be that there are two conferences (CIG and AIIDE) that attract the same people, and a journal (TCIAIG - Transactions on Computational Intelligence and Artificial Intelligence in Games) that seems to resolve the problem by replacing instances of "AI" with "CI/AI."

I have a vague, un-citeable memory of hearing another argument from people who dislike the…