Reports of my death have been vastly exaggerated, for now.
And not only that, I’ve picked up the torch of Sci Fi world-building again. Thanks to Emmett‘s comment, I ditched my old, ugly world generation scripts written in shell and awk (really, what was I thinking). I always wanted to learn Python anyway.
So far, my script does some basic generation work. The beauty here is that it not only reliably produces data using supplied random seeds, I also set this up in an object oriented fashion. That is, this is wholly modular and I might end up with an entire universe generator in one piece of software.
Anyway, here’s some sample output:
And yes, it’s called hello.py because I started with “Hello World” and then just kept adding pieces. I guess this is about 2h of work so far.
One thing you will remember from when we looked at the dice results for this sector was the insanely high total population – 2663 billion people – for what is supposed to be frontier-ish.
This is really due to four population code B worlds – that is, 100 billion or more inhabitants. I’ve already downgraded one of them. In addition, the sector contains 8 worlds inhabited by between 10 and 100 billion people:
Is this even possible?
From a pure math standpoint, absolutely. Earth’s population has increased dramatically over the past few centuries, as better agriculture and medicine reduced mortality – especially child mortality. When I was a kid, the world’s population hit 5 billion people. I remember the TV gala; for some weird reason people actually celebrated it. 2011, it was at 7 billion. Call it 25 years for 50% growth. Simply continue to feed all these people and you’ll have run-away, exponential growth.
Of course, things aren’t as simple as that. First off, the Earth is a closed system and at some point – we are not sure where it would be – there simply won’t be enough food, energy and water. Population would hit a wall and things would turn ugly.
In reality, even if there was no limit to food, energy and water (say because of interstellar imports) it won’t work out that way.
People adapt to their environment – we’re really good at that. Better health, more wealth, and especially better education also limit fertility. Women simply give birth to fewer children. In the 1950s, it was 5 kids per woman. In the early 2000s, it was half that. The UN expect it to eventually drop to just above 2.05. In other words, a balance will set in, and the best guesses place this at ~9 billion people.
In other words, a super-densely populated world isn’t going to happen in any natural way. Population growth is a byproduct of technological progress. If that progress stops, or even reverses, the population becomes unsustainable and will either crash or find an equilibrium. If technological progress continues unabated, then attitudes will change with it and population will find an equilibrium eventually as well, just at a higher level. To put it bluntly, people simply have better things to do with their lives than to raise kids continuously.
I am obviously not worried as much about building a realistic population model as I am about creating a setting that fits its genre and is internally consistent and, well, hopefully interesting.
Massively populated worlds are definitely in-genre. Asimov’s Trantor is of course the grand-daddy of them all, and had anything between 40-500 billion inhabitants. Coruscant has a trillion inhabitants. Then there are the many city-worlds of the Warhammer 40k empire (and probably others). Massive, galactic-scale societies support these worlds and absorb their effect on the economy.
In Niven’s “Known Space”, Earth has a population of 18 billion and is described as a crowded hell. Heinlein assumes 11 billion in “The Moon is a Harsh Mistress” and it’s not exactly doing us any good. (Of course in “Starman Jones”, Heinlein assumes that 4 billion people are a lot). In both cases, space travel is fairly limited for various reasons – all those Terrans can’t just mass-emigrate, which limits the effect on other worlds.
The World-Builder’s Solution
My gut reaction was to simply downgrade these worlds – as I did with #2021. However, I reminded myself of the reasons for using a random generator in the first place: It is supposed to spur our imagination, right?
Here’s a map of where those >1 billion people planets are:
The 1.2 in Subsector K is our world #2021, which originally had 786 billion people. Okay, so the absolute numbers are quite too high. But do you notice what I am seeing?
Subsector H, birthplace of the rebellion, has two super-high population planets. Lots of cheap manpower for the war. And that subsectors H-J axis I mentioned? Another super-high population world in subsector J – and the world with the highest tech level in the entire sector! Now, the 834 billion (and 482 billion) are just ridiculously high numbers, but if we fix it like so:
We’ve effectively preserved the random generator results, improved them significantly, and used them to explain the campaign’s political situation.
This brings the population of the sector down to 508 billion people – a fifth of what it was initially.
So. We have a home. Sector 256. This means the work is just beginning – now I need to lay out local space.
The map of local space should be centered on the Imperial Core. That is, by producing this map we imply that “this is it”, similar to how a Terran national map will show, well, the subject of the map plus perhaps parts of some neighbors. Subsectors F and G as well as J and K should thus be the main focus. K is obviously quite sparse – a backwoods area people don’t go to, perhaps comparable to a stretch of desert.
H on the other hand has many worlds that must be quite important – look at all of these A and B class ports and the travel connections between them!
In theory, this could be a neighboring nation but the ideas I have do not allow for a secondary powerful nation. So it’s part of the Empire, and this means I’ll have to expand the map to the “east” a little bit eventually, just to give our protagonists some room to explore.
The Imperial capital world, Mithra, and the original colony worlds the colonists settled on should be close to the center of that region. They do not “have” to be important anymore – just consider the difference between Rome two thousand years ago and now – but they should probably be relatively heavily populated. They should also be fairly close to each other.
Looking at the map, I immediately notice a bunch of temperate worlds which are marked as fairly habitable. (I also notice that habitability index 9 didn’t get shaded, but no matter). These are 1917, 2017, 2118, 2119, 2021, and 2219:
Interesting. #1917 works well for Mithra, just increase the population a little: X863845-0, Pop 156000000. Makes them “Rich” by Traveller definitions and I appreciate the irony. But we’ll get back to that later.
The other three original colonies were Sassandra, Ascalon and Xoth. Let’s use the three garden worlds, #2017, #2118 and #2219, for them. Either the colonists picked worlds most suitable for them, or ones they could easily terraform.
As for #2021, I’m reducing the population code to 9, with 1.19 billion inhabitants.
The Republic was founded on Avalon. But where is that? With Mithra in “G”, our logical choices are “H” and “J”. J is probably the better choice – More isolated – but without wanting to foreshadow anything, I really want to place it in H. Let’s assume all those interconnected worlds indicate a tightly-knit community in this province, perhaps they were never too happy about being annexed by Empire in the first place. And Willem II was just the sort of Emperor who would ignore serious problems staring him into the face.
Consulting the map again, I find this:
A small-ish desert world with high tech, good infrastructure, a very thin atmosphere and a class C government which the Traveller rules book says could be a revolutionary council. Could it be any better?
I can totally imagine these poor bastards, working in the mines under adverse conditions, their living quarters packed due to the high population. Everybody’s poor, and ideas of a Better Future begin to spread.
With the locations of Mithra and Avalon fixed, I’m thinking that the Republic first captured worlds in J, before circling back and attacking the Imperial core worlds from multiple sides. This probably also means that the J-H axis, with travel through the empty space of K, is the main area of Republic control. G is an occupied mess, and F ends up as a region on the sidelines – the Contact Light equivalent of the Regina subsector.
This is what I love about rng’s – they can be so inspirational!
It’s been a while since I worked on world generation. Needless to say, the layout of composition of “Imperial Space” is one of the big fundamentals that needs to be settled before I can work on the details of the setting.
I did consider reworking the random generator into generating entire solar systems (Evil Dr Ganymede has posted a great revision of the 2300AD system generation rules that seems about perfect for the purpose) and perhaps into a less grid-based 2D map, or even a pseudo-3D map.
In the end, I think I should not do either of these. For a space opera setting, a realistic map isn’t necessary – in fact, it’s probably a distraction. Most people can’t visualize 3D space very well.
As for Dr Ganymede’s system – it would create a lot of nice detail but in the end I also want to make some progress. If whatever audience this thing gets prefers, I can always retcon. 🙂
To cut to the chase, I played around with a few random seeds, and 256 looks great. Here is the map:
The green circles indicate “habitability”, the darker the better. The lines are “travel routes”, basically they connect all A/B class starports that lie within a certain distance of each other.
What I like about this sector is its structure. Subsectors F, G and H are probably the “core” of the (former) Empire. I think that J might make a good place for either the Imperial capital – adding physical distance to the social detachment that led to the civil war – or the rebel capital – explaining why the Empire didn’t see it as a bigger threat.
Subsectors M and N, as well as subsectors O and P make for one nice “fringe cluster” each. There’s a small group with two very habitable worlds in subsector A – a nice “outpost” area – and a number of colonized worlds in subsector B, which might prove interesting – since none of them is a nice place to live there must be something fairly important there to warrant settlement.
The sector contains 262 worlds with a total population of 2,663,284,385,714. That’s a lot of people and I’ll definitely have to reduce it – there are a number of population B systems.
Tech level distrubtion:
I think this is going to be a very nice sector. Do let me know what you think of the layout!
Next step: Clean up the map, and turn it from a generic sector into our colonial space.
Work days keep me from being productive where it counts – like science fiction world building!
I’ve made a number of improvements to my sector generator scripts…
I generate a “Habitability Index” – this has actually been in the script for a few days. I don’t use it for anything, but it’s a quick index of how nice the planet is to live on. Numbers are only ever added, not subtracted, so a world with a medium HI can still be crappy, but it’s still quite useful for judging worlds at-a-glance. Ranges from 0 (=abysmal) to 8(=perfectly earthlike).
I now use random seeds. As long as you know a sector’s seed, you can always recreate it again a second time with the script (as long as the script didn’t change).
The script now rolls for actual population, using Benford’s Law. (Thanks Berka.)
The script prints out some aggregated statistics about a sector – still a WIP.
Actual Population Sample
Here are the populations of the High Pop worlds of sector#121:
(8)Temperate 0110 B566998-8 Ga Hi HI=8 A=6320000000
(3)Temperate 1502 B310999-C Hi Ht In Na HI=3 A=1420000000
(7)Temperate 1710 A66ABD9-E Hi Ht Wa HI=7 A=119000000000
(5)Temperate 3209 C8B5998-A Fl Hi HI=5 A=3400000000
(6)Temperate 1617 B79AAD9-9 Hi In Wa HI=6 A=31600000000
(3)Roasting 1620 A554A96-C Ga Hi Ht HI=3 A=25100000000
(6)Temperate 2013 C841AD9-6 Hi In Po HI=6 A=10800000000
(4)Roasting 2718 B5869B8-A Ga Hi HI=4 A=7190000000
(6)Temperate 0330 D9729B9-7 Hi In HI=6 A=4980000000
(7)Temperate 0923 B577A75-A Ga Hi In HI=7 A=87300000000
(7)Temperate 1124 BA669B9-A Ga Hi HI=7 A=1550000000
(7)Temperate 1127 C578BD9-7 Ga Hi In HI=7 A=310000000000
(8)Temperate 1326 B8759D9-4 Ga Hi In Lt HI=8 A=4960000000
(7)Temperate 1522 A675B66-B Ga Hi In HI=7 A=206000000000
(3)Temperate 1527 A410A96-G Hi Ht In Na HI=3 A=50000000000
(3)Cold 2229 A631AC9-E Hi Ht Na Po HI=3 A=61200000000
(6)Temperate 2429 C894996-4 Ga Hi In Lt HI=6 A=2990000000
(7)Temperate 1839 A585AA8-B Ga Hi HI=7 A=79600000000
A= is the actual population. I only generate the leading 3 digits and then scale it up to the correct power of ten. Yeah that’s 300 billion people at TL7 on #1127 – with a small planet and more water surface than Earth has. Must be a lovely place. Lots of algae farms… Not to mention those TL4 and TL6 worlds.
Aggregated Statistics Sample
Generating sector: 121
Total Systems: 251
Total Population: 1022367735546
I’ll add TLs and World Types to the statistics as well…
And I presumably should tackle unrealistic TLs somehow.
By the way, if anybody wants these scripts – let me know. You need unix (or a mac) for them, there is one shell script and one awk script – plus of course the sector map script I’ve modified.
For subsectors that had a split system probability, I rolled two subsectors each and then “masked” them manually. This was by far easier than to attempt to teach the script which hexes had what probability… However, for the lower-right corner two subsectors I got tired of this and just rolled 4- for the entire subsector. It will do.
Without much fuss, here is the sector map:
Click on it for the full-sized image. I kept my sketch as a translucent overlay.
The sector ended up having 213 worlds, slightly short of the 236 I had estimated. Tech level distribution is heavily stacked towards the low end:
World types are fairly well spread, though I stupidly removed my Se/Sm classes again:
As for the results themselves, there are good and bad things.
Decent mix of world types
Fewer worlds than my draft sector (smaller is better)
Highest “regular” tech level is 13 (C), on 9 worlds.
The ten high tech worlds are all fairly low population (2×8, 1×9). The 15 High Pop worlds are 9×9, 5xA and 1xB, or between 159 and 1231 billion people, give or take a few. This isn’t necessarily a contradiction; neither China nor India have the highest tech on Earth.
The sector almost seems TOO sparse considering it is supposed to host the main interstellar nation in the region – even IF it is a frontier region
Distinction between “sparse” and more “dense” star region absolutely not visible based on sheer system presence.
Does the setting work with so few TL10-13 worlds?
Is the sector as-is viable for the sort of setting I have in mind?
Is it, and this may sound silly, aesthetically pleasing?
I don’t really speak Perl and I know nothing about the format of .svg files, but… I’ve created a version of that subsector map script that maps sectors. It doesn’t have a generator yet – sorry, this will have to wait until another day -but I did include some rough sample data.
Anyway, maybe someone finds it useful. And if you want to work on it, be my guest, it’s of course GPL like the original.
The conclusion of the first trial run was that worlds were too big, the change I made was too drastic. So I sat down and did a few more 10k runs. This is a graph of the relevant world types – I consider something like “rich” to be too poorly defined to begin with.
Note that I added “Se” (Super-Earth, size 10+) and “Sm” (Small, size 2-) for this exercise.
I hope it’s not too small to read. Anyway, the graph shows 3d6-3, 3d6-4 and 3d6-5 compared to 2d6-2 when rolling for world size.
Obviously Super-Earths dramatically decrease and small worlds increase during that sequence. Fluid Ocean worlds are also directly tied to large worlds, and Vacuum worlds to small worlds.
3d6-5 would result in more asteroids than 2d6-2. Again, a no-brainer, but since I wanted to reduce smaller worlds not increase them, this seems like a poor fit solely on this criteria.
3d6-4 seems like a good compromise choice for my purpose based on this graph, so I’ll use that.
I haven’t really been able to make TL behave nicer, and I didn’t want to add a lot of filters. I can still do that in the future, but I have another plan.
Trial Run 2 Subsector
Many garden worlds in this one. I like how there again seems to be a cluster – marked by red communications links – of “developed” worlds contrasting with the “frontier” of the rest of the sector.
Cold 0101 C941775-8 Po
Hot 0109 C787545-5 Ag Ga Lt NI
Temperate 0110 EA75652-6 Ag Ga NI
Special 0202 XAD5423-2 Fl Lt NI
Cold 0205 X410000-0 Ba
Temperate 0210 X410000-0 Ba
Temperate 0304 X967543-1 Ag Ga Lt NI
Cold 0308 B754431-6 Ga NI
Cold 0403 ECA6373-6 Fl Lo
Temperate 0405 X893224-3 Lo Lt
Special 0410 XBE4315-0 Fl Lo Lt
Hot 0501 EB86000-0 Ba Ga
Temperate 0506 C553442-5 Lt NI Po
Cold 0508 D567523-4 Ag Ga Lt NI
Cold 0510 X4A4465-1 Fl Lt NI
Cold 0601 X510467-4 Lt NI
Roasting 0606 CAC1775-7 Fl
Temperate 0608 B653965-9 Hi Po
Temperate 0703 E986242-4 Ga Lo Lt
Temperate 0705 B8529A9-9 Hi Po
Special 0802 EDD3341-4 Fl Lo Lt
Hot 0803 X9C7340-2 Fl Lo Lt
Temperate 0805 D7489B9-5 Ga Hi In Lt
Temperate 0808 A568BA8-A Ga Hi
Temperate 0809 B684475-B Ga NI
World #808 has a population of B, “hundreds of billions” and must be the undisputed superpower of this subsector. Tech Level is again generally fairly low, considering I was aiming for a nominal 13 on “core” worlds, but it is a fairly decent mix if one looks at it as a pure Traveller-like premise.
While I am working on the framework to generate the low-level detail, I can’t help myself but to work on the larger picture – and some actual setting data. Keep in mind that I already created one sector last year; I consider it my “draft”, and it will certainly inform many of the decisions I will be making.
For the first sector, I simply created a small grid of 3×3 sectors with a rough drawing of what I thought local space should look like. (In reality, these should be rectangular.)
I’ve refined this method somewhat. I created the following in The GIMP:
Black are “sparse” or “rift” regions, white are regions of greater star density,
The process to create such an image is fairly simple:
Create a new image. I used landscape, A4 size. But this doesn’t matter.
Filters -> Render -> Clouds -> Plasma. I used the maximum Turbulence.
Colors -> Desaturate
Colors -> Threshold. Play with the sliders until it looks nice
Filters -> Blur -> Gaussian Blur. I used Blur method “ILR” and radius 30×30, though you may have to change this depending on your image. You want to significantly soften the edges, while keeping the general shapes recognizable.
Create a second layer.
On the second layer: Filter -> Render -> Clouds -> Solid Noise. I used detail 15, x and y size of 16, and both Turbulent and Tilable disabled.
Move this new layer underneath the original layer.
Set the original layer’s mode to “multiply”.
Merge the layer down.
User Colors-> Threshold, play with the sliders again until you get nice distribution.
If you dislike the results, try inverting colors or different random seeds for your plasma clouds.
Don’t be afraid to manually edit the image after step 11 – I did!
Placing our Sector
Note that the image doesn’t have any sort of scale, which gives us some flexibility. I used Inkscape to place the same 3×3 sector grid, and I resized it a few times until I had the “right” fit. I decided on this location:
As is the tradition, X marks the spot – the sector of my setting. I picked this location because there is a lot of “interesting geography” adjacent to it.
Here’s the zoomed section, with subsectors stenciled in as well: