Fantasy Dungeon Generator SUPER TURBO ENHANCED EDITION

Use the "RollWhat" dropdown to determine what dungeon part to generate. Once you have a dungeon premise, set the dungeon's purpose using the "Purpose" dropdown. Otherwise, chambers' contents and purposes will generate incorrectly.

This is an expanded and refined version of my popular Fantasy Dungeon Generator. It's not exactly as finished as I originally aimed, but I haven't worked on it in months and I think it's still pretty neat so I'm releasing it as-is.

Citation

Dungeon Master's Guide

This chart uses input variables
  • Purpose
  • RollWhat
  • Condition
Result

{% spacelink = { } %}
{% space = {{spacelink}} %}
{%if RollWhat == {Dungeon Premise}%}
{% DungeonLocationVar = {CHART(52708)} %}
{% DungeonPurposeSplit = split sep:"&DIVIDE&" source:{Roll on "DungeonPurpose"} %}

{%end%}

{% DungeonPurposeName = {school} %}

{%elif {{DungeonPurposeSplit.1}} == {laboratory of the arcane}%}

{% DungeonPurposeName = {laboratory} %}

{%elif {{DungeonPurposeSplit.1}} == {treasure vault}%}

{% DungeonPurposeName = {vault} %}

{%elif {{DungeonPurposeSplit.1}} == {planar gatehouse}%}

{% DungeonPurposeName = {gatehouse} %}

{%elif {{DungeonPurposeSplit.1}} == {planar hub}%}

{% DungeonPurposeName = {hub} %}

{%elif {{DungeonPurposeSplit.1}} == {tangle of chambers and passages}%}

{% DungeonPurposeName = {tangle} %}

{%else%}

{% DungeonPurposeName = {{DungeonPurposeSplit.1}} %}

{%end%}
{% DungeonPurposeDesc = {{DungeonPurposeSplit.2}} %}

{% DungeonCreatorVar = {CHART(52710)} %}

This site is a {{DungeonPurposeSplit.1}} {{DungeonLocationVar}}, built by {{ a_an input:{{{DungeonCreatorVar}}} }} {{DungeonPurposeDesc}}. The {{DungeonPurposeName}} Roll on "DungeonHistory" the {{DungeonPurposeName}} has Roll on "StateOfRuin"

The {{DungeonPurposeName}}'s easiest access point is Roll on "Access" that leads to the starting area. The air inside is Roll on "Air" and carries Roll on "Odor"Resolve: {|, as well as the sound of Roll on "Noises"}. Generally, the {{DungeonPurposeName}}'s interior is Resolve: {unlit and dark|{dimly|brightly} lit by Roll on "LightSource"}{%if not DungeonPurposeName == "mine" and not DungeonLocationVar == "located in natural caves" and not DungeonLocationVar == "floating on the sea" and not DungeonLocationVar == "located in sea caves" and not DungeonLocationVar == "located among the branches of a tree"%}, its Resolve: {walls and floors are made up of Roll on "Architecture"{|, its walls are Roll on "WallAdornment"}|walls are made up of Roll on "Architecture"{| and Roll on "WallAdornment"}, its floors are made up of Roll on "Architecture"}, and its ceilings are Resolve: {low and |high and |}Roll on "Ceiling"{%else%}Resolve: {| and its walls are Roll on "WallAdornment"}{%end%}.

{% VillainTypeName = {villain} %}

{% VillainSplit = split sep:"&DIVIDE&" source:{Roll on "AdventureVillain"} %}

{% VillainTypeVar = VillainSplit.1 %}

{% VillainTypeName = VillainSplit.2 %}

{% VillainLongNameType = VillainSplit.3 %}

{% VillainDesireVar = VillainSplit.4 %}

{% VillainSpecialRoll = VillainSplit.5 %}

{% ProperNoun = VillainTypeName %}

{% ProperNoun = {UPPER({$ProperNoun})} %}

{% ProperNoun = {TITLE({$ProperNoun})} %}

{% VillainIdentityString = {known as the TITLE({CHART(53516) {$ProperNoun}})} %}

{%if VillainTypeVar == "humanoid"%}

{% VillainNameSplit = split sep:" " source:{Roll on "Fantasy - NameGen"} %}

{% VillainName = {{VillainNameSplit.1}} %}

{% VillainSurname = {{VillainNameSplit.2}} %}

{% VillainEpithet = {TITLE(CHART(53516))} %}

{% VillainRace = {CHART(52868)} %}

{% VillainIdentityString = {CHART(53623)} %}

{%elif VillainTypeVar == "dragon"%}

{% VillainIdentityString = {called CHART(54003){| the TITLE(CHART(53516)) TITLE({$ProperNoun})}|known as The TITLE(CHART(53516)) TITLE({$ProperNoun}){|, though their true name is CHART(54003)}} %}

{%elif VillainTypeVar == "dungeon"%}

{% VillainIdentityString = {called the TITLE({$DungeonPurposeName})'s {|TITLE(CHART(53516))} TITLE({$ProperNoun})} %}{%end%}
{%else%}

{% VillainRace = {$VillainTypeName} %}

{%end%}

{%if VillainLongNameType == "Align"%}

{% VillainLongName = {{CHART(53012) |}{{VillainTypeName}}} %}

{%elif VillainLongNameType == "RaceAlign"%}

{% VillainLongName = {{CHART(53012) |}{$VillainRace} {{VillainTypeName}}} %}

{%elif VillainLongNameType == "Same"%}

{% VillainLongName = {{VillainTypeName}} %}

{%else%}

{% VillainLongName = {{VillainLongNameType}} %}

{%end%}

{%if {d10} >= {5} and not VillainDesireVar == "Normal"%}

{% VillainDesire = {CHART(name="{$VillainDesireVar}")} %}

{%else%}

{% VillainDesire = {CHART(name="VillainScheme")} %}

{%end%}

{% VillainCharList = {JOIN("&DIVIDE&", UNQ(3, CHART(id="54196")))} %}

{% VillainCharArray = split sep:"&DIVIDE&" source:{$VillainCharList} %}

The main threat in the {{DungeonPurposeName}} is {{ a_an input:{{{VillainLongName}}} }} {{VillainIdentityString}}, who Resolve: {is destined|is cursed|believes they have been divinely appointed|seeks|aims|believes they are destined|plans|means|endeavors|strives|will attempt|aspires|has ambitions|wishes|desires|is on course} to Resolve: {|Roll on "VillainMethod" as part of their wider goal to }{{VillainDesire}}. {%if not VillainSpecialRoll =="None"%}Roll on "{$VillainSpecialRoll}". {%end%}The {{VillainTypeName}} is known to be {{VillainCharArray.1}}, {{VillainCharArray.2}}, and {{VillainCharArray.3}}Resolve: {|, and {has no {mercy|patience} for|is easily enraged by} Roll on "VillainHotButton"}.Resolve: {| While they are a dangerous foe, they do have an exploitable weakness; Roll on "VillainWeakness".} Resolve: {|The {{VillainTypeName}} Roll on "Minions".}

The party's main hook to explore the {{DungeonPurposeName}} comes when Roll on "PartyGoal".Resolve: {| The party is also told that they may find a potential ally in {{ a_an input:{Roll on "AdventureAlly"} }} who's Roll on "AllyState".}Resolve: {| However, the party's goal is complicated by Roll on "Twist".}Resolve: {| They are further tested when Roll on "MoralQuandry".}Resolve: {| Should the party pursue their goal to the end, they will end up Roll on "Climax"}

Set the generator's dropdowns to the appropriate Purpose and Condition, then roll a Starting Area to begin mapping the site...
Error: {% end %Invalid variable assignment. Equality sign is missing.}
{%if RollWhat == {Starting Area}%}

Roll on "StartingArea" (loops_allowed="true")
{%end%}
{%if RollWhat == {Passage}%}
Roll on "Passage" (loops_allowed="true")
{%end%}
{%if RollWhat == {Chamber}%}
Roll on "Chamber" (loops_allowed="true")
{%end%}
{%if RollWhat == {TEST}%}
{% ListNum = 1 %}
Roll on "RoomGenerator"
{%end%}
{%if RollWhat == {TEST 2}%}
{% ListNum = 1 %}
Roll on "LevelGenerator"
{%end%}


Subcharts