Advertisement
Guest User

Retarded Dungeon Generator

a guest
Mar 1st, 2015
224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.59 KB | None | 0 0
  1. import turtle, random
  2.  
  3. MAX_CORRIDOR_LENGTH = 7
  4.  
  5. def get_map_size(tile_map):
  6.     return (len(tile_map), len(tile_map[0]))
  7.  
  8. def get_neighbor_count(tile_map, coord):
  9.     count = 0
  10.     h, w = get_map_size(tile_map)
  11.     if (coord[0] > 0 and tile_map[coord[0]-1][coord[1]] > 0):
  12.         count += 1
  13.     if (coord[0] < h-1 and tile_map[coord[0]+1][coord[1]] > 0):
  14.         count += 1
  15.     if (coord[1] > 0 and tile_map[coord[0]][coord[1]-1] > 0):
  16.         count += 1
  17.     if (coord[1] < w-1 and tile_map[coord[0]][coord[1]+1] > 0):
  18.         count += 1 
  19.     return count
  20.  
  21. def get_corridor_length(tile_map, coord, direction):
  22.     offsets = ((-1, 0), (0, 1), (1, 0), (0, -1))
  23.     h, w = get_map_size(tile_map)
  24.     new_coord = coord
  25.     length = 0
  26.     while (new_coord[0] in range(h) and new_coord[1] in range(w)) and tile_map[new_coord[0]][new_coord[1]] > 0:
  27.         length += 1
  28.         new_coord = tuple(map(sum, zip(new_coord, offsets[direction])))
  29.     return length
  30.  
  31. def gen_path_tree(w, h):
  32.     offsets = ((-1, 0), (0, 1), (1, 0), (0, -1))
  33.  
  34.     tile_map = [[0 for x in range(w)] for y in range(h)]
  35.     start = (random.randint(0, h-1), random.randint(0, w-1), 1)
  36.     tile_map[start[0]][start[1]] = start[2]
  37.     stack = [start]
  38.     while len(stack) > 0:
  39.         if (len(stack) >= 2 and random.randint(0, 1) == 1):
  40.             k, l = stack.pop(), stack.pop()
  41.             stack.append(k)
  42.             stack.append(l)
  43.         coord = stack.pop()
  44.         for o in offsets:
  45.             next_coord = tuple(map(sum, zip(coord, o)))+(coord[2]+1,)
  46.             if next_coord[0] in range(0, h) and next_coord[1] in range(0, w):
  47.                 if get_neighbor_count(tile_map, next_coord) == 1:
  48.                     stack.append(next_coord)
  49.                     tile_map[next_coord[0]][next_coord[1]] = next_coord[2]
  50.     return tile_map
  51.  
  52. def isolate_path(tile_map):
  53.     offsets = ((-1, 0), (0, 1), (1, 0), (0, -1))
  54.     h, w = get_map_size(tile_map)
  55.     max_coord = (0, 0)
  56.     for y in range(h):
  57.         for x in range(y):
  58.             if tile_map[y][x] > tile_map[max_coord[0]][max_coord[1]]:
  59.                 max_coord = (y, x)
  60.     stack = [max_coord]
  61.     new_map = [[0 for x in range(w)] for y in range(h)]
  62.     while len(stack) > 0:
  63.         coord = stack.pop()
  64.         new_map[coord[0]][coord[1]] = tile_map[coord[0]][coord[1]]
  65.         for o in offsets:
  66.             new_coord = tuple(map(sum, zip(coord, o)))
  67.             if new_coord[0] in range(h) and new_coord[1] in range(w):
  68.                 if tile_map[new_coord[0]][new_coord[1]] < tile_map[coord[0]][coord[1]]:
  69.                     stack.append(new_coord)
  70.     return new_map
  71.  
  72. # this is just here to prevent rooms from being cut off
  73. def add_padding(tile_map, width):
  74.     h, w = get_map_size(tile_map)
  75.     new_map = [[0 for x in range(w+(width*2))] for y in range(h+(width*2))]
  76.     for y in range(h):
  77.         for x in range(w):
  78.             new_map[y+width][x+width] = tile_map[y][x]
  79.     return new_map
  80.  
  81. def plot_rooms(tile_map):
  82.     h, w = get_map_size(tile_map)
  83.     room_map = [[0 for x in range(w)] for y in range(h)]
  84.     max_coord = (-1, -1, 0)
  85.     for y in range(h):
  86.         for x in range(w):
  87.             if tile_map[y][x] > max_coord[2]:
  88.                 max_coord = (y, x, tile_map[y][x])
  89.     room_map[max_coord[0]][max_coord[1]] = 1
  90.     for y in range(h):
  91.         for x in range(w):
  92.             if tile_map[y][x]%10 == 1:
  93.                 room_map[y][x] = 1
  94.     return room_map
  95.  
  96. def apply_pattern(old_map, pattern, replacement):
  97.     tile_map = [x[:] for x in old_map]
  98.     ht, wt = get_map_size(tile_map)
  99.     hp, wp = get_map_size(pattern)
  100.     blacklist = []
  101.     for y in range(ht-(hp-1)):
  102.         for x in range(wt-(wp-1)):
  103.             works = True
  104.             for y2 in range(hp):
  105.                 for x2 in range(wp):
  106.                     if (pattern[y2][x2] > -1 and tile_map[y+y2][x+x2] != pattern[y2][x2]) or \
  107.                         ((y+y2, x+x2) in blacklist and pattern[y2][x2] > 0 and tile_map[y+y2][x+x2] > 0):
  108.                         works = False
  109.                 if not works:
  110.                     break
  111.             if works:
  112.                 for y2 in range(hp):
  113.                     for x2 in range(wp):
  114.                         if replacement[y2][x2] > 0:
  115.                             tile_map[y+y2][x+x2] = replacement[y2][x2]
  116.                             blacklist.append((y+y2, x+x2))
  117.     return tile_map
  118.  
  119. def enlarge_rooms(room_map):
  120.     patterns = (
  121.         (
  122.             ( 0, 0, 0, 0, 0),
  123.             ( 0, 0, 0, 0, 0),
  124.             (-1,-1, 0,-1,-1),
  125.             (-1,-1, 1,-1,-1)),
  126.         (
  127.             (-1,-1, 1,-1,-1),
  128.             (-1,-1, 0,-1,-1),
  129.             ( 0, 0, 0, 0, 0),
  130.             ( 0, 0, 0, 0, 0)),
  131.         (
  132.             (-1,-1, 0, 0),
  133.             (-1,-1, 0, 0),
  134.             ( 1, 0, 0, 0),
  135.             (-1,-1, 0, 0),
  136.             (-1,-1, 0, 0)),
  137.         (
  138.             ( 0, 0,-1,-1),
  139.             ( 0, 0,-1,-1),
  140.             ( 0, 0, 0, 1),
  141.             ( 0, 0,-1,-1),
  142.             ( 0, 0,-1,-1))
  143.     )
  144.  
  145.     replacements = (
  146.         (
  147.             (0, 0, 0, 0, 0),
  148.             (0, 0, 0, 0, 0),
  149.             (0, 0, 1, 0, 0),
  150.             (0, 0, 1, 0, 0)),
  151.         (
  152.             (0, 0, 1, 0, 0),
  153.             (0, 0, 1, 0, 0),
  154.             (0, 0, 0, 0, 0),
  155.             (0, 0, 0, 0, 0)),
  156.         (
  157.             (0, 0, 0, 0),
  158.             (0, 0, 0, 0),
  159.             (1, 1, 0, 0),
  160.             (0, 0, 0, 0),
  161.             (0, 0, 0, 0)),
  162.         (
  163.             (0, 0, 0, 0),
  164.             (0, 0, 0, 0),
  165.             (0, 0, 1, 1),
  166.             (0, 0, 0, 0),
  167.             (0, 0, 0, 0))
  168.     )
  169.     new_rooms = [x[:] for x in room_map]
  170.     for i in range(2):
  171.         for j in range(4):
  172.             new_rooms = apply_pattern(new_rooms, patterns[j], replacements[j])
  173.     return new_rooms
  174.  
  175. def combine(map_1, map_2):
  176.     h1, w1 = get_map_size(map_1)
  177.     h2, w2 = get_map_size(map_2)
  178.     h = max(h1, h2)
  179.     w = max(w1, w2)
  180.     new_map = [[0 for x in range(w)] for y in range(h)]
  181.     for y in range(h):
  182.         for x in range(w):
  183.             if y < h1 and x < w1:
  184.                 new_map[y][x] = map_1[y][x]
  185.             if y < h2 and x < w2 and map_2[y][x] > new_map[y][x]:
  186.                 new_map[y][x] = map_2[y][x]
  187.     return new_map
  188.  
  189. def turtle_print(tile_map):
  190.     h, w = get_map_size(tile_map)
  191.     turtle.setup(w*4, h*4)
  192.     turtle.setworldcoordinates(0,h,w,0)
  193.     turtle.up()
  194.     turtle.speed(0)
  195.     turtle.tracer(100)
  196.     for y in range(h):
  197.         for x in range(w):
  198.             if tile_map[y][x] > 0:
  199.                 turtle.goto(x, y)
  200.                 turtle.dot(4)
  201.     turtle.exitonclick()
  202.  
  203. tree = gen_path_tree(45,45)
  204. tree = isolate_path(tree)
  205. tree = add_padding(tree, 5)
  206. rooms = plot_rooms(tree)
  207. rooms = enlarge_rooms(rooms)
  208. final = combine(tree, rooms)
  209. turtle_print(final)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement