Book Review: Procedural Generation in Game Design

From the first line of code I wrote, I have always been fascinated by procedural content generation (PCG) and the near-limitless potential it seems to hold for game development. Like so many other new developers, my first project was (of course) a wildly ambitious rogue-like. Needless to say, it didn’t quite pan out.

However, despite its challenges and limitations, I did keep my fascination for PCG and consider it a wonderful tool when applied correctly. Recently, I have been trying to read up on PCG while working on SKALD and a major gripe for me has been the lack of good literature regarding the subject. No wonder then, that I was very pleased to pick up a copy of Procedural Generation in Game Design.

Cover for the book Procedural Generation in Game Design

Procedural Generation in Game Design is a book consisting of 27 chapters (who read like essays) from different industry professionals. The book is edited by Tanya X. Short (creative director of Kitfox Games ) and Tarn Adams (co-creator of Dwarf Fortress) with a preface by Derek Yu (creator of Spelunky) .

On its back cover, the book lists the following four features:

  • Introduces the differences between static/traditional game design and procedural game design
  • Demonstrates how to solve or avoid common problems with procedural game design in a variety of concrete ways
  • Includes industry leaders’ experiences and lessons from award-winning games
  • World’s finest guide for how to begin thinking about procedural design

The book is divided into four sections: “Procedural Generation”, “Procedural Content”, “Procedural Narrative” and “The Procedural Future”.  Each section contains a collection of chapters that, more or less, share a common thread.

The topics covered in the different chapters is quite varied and include (among others): “When and Why to Use Procedural Generation”,  several procedural level design case studies, “Ethical Procedural Generation”, puzzle design, “Audio and Composition”, “Story and Plot Generation” and “Algorithms and Approaches”.

Though varying in both length and depth, all the individual chapters are quite good  with some even being excellent.

Mentioning a few, Mark R. Johnson’s (creator of Ultima Ratio Regnum) short chapter on meaning in PCG is great. So is Brian Bucklew’s (Freehold Games) chapter on “Algorithms and Approaches” (though I wish it had been longer). The entire section on procedural narrative is excellent as well, with the chapters by Ben Kybartas (Delft University of Technology) and Emily Short (check out her excellent blog) standing out in particular.

My major criticism of this book, however, is that it struggles in creating a coherent presentation and progression of content.

In several cases there seems to be a mismatch between chapter- and section topics. For instance: “Algorithms and Approaches” is oddly placed in the section called “Procedural Futures” even though the subject of the chapter is to give an overview of classical techniques used in PCG. In fact, I find that only the section called “Procedural Narrative” manages to maintain a strong coherency between the topics of its chapters.

As I have mentioned, I also find that the chapters vary somewhat in how deeply they explore their chosen topics. While a few read like abbreviated academic papers, others (the majority) feel more like blog posts. This is not to say that the quality of the content is poor: The chapters are written by highly talented game developers and provide inspiring insights into several well-known PCG-heavy indie game titles.

However, each chapter appears to have been written in isolation with only minimal direction concerning content. I find that the progression of content and relative amount of space given to each subject is also such that the book seems a bit underwhelming despite its 300+ pages. This is perhaps somewhat compounded by each author spending a few paragraphs talking about themselves and their project. Not that this is wrong, but it does dilute the PCG-specific content of the book.

The result is that the book does not live up to its full potential and promise of providing  the “World’s finest guide for how to begin thinking about procedural design”. Furthermore I find that this makes it hard to see who the books intended audience is: New developers may find the coverage of subjects incomplete while experienced developers may find it somewhat superficial.

Though the execution is far from perfect, the book (arguably) does mostly deliver on its promised features. And for all my criticisms, I did enjoy reading the individual chapters (or essays if you will). Therefore, I do recommend picking up this book if you’re looking for an interesting collection of individual essays concerning PCG by leading indie game developers. However, if you are looking for a comprehensive guide and introduction to PCG I doubt that this book alone will suffice.

You can pick up Procedural Generation in Game Design at Amazon for $49.77 (320 pages paperback, with grey-scale illustrations).

I was tipped off about this book by the very talented Filip Hráček.

Did you find this book review helpful? If you have any questions or comments, please get in touch. Also, follow Scape-IT and SKALD on Twitter for all things RPG and geeky!

 

 

 

The SKALD Markup Language

The Basics

SKALD is a game engine specifically written for digital gamebooks and interactive novels. The design vision for SKALD has been to create an engine that allows for a strong narrative to be built upon a foundation of classic RPG features (character development, tactical combat, loot etc.) as well as certain rouge-like features (procedural generation). The game engine is designed with a strong separation between data and logic in mind. The reasoning being that it must be possible for a designer with minimal technical expertise to add content. Also keeping all data separate from the logic will allow multiple gamebooks to be published using SKALD without making changes to the engine itself.

A mage
The mark-up language is where the magic happens

The SKALD markup language has three main components:

  • The XML that encases all the data
  • A simple string markup used to create procedural content and to set the order of resolution for any embedded dynamic code.
  • The formatting for embedding dynamic code.

The XML

SKALD uses ordinary XML to store data about all its game objects (scenes, items, NPCs). I briefly considered using JSON. However, after doing some research I arrived at the conclusion that the advantages of using JSON over XML were nil for this application. JSON would perhaps have been more relevant if I had a stronger emphasis on developing for a web-based service (as JavaScript loves JSON).

XML

 

The String Markup

All the data in the XML files are parsed to strings. Those strings are then run through a processString() function that performs any action prescribed by the string markup, resolves any embedded code and returns a copy of the processed string.

One of the first things I found that I wanted was a short-hand for returning random strings from the XML. My solution was simply to use the ‘/’ character. Adding ‘/’ to any string will cause the processString() function to return the result on either the left or right side of the ‘/’. For example:

processString(“I like hamburgers/I like sushi/I like ramen”)

returns either “I like hamburgers”, “I like ramen” or “I like sushi”.

Right of the bat you can see that this can get verbose. The solution was to add parenthesis. Now the previous string can be shortened like so:

processString(“I like (hamburgers/sushi/ramen)”).

By nesting parenthesis (resolves from inner, to outer) you can make complex string such as:

processString(“I like ((cheese-burgers/bacon-burgers/BBQburgers)/sushi/ramen)”)

The applications for this is to create variety in the text (especially for scenes that the player keeps returning to) or to provide randomized output from certain XML tags.

For instance, each scene has one or more exits that lead to the next scene. That exit contains a tag called <tar> (target) which is basically the id of the next scene to load. Since the value of <tar> is stored as a string and ran through the processString() function, you can write an exit with a target like this:

<tar>2/3/4</tar>

The result is an exit that randomly sends you to scene 2, 3 or 4. Pretty neat for making things like random encounters.

Dynamic Code

So far, the system is completely stateless. Processing the string

processString(“I like (hamburgers/sushi/ramen)”)

will return a random output every time. The next logical step was to add a system for storing and modifying variables at run-time. The solution is for implemented by using “Reflection” in C# to access functions in the code via strings passed from the XML. For instance I have a function addVariable(key, value) that creates a variable (named key) and sets it to value. So

addVariable(“food”,”hamburgers”)

will set the variable “food” to “hamburgers” and

getVariable(“food”)

now returns “hamburgers”. Using my own notation to embed functions in the xml datafiles the functions must be wrapped in curly braces like this:

{addVariable|food;hamburgers}

It is now possible to write:

processString(“I like {addVariable|food;(hamburgers/sushi/ramen)}”)

This line of code will return for instance, “I like sushi”. And then

processString(“My favorite food is still {getVariable|food}”)

Will utilize the value stored above and return “My favorite food is still sushi”. Note that the “processString” function will substitute everything wrapped in curly brackets for the return value of the function wrapped in the curly brackets. 

The SKALD system contains about a dozen functions that can be called dynamically. In large part these are used to manipulate and perform logical operations on variables (allowing for conditional branching etc.). The result is that the number of scenes that need to be written can be reduced drastically. It also allows procedural content to be added by the designer, working only through the XML file.

Overall, I’m pleased with the functionality of the SKALD markup language, as it exists today. It’s expressive enough tell any kind of story and to give a direct binding between the story elements and the underlying RPG mechanics. It also supports the concept of separating data and logic and it greatly reduces duplication of data by cutting down on the number of scenes that need to be written. At the same time, it’s still possible to write an entire module by using only XML and entirely forgoing the use of the string markup and dynamic.

Now, off to write some adventures!

Design Goals for the SKALD Engine

The SKALD Roleplaying System consists of three components:

  • A set of RPG rules usable for pen-and-paper as well computer RPGs.
  • A game engine for making gamebooks, interactive fiction and text-heavy roleplaying games.
  • The games published using the SKALD engine.

The current focus of the project is to finish the game engine. This post will attempt to summarize the design goals for the engine. For more information about the project in general, see the welcome post.

NOTE: I’m writing this post as much for myself as anyone else. As such, this post will be highly prone to edits as i update and change the design goals.

SKALD is a Storytelling Tool

First and foremost, I want to create something that will allow me to tell stories. I was a pen-and-paper RPG game master for years but as I grew older, holding together a gaming group became near impossible. I began to miss the creative outlet that GMing represented. This was been a big driving force in deciding to develop a game engine for text based roleplaying games and gamebooks.

Specifically, I chose text-heavy games because I feel comfortable with using text as a narrative device. Text is easy to add (if you don’t consider the hardships of writing prose) and very flexible. Flexibility was another important point as it gives me the option of choosing between an infinite variety of settings: From sci-fi and fantasy to historical and educational. This was an important rational for beginning this project by creating a setting-agnostic game engine.

SKALD is a roleplaying game

In addition to creating a system for writing choose-your-own-adventure style gamebooks I also want SKALD to be rooted in a proper RPG system. At a minimum the SKALD game engine must allow for the following game mechanics:

  • a character creation and advancement system complete with skills and feats
  • skill checks
  • tactical combat (in one way or another)
  • looting, buying and selling items
  • magic and / or psionics

An important part of implementing the RPG features is that the system must be modular enough that it should be fully possible to choose away any and all parts of the RPG system at the design level and without changing the source code. In other words: Using the same game engine, it must be possible to make a vanilla gamebook with no features beyond one paragraph leading to the next, as well as gamebooks with full RPG game mechanics.

SKALD has rogue-like features

In addition to the rpg game-mechanics it’s also important for me that the SKALD game engine allows for certain rogue-like features. In particular I want to have the ability to add procedurally generated content to the game. This, combined with an underlying RPG system will make it possible to essentially write a text based rogue-like. At the same time, just as with the RPG system, it must be fully possible to write a gamebook without using a single rogue-like feature.

Why add rogue-like features? Well, my reasoning thus far is that this will make it a lot easier to add to the runtime of the game. I have a vision of the narrative of the gamebooks being superimposed on relatively open worlds and thus adding a lot more replay value to the game beyond just going through the main plot over and over.

Again: This is an optional feature I’ll add to give myself the full breadth tools to tell the kinds of stories I would like.

Engineered with Sustainability in Mind

Not only is SKALD a labor of love, but it will also serve as a tool I could potentially be relying on for years to come. In the long term, it might even be adopted by other game developers interested in working within the gamebook genre.

As with all code that sees long-term use, there’s a lot to be gained by “measuring twice and cutting once“. In other words I intend to take my time and keep the source code architecturally sound, compact and well documented.

The notion of strictly separating the logic from the data and making all aspects of the game itself modifiable via the data is the prime tenet I’m currently building the engine around.

SKALD as a Brand

Lastly, it would be pretty neat if the SKALD system and the game engine in particular becomes a recognizable brand. It would be awesome to see “Powered by the SKALD engine” and “SKALD Roleplaying System presents:”  on games!

 

That’s it so far. Thanks for reading and be sure to keep following the SKALD devlog! In the meantime, follow Scape-IT and SKALD on Twitter for all things RPG!