Hi! I'm the programmer, and this is a post about the tools that we use to build the comics that deliver story in our game.
a scene from Berri's "Brash" relationship quest
Let's talk about how we enable character-specific writing in Wildermyth.
The Challenge
Our game doesn't have one overarcing plot. Instead, story is delivered organically as you make choices. At each encounter, the game delivers events that are specific to what is going on, and who is involved.
Wildermyth is a character-driven, randomly generated game. All of the writing has to handle characters that might be male or female, straight or gay, and might have various personalities and relationships with eachother.
We're leaning into that. Our goal is to deliver stories that allow your heroes to shine as real people with believable personalities, and that react to what's going on in your game.
We're leaning into that. Our goal is to deliver stories that allow your heroes to shine as real people with believable personalities, and that react to what's going on in your game.
amirite?
So, is that too much to promise? I don't think so. Here's a terrific talk that was a big inspiration to us as we were putting the dynamic writing system together: http://gdcvault.com/play/10155 28/AI-driven-Dynamic-Dialog- through
The system he lays out is intended for dialogue in an action game, but we're able to use similar ideas in our game to select appropriate events based on the situation.
The system he lays out is intended for dialogue in an action game, but we're able to use similar ideas in our game to select appropriate events based on the situation.
Dynamic Writing
The basic idea behind our approach is that our writers work in relatively small chunks, called events, and each event has a set of targets (rules) that must be satisfied in order for it to fire. So if you, as a writer, want to tell a story about a nostalgic hero getting ambushed by Drauven in the forest, you can build your event with targets something like:role:hook, aspects:["hook_nostalgic"]That gives you an event that can only happen in a specific situation, and the game will assign the matching heroes to the named roles (hook, friend, legend). Those roles can be used in the text like so:
role:friend, relationshipStatus:{require:any, with:hook}
role:foes, aspects["drauven"]
role:site, aspects["forest"]
role:legend
<panel half|hook grim anchor:{x:0.1,y:0.5} size:0.6667|friend talking speaking textBox:{} size:0.8333>
<legend.mf:His/Her> words or not, it sounds like they stuck with you
<panel fourth |hook joy>
Well I'm not going to pretend they didn't!
<panel fourth|hook talking>
They're nice words. I'm not insensitive to that. But ultimately...
<panel full right|hook talking|friend skeptical anchor:{x:0.78,y:0.5} size:0.5882 nameTag:bottomRight head:{rotate:345,scaleY:-1}>
Ultimately, they're just words. The river is the river. It's cold, it's fast, it will kill you if you're not careful around its waters. And the trees might hide sylvan treasures, sure, but more likely they contain wolves, and rogues, and. And look! There among the bark and fern! Definitely Drauven.
Hopefully you can get a sense for how it works, but probably you don't want to be editing stuff like that by hand. Well, you don't have to. Sortof. I mean, sometimes a little bit. Anyway let's look at the tools.
Adding new targets (story roles) is done like this:
And eventually we have all our targets set up like so:
These will all be matched automatically by the game and can be called out in the text. So this event will only occur when the site has the "biome_swamp" aspect, the injected threat has the "morthagi" aspect, and there are at least two heroes, one of which is fairly bookish (at least 50) and another of which is a loner (at least 40).
Now let's move over to the writing side of things. When we first arrive, it's pretty barren.
Bookish (Tanius) uses a <loner> tag to insert the name of his conversation partner (Kayn), and Loner responds depending on Bookish's gender and Loner's gender. Here's the same text interpreted by different characters:
Pretty much works the way you expect it to. Tags can be nested, you can get as precious as you like with it. We support a bunch of tags, here are some:
mf:a/b -- insert a if character is male, otherwise b
awm:a/b -- insert a if character is attracted to women, b if character is attracted to men
whm:a/b/c/d -- insert a if character is a warrior, b if hunter, c if mystic, d if farmer
fullname -- the characters whole name instead of their short name
And we also support more advanced queries like this:
So in this case, depending on their personality stats, bookish and loner will have a different conversation. (this can get out of hand quickly, so it's maybe best used for minor coloration, rather than changing the meaning or thrust of a panel.)
But the basic idea is that you can write: <role.stat1/stat2/stat3:a/b/c> for 2 or more stats, and whichever stat is higher, the corresponding text will be inserted.
All characters in Wildermyth are generated with histories that influence their personality stats. The personality stats are:
Next, let's add some visual interest. We said this was going to be in a swamp, right? Well, when you click on one of the panels on the right, the Panel Editor pops up and you can just go crazy with it.
Event Creation
Let's say we want to write a story about encountering Morthagi in a swamp, and the story we have in mind calls for two heroes, one bookish and one a loner.Adding new targets (story roles) is done like this:
And eventually we have all our targets set up like so:
These will all be matched automatically by the game and can be called out in the text. So this event will only occur when the site has the "biome_swamp" aspect, the injected threat has the "morthagi" aspect, and there are at least two heroes, one of which is fairly bookish (at least 50) and another of which is a loner (at least 40).
Now let's move over to the writing side of things. When we first arrive, it's pretty barren.
This is your blank page.
So let's add some story.Using Targets and Panels
You can make comic panels by inserting a <panel> tag, and you can specify who's in them by their role. You can insert their name into the text, and you can insert different text based on the character's gender, and lots of other game properties. Here's a basic example.Bookish (Tanius) uses a <loner> tag to insert the name of his conversation partner (Kayn), and Loner responds depending on Bookish's gender and Loner's gender. Here's the same text interpreted by different characters:
Pretty much works the way you expect it to. Tags can be nested, you can get as precious as you like with it. We support a bunch of tags, here are some:
mf:a/b -- insert a if character is male, otherwise b
awm:a/b -- insert a if character is attracted to women, b if character is attracted to men
whm:a/b/c/d -- insert a if character is a warrior, b if hunter, c if mystic, d if farmer
fullname -- the characters whole name instead of their short name
And we also support more advanced queries like this:
So in this case, depending on their personality stats, bookish and loner will have a different conversation. (this can get out of hand quickly, so it's maybe best used for minor coloration, rather than changing the meaning or thrust of a panel.)
But the basic idea is that you can write: <role.stat1/stat2/stat3:a/b/c> for 2 or more stats, and whichever stat is higher, the corresponding text will be inserted.
All characters in Wildermyth are generated with histories that influence their personality stats. The personality stats are:
- BOOKISH
- COWARD
- GOOFBALL
- HEALER
- HOTHEAD
- LEADER
- LONER
- PEACEMAKER
- POET
- ROMANTIC
- SNARK
Next, let's add some visual interest. We said this was going to be in a swamp, right? Well, when you click on one of the panels on the right, the Panel Editor pops up and you can just go crazy with it.
Visuals: The Comic Editor
In-panel, you can see little handles that let you adjust each actor's position, head rotation, and size, and on the left you have very detailed control over the panel. You can also add new actors here, like images, props, etc., and then put them where you want them, tint them, whatever. You can take it pretty far:
So that's where the tools are now. I think it's still a bit rough, honestly, and we can do better both in terms of ease-of-use, and visual flexibility. I have lots of ideas for improvements. But already we can build fairly sophisticated comics pretty quickly.
The Dream
Sometimes when I think about what this game could be, I think it could be an amazing storytelling tool. Maybe you want to build your own Wildermyth quest lines. Maybe you're running a D&D game and you want to build out some content for your players. Or maybe you just want to make funny comics for your friends.
I would love to enable all that stuff. I want us to be able to tell all the stories, and (for the ones that make sense,) have them fit right into our game world, seamlessly.
I would love to enable all that stuff. I want us to be able to tell all the stories, and (for the ones that make sense,) have them fit right into our game world, seamlessly.












Add shapeshifter to personalities... werewolf, crow, coyote, fox, etc.
ReplyDeleteYeah! Right now that stuff is handled as Aspects, so you can totally a) have those characters and b) write particular stories about them. The Stats are more for just personality sliders that everyone has, and they range roughly from 0-100.
Delete