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.
|
# Called when the node enters the scene tree for the first time.
|
||||||
var rnd: RandomNumberGenerator
|
var rnd: RandomNumberGenerator
|
||||||
var contour = [
|
var contour = [
|
||||||
Vector2(-10, -10), Vector2(-8, -10), Vector2(-8, -8), Vector2(-6, -8), Vector2(-6, -10),
|
Vector2(-20, -20), Vector2(-8, -20), Vector2(-8, -8), Vector2(-6, -8), Vector2(-6, -20),
|
||||||
Vector2(10, -10), Vector2(10, -8), Vector2(8, -8), Vector2(8, -6), Vector2(10, -6),
|
Vector2(20, -20), Vector2(20, -8), Vector2(8, -8), Vector2(8, -6), Vector2(20, -6),
|
||||||
Vector2(10, 10), Vector2(8, 10), Vector2(8, 8), Vector2(6, 8), Vector2(6, 10),
|
Vector2(20, 20), Vector2(8, 20), Vector2(8, 8), Vector2(6, 8), Vector2(6, 20),
|
||||||
Vector2(-10, 10), Vector2(-10, 8), Vector2(-8, 8), Vector2(-8, 6), Vector2(-10, 6), Vector2(-15, 2),
|
Vector2(-20, 20), Vector2(-20, 8), Vector2(-8, 8), Vector2(-8, 6), Vector2(-20, 6), Vector2(-25, 2),
|
||||||
]
|
]
|
||||||
var wall_length = 2.0
|
var wall_length = 2.0
|
||||||
var grid_areas = []
|
var grid_areas = []
|
||||||
@@ -289,7 +289,7 @@ func create_windows(pwindow: float):
|
|||||||
var rflags = []
|
var rflags = []
|
||||||
for p in flags:
|
for p in flags:
|
||||||
if point_flags & p[0] != 0:
|
if point_flags & p[0] != 0:
|
||||||
if rnd.randf() > pwindow:
|
if rnd.randf() > 1.0 - pwindow:
|
||||||
rflags.push_back(p)
|
rflags.push_back(p)
|
||||||
for f in rflags:
|
for f in rflags:
|
||||||
point_flags &= ~f[0]
|
point_flags &= ~f[0]
|
||||||
@@ -310,21 +310,22 @@ func create_areas(min_d: int = 4):
|
|||||||
grid_areas[t] = 0x0
|
grid_areas[t] = 0x0
|
||||||
else:
|
else:
|
||||||
grid_areas[t] = 0xffff
|
grid_areas[t] = 0xffff
|
||||||
var p = walls_tiles.duplicate()
|
|
||||||
var area_code: int = 1
|
var area_code: int = 1
|
||||||
while p.size() > 0:
|
for t in [FLAG_ENTRY_MASK, FLAG_WINDOW_MASK]:
|
||||||
var tile = p.pop_front()
|
var p = walls_tiles.duplicate()
|
||||||
print("tile ", tile)
|
while p.size() > 0:
|
||||||
var point_flags = grid_walls[tile]
|
var tile = p.pop_front()
|
||||||
for t in [FLAG_ENTRY_MASK, FLAG_WINDOW_MASK]:
|
var point_flags = grid_walls[tile]
|
||||||
if (point_flags & t != 0):
|
if (point_flags & t != 0):
|
||||||
|
if t == FLAG_ENTRY_MASK:
|
||||||
|
print("entry")
|
||||||
if created_roots.empty():
|
if created_roots.empty():
|
||||||
print("p")
|
|
||||||
grid_areas[tile] = area_code
|
grid_areas[tile] = area_code
|
||||||
|
if t == FLAG_ENTRY_MASK:
|
||||||
|
enterance = area_code
|
||||||
area_code += 1
|
area_code += 1
|
||||||
created_roots.push_back(tile)
|
created_roots.push_back(tile)
|
||||||
else:
|
else:
|
||||||
print("pp")
|
|
||||||
var mdst = 1000000000
|
var mdst = 1000000000
|
||||||
for e in created_roots:
|
for e in created_roots:
|
||||||
var dst = tile_distance(e, tile)
|
var dst = tile_distance(e, tile)
|
||||||
@@ -333,13 +334,123 @@ func create_areas(min_d: int = 4):
|
|||||||
print(mdst)
|
print(mdst)
|
||||||
if mdst >= min_d:
|
if mdst >= min_d:
|
||||||
grid_areas[tile] = area_code
|
grid_areas[tile] = area_code
|
||||||
|
if t == FLAG_ENTRY_MASK:
|
||||||
|
enterance = area_code
|
||||||
area_code += 1
|
area_code += 1
|
||||||
created_roots.push_back(tile)
|
created_roots.push_back(tile)
|
||||||
|
assert(enterance != null)
|
||||||
func grow_areas_left():
|
func grow_areas_left():
|
||||||
for k in range(grid_areas.size()):
|
var count = 0
|
||||||
pass
|
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_areas)
|
||||||
print(grid_walls)
|
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():
|
func build_area_walls():
|
||||||
for tile in range(grid_areas.size()):
|
for tile in range(grid_areas.size()):
|
||||||
var code = grid_areas[tile]
|
var code = grid_areas[tile]
|
||||||
@@ -361,31 +472,55 @@ func build_area_walls():
|
|||||||
var left_flags = grid_walls[tile - 1]
|
var left_flags = grid_walls[tile - 1]
|
||||||
if (point_flags & FLAG_LEFT_MASK == 0) && (left_flags & FLAG_RIGHT_MASK == 0):
|
if (point_flags & FLAG_LEFT_MASK == 0) && (left_flags & FLAG_RIGHT_MASK == 0):
|
||||||
point_flags |= FLAG_WALL_LEFT
|
point_flags |= FLAG_WALL_LEFT
|
||||||
print("left ", leftm)
|
|
||||||
if (rightm == 0) && x < size_x - 1:
|
if (rightm == 0) && x < size_x - 1:
|
||||||
var right_code = grid_areas[tile + 1]
|
var right_code = grid_areas[tile + 1]
|
||||||
if code != right_code:
|
if code != right_code:
|
||||||
var right_flags = grid_walls[tile + 1]
|
var right_flags = grid_walls[tile + 1]
|
||||||
if (point_flags & FLAG_RIGHT_MASK == 0) && (right_flags & FLAG_LEFT_MASK == 0):
|
if (point_flags & FLAG_RIGHT_MASK == 0) && (right_flags & FLAG_LEFT_MASK == 0):
|
||||||
point_flags |= FLAG_WALL_RIGHT
|
point_flags |= FLAG_WALL_RIGHT
|
||||||
print("right ", rightm)
|
|
||||||
if upm == 0 && y > 0:
|
if upm == 0 && y > 0:
|
||||||
var up_code = grid_areas[tile - size_x]
|
var up_code = grid_areas[tile - size_x]
|
||||||
if code != up_code:
|
if code != up_code:
|
||||||
var up_flags = grid_walls[tile - size_x]
|
var up_flags = grid_walls[tile - size_x]
|
||||||
if (point_flags & FLAG_UP_MASK == 0) && (up_flags & FLAG_DOWN_MASK == 0):
|
if (point_flags & FLAG_UP_MASK == 0) && (up_flags & FLAG_DOWN_MASK == 0):
|
||||||
point_flags |= FLAG_WALL_UP
|
point_flags |= FLAG_WALL_UP
|
||||||
print("up ", upm)
|
|
||||||
if downm == 0 && y < size_y - 1:
|
if downm == 0 && y < size_y - 1:
|
||||||
var down_code = grid_areas[tile + size_x]
|
var down_code = grid_areas[tile + size_x]
|
||||||
if code != down_code:
|
if code != down_code:
|
||||||
var down_flags = grid_walls[tile + size_x]
|
var down_flags = grid_walls[tile + size_x]
|
||||||
if (point_flags & FLAG_DOWN_MASK == 0) && (down_flags & FLAG_UP_MASK == 0):
|
if (point_flags & FLAG_DOWN_MASK == 0) && (down_flags & FLAG_UP_MASK == 0):
|
||||||
point_flags |= FLAG_WALL_DOWN
|
point_flags |= FLAG_WALL_DOWN
|
||||||
print("down ", downm)
|
# if old_point_flags != point_flags:
|
||||||
if old_point_flags != point_flags:
|
# print("point flags %04x" % (old_point_flags), " after %04x" % (point_flags))
|
||||||
print("point flags %04x" % (old_point_flags), " after %04x" % (point_flags))
|
|
||||||
grid_walls[tile] = 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):
|
func instance_wall(what, p0, p1):
|
||||||
var obj = what.instance()
|
var obj = what.instance()
|
||||||
@@ -445,8 +580,18 @@ func _process(delta):
|
|||||||
init_walls()
|
init_walls()
|
||||||
convert_walls()
|
convert_walls()
|
||||||
create_entry_door()
|
create_entry_door()
|
||||||
create_windows(0.0)
|
create_windows(0.6)
|
||||||
create_areas(4)
|
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()
|
build_area_walls()
|
||||||
display_walls()
|
display_walls()
|
||||||
# place_flats()
|
# place_flats()
|
||||||
@@ -456,4 +601,4 @@ func _process(delta):
|
|||||||
# print(grid)
|
# print(grid)
|
||||||
# for k in range(150):
|
# for k in range(150):
|
||||||
# build_corridor()
|
# build_corridor()
|
||||||
state = 1
|
state = 3
|
||||||
|
|||||||
Reference in New Issue
Block a user