Building generation complete, city goes next
This commit is contained in:
@@ -10,15 +10,14 @@ var window = preload("res://scenes/maps/window.tscn")
|
||||
var door = preload("res://scenes/maps/door.tscn")
|
||||
var entry = preload("res://scenes/maps/door-outside.tscn")
|
||||
var fl = preload("res://scenes/maps/floor.escn")
|
||||
var stairs = preload("res://scenes/maps/stairs-small.escn")
|
||||
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
var rnd: RandomNumberGenerator
|
||||
var contour = [
|
||||
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),
|
||||
Vector2(-10, -10), Vector2(10, -10),
|
||||
Vector2(10, 10), Vector2(-10, 10)
|
||||
]
|
||||
|
||||
var spaces = [
|
||||
@@ -48,6 +47,7 @@ class Floor extends Reference:
|
||||
const FLAG_DOOR_UP = (1 << 14)
|
||||
const FLAG_DOOR_RIGHT = (1 << 15)
|
||||
const FLAG_DOOR_DOWN = (1 << 16)
|
||||
const FLAG_STAIRS = (1 << 17)
|
||||
const FLAG_WALL_MASK = (FLAG_WALL_LEFT | FLAG_WALL_UP | FLAG_WALL_RIGHT | FLAG_WALL_DOWN)
|
||||
const FLAG_ENTRY_MASK = (FLAG_ENTRY_LEFT | FLAG_ENTRY_UP | FLAG_ENTRY_RIGHT | FLAG_ENTRY_DOWN)
|
||||
const FLAG_WINDOW_MASK = (FLAG_WINDOW_LEFT | FLAG_WINDOW_UP | FLAG_WINDOW_RIGHT | FLAG_WINDOW_DOWN)
|
||||
@@ -66,6 +66,29 @@ class Floor extends Reference:
|
||||
var windows = []
|
||||
var walls_tiles = []
|
||||
var enterance
|
||||
var enterance_tile = -1
|
||||
var stairs_pos: Vector2
|
||||
var stairs_tile: int
|
||||
const big_stairs_w = 10
|
||||
const big_stairs_h = 8
|
||||
const small_stairs_w = 4
|
||||
const small_stairs_h = 4
|
||||
func copy():
|
||||
var ret = Floor.new()
|
||||
ret.wall_length = wall_length
|
||||
ret.grid_areas = grid_areas.duplicate()
|
||||
ret.grid_walls = grid_walls.duplicate()
|
||||
ret.grid_rect = grid_rect
|
||||
ret.grid_size = grid_size
|
||||
ret.size_x = size_x
|
||||
ret.size_y = size_y
|
||||
ret.windows = windows.duplicate()
|
||||
ret.walls_tiles = walls_tiles.duplicate()
|
||||
ret.enterance = enterance
|
||||
ret.enterance_tile = enterance_tile
|
||||
ret.stairs_pos = stairs_pos
|
||||
ret.stairs_tile = stairs_tile
|
||||
return ret
|
||||
func init_grid(contour):
|
||||
for k in range(contour.size()):
|
||||
var p1 = contour[k]
|
||||
@@ -250,10 +273,10 @@ class Floor extends Reference:
|
||||
var tile = walls_tiles[rnd.randi() % walls_tiles.size()]
|
||||
var point_flags = grid_walls[tile]
|
||||
var flags = [
|
||||
[1, 32],
|
||||
[2, 64],
|
||||
[4, 128],
|
||||
[8, 256]
|
||||
[FLAG_WALL_LEFT, FLAG_ENTRY_LEFT],
|
||||
[FLAG_WALL_UP, FLAG_ENTRY_UP],
|
||||
[FLAG_WALL_RIGHT, FLAG_ENTRY_RIGHT],
|
||||
[FLAG_WALL_DOWN, FLAG_ENTRY_DOWN]
|
||||
]
|
||||
var rflags = []
|
||||
for p in flags:
|
||||
@@ -263,6 +286,74 @@ class Floor extends Reference:
|
||||
point_flags &= ~f[0]
|
||||
point_flags |= f[1]
|
||||
grid_walls[tile] = point_flags
|
||||
enterance_tile = tile
|
||||
func allocate_stairs(area_code: int):
|
||||
var stairs_w = small_stairs_w
|
||||
var stairs_h = small_stairs_h
|
||||
var stairs_grid_w = int((stairs_w + grid_size * 0.5) / grid_size)
|
||||
var stairs_grid_h = int((stairs_h + grid_size * 0.5) / grid_size)
|
||||
print("size_x ", size_x)
|
||||
print("size_y ", size_y)
|
||||
print("stairs grid size: ", stairs_grid_w, " ", stairs_grid_h)
|
||||
var candidates = []
|
||||
var candidates_tile = []
|
||||
for i in range(size_y - stairs_grid_h):
|
||||
for j in range(size_x - stairs_grid_w):
|
||||
var ok = true
|
||||
for ii in range(stairs_grid_h):
|
||||
for jj in range(stairs_grid_w):
|
||||
if grid_walls[(i + ii) * size_x + j + jj] != FLAG_FLOOR:
|
||||
ok = false
|
||||
break
|
||||
if grid_areas[(i + ii) * size_x + j + jj] != 0:
|
||||
ok = false
|
||||
break
|
||||
if ok:
|
||||
candidates_tile.push_back(i * size_x + j)
|
||||
var pos = grid2pos(j, i) + Vector2(stairs_w, stairs_h) * 0.5
|
||||
print("stairs tile: ", i * size_x +j, " pos: ", pos)
|
||||
candidates.push_back(pos)
|
||||
assert(candidates_tile.size() > 0)
|
||||
var pos = 0
|
||||
for xpos in range(1, candidates_tile.size(), 1):
|
||||
if abs(enterance_tile - candidates_tile[xpos]) < abs(enterance_tile - candidates_tile[pos]):
|
||||
pos = xpos
|
||||
stairs_tile = candidates_tile[pos]
|
||||
stairs_pos = candidates[pos]
|
||||
print("result: tile: ", stairs_tile, " pos: ", stairs_pos)
|
||||
for i in range(stairs_grid_h):
|
||||
for j in range(stairs_grid_w):
|
||||
grid_areas[stairs_tile + i * size_x + j] = area_code
|
||||
grid_walls[stairs_tile + i * size_x + j] |= FLAG_STAIRS
|
||||
func remove_stairs_floor():
|
||||
var stairs_w = small_stairs_w
|
||||
var stairs_h = small_stairs_h
|
||||
var stairs_grid_w = int((stairs_w + grid_size * 0.5) / grid_size)
|
||||
var stairs_grid_h = int((stairs_h + grid_size * 0.5) / grid_size)
|
||||
for i in range(stairs_grid_h):
|
||||
for j in range(stairs_grid_w):
|
||||
grid_walls[stairs_tile + i * size_x + j] &= ~FLAG_FLOOR
|
||||
|
||||
func clear_entry_door():
|
||||
if enterance_tile < 0:
|
||||
return
|
||||
var point_flags = grid_walls[enterance_tile]
|
||||
var flags = [
|
||||
[FLAG_ENTRY_LEFT, FLAG_WALL_LEFT, FLAG_WINDOW_LEFT],
|
||||
[FLAG_ENTRY_UP, FLAG_WALL_UP, FLAG_WINDOW_UP],
|
||||
[FLAG_ENTRY_RIGHT, FLAG_WALL_RIGHT, FLAG_WINDOW_RIGHT],
|
||||
[FLAG_ENTRY_DOWN, FLAG_WALL_DOWN, FLAG_WINDOW_DOWN]
|
||||
]
|
||||
var rflags = []
|
||||
for p in flags:
|
||||
if point_flags & p[0] != 0:
|
||||
rflags.push_back(p)
|
||||
for f in rflags:
|
||||
point_flags &= ~f[0]
|
||||
point_flags |= f[1]
|
||||
grid_walls[enterance_tile] = point_flags
|
||||
enterance_tile = -1
|
||||
|
||||
func create_windows(rnd, pwindow: float):
|
||||
for tile in walls_tiles:
|
||||
var point_flags = grid_walls[tile]
|
||||
@@ -288,19 +379,22 @@ class Floor extends Reference:
|
||||
var cur_y = int(tile2 / size_x)
|
||||
var dst = Vector2(cur_x - last_x, cur_y - last_y).length()
|
||||
return int(dst)
|
||||
func create_areas(min_d: int = 4):
|
||||
var created_roots = []
|
||||
func init_areas():
|
||||
for t in range(grid_walls.size()):
|
||||
if grid_walls[t] & FLAG_FLOOR:
|
||||
grid_areas[t] = 0x0
|
||||
else:
|
||||
grid_areas[t] = 0xffff
|
||||
var area_code: int = 1
|
||||
func create_areas(min_d: int = 4, start_code: int = 1) -> int:
|
||||
var created_roots = []
|
||||
var area_code: int = start_code
|
||||
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 & FLAG_STAIRS != 0:
|
||||
continue
|
||||
if (point_flags & t != 0):
|
||||
if t == FLAG_ENTRY_MASK:
|
||||
print("entry")
|
||||
@@ -324,6 +418,7 @@ class Floor extends Reference:
|
||||
area_code += 1
|
||||
created_roots.push_back(tile)
|
||||
assert(enterance != null)
|
||||
return area_code
|
||||
func grow_areas_left():
|
||||
var count = 0
|
||||
for tile in range(grid_areas.size()):
|
||||
@@ -613,6 +708,14 @@ class Floor extends Reference:
|
||||
var p = p0
|
||||
xform.origin = Vector3(p.x, 0, p.y)
|
||||
fd.transform = xform
|
||||
assert(stairs_pos != null)
|
||||
if stairs_pos:
|
||||
var fd = objdata.stairs.instance()
|
||||
base.add_child(fd)
|
||||
var xform = Transform()
|
||||
var p = stairs_pos
|
||||
xform.origin = Vector3(p.x, 0, p.y)
|
||||
fd.transform = xform
|
||||
func debug_contour():
|
||||
$debug.begin(Mesh.PRIMITIVE_LINES)
|
||||
for k in range(contour.size()):
|
||||
@@ -655,11 +758,13 @@ var objd = {
|
||||
"window": window,
|
||||
"door": door,
|
||||
"floor": fl,
|
||||
"entry": entry
|
||||
"entry": entry,
|
||||
"stairs": stairs
|
||||
}
|
||||
var floors = []
|
||||
var nfloors = 3
|
||||
var nfloors = 40
|
||||
var floor_bases = []
|
||||
var area_code = 1
|
||||
func _process(delta):
|
||||
match(state):
|
||||
0:
|
||||
@@ -674,17 +779,39 @@ func _process(delta):
|
||||
floors[0].convert_walls()
|
||||
floors[0].create_entry_door(rnd)
|
||||
floors[0].create_windows(rnd, 0.6)
|
||||
floors[0].create_areas(4)
|
||||
floors[0].init_areas()
|
||||
floors[0].allocate_stairs(area_code)
|
||||
area_code += 1
|
||||
for k in range(0, nfloors, 1):
|
||||
if k > 0:
|
||||
floors[k] = floors[0].copy()
|
||||
floors[k].clear_entry_door()
|
||||
area_code = floors[k].create_areas(4, area_code)
|
||||
state = 1
|
||||
1:
|
||||
var b1 = floors[0].grow_areas_left()
|
||||
var b2 = floors[0].grow_areas_up()
|
||||
var b3 = floors[0].grow_areas_right()
|
||||
var b4 = floors[0].grow_areas_down()
|
||||
var b1 = false
|
||||
var b2 = false
|
||||
var b3 = false
|
||||
var b4 = false
|
||||
for k in range(nfloors):
|
||||
var tb1 = floors[k].grow_areas_left()
|
||||
if tb1:
|
||||
b1 = true
|
||||
var tb2 = floors[k].grow_areas_up()
|
||||
if tb2:
|
||||
b2 = true
|
||||
var tb3 = floors[k].grow_areas_right()
|
||||
if tb3:
|
||||
b3 = true
|
||||
var tb4 = floors[k].grow_areas_down()
|
||||
if tb4:
|
||||
b4 = true
|
||||
if !b1 && !b2 && !b3 && !b4:
|
||||
state = 2
|
||||
2:
|
||||
floors[0].build_doors()
|
||||
floors[0].build_area_walls()
|
||||
floors[0].display_walls(floor_bases[0], objd)
|
||||
for k in range(nfloors):
|
||||
floors[k].build_doors()
|
||||
floors[k].build_area_walls()
|
||||
floors[k].remove_stairs_floor()
|
||||
floors[k].display_walls(floor_bases[k], objd)
|
||||
state = 3
|
||||
|
||||
Reference in New Issue
Block a user