The basic unit of a procedural story is a chunk. I define a chunk as a set of content that can be defined by the narrative symbology and a role in the game space. Think of a chunk as the bones in procedural animation that are moved through time and space, and the narrative symbology as the constraints on the bones. Except you’re moving events through time. Like a wizard.
So chunks can be pretty broad. Take Farcry 2. To quote Patrick Redding:
Figure out the right way to break content down, for a dialogue, or for an animation, or for a scripted event, so that we can reuse as much of that content as possible and make sure that it can be used in lots of different locations with lots of different NPCs. And that’s really the nuts and bolts of it.
The choice of what you chunk is entirely up to you. I think it can even range from costume changes all the way up to adding new characters. But I recommend at least starting off with groups I call Encounters. Encounters are just the group of chunks that are authored to play together in a specific space. The key advantage of Encounters is that you (1) know where they are going to be used, so you can better author them and (2) you can only play one Encounter at a time. This makes the system vastly more understandable and usable, because Encounters very closely mirror the scripted event sequences that linear level designers are used to working with. Additionally, each Encounter is individually required to clean itself up, and thus designers can work independently from each other without stomping on each other’s toes. Clean up can be a real technical issue in the procedural space, particularly when we get to streaming, so this is a nice feature. If the game can only allow 10 characters at a time, both designers can’t use 10 characters unless they each clean them up afterwords.
I call the defined spaces these Encounters use Zones. Most traditional linear games already define playspace using trigger-segmented rooms, so designers are used to working with them. The Zone density, Zone sizes, and Zone spacing (or overlapping) are useful variables in determining how the the style of your game. You can also deliberate skip some Zone at a periodic rate to alter the feel. By separately defining Zones, we can then create multiple Encounters for each Zone, and then play the most relevant Encounter when asked. This appropriate Encounter Picking is the goal of the AI algorithm. Because of the greater narrative density in each Zone, creating an Encounter-based game requires much less space (and thus much less art). It also happens to handle backtracking well, keeping the smaller space interesting, and pushing more gameplay exploration.
That said, there are drawbacks to only using the Encounter approach that you’ll want to mitigate. First, you’ve got to clean each Encounter up. For some games this can be a real issue. If you want guys to chase you from room to room, then they can’t get despawned after an Encounter. Second, this creates deadspace between Encounters. Ideally, you’ll want to hide the Zone switches with some content as well, so the entire experience feels smooth. But both of these issues are traditionally problems for linear scripted trigger-based games, so if you’re doing that already, you might as well get them fixed for the Encounters as well.
Next time, I’ll dig into the flow of narrative over time in this Encounter approach, and compare it to Branching and Facade systems.