Advertisement
Guest User

Untitled

a guest
Sep 14th, 2019
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 2.90 KB | None | 0 0
  1. extends Reference
  2.  
  3. class_name Leaf # used for the BSP tree algorithm
  4. #func __init__(x, y, width, height):
  5.    
  6. var x
  7. var y
  8. var width
  9. var height
  10. export var MIN_LEAF_SIZE = 10
  11. var child_1 = null
  12. var child_2 = null
  13. var room = null
  14. var hall = null
  15.  
  16. func splitLeaf():
  17.     # begin splitting the leaf into two children
  18.     if (child_1 != null) or (child_2 != null):
  19.         return false # This leaf has already been split
  20.  
  21.     """
  22.     ==== Determine the direction of the split ====
  23.     If the width of the leaf is >25% larger than the height,
  24.     split the leaf vertically.
  25.     If the height of the leaf is >25 larger than the width,
  26.     split the leaf horizontally.
  27.     Otherwise, choose the direction at random.
  28.     """
  29.     var splitHorizontally = randi() % 2
  30.     if (width/height >= 1.25):
  31.         splitHorizontally = false
  32.     elif (height/width >= 1.25):
  33.         splitHorizontally = true
  34.  
  35.     var maxSize
  36.     if (splitHorizontally):
  37.         maxSize = height - MIN_LEAF_SIZE
  38.     else:
  39.         maxSize = width - MIN_LEAF_SIZE
  40.  
  41.     if (maxSize <= MIN_LEAF_SIZE):
  42.         return false # the leaf is too small to split further
  43.  
  44.     var leafRange = range(MIN_LEAF_SIZE,maxSize)
  45.     var split = leafRange[randi() % leafRange.size()] #determine where to split the leaf
  46.  
  47.     if (splitHorizontally):
  48.         child_1 = Leaf.new(x, y, width, split)
  49.         child_2 = Leaf.new(x, y+split, width, height-split)
  50.     else:
  51.         child_1 = Leaf.new(x, y,split, height)
  52.         child_2 = Leaf.new(x + split, y, width-split, height)
  53.  
  54.     return true
  55.  
  56. func createRooms(bspTree):
  57.     if (child_1) or (child_2):
  58.         # recursively search for children until you hit the end of the branch
  59.         if (child_1):
  60.             child_1.createRooms(bspTree)
  61.         if (child_2):
  62.             child_2.createRooms(bspTree)
  63.  
  64.         if (child_1 and child_2):
  65.             bspTree.createHall(child_1.getRoom(),
  66.                 child_2.getRoom())
  67.  
  68.     else:
  69.     # Create rooms in the end branches of the bsp tree
  70.         var wRange = range(bspTree.ROOM_MIN_SIZE, min(bspTree.ROOM_MAX_SIZE,width-1))
  71.         var hRange = range(bspTree.ROOM_MIN_SIZE, min(bspTree.ROOM_MAX_SIZE,height-1))
  72.         var w = wRange[randi() & wRange.size()]
  73.         var h = hRange[randi() & hRange.size()]
  74.         var xRange = range(x, x+(width-1)-w)
  75.         var yRange = range(y, y+(height-1)-h)
  76.         var x = xRange[randi() & xRange.size()]
  77.         var y = yRange[randi() & yRange.size()]
  78.         var room = Rect2(x,y,w,h)
  79.         bspTree.createRoom(room)
  80.  
  81. func getRoom():
  82.     var room_1
  83.     var room_2
  84.     if (room):
  85.         return room
  86.     else:
  87.         if (child_1):
  88.             room_1 = child_1.getRoom()
  89.         if (child_2):
  90.             room_2 = child_2.getRoom()
  91.  
  92.         if (not child_1 and not child_2):
  93.             # neither room_1 nor room_2
  94.             return null
  95.  
  96.         elif (not room_2):
  97.             # room_1 and !room_2
  98.             return room_1
  99.  
  100.         elif (not room_1):
  101.             # room_2 and !room_1
  102.             return room_2
  103.  
  104.         # If both room_1 and room_2 exist, pick one
  105.         elif (randf() < 0.5):
  106.             return room_1
  107.         else:
  108.             return room_2
  109.  
  110. func _init(newX, newY, newWidth, newHeight) -> void:
  111.     x = newX
  112.     y = newY
  113.     width = newWidth
  114.     height = newHeight
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement