Introduction
I am building a world simulator and put an RPG inside it. Why?
So as to have the detailed data necessary, and the passage of time, to generate interesting procedurally generated quests.
Goals
Chris Crawford is a smart visionary. But also broke his career on trying to solve ‘emergent narrative’ in games with his Storytron. As quoted in RPS article:
take Crusader Kings or Civilization, for instance, which both provide complex systems upon which all sorts of interesting decisions can be made. But Crawford argues that these sorts of games don't count because they "are not very dramatically interesting stories."
"It might be fascinating to the person who experiences it," he says, "but ultimately we have to ask does it really approach the quality of what we normally call a story? And the answer with almost all games is, well, no."
The following goals may not sound terribly revelatory but Crawford is a warning a lot of resources can be wasted for little results. I’m trying to provide direction through restraint: Hey we’re here to do something cool not find the ultimate breakthrough.
1. Pragmatic: It just has to work and entertain people.
We’re not trying to build an AI that wins an Oscar for Best Screenplay.
We’re not trying to match hand crafted narrative.
Our goals are entirely different from Crawford’s and therefore I think achievable. He says the ‘emergent story’ of Crusader Kings or Civ aren’t compelling outside of the original player. That is totally fine by me.
Let’s entertain one person over and over again. This to me is success.
2. Tailored to the Type of Quest - Not One Size Fits All
We don’t have to solve the “Singularity of Story”. If a different algorithm, approach, or paradigm is needed for a ‘murder mystery’ versus ‘find the artifact’, then we’ll do it by bringing each story type online one at a time. Of course we are looking for reuse, but the point here is it doesn’t have to happen.
3. Existing Proven Tech - Blue Ocean - Nintendo Wii Approach
In Gen 7 of the video game wars, Sony (PS3) and Microsoft (360) were trying to outdo each other on who could bleed the most money per hardware console by packing in the latest tech for a fixed price. Nintendo simply took existing ‘old’ tech and presented it in a new way.
Microsoft sold 84 million 360s
Sony sold 87 million PS3s
Nintendo won by selling 110 million Wiis and made money on every single one of them.
We will use simple ‘old’ tech, like templates, randomization, filtering states, variables, tags, and make something new from it.
Core Inspiration
Shortly after I started on Archmage Rises full time I saw this inspiring Ken Levine talk on 'Narrative Lego'
His ideas and examples are great. Sadly, after several attempts to implement his Stars and Passions ideas I found lots of problems. This isn’t a criticism, just there are a lot of ‘gotchas’ Ken didn’t cover that we’ve run into.
10 years later, Ken was interviewed by AIAS Game Maker’s Notebook and asked about his experience implementing Narrative Legos. This link gets to that part of an excellent interview:
When I listened to it, I heard some backpedaling from the initial broad idealism from the first talk. Restraint tempered by difficulties in implementation. Exactly where we are at. 😛
Our Approach
The creative process is simply this: Make something crappy. Now make it better.
For those of us who tend towards perfectionism, “If you’re going to do it, do it right”, the inability to make something amazing right away can be paralyzing. Its like taking the first step of 1,000 miles and already feeling like a failure.
The above adage of make something crappy really helps break me out of stinkin’ thinkin’ and get moving. Momentum can be built over time. Rome wasn’t built in a day, yadda yadda.
There is much more to say, but I’m trying to keep this first entry simple as I introduce you to my brain and the complexity of the task.
Here is a very high level flow of where we are starting for our test.
Nolan has an undergrad in history and a masters in screenwriting. He wrote up a summary analysis of the typical narrative approaches: Hero’s Journey, Three Act structure, Dan Harmon’s Story Circle, and his own Relational.
Nolan has been invaluable in the process. I told him, “We aren’t finished until you are happy with the stories we generate.”
Out of the gate, Nolan was taken aback with the idea of first generating characters then generating motivations and story. That’s backwards from how he writes or was taught. However, I think it creates a strong foundation, especially when we go to plug all this into the game world where we need to plug random NPCs into roles in the story.
The Prototype Program
I love working in C# Windows Forms. I won’t deny it! We have a tool called Bard for making Archmage Rises design data, Encounters, and Quests.
I took Bard, added a new feature World’s Worst Story, and started programming. I’m now summarizing a week’s worth of work, hopefully it will make sense.
1 Select Story
To keep things simple we chose a very simple story type: Kill the Monster.
2 Determine Object
Again, to keep it simple we always choose “Skeleton” as an object.
3 Select Characters
We generate a random number of characters within a min/max. At first all the characters I generated were of equal importance to the story. If I generated 5 roles, there were potentially 5 different agendas for the object. While it sounds interesting, it is kinda weird to have 1 protagonist and 4 equal antagonists. Each one of them become a ‘quest end’, meaning five different endings and different rewards.
Interesting, sure. But I can already see problems playing it out. It’ll just feel weird and it’s hard to keep it all straight in the player’s head. Especially with multiple quests occuring at once..
I came to realize not all ‘roles’ are equal, there are Major roles and there are Minor roles.
So I rewired it to generate X major roles and Y major roles.
4 Select Motivation
With our major and minor roles set, we now determine what their motivation is in this story. Moving fast and loose, we came up with a combinatorial composite system of motivations using a specific End Goal and a broad Conviction:
Conviction: Fight, Study, or Avoid
Goal: Eliminate, Study, Trophy, LiveAndLetLive, Fear, Resource
What’s cool about this system is that an NPC can want the skeleton fought because they want it Eliminated OR because they are afraid of it. Another NPC could want a skeleton left alone because they want to Study it OR because they believe in ‘Live and Let Live’.
Our intent is not to be exhaustive but to just come up with a few motivations and see if it works. And it does, surprisingly well! With even rudimentary data we’re already getting some interesting nuanced complexity.
Aside: I tested adding a new motivation to the system. It took 3.5 minutes and full worked. I was pleased with the data structure we have so far.
5. Assign Quest Giver and other roles
Philosophically we are all in the staring role of our own life’s theater. We play smaller roles in each other’s stories. Putting all that aside, we found it easier to pick a Quest Giver and make that the protagonist. Everyone else is either an Ally, Neutral, or Against the protagonist Quest Giver getting what they desire.
So if two NPCs both want the skeleton dead, they are said to be Allied. The second NPC will provide assitance to the quest giver getting what they want: a dead skeleton.
But wait! What if NPC A wants the skeleton killed so they can study the body, and NPC B wants the skeleton killed so they can use it’s body as a resource in some crazy experiment. They want the skeleton dead, yes, but it is a zero sum game: there is only one skeleton body (theoretically), so they are actually at odds with each other.
This required assigning Ownership to motivations. If F wants a skeleton dead so it can have it as a trophy on the wall, the goal requires ownership. If G wants it dead because they are afraid of skeletons, that motivation does not require ownership and the two are in agreement.
So we go through all our characters and figure out their disposition and role in the story based on comparison of motivations.
6. The output Thus Far
With all the above done and considered, here is a sample of the output. You can see where I made it clear where any disagreements are so we could validate everything is working as we would expect.
There are a series of Minor roles. Their motivation is simply to support major players. If they are against the quest giver, then they will help the antagonist and provide roadblocks to the player. If they are neutral, they can be persuaded to join a side (more on that another time). If they are Allied, they provide help and resources to player so the quest giver gets what they desire.
**Quest Giver:** Guichard Peake, Male, Low wealth, age 46
Motivation: Fight - Skeletons terrify me.
**Majors:**
Emma Godwin, Female, High wealth, age 40
Motivation: Avoid - Skeletons terrify me.
ALLIED quest giver.
Emma Mellish, Female, High wealth, age 29
Motivation: Avoid - Skeletons have just as much right to exist as we do.
AGAINST quest giver. Disagree on: Skeleton should be Intact
Hugh Rooke, Male, High wealth, age 24
Motivation: Capture - A Intact Skeleton will make an excellent trophy.
AGAINST quest giver. Disagree on: Skeleton should be Intact
**Minors:**
Guichard Naylor, Male, High wealth, age 56
Motivation: Support -
ALLIED quest giver.
Imayna Buggy, Female, Low wealth, age 22
Motivation: Support -
NEUTRAL quest giver.
Bertha Petrie, Female, Mid wealth, age 31
Motivation: Support -
NEUTRAL quest giver.
Isabel Guy, Female, Low wealth, age 31
Motivation: Support -
NEUTRAL quest giver.
Cecily Radcliffe, Female, High wealth, age 30
Motivation: Support -
NEUTRAL quest giver.
Walter Grubb, Male, High wealth, age 62
Motivation: Support -
AGAINST quest giver.
We took a step back and analyzed our results. So far so good. This seems to be going in the right direction. Nolan is happy, and at the end of the day that is what we’re all here for. 😛
Next Steps
Next week we’re going to assign tasks based on motivation and alignment
Thanks for reading. Hope this was clear!