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 = onig.new ("^(\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"))
                    else
                       -- Check for leading NO-BREAK SPACE charaters
                       local m1, m2 = onig.match (subel[1].text,
                                                  leading_nobreakspace_rx)
                       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))
                       else
                          -- Just put the subel in Plain element.
                          table.insert (l, (pandoc.Plain (subel)))
                       end
                    end
                 end
                 return l
        end })
     end
     return {
        ms( ".start", annotation ),
        element,
        ms( ".stop", annotation )
     }
  end
end

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

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

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

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

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

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

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
   .DE
   .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
.DE
.ds FAM \\*[OLDFAM]
..
.LP
This is a sentence.
This sentence talks about \*[startprogram]pandoc\*[stopprogram].
This is
another sentence.
.startpoem
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.
.stoppoem
.LP
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 --output=poem-plus-rst.ms

and the command to produce a PDF is:

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

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.

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 Tor.com and found it interesting. We discussed it, and he downloaded Starter Traveller from Drivethrurpg.com (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.

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 DrivethruRPG.com seems to be a better scan than the one off the Classic Traveller CD-Rom at farfuture.net, 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.