Using Ruby to Merge Traveller and Stars without Number System Generators

Or How to Use Your Hobby to Keep your Professional Skills Sharp

Any sufficiently advanced hobby is indistinguishable from work.

Two or so years ago, I was thinking a lot about Sci-Fi Role Playing Games (RPGs 📖). I was running New Vistas in the Thel Sector using the Stars without Number: Revised Edition (SWN 📖). I had recently purchased the Traveller: Core Rulebook (Traveller 📖). I hadn’t started Let’s Read “Traveller: Core Rulebook” series but was considering writing that because I was super curious about Traveller; and found writing about it helped me learn more about it. Both Stars without Number: Revised Edition and Traveller have extensive random generators, that only partially overlap. I started exploring how I might use one generator to enrich the output of the other generator.

This resulted in an interesting (to me) software project: jeremyf/twn, Ruby 📖 gem that used the output of one generator to inform the results of a second generator.

At the time, I wasn’t doing much professional coding. But I wanted to keep practicing. So I took the very well understood domain problem and very clear procedures for each one, and began developing a command line tool.

The goal of twn is to use both processes to generate an even more descriptive world.

I envision that you should be able to feed in an already existing Stars without Number system and output the remaining Traveller attributes. Those generated Traveller attributes would be informed by the Stars without Number attributes. In other words, if you gave a Stars without Number system that has a Tech Level of 4, then the Traveller attributes that feed into Tech Level would need to be able to create the conditions so you could get that Tech Level.

The code got to a useful enough state for me, but had quite a bit more that I could’ve done.


I haven’t touched that code in 2 years, so why write about it now?

In writing that code I had a crystal clear (to me) domain problem and could instead spend time practicing my implementation. This clear domain problem provided me with an opportunity to practice and grow my professional software/programming skills.

In particular, I learned the most as I worked on the TWN::Generator class. That class tracked what had already been “rolled” and ensures that future “rolls” conformed to the contraints of the existing rolled results.

Along the way I wrote some documentation, tests, and lingering “todo” items for this command line application. This “practice” created a few new mental pathways; it also helped me keep “sharp” my software skills even as I was in a professional role that eschewed programming.