Lacking Natural Simplicity

Random musings on books, code, and tabletop games.

GURPS vs. D&D vs. Dungeon Fantasy RPG

After I played D&D for a while at the beginning of my RPG career I found out that I was interested in other games. T&T, then DragonQuest, RuneQuest, GURPS, and Elric! and many more since then. Eventually one of the things I figured out was that I was looking for the different flavors that different RPG systems give the games you play with them. D&D has a very specific flavor. Elric! has a very specific but different flavor. Some of that flavor comes from the systems and some of that flavor comes from the setting. But the D&D systems flavor seems to overpower the setting flavor. (You could say that the “implied setting elements” from the D&D core rules have heavily flavor any D&D setting.)

The Dungeon Fantasy RPG is GURPS specialized for powerful characters plundering dungeons, and because of that it adopts some (but not all) of the cliches from D&D (druids, monks, clerics, etc), and puts its own spin on them. But one of the things I liked about GURPS was that it didn't have the same set of cliches as D&D. Oh well.

Despite looking for the different flavors that systems imbue, I still like generic RPGs like GURPS and Savage Worlds and Basic Roleplaying. I like the flavor that those systems give, and I like seeing how that interacts with the flavor of the setting.

Reactions to S. John Ross's Medieval Demographics Made Easy

S. John Ross's article Medieval Demographics Made Easy (which can be found here) has been used by many gamers to add some verisimilitude to their games. There have been some useful criticisms, however. Here are a couple:

Customizing pandoc ms output with a Lua filter

This article started as a message I sent to the the pandoc-discuss Google Group. This version has more links and has been slightly reworded.

I work with ReStructuredText documents a lot and often use pandoc to format them, especially to PDF by way of pandoc's ms output format, which uses groff with the -ms macros to produce the PDF output. Using ms output is fast, groff is usually available on the operating systems I use, and if you do have to install groff it is easy to do and much, much smaller than any TeX distributions.

However, it would be a nice to be able to customize the ms output more for specific input, like if you are using technical writing and are pining for something like the various inline roles of DocBook, or wanted poems to be typeset more stylishly that the ms output does.

You should probably be a little familiar with the Pandoc User Manual and have the documentation for Lua Filter's available for reference while reading this article. And having a reading familiarity with groff and its manual and specifically the -ms macros will be useful too. And maybe Lua as well.

Starting with an article from Dave Jarvis that had an example Lua filter for customizing the ConTeXt output and a little help from the pandoc-discuss mailing list I came up with this example Lua Filter that formats program names and poems specially.

This filter wraps spans with a class, such as from interpreted text roles defined in the source ReST (like :program:`pandoc`) in calls to user defined groff strings \*[start<class>] and \*[stop<class>]. (I've specified the string definitions for \*[startprogram] and \*[stopprogram] in the source ReST as a raw block for ms output but they could be in a customized ms pandoc template, too.) These strings can include groff escapes to change the font and the glyph color and then change back to the previous font and glyph color. In this example I made PDF output for the interpreted text role program come out in a constant width font and in red.

It also wraps divs with classes with calls to user defined groff macros .start<class> and .stop<class> (also included in the source ReST in the raw block for ms output).

For divs with the poem class, it converts any contained LineBlock elements into a list of Plain elements containing its contents, avoiding the ms output for the LineBlock starting with .LP, which would cancel the .DS (display start) macro I want to use in the .startpoem macro definition. The .LP would also reset the font family in use to the default, another reason to avoid it. 1

The filter also converts the empty element that occurs in the line block as a result of a blank line in the line block input into a RawBlock that creates a blank line in the ms output, to show the division into stanzas of the poem.

Interestingly, the first Str elements in the each line in the content of the line block preserved the leading spaces from the input as Unicode NO-BREAK SPACE characters, preserving indentation of lines in the line block. Unfortunately, the width of those spaces alone is not enough create a visually distinct indentation, so this filter changes those Str elements into a RawInline that outputs a groff horizfontal movement whose width is based on the number of leading NO-BREAK SPACE characters, and follow this with a new Str element that has the leading NO-BREAK SPACE characters removed.

Here is the Lua filter, classify-rst-ms.lua:

onig = require ("rex_onig") -- Need a regex package that understands UTF8.
-- text in LineBreak preserves leading spaces as Unicode NO-BREAK SPACE
leading_nobreakspace_rx = ("^(\u{a0}+)(.*)$", nil, "UTF8")

function Div( element )
  local annotation = element.classes:find_if( matches )
  local numPara = 0
   if annotation then
     annotation = annotation:gsub( "[^%w]*", "" )
     if annotation == "poem" then
        element = pandoc.walk_block (
           element, {
              -- Replace LineBlock element with a list of Plain elements
              -- containing the LineBlock's subelements.
              LineBlock = function (el)
                 local l = {}
                 for _, subel in ipairs (el.content) do
                    if #subel == 0 then
                       -- If subel is an empty table, output a raw empty line
                       table.insert (l, pandoc.RawBlock ("ms", "\n\n"))
                       -- Check for leading NO-BREAK SPACE charaters
                       local m1, m2 = onig.match (subel[1].text,
                       if m1 then
                          -- Replace the NO-BREAK SPACE characters with a raw
                          -- groff horizontal movement, because the
                          -- NO-BREAK SPACE characters are too narrow.
                          table.insert (subel, 1, pandoc.RawInline ("ms", string.format ("\\h'%dn'", utf8.len (m1))))
                          -- Modify what was used to be the first item to just
                          -- include the trailing characters of the match.
                          subel[2] = pandoc.Str (m2)
                          table.insert (l, pandoc.Plain (subel))
                          -- Just put the subel in Plain element.
                          table.insert (l, (pandoc.Plain (subel)))
                 return l
        end })
     return {
        ms( ".start", annotation ),
        ms( ".stop", annotation )

function Span(element)
  local annotation = element.classes:find_if(matches)

  if annotation then
     annotation = annotation:gsub("[^%w]*", "")

     return {
        ms_inline("\\*[start", annotation, "]"),
        ms_inline("\\*[stop", annotation, "]")

function matches( s )
 return s:match( "^%a+" )

function ms( macro, annotation )
 return pandoc.RawBlock( "ms", macro .. annotation )

function ms_inline (macro, annotation, stop)
  return pandoc.RawInline ("ms", macro .. annotation .. stop)

Here is the ReST source of the document, poem-plus.rst:

Lua Filters For Massaging ``ms`` Output

.. raw:: ms

   .ds startprogram \\f[CW]\\m[red]
   .ds stopprogram \\m[]\\fP
   .de startpoem
   .ds OLDFAM \\*[FAM]
   .ds FAM BM
   .DS I 3
   .de stoppoem
   .ds FAM \\*[OLDFAM]

.. role:: program

This is a sentence.  This sentence talks about :program:`pandoc`.
This is
another sentence.

.. class:: poem

   | Some say the world will end in fire,
   |    Some say in ice.
   | From what I've tasted of desire
   |    I hold with those who favor fire.
   | But if it had to perish twice,
   |    I think I know enough of hate
   |    To say that for destruction ice
   |    Is also great,
   | And would suffice.
   | And another line,
   |    And an indented line.

This is a final sentence.

And here is the ms output:

.SH 1
Lua Filters For Massaging \f[CB]ms\f[B] Output
.pdfhref O 1 "Lua Filters For Massaging ms Output"
.pdfhref M "lua-filters-for-massaging-ms-output"
.ds startprogram \\f[CW]\\m[red]
.ds stopprogram \\m[]\\fP
.de startpoem
.ds OLDFAM \\*[FAM]
.ds FAM BM
.DS I 3
.de stoppoem
.ds FAM \\*[OLDFAM]
This is a sentence.
This sentence talks about \*[startprogram]pandoc\*[stopprogram].
This is
another sentence.
Some say the world will end in fire,
\h'3n'Some say in ice.
From what I\[aq]ve tasted of desire
\h'3n'I hold with those who favor fire.
But if it had to perish twice,
\h'3n'I think I know enough of hate
\h'3n'To say that for destruction ice
\h'3n'Is also great,
And would suffice.

And another line,
\h'3n'And an indented line.
This is a final sentence.

The command to produce the ms output is:

pandoc -f rst -t ms --lua-filter classify-rst-ms.lua --wrap=preserve poem-plus.rst

and the command to produce a PDF is:

pandoc -f rst -t ms --lua-filter classify-rst-ms.lua --wrap=preserve poem-plus.rst

Here is the output PDF.

Being able to rewrite the tree and insert RawBlocks and RawInlines is really powerful when it comes to customizing output for particular output formats.

I hope this example is useful for others like me just learning to use Lua filters.


The .LP macro in the -ms macros resets a lot of things back to the default when it is used, so if you want the custom groff setting from your user defined macros to continue from the start to the end you can't allow the use of .LP between the .start<class> and .stop<class> macros.

Binding a symbol defined with DEFCONSTANT with LET is not portable in Common Lisp

SBCL and CCL and CLISP think binding a symbol defined with defconstant is an error, so if you do

(defconstant foo "foo")
(let ((foo "bar")) foo)

you get an error. But in ABCL and ECL you don’t.

If you try

(defun x () (let ((foo "bar")) foo))

in SBCL and CCL you get an error when the function is compiled. In SBCL the function is defined, but always gives an error when run. In CCL the function does not get defined.

Recent Reading: Howard and Carter

  • Cthulhu: The Mythos and Kindred Horrors, by Robert E. Howard, copyright 1987 by Ala Key Kuykendall and Alla Ray Morris; Baen Publishing Enterprises; ISBN 0-671-65641-4.

I enjoyed reading these again; it has been many years since I have read them. The racism of the stories set in America is what you'd expect from a person of Howard's era, but understanding that, the other elements of the stories make the book worth reading.

  • By the Light of the Green Star, by Lin Carter, copyright 1974; DAW Books Number 110.

  • As the Green Star Rises, by Lin Carter, copyright 1975; DAW Books; ISBN 0-87997-811-2.

  • In the Green Star's Glow, by Lin Carter, copyright 1976; DAW Books.

It is interesting to note that these were popular enough at the time to go into multiple printings, judging from my copies, all of which are later printings except for the second book, When the Green Star Calls. The Amazon reviews of the books in the series are positive as well.

They are definitely fast, fun, pulpy adventures.

Recent Reading: Carter and Page

I've continued reading Lin Carter's Green Star Sword & Planet novels.

  • When the Green Star Calls, by Lin Carter, copyright 1973; DAW Books Number 62.

  • By the Light of the Green Star, by Lin Carter, copyright 1974; DAW Books Number 110.

Both of these are short novels, 176 pages for the first and 175 pages for the second. Both end on cliffhangers. In the first the protagonist and his friends are split into two groups, and they are apart the whole in the second.

I've also continued my Sword & Sorcery reading with Norvell W. Page, who is new to me.

  • Flame Winds, by Norvell W. Page; copyright 1939 by Street and Smith, Inc., copyright 1967 by Conde Nast Publications, Inc.; Berkley Publishing Corp., 1978.

Well, it was no Conan, but it was entertaining!

The "Typical Activities" checklist from The Traveller Book and Starter Traveller

I've been looking at Cepheus Engine and I've noticed that there is nothing like the “Typical Activities” checklist that first appeared in The Traveller Book, but which I first encountered in play recently with Starter Traveller. It made a definite impression on me — with this one could improvise a trading session from start to end. I'm not sure yet whether Cepheus Engine supports the completely improvised Traveller adventure talked about on the Tales to Astound blog, but using this with Cepheus Engine would certainly make it easier.

Typical Activities

  1. Arrive in star system.

    1. Scan area for potential danger, problems, and other data.

    2. Set course insystem.

    3. Possible ship encounter.

  2. Local gas giant.

    1. Achieve orbit.

    2. Refuel.

    3. Set course to major world or outsystem.

  3. Local major world.

    1. Achieve orbit.

    2. Proceed to orbital starport (unstreamlined ships) or surface starport (streamlined ships).

    3. Arrival onplanet.

      1. Unload high passengers.

      2. Unload mail.

      3. Unload middle passengers.

      4. Unload cargo.

      5. Unload low passengers.

      6. Conclude low lottery.

    4. Refit and maintenance.

      1. Refuel from starport.

      2. Renew ship life support.

    5. Commodity activity.

      1. Sell speculative cargo.

      2. Buy speculative cargo.

    6. Ship business.

      1. Pay berthing costs.

      2. Pay bank payment.

      3. Pay maintenance fund.

      4. Pay crew salaries.

    7. Miscellaneous activity.

      1. Patron encounters.

      2. Planetary exploration.

      3. Local areas of interest.

      4. Hire new crew members.

    8. Prepare for departure.

      1. Load cargo.

      2. Load low passengers.

      3. Load middle passengers.

      4. Load high passengers.

      5. Load mail.

      6. Collect income for all aspects of current trip.

  4. Departure.

    1. Lift-off.

    2. Achieve orbit.

    3. Set course outsystem.

    4. Possible ship encounter.

    5. Jump.

Note: This list is primarily of interest to merchants. Not all events on this list are explained in this chapter on travelling. Other relevant chapters include Worlds, Encounters, and Trade and Commerce.

Playing Classic Traveller in 2020

Finally playing Classic Traveller

A friend of mine who was in my gaming group back in the 1980s read the article Traveller: A Classic Science Fiction Simulator at and found it interesting. We discussed it, and he downloaded Starter Traveller from (it is free) and started reading it. I had the PDF already, and I printed it out and started reading it as well. I also found a physical copy for sale on the Internet, so I ordered that as well, and it was much more convenient to use than my printout in binders.

My Gaming History

My experience with Traveller back in the 1980s was minimal: another friend had the little black box with the three little black books (LBBs), and we rolled up characters (which at the time seemed way more complicated than D&D, which we were used to). Then we tried to figure out what to do, which was not immediately obvious to us. D&D has the obvious core activity of going down in a dungeon and killing monsters, but Traveller was a lot more wide-open. My friend hadn't bought an adventure (which I find very useful for getting an idea of core activity of a game) and he'd bought the Basic Set, so there wasn't an adventure in the box. We didn't realize that we could use the various checklists and procedures to improvise an adventure on the spot. So we didn't get far, alas.

I bought several new editions of Traveller over the years (Megatraveller, Traveller: The New Era, Traveller 4, Traveller 5) but never found the chance to play them. But my interest in Classic Traveller grew once I found it being talked about in Internet forums and blogs. I bought a copy of the original rules and many other LBBs, and some of the reprints and CD-ROMs.

Anyway, yesterday afternoon I went over to my friend's house with my Starter Traveller box and some other Classic Traveller materials for show and tell, and then we rolled up three characters each, 2D6 for attributes in order. I had two survive character generation (because we were using the hardcore “you can die in character generation” rule that was the default in Classic Traveller), both had been in the Army, both having miserable strengths (one of them couldn't carry his rifle and a clip of ammo; don't know how he made it through the Army), and the weakest only had one term and the other only had two terms, though he made Lieutenant. My friend had one character survive character generation, also from the Army, and he had more terms that either of my characters, though I don't remember how many, and ended up a Lt. Colonel if I remember correctly.

Then we ran a practice combat between my friend's character and my better character: Submachine Guns at short range (1–5 meters) in a forest! Classic Traveller doesn't have initiative, so everything happens simultaneously, and we both shot the other and each had an attribute reduced to zero, so we both fell unconscious. After ten minutes we both woke up, and decided to not try to kill each other again. Since he had Medical-1 he used his medical kit and healed us both.

Then we tried our hand at what some think is Traveller‘s core activity: shipping cargo to another planet (once we finally figured out that standard shipping of non-speculative cargo is covered in the “REVENUE” subsection of “STARSHIP ECONOMICS”, and not near “TRADE AND COMMERCE” section that we mistakenly thought it would be near). So, we rolled up some cargoes and High, Middle, and Low passages for our arbitrarily chosen world. Then we worked out all the expenses for our ship, the standard Type-A Free Trader, to see if we could keep up with them. And we could, though there seemed to be little slack. Success! This lead us back to the “REQUIRED STARSHIP COMPONENTS” subsection of the “STARSHIPS” section to figure out how much fuel was available for maneuvering in-system after a jump. (10 tons out of 30 tons of fuel was available for the maneuver drive and the power plant, if I remember correctly.) We looked at speculative cargoes a bit, but didn't actually try them. We weren't sure how you found the selling price once you were at your destination. (A second roll on the “Actual Value” table?)

At some point we looked at experience and character development in Classic Traveller. As far as we can tell, that section is missing from Starter Traveller, though it is in the 1981 LBBs and The Traveller Book. (Is it in the 1977 LBBs? I'll have to check. 1) Anyway, basically you do a 4 year self-improvement program, and if you succeed in staying the program (Roll your Determination, and you need an 8+ on 2D6), the program improves a couple of skills temporarily by 1 level of expertise. You can then do another 4 year program to make those gains permanent. (There are similar but slightly different procedures for improving physical attributes, weapons skills, and education.)

Anyway, we had a lot of fun. Next time we get together we're going to design a starship or two and try space combat!

Reflections Afterward

The version of Starter Traveller available at seems to be a better scan than the one off the Classic Traveller CD-Rom at, and is arranged in three separate PDF files, one for each of the three books in the set, which is much more convenient for printing and for viewing more than one at once on a screen. Alas, neither of them had select-able text, each page being a scanned image.

I had brought my copy of the 1977 edition of Classic Traveller, 3 digest sized (5½×8½ inches) booklets in the classic box, along with some of the other books/supplements/adventures in that format, the Quick Link Interactive reprint of the 1981 LBBs in one volume, and the hardcover edition of The Traveller Book. I find the pamphlet format of the original Classic Traveller books charming: they're an easy size for reading away from the table, they seem to have lasted pretty well over the years, and it is relatively easy to refer to two of them at once. On the other hand, Starter Traveller's division into a book of the Core Rules, another book of Charts and Tables, and a final book with adventures, is very handy at the table where you have room enough to have both Core Rules open and Charts and Tables open to the the specific pages for the tables matching what you're reading in Core Rules. Also Starter Traveller has a “TYPICAL ACTIVITIES” checklist on p. 9 of Charts and Tables (that I can't find in the 3LBBs) that basically outlines how you could improvise a Free Trader-based adventure at the table. The hardback The Traveller Book is sturdy and easy to use at the table, but not as convenient as Starter Traveller‘s split into Core Rules and Charts and Tables. The Core Rules booklet had helpful page references to Charts and Tables for each of the major sections, and these were usually a 2-page spread with all (or nearly all) of the tables for the subject being discussed. Despite the charming nature of the LBBs, I think having the separate Charts and Tables book from Starter Traveller is so convenient that we'll continue using it at the table.

I found it useful to have multiple versions of Traveller available while reading Starter Traveller to cross-check things: I found an erratum in Starter Traveller this way.


I remembered that Megatraveller had a different method for character advancement/experience, so I looked that up when I got home.

You can learn a new skill by experience, observing and trying that skill and gaining 1 Adventure Tally (AT) per session if the referee it played a significant part in the session. Once you've acquired enough ATs, you need to roll a 15 or more on 2D6 with a Dice Modifier (DM) from Intelligence (if it is high enough) and the number of ATs you've accumulated. Use the same procedure to improve a skill. There is a similar procedure for improving characteristics. (This is similar to getting skill “Ticks” in RuneQuest or other Basic Roleplaying-based systems.)

You could also learn a skill by formal training. (1) You have to roll 7+ on 2D6 (having an applicable skill gives you a DM; the skill depends on what kind of training you're seeking) to find the training. (2) You have to roll 7+ on 2D6 (with a DM from your Determination characteristic) to stay determined to complete the training. Finally, (3) You have to roll to see if you were successful by rolling 11+ on 2D6 (with DMs from the skill you are training if you already have it, or other related skills you already know, and your instructors Instruction skill). The training takes on average 200 hours, and costs approximately Cr10 per hour. There is a similar procedure for improving characteristics, except for Social Standing, which can only be improved by actually acquiring money and spending it.

Amusingly Megatraveller, in contrast to Classic Traveller's relative lack of character improvement, points out that increasing skills and characteristics by accumulating ATs encourages characters' participation, keeps them interested in the game, and makes them aware of the benefits they can achieve in a session. I'll note that this is just like leveling in D&D or getting experience points in skill based games like Hero System or GURPS.

Finally, my quick look through the Megatraveller Players' Manual gave me the impression that Megatraveller is just much more complicated that Classic Traveller in every way, a typical second-system effect.