Made fully-connected room set
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user