Made fully-connected room set

This commit is contained in:
Segey Lapin
2020-04-19 06:36:45 +03:00
parent 153878d792
commit 585a9bdae1

View File

@@ -40,10 +40,10 @@ const FLAG_DOWN_MASK = (FLAG_WALL_DOWN | FLAG_ENTRY_DOWN | FLAG_WINDOW_DOWN | FL
# Called when the node enters the scene tree for the first time.
var rnd: RandomNumberGenerator
var contour = [
Vector2(-10, -10), Vector2(-8, -10), Vector2(-8, -8), Vector2(-6, -8), Vector2(-6, -10),
Vector2(10, -10), Vector2(10, -8), Vector2(8, -8), Vector2(8, -6), Vector2(10, -6),
Vector2(10, 10), Vector2(8, 10), Vector2(8, 8), Vector2(6, 8), Vector2(6, 10),
Vector2(-10, 10), Vector2(-10, 8), Vector2(-8, 8), Vector2(-8, 6), Vector2(-10, 6), Vector2(-15, 2),
Vector2(-20, -20), Vector2(-8, -20), Vector2(-8, -8), Vector2(-6, -8), Vector2(-6, -20),
Vector2(20, -20), Vector2(20, -8), Vector2(8, -8), Vector2(8, -6), Vector2(20, -6),
Vector2(20, 20), Vector2(8, 20), Vector2(8, 8), Vector2(6, 8), Vector2(6, 20),
Vector2(-20, 20), Vector2(-20, 8), Vector2(-8, 8), Vector2(-8, 6), Vector2(-20, 6), Vector2(-25, 2),
]
var wall_length = 2.0
var grid_areas = []
@@ -289,7 +289,7 @@ func create_windows(pwindow: float):
var rflags = []
for p in flags:
if point_flags & p[0] != 0:
if rnd.randf() > pwindow:
if rnd.randf() > 1.0 - pwindow:
rflags.push_back(p)
for f in rflags:
point_flags &= ~f[0]
@@ -310,21 +310,22 @@ func create_areas(min_d: int = 4):
grid_areas[t] = 0x0
else:
grid_areas[t] = 0xffff
var p = walls_tiles.duplicate()
var area_code: int = 1
while p.size() > 0:
var tile = p.pop_front()
print("tile ", tile)
var point_flags = grid_walls[tile]
for t in [FLAG_ENTRY_MASK, FLAG_WINDOW_MASK]:
for t in [FLAG_ENTRY_MASK, FLAG_WINDOW_MASK]:
var p = walls_tiles.duplicate()
while p.size() > 0:
var tile = p.pop_front()
var point_flags = grid_walls[tile]
if (point_flags & t != 0):
if t == FLAG_ENTRY_MASK:
print("entry")
if created_roots.empty():
print("p")
grid_areas[tile] = area_code
if t == FLAG_ENTRY_MASK:
enterance = area_code
area_code += 1
created_roots.push_back(tile)
else:
print("pp")
var mdst = 1000000000
for e in created_roots:
var dst = tile_distance(e, tile)
@@ -333,13 +334,123 @@ func create_areas(min_d: int = 4):
print(mdst)
if mdst >= min_d:
grid_areas[tile] = area_code
if t == FLAG_ENTRY_MASK:
enterance = area_code
area_code += 1
created_roots.push_back(tile)
assert(enterance != null)
func grow_areas_left():
for k in range(grid_areas.size()):
pass
var count = 0
for tile in range(grid_areas.size()):
var code = grid_areas[tile]
var point_flags = grid_walls[tile]
if code == 0xffff:
continue
if (point_flags & FLAG_FLOOR) == 0:
continue
var x = tile % size_x
var y = int(tile / size_x)
if x > 0:
var code_left = grid_areas[tile - 1]
if code_left == 0:
grid_areas[tile - 1] = code
count += 1
return false if count == 0 else true
func grow_areas_right():
var count = 0
for tile in range(grid_areas.size()):
var code = grid_areas[tile]
var point_flags = grid_walls[tile]
if code == 0xffff:
continue
if (point_flags & FLAG_FLOOR) == 0:
continue
var x = tile % size_x
var y = int(tile / size_x)
if x < size_x - 1:
var code_right = grid_areas[tile + 1]
if code_right == 0:
grid_areas[tile + 1] = code
count += 1
return false if count == 0 else true
func grow_areas_up():
var count = 0
for tile in range(grid_areas.size()):
var code = grid_areas[tile]
var point_flags = grid_walls[tile]
if code == 0xffff:
continue
if (point_flags & FLAG_FLOOR) == 0:
continue
var x = tile % size_x
var y = int(tile / size_x)
if y > 0:
var code_up = grid_areas[tile - size_x]
if code_up == 0:
grid_areas[tile - size_x] = code
count += 1
return false if count == 0 else true
func grow_areas_down():
var count = 0
for tile in range(grid_areas.size()):
var code = grid_areas[tile]
var point_flags = grid_walls[tile]
if code == 0xffff:
continue
if (point_flags & FLAG_FLOOR) == 0:
continue
var x = tile % size_x
var y = int(tile / size_x)
if y < size_y - 1:
var code_down = grid_areas[tile + size_x]
if code_down == 0:
grid_areas[tile + size_x] = code
count += 1
print(grid_areas)
print(grid_walls)
return false if count == 0 else true
func add_adj(adj, ncode, ncode2, ntile, ntile2, adj_type):
print("add_adj ", ncode)
if adj.has(ncode):
if adj[ncode].has(ncode2):
adj[ncode][ncode2].push_back([ntile, ntile2, adj_type])
else:
adj[ncode][ncode2] = [[ntile, ntile2, adj_type]]
else:
adj[ncode] = {}
adj[ncode][ncode2] = [[ntile, ntile2, adj_type]]
func build_area_adj():
var adj = {}
for tile in range(grid_areas.size()):
var code = grid_areas[tile]
var point_flags = grid_walls[tile]
if code == 0xffff:
continue
if (point_flags & FLAG_FLOOR) == 0:
continue
var x = tile % size_x
var y = int(tile / size_x)
print(tile, " ", code, " ", point_flags)
if x > 0:
var code_left = grid_areas[tile - 1]
if code_left != code && code_left != 0xffff:
add_adj(adj, code, code_left, tile, tile - 1, FLAG_DOOR_LEFT)
if x < size_x - 1:
var code_right = grid_areas[tile + 1]
if code_right != code && code_right != 0xffff:
add_adj(adj, code, code_right, tile, tile + 1, FLAG_DOOR_RIGHT)
if y > 0:
var code_up = grid_areas[tile - size_x]
if code_up != code && code_up != 0xffff:
add_adj(adj, code, code_up, tile, tile - size_x, FLAG_DOOR_UP)
if y < size_y - 1:
var code_down = grid_areas[tile + size_x]
if code_down != code && code_down != 0xffff:
add_adj(adj, code, code_down, tile, tile + size_x, FLAG_DOOR_DOWN)
assert(!adj.empty())
return adj
func build_area_walls():
for tile in range(grid_areas.size()):
var code = grid_areas[tile]
@@ -361,31 +472,55 @@ func build_area_walls():
var left_flags = grid_walls[tile - 1]
if (point_flags & FLAG_LEFT_MASK == 0) && (left_flags & FLAG_RIGHT_MASK == 0):
point_flags |= FLAG_WALL_LEFT
print("left ", leftm)
if (rightm == 0) && x < size_x - 1:
var right_code = grid_areas[tile + 1]
if code != right_code:
var right_flags = grid_walls[tile + 1]
if (point_flags & FLAG_RIGHT_MASK == 0) && (right_flags & FLAG_LEFT_MASK == 0):
point_flags |= FLAG_WALL_RIGHT
print("right ", rightm)
if upm == 0 && y > 0:
var up_code = grid_areas[tile - size_x]
if code != up_code:
var up_flags = grid_walls[tile - size_x]
if (point_flags & FLAG_UP_MASK == 0) && (up_flags & FLAG_DOWN_MASK == 0):
point_flags |= FLAG_WALL_UP
print("up ", upm)
if downm == 0 && y < size_y - 1:
var down_code = grid_areas[tile + size_x]
if code != down_code:
var down_flags = grid_walls[tile + size_x]
if (point_flags & FLAG_DOWN_MASK == 0) && (down_flags & FLAG_UP_MASK == 0):
point_flags |= FLAG_WALL_DOWN
print("down ", downm)
if old_point_flags != point_flags:
print("point flags %04x" % (old_point_flags), " after %04x" % (point_flags))
# if old_point_flags != point_flags:
# print("point flags %04x" % (old_point_flags), " after %04x" % (point_flags))
grid_walls[tile] = point_flags
func build_doors():
var adj = build_area_adj()
print("adj: ", adj)
var queue = [enterance]
var seen = []
while queue.size() > 0:
var item = queue.pop_front()
if item in seen:
continue
seen.push_back(item)
for e in adj[item].keys():
var data = adj[item][e][0]
var tile = data[0]
var point_flags = grid_walls[tile]
var rtype = data[2]
match(rtype):
FLAG_DOOR_LEFT:
point_flags &= ~FLAG_LEFT_MASK
FLAG_DOOR_UP:
point_flags &= ~FLAG_UP_MASK
FLAG_DOOR_RIGHT:
point_flags &= ~FLAG_RIGHT_MASK
FLAG_DOOR_DOWN:
point_flags &= ~FLAG_DOWN_MASK
point_flags |= rtype
grid_walls[tile] = point_flags
if !e in seen:
queue.push_back(e)
func instance_wall(what, p0, p1):
var obj = what.instance()
@@ -445,8 +580,18 @@ func _process(delta):
init_walls()
convert_walls()
create_entry_door()
create_windows(0.0)
create_windows(0.6)
create_areas(4)
state = 1
1:
var b1 = grow_areas_left()
var b2 = grow_areas_up()
var b3 = grow_areas_right()
var b4 = grow_areas_down()
if !b1 && !b2 && !b3 && !b4:
state = 2
2:
build_doors()
build_area_walls()
display_walls()
# place_flats()
@@ -456,4 +601,4 @@ func _process(delta):
# print(grid)
# for k in range(150):
# build_corridor()
state = 1
state = 3