Since my last post I’ve been struggling with a number of realizations about procedural content generation, that effectively slowed down my progress to a point where I didn’t even write one line of code per day anymore. Those realizations came to me in several different ways that I want to share:
1. The 10’000 bowls of oatmeal
In a GDC talk video I recently watched from, I learned about the 10’000 bowls of oatmeal problem, a term coined by Kate Compton in her blog post “So you want to build a generator” where the difference of uniqueness vs perceptual uniqueness is very well explained. Basically, you can pour 10’000 bowls of raw oats and mathematically speaking, every bowl will be unique, but at the same time any two of them are virtually indistinguishable to the human eye. In her post, which I can only recommend you read if you’re interested in procedural generation, she gives a hilarious little jab at the 18’446’744’073’709’551’616 (which by the way is just fancy marketing talk for 2^64) planets that can be generated with a certain algorithm and points out that they might be subtly different but after seeing a certain amount of them, they all seem to be very similar to a point that they may not be perceived as different.
Achieving perceptual uniqueness is very difficult with procedural generation. While it’s true that with simple means, you can generate gigantic “pseudo” random numbers and using those to feed an algorithm to generate objects, that mathematically speaking, will lead to that same gigantic amount of “different” objects. It depends almost entirely on the algorithm used, if most of the generated objects look really similar and may be indistinguishable to your eye.
The difficulty designing an algorithm that permits a large amount of perceptual difference lies in it’s constraints to be able to use what you created in a meaningful way. Lets say you want to create procedural plants and place them in a world where you can interact with them, you would have to make sure, that every generated plant conforms to certain rules, so another algorithm could then place those plants. This is already an extreme limitation, going from every possible shape and size to only shapes that fit inside a certain size range and due to the fact that you want it to be identified as a plant, its shape is restricted to have some sort of “organic” look…
Finding a good balance of allowing an algorithm to create vastly different objects while adhering to rules that allow for interaction and usability in a game world is a very challenging task and one that threw many and much smarter people before me into one of those bowls of oatmeal. So chances are good, that even investing huge amounts of time in tweaking and fine tuning an algorithm will still lead to disappointment in players, if you promise uniqueness.
2. Playing a lot of No Man’s Sky
Under the excuse of looking for inspiration, I played a lot of No Man’s Sky, since the launch of the Next update this year. I did play the game on release back in 2016 for about 20 hours and it was a very disappointing experience back then but I loved the idea of creating a procedural game world, or in this case “universe”. The problem with the game was, that the game play felt like, what a friend of mine fittingly compared to Tomacco from The Simpsons. We didn’t enjoy the game play but at the same time couldn’t stop trying to find that magical planet, where everything would look great and really different.
More variety in flora and fauna was promised and at first I saw all those improvements and it really felt like a giant leap to what it was upon release. But the difference on how long it took until all planets/plants/animals looked more or less familiar to my eyes was only marginal. If everything looked similar upon release would take about 5 to 10 hours of playing, after the “Next” update it took about 15 to 20 hours of playing until that same feeling would creep back in, except that it felt less like Tomacco than the first time around.
That made me start to think about what was missing for me in this game that made me feel annoyed/bored after a while. I had no purpose in this generated universe… Yes, there is a story and more and more story was added to the game over time. Then there is base building, you could do side missions to pass the time and so on… But the different main story lines in the game just lead to basically the same and the side missions repeat themselves very soon and after you played every kind of side mission once, they started to become pointless to me. In fact, what I enjoyed the most of the roughly 140 hours of “playing” this game, was certain glitches I read about and tried out for myself and that, I guess, speaks for itself when the bugs in Software bring you more joy than the working parts of it.
My conclusion of what is missing is rather simple, I need a purpose first, good game play/mechanics second and way behind those two comes a beautiful world/universe to play in. NMS feels like the other way around, the almost infinitely large universe feels empty, the tasks you have to perform are shallow and lack purpose and finally the story does not provide the means to connect you with the location where it unravels. It all feels just a little bit random… and not in a good way!
Doubt crept into my mind about what I was doing and that lead to programmers block (must be a thing, writers have it too).
I had to force myself to face the reality that procedural generation can be a great tool, but a tool needs to be used correctly to get a good result. I’ve done my fair share of abusing a tool to achieve something that the tool originally wasn’t intended to (MS Excel, I’m looking at you!!) and met a few people so convinced by their preferred tool that they invested way too much time into solving problems with tools that weren’t meant to be used in that way.
So instead of trying to find the holy grail in procedural generation and be constantly disappointed about it, I took a step back and decided to just go on writing a mediocre prototype of something, that hopefully leads to better ideas down the road :)
PS: I still plan to show how I extract a 2D height map from a generated planet… stay tuned