Linking five themed dungeons with transit pads
A new game can start in a tour of five dungeons, one per theme, joined by pads in each boss's room, and a test checks they show 60 dungeon features.
There’s now a tour of five dungeons, one for each theme, and each dungeon ends in a transit pad that takes the party to the next one. I run tour.bat and a new game starts at the entrance of the first. The last pad goes back to the first dungeon, so it’s a ring.

The film’s 12 frames, in order, with captions.
Why make a tour?
I wanted an experience of five dungeons connected by a teleporter at the end of each one, one dungeon for every theme, showing off every attribute I’ve built. The five are the Coil Works (cyberpunk, 3 floors), the Boiler Sumps (steampunk, 2), the Rind Chapel (eldritch, 3), the Tallow Keep (fantasy, 2) and the Staff Quarters (house, 2). The pad was already on my list as a missing dungeon component, so this closed that too.
How does the pad work?
A pad is a thing named teleport on a dungeon sheet, with a field to. It holds either another pad’s id or a dungeon’s id, which means that dungeon’s entrance. The node is a dark plate with a glowing ring and core, a faint column of light you can see down a corridor, a light that breathes on game time (a 2.4 second cycle) and a low hum. It’s cyan in every theme.
Pressing E within 2.4 meters fades the screen out over 0.35 seconds and calls jump(), which moves the party instantly onto the far pad’s square, facing the most open floor. Then the screen fades back in over 0.7 seconds. Nothing about the pad is saved. Only the party’s position is, which is why a jump needs no save logic.
Where do all five dungeons stand?
They aren’t placed anywhere in the world. A dungeon file with a tour field is built only when a game starts in one of them, which tour.bat does with --start-in, or when a save made in one loads. Then a class called TourSites stands all five at once, 700 meters under the middle of the map and 450 meters apart along x, so every pad has its far end already standing. I put them that deep because the water surface ignores a party under the ground, so nobody ends up swimming. A tour game also never autosaves, so it can’t overwrite a normal game’s save.
How is the content made?
One script, tools/tour_build.py, writes all five dungeon files in a run, so I can make them again whenever the generator, the monster stocking or the furniture changes. Each dungeon comes from the dungeon generator, with rising floors, curved rooms and every cycle once. Where the generator lays none of a feature, the script adds it by hand: short dead-end alcoves dug off a room’s wall, each holding one showpiece, plus a cavern of coils, machines, meat and failing lights. The eldritch dungeon gets its meat from the meat painter at growth 0.3, 0.6, 0.8 and 1.0.
The game warns about content it finds odd, and the first build had warnings, so the script has three fix passes:
fix_doorsmoves a door that could be walked around onto a square with rock on both sides.fix_packsmoves a pack whose monsters don’t fit back into its room.clear_meatclears painted meat from dug squares, rock and passages.
They moved 2 doors and 10 packs and cleared 3 meat squares, and the tour then warned of nothing. I did it in the script and not in the files because the files get rewritten on every build.
How do I know it shows everything?
The inventory of features sits at the top of the script and again in tests/theme_tour. It has 60 entries, from the secret doors and one-way valve doors to lifts, ladders, spiral stairs, round rooms, water, laser walls and meat at every growth. The test fails if a feature the game has built is in none of the five dungeons. It also walks from each entrance to its pad and through all five jumps, and checks a save snapshot. It passes 102 checks with none failing.
Five things are listed as absent because they can’t be shown yet: pits, wanderers, people, the site key and an exit up a second ramp. I dropped one thing I wanted, the burst meat vat on the cyberpunk dungeon’s third floor. Its 4 by 4 block with a clear ring fits no room the generator makes.
What’s still weak?
The film shows the first build. The fantasy props were installed just after this landed, so the fantasy rooms in the film are furnished from the house set, and the tour’s rooms will be generated again when the room-filling work lands. A dungeon’s interior pieces only lay on floor 1, so deeper floors are painted faces in the theme’s set. A tour save loaded through Continue may miss door and chest states, so tour.bat is the safe way in. The in-game map shows a pad’s square as plain floor, though the floor pictures in the dungeon report mark it. Once, after a jump, the party was a square off after the fade. The test now checks the square at the moment of the jump, and I don’t know the cause.