Skip to content

Instantly share code, notes, and snippets.

@ToferC
Created February 3, 2014 13:01
Show Gist options
  • Save ToferC/8783430 to your computer and use it in GitHub Desktop.
Save ToferC/8783430 to your computer and use it in GitHub Desktop.
dungeons
#coding: utf-8
levels = raw_input('How many levels is this dungeon? ')
# Script to generate random dungeons for ACKS Rome
import random, collections
dungeon_theme = {1: 'Abandoned mine', 11: 'Natural caverns', 2: 'Barrow mound', 12: 'Prison', 3: 'Catacombs', 13: 'Ruined manor', 4: 'Cliff city', 14: 'Sewers', 5: 'Crumbling castle', 15: 'Sunken city', 6: 'Giant burrow', 16: 'Temple', 7: 'Giant insect hive', 17: 'Tomb', 8: 'Humanoid warren', 18: 'Tower', 9: 'Maze',19: 'Underground river',10: 'Monster lair', 20: "Wizard's dungeon"}
room_aspects = ['Uneven footing','Difficult to see','Maze-like','Poorly lit','Scattered old bones','Trickling water','Collapsed Corridor','Unnatural Light','Ancient Runes','Flora growing through cracks','Secret Passages','Littered with Traps','Dust-filled','Crumbling Stone','Unending Stairway','Light From Outside','Terrible Odor','Sounds of Underground Lake','Scurrying Creatures','Ancient Murals','Endless Chasm','Walls Closing In','Low Ceiling','Busted Statues','L shaped','Mysterious Well','Celtic Runes']
room_size = {'Small': [4,4], 'Medium': [10,10], 'Large': [20,20], 'Massive': [40,40]}
traps = {'Arrow Trap': 'When triggered, an arrow fires from a hidden location, attacking one adventurer as a 1st level fighter for 1d6+1 damage.', 'Bricks from Ceiling': "When triggered, bricks fall from the ceiling. Each adventurer in a 10' radius must make a saving throw versus Blast or suffer 2d6 points of damage.", 'Camouflaged Pit Trap': "When triggered, a pit opens beneath the feet of all adventurers in a 10' x 10' square. Adventurers who fall down the pit take 1d6 points of damage per 10' fallen. Pits should generally be 10' deep per dungeon level.", 'Poison Dart Trap': 'When triggered, a dart fires from a hidden location, attacking one adventurer as a 1st level fighter for 1d4+1 damage. If the adventurer is hit, he must save versus Poison or die.', 'Poison Needle Trap': "When triggered, a small needle pops out of a lock. The adventurer who triggered the trap must save versus Poison or die.", 'Portcullis Trap': "When triggered, a portcullis falls suddenly downward. The adventurer who triggered the trap must make a save versus Blast or suffer 3d6 points of damage. The way will then be blocked, and party members may be separated.", 'Rolling Rock Trap': "When triggered, a rock rolls out from a hidden location. All adventurers in the room or hallway must save versus Blast or suffer 2d6 points of damage."}
unique_enc = {1: ['Rot grub', 'spitting cobra', 'skeleton'], 2: ['Green slime', 'wood golem', 'yellow mold'], 3: ['Gelatinous cube', 'gray ooze', 'animated statue (iron, crystal)', 'doppelganger', 'shadow'], 4: ['Animated statue (stone)', 'ochre jelly', 'rust monster'], 5: ['Golem (bone)', 'invisible stalker', 'mummy'], 6: ['Golem (amber, bronze)', 'black pudding', 'djinni', 'efreeti', 'elemental']}
unprot_treasure = {1: ['A', 'B', 'C', 'D', 'E', 'F'], 2: ['C', 'D', 'E', 'F', 'G', 'H'], 3: ['E', 'F', 'G', 'H', 'I', 'J'], 4: ['G', 'H', 'I', 'J', 'K', 'L'], 5: ['I', 'J', 'K', 'L', 'M', 'N'], 6: ['M', 'N', 'O', 'P', 'Q', 'R']}
wandering_m = {1: ['Beetle, Fire (1d8)', 'Centipede, Giant (2d4)', 'Ferret, Giant (1d8)', 'Goblin (2d4)', 'Kobold (4d4)', 'Men, Brigand (2d4)', 'Morlock (1d12)', 'NPC Party (Lvl 1) (1d4+2)', 'Orc (2d4)', 'Rat, Giant (3d6)', 'Skeleton (3d4)', 'Stirge (1d10)'], 2: ['Bat, Giant (1d10)', 'Fly, Giant Carnivorous (1d8)', 'Ghoul (1d6)', 'Gnoll (1d6)', 'Hobgoblin (1d6)', 'Lizardman (2d4)', 'Locust, Cavern (1d10)', 'Men, Berserker (1d6)', 'NPC Party (Lvl 2) (1d4+2)', 'Snake, Pit Viper (1d8)', 'Troglodyte (1d8)', 'Zombie (2d4)'], 3: ['Ant, Giant (2d4)', 'Bugbear (2d4)', 'Carcass Scavenger (1d3)', 'Gargoyle (1d6)', 'Lizard, Draco (1d3)', 'Lycanthrope, Werewolf (1d6)', 'NPC Party (Lvl 4) (1d4+2)', 'Ogre (1d6)', 'Scorpion, Giant (1d6)', 'Throghrin (1d6)', 'Wight (1d6)', 'Wolf, Dire (1d4)'], 4: ['Boar, Giant (1d4)', 'Cockatrice (1d4)', 'Lycanthrope, Wereboar (1d4)', 'Lycanthrope, Weretiger (1d4)', 'Medusa (1d3)', 'Minotaur (1d6)', 'NPC Party (Lvl 5) (1d4+2)', 'Owl Bear (1d4)', 'Phase Tiger (1d4)', 'Rhagodessa, Giant (1d4)', 'Snake, Giant Python (1d3)', 'Wraith (1d4)' ], 5: ['Ankheg (1d6)', 'Basilisk (1d6)', 'Caecilian (1d3)', 'Ettin (1d2)', 'Giant, Hill (1d4)', 'Giant, Stone (1d2)', 'Hell Hound, Greater (2d4)', 'NPC Party (Lvl 8) (1d4+3)', 'Salamander, Flame (1d4+1)', 'Spectre (1d4)', 'Troll (1d8)', 'Wyvern (1d2)'], 6: ['Cyclops (1)', 'Demon Boar (1d4)', 'Dragon (20 HD) (1)', 'Giant, Cloud (1d2)', 'Gorgon (1d2)', 'Hydra (12 HD) (1)', 'Lamia (1)', 'NPC Party (Lvl 14) (1d4+3)', 'Purple Worm (1d2)', 'Remorhaz (15 HD) (1)', 'Skittering Maw (1)', 'Vampire (9 HD) (1d4)']}
def roll_em(dice,pips,mod):
total = 0
for i in range(1,dice+1):
total += random.randint(1,pips)
total += mod
return total
def dungeon_gen(levels):
# dungeon_dict = {level 1:{1:['monster',true], 2:['Empty',False],3:['Unique',True]},level 2:[xxx]}
# dict[levelkey][level_dict][room_list]
theme = dungeon_theme[roll_em(1,20,0)]
room_list = {}
dungeon_dict = {}
for level in range(1,levels+1):
dungeon_dict['level '+str(level)] = {}
rooms = roll_em(2,10,0)
for room in range(1,rooms+1):
dungeon_dict['level '+str(level)][room] = []
x = roll_em(1,100,0)
if x < 30: # Sets up Empty room
dungeon_dict['level '+str(level)][room].append(str(random.choice(room_size.keys())).title())
dungeon_dict['level '+str(level)][room].append('Empty')
dungeon_dict['level '+str(level)][room].append(str(random.choice(room_aspects)))
if roll_em(1,100,0) < 15:
dungeon_dict['level '+str(level)][room].append('Treasure: '+str(random.choice(unprot_treasure[level])))
else:
dungeon_dict['level '+str(level)][room].append(None)
elif x < 60: # Sets up Monster room
dungeon_dict['level '+str(level)][room].append(str(random.choice(room_size.keys())).title())
dungeon_dict['level '+str(level)][room].append('Monster: '+str(random.choice(wandering_m[level])))
dungeon_dict['level '+str(level)][room].append(str(random.choice(room_aspects)))
if roll_em(1,100,0) < 20:
dungeon_dict['level '+str(level)][room].append('Treasure: by Monster')
else:
dungeon_dict['level '+str(level)][room].append(None)
elif x < 75: # Sets up Trap room
dungeon_dict['level '+str(level)][room].append(str(random.choice(room_size.keys())).title())
dungeon_dict['level '+str(level)][room].append('Trap: '+str(random.choice(traps.keys())))
dungeon_dict['level '+str(level)][room].append(str(random.choice(room_aspects)))
if roll_em(1,100,0) < 30:
dungeon_dict['level '+str(level)][room].append('Treasure: '+str(random.choice(unprot_treasure[level])))
else:
dungeon_dict['level '+str(level)][room].append(None)
else: # Sets up Unique room
dungeon_dict['level '+str(level)][room].append(str(random.choice(room_size.keys())).title())
dungeon_dict['level '+str(level)][room].append('Unique: '+str(random.choice(unique_enc[level])).title())
dungeon_dict['level '+str(level)][room].append(str(random.choice(room_aspects)))
if roll_em(1,100,0) < 40:
dungeon_dict['level '+str(level)][room].append('Treasure: '+str(random.choice(unprot_treasure[level])))
else:
dungeon_dict['level '+str(level)][room].append(None)
dun_string = '> **{}** Levels: {}\n<br>'.format(theme,levels)
#print '**{}**'.format(theme)
#print 'Levels: {}'.format(levels)
for level in collections.OrderedDict(sorted(dungeon_dict.items(), key=lambda t: t[0])):
dun_string += '> **{}**:\n<br>'.format(level).title()
for k,v in dungeon_dict[level].items():
dun_string += 'Room {}: Type: {}\n<br>'.format(k,str(v).strip('[]').translate(None,"'"))
dun_string += '\n<br>'
#print dungeon_dict
return dun_string
dungeon_gen(levels)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment