func _combineLists(destination: Array, source: Array) -> void:
var random := Random.nextBool()
for y in range(_height):
for x in range(_width):
var index := Utility.index(x, y, _width)
destination[index] = (destination[index] and source[index]) if random else (destination[index] or source[index])
func _biggest(list: Array) -> Array:
var disjointSet := _disjointSetup(list)
var caves := disjointSet.split(list)
_removeSmallCaves(caves, list)
return caves.values()[0]
func _bigEnough(list: Array) -> bool:
return _biggest(list).size() > 4
func _unionAdjacent(disjointSet: DisjointSet, list: Array, x: int, y: int) -> void:
for yy in range(-1, 2):
for xx in range(-1, 2):
if not ((xx == 0) and (yy == 0)) and _level.insideMap(x + xx, y + yy):
var index1 := Utility.index(x + xx, y + yy, _width)
if not list[index1]:
var root1 := disjointSet.find(index1)
var index0 := Utility.index(x, y, _width)
var root0 := disjointSet.find(index0)
if root0 != root1:
disjointSet.union(root0, root1)
func _disjointSetup(list: Array) -> DisjointSet:
var disjointSet := DisjointSet.new(_width * _height)
for y in range(_height):
for x in range(_width):
if not list[Utility.index(x, y, _width)]:
_unionAdjacent(disjointSet, list, x, y)
return disjointSet
func _removeSmall(list: Array) -> void:
_removeSmallCaves(_disjointSetup(list).split(list), list)
func _removeSmallCaves(caves: Dictionary, list: Array) -> void:
var biggest := 0
var biggestKey := 0
for key in caves.keys():
var size: int = caves[key].size()
if size > biggest:
biggest = size
biggestKey = key
var delete := []
for key in caves.keys():
if key != biggestKey:
delete.append(key)
for key in delete:
if list != null:
var cave: Array = caves[key]
for i in cave:
list[i] = true
Utility.stfu(caves.erase(key))
func _isCaveEdge(list: Array, x: int, y: int) -> bool:
var edge := false
for yy in range(-1, 2):
for xx in range(-1, 2):
if not ((xx == 0) and (yy == 0)):
var new := Vector2(x + xx, y + yy)
if _level.insideMapV(new) and not list[Utility.indexV(new, _width)]:
edge = true
return edge
func _outlineCaves(list: Array) -> void:
for y in range(_height):
for x in range(_width):
if list[Utility.index(x, y, _width)]:
if _isCaveEdge(list, x, y):
_setWall(x, y)