Lifepaths, flowcharts, Edge, and human greed

Hellmouth was my semi-failed entry into the 2012 7DRL competition. I’ve continued to work on it over the past few months, and while the game is still sorely lacking in features, I’ve made some real progress by focusing on building components in isolation from each other as much as possible.

One such component is the character generation system. Hellmouth uses a lifepath system where your decisions about your character’s history affect their capabilities. Here’s what one of Hellmouth’s lifepath nodes looks like:

'Warrior Parents' : {
 'age' : 0,
 'text' : "My parents were skilled warriors.",
 'short' : "were heir to martial prowess",
 'effects' : {'HP' : 1},
 'choices' : ('Mundane Infant', 'Dark Omen', 'Strange Omen', 'Holy Day', 'Bloody Birth', 'Immediate Adoption'),

(Apparently, a lifepath system is also found in the cult classic computer game Darklands. #rgrd informed me of the resemblance when they realized that it also shares Hellmouth’s setting and plot… even though I’d never heard of it. Eerie!)

A dict-based lifepath node format works for me, but it’s hard to piece together an entire tree from looking at single nodes. Thankfully, BirdoPrey in #rgrd IRC brought up his use of the DOT language to visualize his program’s class structure. I had been planning to learn DOT for a while (I have the scribbled notes to prove it!), and I saw this as the perfect opportunity. Some proper visualizations (c.f. scribbled notes) would be helpful for many of the problems I was having with laying out lifepath events: finding nodes that I had forgotten to create, finding unconnected nodes, and ensuring that nodes intended to run ‘parallel’ to each other actually do so.

Generating a file with the necessary syntax was easy (thanks, Python!). The DOT language is interpreted by many programs, but I chose to use dot, part of Graphviz. Refreshing the visualization after making changes to the lifepath data takes just one line and a few seconds:

python | dot -Tpng > hellmouth.png

Nifty, huh?

Hellmouth’s lifepath, while very large for its early stage of development, is a fairly straight take on the concept. A more innovative lifepath system can be found in the MechWarrior RPG‘s lifepath system. The character’s progression is divided into stages, with the choices at each stage representing broad background details. Early choices, like growing up in a specific nation, are relatively linear. Later choices allow for more open-ended decisions to be made; for example, military service can consist of progression into more elite units, but it could also take the form of several tours of duty with the same unit.

Each choice, in turn, has many possible events. One event is chosen at random, but you can spend Edge (your character’s luck attribute) to buy rerolls. This is a permanent cost, but the choice is often quite appealing. Some choices are inaccessible without prerequisites that can only be obtained by rolling, and those choices often offer better (or at least more interesting) outcomes, like becoming a professional ‘Mech gladiator on Solaris VII. Additionally, some random events can cripple your character, whereas others can result in wealth far beyond what you could normally purchase using your discretionary points.

(And therefore far beyond what the other players can gain access to without extraordinary luck of their own. Problematic!)

Unfortunately, probabilistic lifepath events don’t translate well to single player roguelikes. I fondly remember high school days spent rerolling characters in ADOM until I got the star signs that I wanted. Other ADOM players are more extreme and scummed for random birth events as well. Some desperate souls have been known to start and save many characters on Creator’s Day. A few depraved servants of cHaOs simply changed their system clocks! Their corruption is admirably intense.

Leave a Comment

NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>