Category Archives: Maps

New System Generation, WIP #1

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 because I started with “Hello World” and then just kept adding pieces. I guess this is about 2h of work so far.

Update: It now creates basic SVG maps, too:

People, People Everywhere (High Population Worlds, Part 1)

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:

(5)Temperate 1429 AA8ABB9-G Hi Ht Wa     HI5 834.000.000.000 (5)Temperate
(8)Temperate 0516 A763BD9-C Hi Ht       HI8 482.000.000.000 (8)Temperate
(3)Temperate 2614 BAA5BD9-7 Fl Hi       HI3 (3)Temperate
(8)Temperate 2917 B888AA9-7 Ga Hi       HI8 95.700.000.000 (8)Temperate
(3)Temperate 2611 A400A96-D Hi Ht In Na Va HI3 (3)Temperate
(8)Temperate 1418 C785A96-8 Ga Hi       HI8 61.700.000.000 (8)Temperate
(7)Temperate 2135 B784A89-7 Ga Hi       HI7 (7)Temperate
(5)Temperate 1113 A8A5A89-D Fl Hi Ht     HI5 30.500.000.000 (5)Temperate
(4)Hot 1935 B743A88-9 Hi In Po     HI4 15.700.000.000 (4)Hot
(3)Temperate 0305 B410AD9-B Hi In Na     HI3 (3)Temperate
Xoth 2219 A576A85-A Ga Hi In     HI7 (7)Temperate

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.

Earth's Population over time, in Billion
Earth’s Population over time, in Billion

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.

A regular Sunday shopping in Chennai. A good example of the sea of humanity. cc-by-sa, McKay Savage
A regular Sunday shopping in Chennai. A good example of the sea of humanity. cc-by-sa, McKay Savage

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.

Genre Considerations

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.

Next up, we’ll take a look at these planets’ individual UWPs to figure out just how these people might be living.

Quo Vadis, 256?

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:

(8)Temperate 1917 X863445-0 Lt NI HI8 25500
(9)Temperate 2017 B8658B9-A Ga Ri HI9 833000000
(7)Temperate 2021 A663BB8-C Hi Ht HI7 786000000000
(8)Temperate 2118 D864951-8 Ga Hi HI8 5770000000
(8)Temperate 2119 C875657-8 Ag Ga NI HI8 4610000
(7)Temperate 2219 A576A85-A Ga Hi In HI7 12200000000

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

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:

(2)Hot 2715 A6309C7-D De Hi Ht Na Po HI2 1580000000

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!


Welcome to Sector 256

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:


World classes:


Starport classes:


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.

World Generator Progress

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

Star Ports:
   A: 12
   B: 24
   C: 40
   D: 48
   E: 57
   X: 70

To Do

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.

Creating Local Space (2)

Today I decided to put one and one together, so to speak: Apply the theory I build up in the world building posts to the creation of our little nook of local space. Let’s call this our third trial run, that is, I may or may not keep the results.

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 4
Ga 54
Fl 53
Wa 7
Va 23
Ht 12
Lt 102
Hi 15
Lo 74
De 11
Ba 10

I’ve made the sector data the sample data for the hacked svg sector map script, if you want to look at or play with the raw data.

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.

Open questions:

  1. Does the setting work with so few TL10-13 worlds?
  2. Is the sector as-is viable for the sort of setting I have in mind?
  3. Is it, and this may sound silly, aesthetically pleasing?
  4. Is it a “good sector” for adventure?

There are probably more… we’ll see…

Hacked Version of the Subsector Map Script

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.

Size Matters, and Subsector Trial Run 2

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.

Tech Level

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.

World Data:

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.

Creating Local Space (1)

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:

  1. Create a new image. I used landscape, A4 size. But this doesn’t matter.
  2. Filters -> Render -> Clouds -> Plasma.  I used the maximum Turbulence.
  3. Colors -> Desaturate
  4. Colors -> Threshold. Play with the sliders until it looks nice
  5. 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.
  6. Create a second layer.
  7. 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.
  8. Move this new layer underneath the original layer.
  9. Set the original layer’s mode to “multiply”.
  10. Merge the layer down.
  11. User Colors-> Threshold, play with the sliders again until you get nice distribution.
  12. If you dislike the results, try inverting colors or different random seeds for your plasma clouds.
  13. 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:


Looking at the map, I think that these are good probabilities:


I estimate a total of 236 systems for this, or just over half the number of systems in my draft sector. If this ends up feeling too sparse, I can obviously shift the probabilities up a bit.

We’ll do that next time.