Assemble dungeons from hand-built rooms instead of drawing every floor.

Procedural Dungeons

Hand-authored dungeons are the best-looking and the slowest to make. Procedural assembly splits the difference: you build the rooms, the engine builds the dungeon. Each run stitches your hand-made rooms into a fresh layout that still looks designed, because every tile in it was drawn by you.

Room Templates

A room template is an ordinary zone you built, tagged with the metadata the assembler needs:

FieldWhat it controls
RolesWhat the room can be used as: entrance, combat, connector, highlight, treasure, boss, exit, dead end
SizeWidth and height in tiles
Theme tagsWhich dungeons it belongs to (crypt, mine, sewer…)
Difficulty costWhat it spends from the run's difficulty budget
Rarity weightHow often it gets picked
Min / max depthHow deep into the dungeon it may appear
Max usesCap on repeats within one layout
Allowed rotations0°, 90°, 180°, 270°

Sockets

Rooms connect through sockets on their edges — a direction (north/south/east/west) and a type: normal door, large door, cave opening, stairs up, stairs down, or portal. Two rooms only join where their socket types and facings match, which is what keeps a generated layout from producing a doorway into solid rock.

Rooms also carry encounter sockets (where mobs or a boss belong) and loot sockets (where chests and rewards belong), so populated content follows the layout automatically.

Generation Config

SettingDefaultMeaning
Min / max rooms5 / 7Layout size range
Required rolesentrance, combat, boss, exitRoles a valid layout must contain
Max branches / branch chance0 / 0Side passages off the main path
Difficulty budget100Total difficulty cost the run may spend
Theme tagsWhich room pool to draw from
Max placement attempts500Give-up threshold before reporting a failure
Regenerate on resetOnA persistent instance gets a fresh layout when it resets

Generation is seeded and deterministic — the same seed gives the same dungeon, so a layout can be shared by a party, reproduced for debugging, or kept stable for a season. Failed generations return validation issues naming what was missing (no room with an exit role, no matching socket type) instead of producing a broken map.

Pair it with instances and portals so each group gets its own generated run.