Created
February 3, 2014 13:01
-
-
Save ToferC/8783430 to your computer and use it in GitHub Desktop.
dungeons
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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