To me, this is a new form of procedural generation. You declare specific rules for your desired content, and then a generator runs accordingly. I’ve only seen it used for text, but I’m sure the same technique works for anything. The simplest example is picking a random item from a list, and a slightly more complex version shows the power of defining a grammar:
grammar = {
"first name": "Anna", "Belle", "John"
"last name": "Brown", "Jameson", "Williams"
"full name": "{first name} {last name}"
}
G(grammar, "full name") -- ex: Anna Williams
The syntax above is pseudocode for a generator I am working on. I plan to allow the use of a custom seed along with the generator so that you can do things like have uniquely generated people for a population, where only a lookup number needs to be stored (if you wish to remember a specific person).
It gets even more powerful when you make it possible to define multiple versions of the same grammar and use different ones depending on an object’s properties, and allow inline code within the grammars. Here’s an incomplete example based on my continuing efforts to build space games:
{
"system name": {
{
props: { pulsar: true }
"PSR {random(1000)}"
}
{
props: { pulsar: false }
"{Greek letter} {Latin name}"
"{random(100)} {Latin genitive}"
"{modern constellation} G{random(1000,9999)}.{random(1000,9999)}"
}
}
}
For this example, pulsars would get their traditional “PSR ###” names, while non-pulsars would get names based on differing classification methods.
I’m currently thinking about a game based on Aurora, but massively simplified and playable in-browser. Grammar-based content generation would play a very important role in this, from generating system names (as above) to NPC ship design.
References
Resources that helped me recognize the potential of grammars:
- GalaxyKate’s So you want to build a generator…
- Tracery (a grammar-based text generator)
- Procjam’s Improv tutorial (Improve is a more advanced grammar-based generator)
- A New Kind of Science by Stephen Wolfram (while not directly used for writing this, I realized that it is a concept shown extensively in this book..or at least the first few chapters, I have not finished it yet)
(Normally I would like to publish working code along with these posts, or some other form of useful data, but today we’re looking at a work-in-progress idea without even that much concrete form.)