There’s a phrase from Mandelbrot about fractals that stuck with me: fractals are about roughness.
I’ve been trying to figure out how to explain something about the dimensions of generativity that I think is under-explained. Effective procgen isn’t about producing as much content as possible, it’s about producing content with the right texture.
By texture, I mean to invoke the sensation of running your hand across the rough fabric of the generated output. Texture isn’t a formal term (yet) and there might be a better term to use to describe the variation of roughness, but that variation is one of my primary interests.
When people first do something with procgen, they sometimes err on the side of trying to show off as much of what their generator can do as they possibly can. An example: you’ve got a series of things that the player is going to experience with (combat encounters, trees, vfx particle systems). You made a lot of them by hand, but you want to randomize the player’s experience of them while avoiding repeats.
First move that many designers make is to treat it like a bag of marbles or a deck of cards: put the content-marbles into the bag, draw marbles at random, replace the marbles when the bag is empty. This guarantees that the player experiences everything at least once, without being able to predict the order, and without repeats (except at the transition between bags). Where’s the problem?
If you’re familiar with Tetris randomizers you might be thinking of the issues with the human perception of randomness, but in my experience that’s less of a problem with very unique content. No, the more immediate problem is twofold: the first time through, the player will have no idea that the content is randomized (how can they? they’ve never seen it before!).1 Then, the second time through, the order is unpredictable, but they’ve seen everything already.
You’d hope that the unpredictable order would make it more interesting, but it can end up feeling very flat; just one thing after another. You can make it less flat by having some of the content marbles be uniquely different, but that works by creating texture along another dimension. The result can devolve into waiting around for the spiky landmark result.
Sometimes a flat pacing is fine; Annals of the Parrigue’s principle of mushroom emphasizes that there’s nothing wrong with repeating slightly-varying content. Sometimes it is perfectly fine to have expected-but-random content. But you can also go for more interesting textures. Weighting the marbles in the bag to make some outcomes rare enough that you won’t encounter them for a while can keep the experience fresh. Repeating low-importance events can make the bigger shocking ones really stand out, while paradoxically making the repetitive events seem like they’re just a natural part of the landscape. Grouping content into related bundles is another way of adding meaningful texture, this time through constraints. In either case, the texture is rougher and more interesting than the smooth, frictionless experience that tries to over every possibility fairly.
The tree/forest/orchard distinction that I’ve talked about is related to this; is your focus the uniqueness of the individual artifact, the slight variations between similar artifacts, or the overall experience of the gestalt across all of the artifacts.
There’s a lot more that could be said about how to use texture for more interesting procgen.
-
There are ways to have people realize they’re interacting with a procgen result the first time around, but that takes some deliberate design. Or explicitly telling them up-front. The easy way is just to have a short enough content loop that it is obvious that things are different this time, which is one of the many reasons why procgen is so effective in roguelikes. ↩