So I’ve always wanted to make a 20 level random dungeon, ever since I was in middle school with the random dungeon tables in the AD&D DMG. Well, now that I’m retired I have some time on my hands, so I did just that. This is exactly the sort of silly, stupid shit I intended to do in my retirement. However, I used the tables in the 5E DMG.

The Plan

The plan was to do a breadth first search. So the first room has three doors in it. I rolled to see what was behind each of those three doors in turn, and that created several new doors and passageways. Then I checked each one of those doors in passage ways to see what was next. To do this, I would take any level of the dungeon that had unresolved doors or passages, start at a certain point on the page, and scan clockwise around the page looking for unresolved doors or passages. When I found one, I would roll on the appropriate table and draw in whatever was called for (as best I could).

I made a decision early on to make all passages at least as long as they are wide. With the tables as written (TAW), it’s entirely possible to have a 40 foot wide passage that is 10 feet long. I generally tried to shrink rooms to fit the available space. I also tried to be generous with passages that were about to go off the edge of the page. I wanted to be consistent about this, but I wasn’t really. If I was in a bad mood, I’d just dead end the passage. If I was in a good mood, I’d turn it right instead of left to make more dungeon.

I tried to place exits within the room randomly, which also meant placing the rooms as randomly as possible. If I got a 20 x 30 room, and there was only one way to fit a 20 x 30, that’s where it would go. But if there was room I’d roll to see if you entered the room on the short side or the long side, and then I’d randomly determine which square you entered on.

I tried to make different areas connect to each other. So if I had a passage that ran into where the wall of a room was already drawn, I’d make a roll and give it a good chance of connecting into the room. This might be as a passage into the room, dead ending into a door into the room, or a secret door into the room. The one exception to this was areas that could only be reached by a secret door. I tried to keep those secret, because there’s enough useless secret doors in a random dungeon anyway.

Counting Days and Rolls

It took me 23 days to draw the initial map. Then I went back and added cross hatching around the edges. That took another month because I was spending much less time on it. The crosshatching was useful, though, as I found a handful of unresolved doors and passages doing it.

I estimate that it took about 9,250 rolls to generate the dungeon. I started rolling manually, and I was not keeping track of my rolls. This got tedious quickly, so I wrote a Python program with all of the tables. That way I could just type in “door” and it would tell me what was on the other side of the door, and automatically roll how wide a passage was or how big a room was and how many exits it had. After a while I realized this was a chance to break out my abacus, so I started keeping track of my rolls on level 10. That was fun for a while, but by the time I got to level 15 I realized it was pretty silly to use an abacus when I could just modify the Python program to keep track of the rolls for me. I kept track of rolls for 10 levels (levels 10, 11, and 13-20). I then did a regression on number of rooms per level to number of rolls. I was amazed at how tight the regression was (r-squared was 95.2%). That’s how I estimated 9,250 rolls.


A common phrase is ‘Continue straight 20 ft., door way on the right, continue 10 ft.’ But does that mean 30 total feet of passage, or 40 feet, with the door getting it’s own 10 feet? I went with the latter. I think it makes more sense when you get side passages. Now, early on I was allowing for 20 foot wide or wider side passages, but later on I realized the tables do not allow for this.

Another problem is too many room exits. Check out level 1, room XIX; or level 2, room XXIV. I eventually started to tone this down to a more reasonable amount when I could. It would be nice if the number of exits from a room depended on the perimeter of the room, but I realize that would make things more complicated. Also, you can get a reasonable number of exits for a room, and then have them all show up on the same wall. You could reroll duplicate walls, but it’s not always a problem. I just started fudging it when it became a problem.

Stairs give you the opposite problem. Let’s define a node as a passage or door where you could roll to see what is next. If you have a passage node, and you roll to see what’s beyond, you can expect to end up with 1.4023 nodes after the roll. You might have none, or one, or more, but on average you will have 1.4023. Door nodes are a bit better: they give you 1.433 nodes on average. Stairs, on the other hand, give you 1.2341 nodes on average. So going to another level strangles growth a bit. Level 3 ran into problems with this, and at one point I had to add a secret door to keep things going and get to 20 levels. So after level 5 I started making the first roll on each new level be on the starting rooms table. That gives an average of 3.15 new nodes, assuming 50% of the wells go somewhere.

I started getting a lot of loops, which seemed rather silly. But then I realized I was getting loops because I was allowing things to connect. But if you don’t allow things to connect you get a lot of dead ends. It’s not so much of a complaint about the 5E tables as it is an observation about random dungeons. Be aware of the consequences of your decisions when making one.

You used to be able to get four way intersections when rolling for passages. You can’t do that any more. I am very disappointed.

As a player, if you know how the tables work, you know where to search for secret doors in passage ways. This could be fixed if instead of ‘Continue straight 20 ft.’ you had ‘Continue straight 1d4 x 10 ft.’


I think if you applied the decisions symmetrically, it would look more human. That is, start with a room with doors on three sides. When you roll for the door on the left, whatever you get there also put it on the door to the right. I’d like to try that, but I’m a bit random dungeoned out at this point.

Instead of a breadth first traversal of the nodes in a dungeon, I think it would be best to do a random traversal of the nodes. However, I think it would be an incredible pain in the ass to keep track of all the nodes in a dungeon.

I didn’t get around to stocking the dungeon yet. My idea was to have a different type of stocking for each tier of play. Levels 1 to 4 would be a temple (probably abandoned and inhabited by orcs or bandits). Levels 5 to 10 would be tombs for worshipers (now full of undead). Levels 11 to 16 would be the headquarters for a secret cult within the temple (maybe still active, maybe not). Levels 17 to 20 would be the lair of whatever BBEG was secretly controlling the court (with lots of his minions). I was going to call it the Forgotten Temple of Modnar. Of course, that’s backwards, not random, so I wrote a Python function to randomize it and got the Forgotten Temple of Nomrad (or Donram, or Radnom, or Nodram, …).

Comments closed due to nothing but spam.