Monday, December 15, 2014

Robot Lovecraft writes technical documentation

Somebody fed Puppet documentation and H.P. Lovecraft stories into a Markov chain generator to produce The Doom that Came to Puppet. This particular type of nonsense really tickles my fancy.

“Parameters are defined essentially exactly the same way since a surprisingly early time in earth’s history—perhaps over fifty million years.”
“Additionally, the machine(s) acting as reverse proxy (usually will need to be able to reach the basement out of which the abyssward aperture opened.”
“During the Jurassic Age the Old Ones had perhaps become satisfied with their decadent art—or had ceased to recognize the superior merit of the older (activerecord) backends in a multi-master environment.”
“Puppet can also be used to demonstrate things here, but it is not wholesome to watch monstrous objects doing what one had known only human beings to do”

Thursday, December 4, 2014

New LotFP releases, including Zak's Red & Pleasant Land

The Lamentations of the Flame Princess store has new books available, including Zak S.'s Red & Pleasant Land. I hear it's selling quickly, so you should order soon if want one. I found that the now-diffucult-to-find Vornheim was much better in hard copy than PDF (and I like PDF's), and R&PL looks super-deluxe.

Thursday, September 11, 2014


Until the middle of the sixteenth century, English church bells, like other European bells, had a variety of uses: some sacred, some secular, and many that were both. Bells called congregations to church, and told them to flee if there was a fire; they rang to signal a death in the parish, and they rang to help the passage of the souls of the dead through purgatory. Other bells, or other ways of ringing the same bells, commanded people to say a particular prayer. Bells were incredibly well-loved by their parishes and were often baptized and given godparents; their individual tones were voices that spoke to the communities over which they rang. They were among the loudest sounds in the soundscape, making up a language that its parishioners could understand.

In the Injunctions issued by the ten-year-old king Edward VI in 1547, these many and varied uses for bells were drastically reduced. Only one bell was now allowed “in convenient time to be rung or knelled before the sermon.”2 Bells were so useful that a single one was still to be used to call the godly to church, but in this new post-Reformation England, their other uses were no longer officially approved. The dead didn’t need help through purgatory, because it no longer existed; there was no need to command anyone to say popish prayers such as the Ave Maria by ringing the Angelus bell, because these prayers were now deemed useless. But parishioners had such affection for church bells that this particular injunction was never seriously enforced. They went to great lengths to keep their bells, sometimes by burying them until the zealous storm had passed.

Monday, August 25, 2014


Blobogix the Invasive Alien Impostor God

Only a couple of players showed up for this Sunday's game, so we tried an idea I've been considering for a while. Each of us took a half hour to write an adventure with d6 rooms, then we ran each adventure.

In the adventure I wrote, an invasive alien displaced a local god and enslaved the priests at the shrine. This is a common problem on planet Zerapis. The players managed to free most of the priests from Blobogix's mind control (minus one or two they shot full of arrows), saved several villagers scheduled for human sacrifice, and acquired a powerful but unwieldy ray gun that freezes people by sending their minds to a barren alien world. Unfortunately, they made a dangerous enemy by letting Blobogix escape with his enormous pulsating egg.

As a player, I found that I've become more conservative and risk averse; I'll take a modest treasure and leave the dungeon without pulling the tantalizing but obviously dangerous shiny lever. Especially when the adventures are so small, I feel bad about it — like I should play with all the things.

Maybe I just need some fresh blood in my face-to-face group. It's hard to get a small set of busy adults in the same room on a regular basis.

Saturday, August 9, 2014

Gruesome Chops for OD&D Fighting-Men

I haven't had a regular game in a few months, but that hasn't stopped me from tinkering with my house rules. This is an attempt to give 0e fighting-men a bit more oomph. What do you think?

Gruesome Chops

A roll of 20 to-hit or a roll of maximum damage gives the Fighting-Man the opportunity to make a Gruesome Chop. The player chooses the hit location; here are some examples:

  1. Eyeball run through. Monsters with hit dice fewer than or equal to the fighting-man must Save or be kebab'd. Monsters with more hit dice lose an eye* (-2 to hit, cyclops -4).
  2. Neck slit. Monsters with hit dice fewer than or equal to the fighting-man must Save or suffer beheading. Monsters with more hit dice loose their voices, and must Save when using a breath weapon.
  3. Limb chop. Monsters with hit dice fewer than or equal to the fighting-man must Save or be dismembered and bleed out. Monsters with more hit dice (and four or fewer legs) are reduced to zero movement.
  4. Bifurcation (horizontal or vertical). Monsters with hit dice fewer than or equal to the fighting-man must Save or be bisected.
  5. Evisceration. Monsters with hit dice fewer than or equal to the fighting-man must Save or spill their guts.
  6. Ribcage crush. Monsters with hit dice fewer than or equal to the fighting-man must Save or suffocate.
  7. Sever artery. Monsters with hit dice fewer than or equal to the fighting-man must Save or BLOOD SPRINKLER!
  8. Break the monster's sword, splinter its shield, sunder its sandals, etc.
  9. Force the monster to fall back ten or twenty feet to the spot you want them (over pit trap, under portcullis, etc.).
  10. Impale. Monsters with hit dice fewer than or equal to the fighting-man must Save or wriggle in grotesque death throes. Monsters with more hit dice are pinned (movement zero).

Any monster that survives a Gruesome Chop immediately checks morale.

N.B. — Most monsters do not make Gruesome Chops, but enemy Fighting-Men do.

Thursday, July 31, 2014

Death in the Iliad

Check out this excellent group of infographics on death in the Iliad. I've long maintained that spears need a more prominent place in D&D.

Wednesday, July 16, 2014

Rolling vs Role Playing Discovery of Traps and Secret Doors

Someone on G+ asked: "Mechanically, why were players expected to role play 'finding traps' but the X in 6 chance to find secret/hidden doors has been there since the get go?"

We need to distinguish between finding traps and disarming/circumventing traps. The accepted practice is to role play disarming/circumventing traps, but that's not the usual case for finding traps.

Characters find pit traps, for example, by falling in them, as determined with the roll of a die. The Underworld & Wilderness Adventures says on page 9:

"Traps are usually sprung by a roll of a 1 or a 2 when any character passes over or by them. Pits will open in the same manner."

Once players know the pit is there, it's easy to avoid in the future. We might be tempted to complain that dice rolling of this sort is unfair in its arbitrariness, but consider the alternative of role playing the examination every crack, hole, and loose stone in the dungeon.

Other kinds of traps — where the presence of a trap is obvious, but the way of avoiding it is not — we resolve through role playing. "You enter a room with a rotting bisected goblin corpse in its center. A few feet from the goblin's body, an overturned bucket spills grease onto the stone floor. Above the corpse, you notice a dark slot in the ceiling from one side wall to the other, and connecting grooves running down the side walls that seem to be greased. What do you do?" No dice roll required.

What about rolling for secret doors? Here's U&WA again:

"Secret passages will be located on the roll of a 1 or a 2 (on a six-sided die) by men, dwarves or hobbits. Elves will be able to locate them on a roll of 1-4. At the referee's option, Elves may be allowed the chance to sense any secret door they pass, a 1 or a 2 indicating that they become aware that something is there."

The text uses "located" rather than "opened", and draws a distinction between actively locating known/suspected secret doors and passively spotting unknown/unsuspected ones.

That suggests a procedure where, after a secret door is located by a roll, we role play opening the door. "I'm going to try pushing each edge of the door outline, and if that doesn't work I'll fiddle with the nearby sconce."

The mechanics for traps and doors are the same (with the obvious reversal that traps are meant to be found (triggered) and secret doors are not).

How to Open the Secret Door

  1. Push door edge to pivot door.
  2. Twist wall sconce near door.
  3. Pull out jutting stone near door edge to release latch.
  4. Replace missing wall stone lying among debris on floor (falls out after door closes again).
  5. Only opens for [1-2 Magic-users 3-4 Fighting-men 5-6 Clerics].
  6. Only opens for [1-2 Monsters 3-4 Undead 5-6 Puddings, jellies, etc.].
  7. Push two stones, one on either side of the door, simultaneously.
  8. Smear you hand with blood, and touch the faint brownish handprint in the middle of the door.
  9. Step on protruding flagstone on floor.
  10. Drain water from adjoining room to relieve pressure on door.
  11. Burn away wax facade.
  12. Opens when the other door to the room is locked.
  13. Hidden door is a decoy; entire wall rotates.
  14. Insert staff or rod in small hole to lever door open.
  15. A strong magnet raises a latch internal to the door.
  16. Opens in light of the moon (may require several mirrors).
  17. Circular door. It unscrews.
  18. Prying the base of the "door" unfolds a ladder — there's a trap door in the ceiling.
  19. Pull latch inside mouth of stone devil face.
  20. Rearming nearby trap causes door to open

"Somethings" Elves Sense Besides Secret Doors

  1. An elf died on this spot centuries ago. Clerics able to cast Speak with Dead may contact this elf regardless of their level and how long ago the elf died, although the spirit mostly wants to share the morbid elven verse its been composing to while away the years.
  2. Cold iron
  3. Flowing water
  4. Dwarves
  5. Pentangles
  6. Elf needs food

Saturday, July 5, 2014

Judges Guild style numbered hex paper

I made some Judges Guild style numbered hex paper, broken up into four US letter size pages. The zip file includes editable Inkscape SVG's and PDF's.

Thursday, July 3, 2014

Bookmark: A Framework for D&D Horror

John at Dreams in the Lich House nicely articulates a framework for D&D horror. It sounds like a good plan, and I look forward to hearing more details.

Thursday, June 12, 2014

B/X Combined and Expanded Index

I combined and expanded the indices for Moldvay Basic and Marsh/Cook Expert. Here's the B/X Index PDF (and the LaTeX file).

Monday, June 9, 2014

More Micro Generator Examples

(This is a follow-up to my previous post on the topic. To see all the examples in a slightly more readable format, click here.)

Magic Item Type Example

Here we have the classic Magic Item Type selection table from page 23 of Monsters & Treasure.

The Code for Magic Item Type

This script selects items from a table that has one result for a range of rolls. The list syntax is slightly different than we've seen. It's a list that contains lists.

function getMagicItemType() {
    var magicItemTypesTable = [
        [20, "Swords"],
        [15, "Armor"],
        [5, "Misc. Weapons"],
        [25, "Potions"],
        [20, "Scrolls"],
        [5, "Rings"],
        [5, "Wands/Staves"],
        [5, "Misc. Magic"]
    function randomTableValue(table) {
        // How large is this table? What's the maximum roll? d12, d100, or what?
        var max = 0;
        for (var i = 0; i < table.length; i++) {
            max = max + table[i][0];
        var roll = Math.floor(Math.random() * max) + 1;
        // Find our roll result in the table:
        var countUpToRoll = 0;
        for (var i = 0; i < table.length; i++) {
            if (roll <= table[i][0] + countUpToRoll) {
                return "d" + max + " = " + roll + ": " + table[i][1];
            } else {
                countUpToRoll = countUpToRoll + table[i][0];
    var itemType = document.getElementById("magicitemtype");
    itemType.innerHTML = randomTableValue(magicItemTypesTable);
<button onclick="getMagicItemType();">Roll Magic Item Type</button>
<span id="magicitemtype"></span>

Arena Fighter Name Generator

We can slightly vary the generated content with randomness and conditional execution.

Math.random() returns a value between 0 and 1.

function arenaFighterName() {
    function arnd(a) {
        // Return random element of array a.
        var i = Math.floor(Math.random() * (a.length));
        if (typeof a[i] === 'function') {
            return a[i]();
        return a[i];
    function namePart1() {
        return arnd([
            "Al", "En", "Ro", "Fel", "Ston", "Hal", "Jo", "Nel", "Ve", "Ga"
        ]) + arnd([
            "rick", "bert", "wick", "thor", "ky", "son", "frey", "sley", "gil"
    function namePart2() {
        var x = Math.random();
        if (x < 0.25) {
            return "the " + arnd([
                "Brave", "Bloody", "Bold", "Cruel", "Clever", "Cunning",
                "Indomitable", "Destroyer", "Quick", "Heartless", "Sly"
        } else if (x < 0.5) {
            return "of " + arnd([
                "Green", "New", "River", "Dun", "Lun", "North", "Wolver",
                "Tam", "Chapel", "Wit", "Bran", "Mor", "Ep", "Grims", "Gos"
            ]) + arnd([
                "thorpe", "by", "ford", "bury", "ham", "shire", "ton", "don",
                "ly", "field", "beck", "gate", "well", "holme", "wick", "port"
        } else if (x < 0.75) {
            return namePart1();
        } else {
            return "";
    var name = namePart1() + " " + namePart2();
    var outputSpan = document.getElementById("arenafightername");
    outputSpan.innerHTML = name;
<button onclick="arenaFighterName();">Arena Fighter Name</button>
<span id="arenafightername"></span>

Dynamically Chosen and Arranged Images (Geomorphs!)

We can play with images as well as text.

function shuffleGeomorphs() {
    function arnd(a) {
        // Return random element of array a.
        var i = Math.floor(Math.random() * (a.length));
        if (typeof a[i] === 'function') {
            return a[i]();
        return a[i];
    var geomorphImages = [
    var imageOutputs = document.getElementById('geomorphgrid').childNodes;
    for(var i = 0; i < imageOutputs.length; i++) {
        imageOutputs[i].src = arnd(geomorphImages);
<button onclick="shuffleGeomorphs();">Shuffle Geomorphs</button>
<div id="geomorphgrid">
<img src="img/g00.png">
<img src="img/g00.png">
<img src="img/g00.png">
<img src="img/g00.png">
<img src="img/g00.png">
<img src="img/g00.png">

Thursday, June 5, 2014

Embedded Micro Generators for Dungeons & Dragons Blogs

(If you want to read this post with a slightly more readable presentation, go here.)

JDJarvis over at Aeons & Augauries inspired me to write this with his little generators like the Foul Tomes of Carcosa.

You can include generated content in you blog posts by adding a script like the ones below. Put the code into your post using your blog editor's text/​HTML mode (on Blogger, click the "HTML" button next to the "Compose" button). Each example is entirely self-contained. Cut, paste, and tinker!

d20 Example

Here we click a button to generate a random number.

The Code for d20

function roll20() {
    var min = 1;
    var max = 20;
    var roll = Math.floor(Math.random() * (max - min + 1)) + min;
    var outputSpan = document.getElementById("d20result");
    outputSpan.innerHTML = roll;
<button onclick="roll20();">d20</button>
<span id="d20result"></span>

Magic Tower Example

Here we combine random selections from various lists, and do it without a button.

Click this paragraph to generate a Magic Tower (then click it again to generate another).

The Code for Magic Tower

function generateMagicTower() {
    function arnd(a) {
        // Return random element of array a.
        var i = Math.floor(Math.random() * (a.length));
        if (typeof a[i] === 'function') {
            return a[i]();
        return a[i];
    var colors = ["Red", "Black", "White", "Gray", "Pearlescent", "Lurid", "Hoary"];
    var structures = ["Tower", "Spire", "Turret", "Belfry", "Citadel", "Seculsium"];
    var outputParagraph = document.getElementById("magictower");
    outputParagraph.innerHTML = "The " + arnd(colors) + " " + arnd(structures);
<p id="magictower" onclick="generateMagicTower();">Click this paragraph to generate a Magic Tower (then click it again to generate another).</p>

Dynamic Hit Points Example

In the paragraph below, the hit points are randomly generated each time the page loads. Reload this page to see the hit points change.

An Ogre (HP ; AC 5; Move 9"; HD 4+1) glowers from the cave entrance.

The Code for Dynamic Hit Points

<p>An Ogre (HP <span id="ogrehitpoints"></span>; AC 5; Move 9"; HD 4+1) glowers from the cave entrance.</p>
function rollHitPoints(hdNumber, hdPlus, hdSize) {
    hdNumber = hdNumber || 1;
    hdPlus = hdPlus || 0;
    hdSize = hdSize || 6;
    var hitPoints = 0;
    for (var i = 0; i < hdNumber; i++) {
        hitPoints = hitPoints + Math.floor(Math.random() * hdSize) + 1;
    hitPoints = hitPoints + hdPlus;
    return hitPoints;
var ogreHitPoints = document.getElementById("ogrehitpoints");
ogreHitPoints.innerHTML = rollHitPoints(4, 1);

Learn More About JavaScript

You can learn a lot of JavaScript using free tutorials on the web.

Start a cheat sheet and keep track of what you learn. Refine it over time as your understanding increases. Here's my JavaScript cheat sheet, for example.

You may also want to keep a code clipping file to store useful and clever little bits of JavaScript to reuse.

Mozilla Developer Connection has a good JavaScript reference. It's a better than many of the alternatives that rank higher on Google results. (In fact, when I search for JavaScript reference info, I include "MDN" in my search terms.)

If you want to learn from books, these are good:

If you start writing scripts of more than a dozen lines, get yourself a good text editor. For Windows, try NotePad++. For Mac, try TextWrangler. If you're on Linux, you probably already have a favorite text editor, but if not try gEdit (or go all hardcore and learn vim).

Finally, you should at least be aware of JSLint and JSHint. They're alternative sites that find errors in JavaScript code. JSLint is more rigorous/harsher. If your JavaScript gets an error you can't solve, these tools may help you find it.

About These Micro Generators

This code was written by Paul Gorman. You may copy, reuse, redistribute, and modify the example code however you see fit.


This is a test.

Friday, May 30, 2014

The Importance of Observation

There's a fun thread over the on the OD&D74 forum that starts with Mike Mornard recounting a recent game of TRACTICS. In the second comment, Chirine relates this anecdote from the Twin Cities:

In the 'straight RPG' sense, observation is just as important. Follow me back in time to the days of yesteryear, when it was a dull evening at the old house and we were bored. We were sitting around, and musing on the very best marching order for a party of player-characters, and the idea came about that we should try an Actual Real-life Experiment. So, Gronan gets into his coat of plates, Olaf gets into his mail, and I hand Alfric (Gronan's squire) and Keith the Cleric a couple of lit candle lanterns. We then unlimber the rattan arsenal, we turn off all the lights in the house, and I - The Monster - go and hide someplace with my treasure of plastic gold pieces. The boys count to fifty, and then come in after me. They go Fighter (Gronan), Squire (Alfric), Cleric (Keith), and Fighter (Olaf); perfectly sound as a marching order, and all in accordance with what was considered Best Dungeon-crawling Practice.

It was awful. Me, I had lots of fun killing all of them in succession, several times over. (I had picked out several ambush points in the house.) A guy would appear out of the gloom, I'd give them a quick double tap on the back of the head to let them know they were dead, and they - being very sporting types! - would keel over dead to the horror and bafflement of the rest of the party. The next guy would look down to check the casualty, and I'd nail him. Then the cleric would try to see what he could do, and he'd get it. last and not least, the last guy in the line would try to see what was going on, and then he'd get it.

In the really dark corners of the house (Remember those attic stairs, Gronan? Oh, my...), I started at the back of the party and worked my way to the front. Same results. Two very experienced fighters, one pretty experienced squire, and one decent cleric all dead as the proverbial doornails saver times over.

What got them killed was lack of observation - not that they didn't try really hard, but that we learned that two fighters in *** closed face helms *** can't see much of anything. If the two unarmored guys weren't looking in the right place in the right time with the lantern held in just the right place, they couldn't see anything either. Most of the time, they said in the post-mortem, the light blinded them and ruined their night vision.

So, the RPG lessions for today:

1) Open-faced helms; a nice burgonet is a good idea.
2) Put the lanterns on a short chain on a short stick; you can keep it low, out of your eyes, and stick it into dark corners while keeping back out of striking range of some nasty lad like me.
3) Put a lightly armored fighter in the front as a scout; they can see better, move faster, and get out of the way of the heavies when they need to.
4) Do the same at the back, and have them keep looking to their rear.

Success in RPGs, at least the way we used to play here in the northwoods, came from teamwork and communication back up by observation.

Thursday, May 29, 2014

Dreams in the Megadungeon

John Arendt of Dreams in the Lich House has a nice series of posts about designing and running a Megadungeon. Check it out if you're not burned out on the topic.

Tuesday, May 27, 2014

Greyhawk was FULL of weird sh*t

Wayne Rossi linked to Mike Mornard's comment on the odd74 forum that "Greyhawk was FULL of weird sh*t", and observed that over the years Greyhawk has earned an unfair reputation as vanilla fantasy.

Look at the "Trick and Traps" or the "Monstrous Tricks and Combination Monsters" sections of Supplement 1, for example! That's certainly wackier than most of the Greyhawk material we saw coming out of TSR in the AD&D era. I remember getting the AD&D Greyhawk box, and finding it pretty boring. Maybe I should take a second look....

Monday, May 26, 2014

Enhanced Dwarf-Land map

Scott of Huge Ruined Pile nuked his blog again today, as he is want to do from time to time. I expect we'll see him again eventually.

When working on his Dwarf-Land setting, Scott commissioned the great Russ Nicholson to do a wonderful map. Unfortunately, the scan was a lossy JPG of limited resolution. I tried to enhance it at the time, but didn't do the best possible job. Today, I went back and created a new enchanced Dwarf-Land map (6MB). It's a 600dpi lossless PNG carefully converted to 1-bit color for sharp printing. I printed some sample details, and it looks damn good. If you're inclined to print a big version of the map (24" x 36"), I recommend you use the new enhanced file. Short of a better scan of the original, this is about as good as it will get.

P.S. — If anyone is really desperate for the blog content, I did a PDF print and a wget. I'll put up a tarball if there's sufficient demand.

Thursday, May 22, 2014


Brendan blogged about Proceduralism. It's worth reading.

Thursday, March 27, 2014

Dungeon Dozen book

The Dungeon Dozen is one of my favorite blogs. Now there's a Dungeon Dozen book. My copy has shipped. You should order one. The coupon code WAFFLESSAY20 will get you 20% off until March 31.

Tuesday, February 4, 2014

Web-based dice roller

I wrote a web-based dice roller suitable for use on your computer or mobile device. It includes those funky DCC dice too. Let me know if you find any bugs.\