Procedural Generation in the Elite Series
There’s a reason why the Elite series has been a central part of the procedural generation conversation. Not just because they were early examples of its application, but because their popularity meant that people studied how they worked in great detail.
Ian Bell released the source code for the original Elite on his website (which I suspect greatly helped the game’s visibility outside of Europe). So we know exactly how Elite generated its galaxy–including its names, economies, and descriptions–which has contributed to many other procedural generators.
The Frontier Elites use a more complex generator, and studying the techniques used is illustrative of how procedural generators have developed. Where the Elite galaxy map was generated all at once, the Frontier galaxy is divided into sectors, each of which is generated from a seed and the density information from the master galaxy map texture. Sectorizing generation like this is useful if you want to extend a generator indefinitely.
The system generation in Frontier works statistically: given a random seed, it rolls metaphorical die on a number of tables, picking numbers that are within the bounds of probability. This is a common approach: Elite uses something similar for picking government types and economies, and here it’s extended to the physical characteristics of the star systems, starting with the chances for each type of star.
A few star systems are predefined, overriding part or all of the generator. This includes Earth, of course, but also the many real-world stars included in the game. Combining scripted data with procedural generation is another useful technique to remember: it’s okay if some things aren’t procedural.
The planet generator is nested within the system generator. And within that there are calls to generate stations, spaceports, and other details. Nesting generators like this is, of course, another useful technique, chaining the output of one system into the input of another.
The name generator is another significant legacy of Elite: constructing sounds from pairs of characters in a Markov-like fashion, it influenced other generators. The Frontier games extend this to naming planets and starports, using tables of name-parts similar to the functionality of the “goat soup” string that described each planet in the original Elite.
Another technical detail is the way numbers are stored. While not technically a generative problem, people do occasionally want to procedurally generate things on vastly differing scales. They inevitably run into floating point issues, because the typical way to store numbers for computation work by throwing away precision, which can easily lead to your trees drifting randomly off of your planets. The Frontier games use a custom-coded scaled word variable; today there are a number of techniques to address this so long as you are aware that it’s an issue that needs to be solved.
Statistical generation has been a common approach since at least the early days of D&D random tables, but it isn’t the only possible method. And, indeed, the fourth Elite game, Elite: Dangerous, has introduced a completely different approach to star system generation, which we’ll discuss in due course.
A detailed discussion of some of the underlying Frontier algorithms: http://www.jongware.com/galaxy1.html