Holy Crap What; A long overdue recap

Okay, it's been way too long since I updated this. For those wondering about it, no, the project hasn't stopped. I've just been monumentally busy both working on this as well as re-taking the Control Theory (“Reglerteknik” for the Swedes) course that's been vexing me for so long. So, time for a long overdue status update.

Work during these past weeks has largely involved trying to devise an actual working system given what we now know about narrative structure. Sadly, this has proven to be a great deal more difficult than initially predicted, as we keep running into unanticipated pitfalls. Some have been leaped over, some have not; but let's start from the beginning.

Initial studies, as we know, focused largely on discerning particular patterns in existing, statically designed games. My first attempts were thus involved with trying to replicate these existing structures, from which was spawned the idea of the “conflict” as the central pivot of the story. In other words, it was observed that all stories center around some kind of “conflict”. It should be noted that “conflict” is here an abstract term; a conflict merely describes an undesirable (for the hero) state of being, and the exact details of what the conflict entails varies greatly. For instance, the following are all conflicts:

  • A mercenary is losing business to a rival mercenary.
  • A sick peasant needs a magical potion to cure his illness.
  • A noble has lost his signet ring.
  • A craftsman wants to make a fine piece of jewelry but lacks a golden opal to finish it.
  • An archaeologist has heard of an ancient relic in a nearby temple, but can't retrieve it himself.

You'll notice how abstract the idea is indeed. Other words one might think of instead of “conflict” might be “problem”, “lack”, or “desire”, depending on which you are looking at. Either way, I have chosen the word “conflict” to represent this concept. Compare this to Propp's description of function VIII/VIIIa, readily acknowledging that the incitement to action may not necessarily be a case of villainy, but a “lack” or “insufficiency”. I'd simply like to generalize this concept, simply stating that a conflict describes a state of being undesirable to the hero, directly or indirectly. Thus, we can conceive of a number of different conflicts of specific types later on.

Seeking to apply this principle to our project, we might be tempted to model conflicts somehow, and indeed that's why I did. In programming terms, one might imagine “Conflict” as a superclass of specific conflicts, such as “Rival Professionals”, “Threat of Assassination”, “Lost Heirloom”, etc. However, we run into a few problems, namely:

  • We end up having to do a lot of work. Every conflict imaginable needs to be modelled individually.
  • It encourages “templateism”. In other words, our stories more than anything just resemble Mad Lib story books with words like “grue” and “sword of smiting” inserted into the blank spots.
  • The system has poor emergent properties. We can't expect to be surprised by a sudden juxtaposition within this system; all that happens will follow the structure set forth by the conflict we have chosen.
  • Modelling player choice in this system becomes difficult.

On the other hand, the system has some nice qualities:

  • We can easily make our stories coherent. The conflict can select attributes, or “props”, relevant to the story with ease, since it knows of its own nature, so to speak.
  • We run no risk of ending up in impossible situations. We can simply build into the conflict mechanisms to prevent such malarkey.
  • We retain creative control. With this system, it's still possible for a human author to insert that certain je ne sais quoi into the story. Whether this is desirable or not is debatable.

In the end, I decided that some of the drawbacks were unacceptable, and after seeking the advice of friends, decided to try a different approach: The pseudo-Markovian token chain method.

This fancy name is basically just this: We divide our story into “tokens”, comparable to Propp's idea of “functions”; each signifies a step the hero undertakes on his quest. Much like Propp noticed, we can say for sure that certain such tokens only ever follow certain other such tokens. For instance, if we have a token called “The hero travels to a shrine”, we can conclude that the next part of the quest can either be “The hero receives a boon from the shrine's deity” or “The hero defeats the shrine's guardian”, or some other token we choose based on certain criteria and random chance.

To generate a story, instead of starting with a conflict, we simply pick from a list of tokens we call inciting event tokens; examples may be “The hero is enlisted by an NPC”, “The hero is sent a letter”, “The hero discovers an object”, etc. From thereon, it should theoretically just be a simple case of using simple “X follows Y” rules to generate an entire story. I call this idea “pseudo-Markovian”, because it resembles the concept of Markov chains, where we can generate a similar list of nodes where each node depends only on the previous node, or event, in our list.

Sadly, things turn out not to be so simple. It turns out that we face significant difficulty getting these tokens to be coherent, or in other words, making them make sense. This problem is only exacerbated if we try to make our system more general and universal in its nature (consider “The hero recovers an object” vs. “The hero recovers the sacred scriptures of the hidden mountaintop cult”).

Consider the case where we choose “The hero finds a letter” as our inciting event token. Now, immediately we realize that what's going to follow this token is highly context-dependent. What is the letter about? Who sent it? What's it's purpose? A letter describing a recipe for cake would belong to a completely different story than a letter telling of a plot to assassinate a king.

We can generate a context for the letter, given a little work. But then we need to figure out some way for this context to affect what future tokens we create to describe our story. Now, the process is no longer the simple “X follows Y” that we had before; it's now a case of “this token can, through some complicated process of determination, give rise to a number of other tokens”. This process quickly grows in complexity, as we shall soon see.

Let's say we can determine that this is a letter about an assassination, as above, and that we can somehow deduce from this that the next token should be “The hero warns the victim of the plot against him.” (Sidenote: This is also non-trivial, and I have not yet managed to devise a good system for doing this... nevertheless, the idea is definitely fathomable and should be realizable.)

All well and good, and we might be able to stop the story right here, but let's assume for the moment that we want to generate a few more tokens for a better, meatier story. Here's where things start to break down.

For a human, it's easy to imagine what might happen next: The victim is frightened and asks the player for protection, the player finds the person ordering the assassination, defeats him or convinces him to call it off, returns and gets a reward, for instance. Superficially it seems that we can accomplish this simply by saying that “Victim asks hero for protection” can follow “Hero warns victim of plot”... but we run into what I'll call an instantiation problem here: The “protection” token does not know the details of the plot. There are many conceivable scenaria where we might imagine a “protection” token fitting in: A merchant seeking refuge from bandits, a girl assaulted by a malevolent witch, a king wanting to get rid of a bandit gang, etc. The token would somehow need to know that what we're seeking protection from is an assassination attempt.

If this were a purely Markovian process, we'd be forced to somehow deduce this from the preceding token; that is the “Hero warns victim of plot” token. This, however, can range from being difficult to downright impossible. At worst, the token is disjointed from the context it appears in, functioning simply as “narrative glue” used to string two important events together, giving us no information about the context we live in.

Even if we have access to some underlying context (which was my second idea, hence the “pseudo-” in pseudo-Markovian), the process of ensuring coherence is clearly non-trivial. We'd need to somehow model the context in a way that is both consistent, universal and flexible, a task to which I can't fathom a simple answer (though a number of approaches have been considered nevertheless).

Now, even if we accept this contrivance as well, we still have significant issues ahead of us. The instantiation of the next token may add further plot elements or props to the story, such as the bandit leader who called for the assassination. Thus the further we progress, the more elements we have that can affect the generation of the story. THe most distressful problem is perhaps the token selection process, which now becomes hideously complicated to the point of nonfunctionality, when each token may amend and re-amend the context it lives in. Worse yet, we may somehow invalidate previous tokens in the chain, causing an impossibility in the story.

Ultimately, though, we need to face one conclusion: This “amendable context” the token chain now lives in is functionally identical to a conflict model. We haven't really gained anything; we have simply complicated matters by being too fancy about it. As the token chain grows longer, we just drag ourselves deeper and deeper into the mire that is a dynamically changing conflict model, with no appreciable gain over simply choosing all these details from the get-go as we generate the story's conflict.

As of yet, I have not been able to find a solution to this problem. As of now, I feel that my initial instincts were correct, and that modelling the conflict upfront is the simplest way and result in the greater overall gain. I can't escape the feeling that the drawbacks of that method result in disappointing results, though... in other words, I'm not at all sure that the sciences would be advanced by simply using this model. It feels too obvious, too evident, and not novel.

I encourage anyone reading this to comment on what I describe above. Eris knows a man is only as strong as his accomplices. Any input whatsoever is highly appreciated.

Comments

1
Elver On December 16 2007 (December 16 2007 19:11)

Alternative idea. Model conflict as abstract forces between different actors. Seek tokens/events that change the balance of forces between the actors.

Add comment

Markdown may be used.
You may enter a name for yourself. If left blank, the comment will be signed “Anonymous.”
Optionally, you may enter an URL to appear alongside your name.
Enter the word shown in the picture above.