|
|
|
|
@ -70,16 +70,11 @@ func set_level_range_visible(value: bool) -> void:
|
|
|
|
|
level_range.visible = value
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func init() -> void:
|
|
|
|
|
init_level_character()
|
|
|
|
|
init_level_main()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func set_focus() -> void:
|
|
|
|
|
var level_range: CSGBox3D = $LevelRange as CSGBox3D
|
|
|
|
|
var level_size: Vector3 = level_range.size
|
|
|
|
|
var focus_min: Vector3 = get_global_position() + Vector3(0.640001, 0.640001, 0.640001)
|
|
|
|
|
var focus_max: Vector3 = get_global_position() + level_size - Vector3(0.640001, 0.639999, 0.639999)
|
|
|
|
|
var focus_min: Vector3 = get_global_position() - Vector3(0.640001, 0.640001, 0.640001)
|
|
|
|
|
var focus_max: Vector3 = get_global_position() + level_size + Vector3(0.640001, 0.640001, 0.640001)
|
|
|
|
|
grid_block_material.set_shader_parameter("focus_min", focus_min)
|
|
|
|
|
grid_block_material.set_shader_parameter("focus_max", focus_max)
|
|
|
|
|
|
|
|
|
|
@ -139,13 +134,9 @@ func init_level_main() -> void:
|
|
|
|
|
mark_white_list.clear()
|
|
|
|
|
mark_black_list.clear()
|
|
|
|
|
grid_main_cache_cells.clear()
|
|
|
|
|
var id_min: Vector3i = Util.get_level_grid_pos2(pos_min())
|
|
|
|
|
var id_max: Vector3i = Util.get_level_grid_pos2(pos_max())
|
|
|
|
|
# 正前面
|
|
|
|
|
for x in range(id_min.x, id_max.x+1):
|
|
|
|
|
for y in range(id_min.y, id_max.y+1):
|
|
|
|
|
var pos: Vector3i = Vector3i(x, y, id_max.z)
|
|
|
|
|
add_grid_main_cache_cell(level_main, pos)
|
|
|
|
|
var id_min: Vector3i = Util.get_level_grid_pos2(pos_min())
|
|
|
|
|
var id_max: Vector3i = Util.get_level_grid_pos2(pos_max())
|
|
|
|
|
|
|
|
|
|
# 底面黑块
|
|
|
|
|
for x in range(id_min.x, id_max.x+1):
|
|
|
|
|
for z in range(id_min.z, id_max.z+1):
|
|
|
|
|
@ -154,24 +145,87 @@ func init_level_main() -> void:
|
|
|
|
|
if not(id == GridMap.INVALID_CELL_ITEM or z == id_max.z):
|
|
|
|
|
continue
|
|
|
|
|
mark_black_list.append(pos)
|
|
|
|
|
|
|
|
|
|
# 底面黑块剔除
|
|
|
|
|
var mark_black_remove_list: Array[Vector3i] = []
|
|
|
|
|
for mark_black in mark_black_list:
|
|
|
|
|
var is_edge: bool
|
|
|
|
|
var check_dir: Vector3i
|
|
|
|
|
if mark_black.x == id_min.x:
|
|
|
|
|
check_dir = Vector3i(-1, 0, 0); is_edge=true;
|
|
|
|
|
elif mark_black.z == id_min.z:
|
|
|
|
|
check_dir = Vector3i(0, 0, -1); is_edge=true;
|
|
|
|
|
elif mark_black.x == id_max.x:
|
|
|
|
|
check_dir = Vector3i(1, 0, 0); is_edge=true;
|
|
|
|
|
elif mark_black.z == id_max.z:
|
|
|
|
|
check_dir = Vector3i(0, 0, 1); is_edge=true;
|
|
|
|
|
else:
|
|
|
|
|
check_dir = Vector3i(0, -1, 0)
|
|
|
|
|
|
|
|
|
|
if mark_black in [
|
|
|
|
|
Vector3i(id_min.x, id_min.y, id_min.z),
|
|
|
|
|
Vector3i(id_max.x, id_min.y, id_min.z),
|
|
|
|
|
Vector3i(id_min.x, id_min.y, id_max.z),
|
|
|
|
|
Vector3i(id_max.x, id_min.y, id_max.z)
|
|
|
|
|
]:
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
if is_edge:
|
|
|
|
|
var is_hole: bool
|
|
|
|
|
for y in range(id_min.y+1, id_max.y):
|
|
|
|
|
var pos: Vector3i = Vector3i(mark_black.x, y, mark_black.z)
|
|
|
|
|
if not check_grid(level_main, pos):
|
|
|
|
|
is_hole = true
|
|
|
|
|
break
|
|
|
|
|
if not is_hole:
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
var mark_black_check: Vector3i = mark_black + check_dir
|
|
|
|
|
var float_pos_check: Vector3 = Util.get_level_float_pos2(mark_black_check) + Vector3(0.64, 0, 0.64)
|
|
|
|
|
if not (Global.level_mgr.get_level_by_pos(float_pos_check) and not check_grid(level_main, float_pos_check)):
|
|
|
|
|
continue
|
|
|
|
|
mark_black_remove_list.append(mark_black)
|
|
|
|
|
mark_black_list = mark_black_list.filter(func (x): return x not in mark_black_remove_list)
|
|
|
|
|
|
|
|
|
|
# 底面黑块延申空气墙
|
|
|
|
|
for mark_black in mark_black_list:
|
|
|
|
|
for y in range(id_min.y, id_max.y):
|
|
|
|
|
add_grid_main_cache_cell(level_main, mark_black)
|
|
|
|
|
for y in range(id_min.y+1, id_max.y):
|
|
|
|
|
var pos: Vector3i = Vector3i(mark_black.x, y, mark_black.z)
|
|
|
|
|
add_grid_main_cache_cell(level_main, pos)
|
|
|
|
|
mark_white_list.append(pos)
|
|
|
|
|
# 底面黑块剔除延申空气墙
|
|
|
|
|
for mark_black in mark_black_remove_list:
|
|
|
|
|
for y in range(id_min.y+1, id_max.y):
|
|
|
|
|
var pos: Vector3i = Vector3i(mark_black.x, y, mark_black.z)
|
|
|
|
|
if not check_grid(level_main, pos):
|
|
|
|
|
continue
|
|
|
|
|
add_grid_main_cache_cell(level_main, pos)
|
|
|
|
|
mark_white_list.append(pos)
|
|
|
|
|
# 顶面
|
|
|
|
|
for x in range(id_min.x, id_max.x+1):
|
|
|
|
|
for z in range(id_min.z, id_max.z+1):
|
|
|
|
|
var pos: Vector3i = Vector3i(x, id_max.y, z)
|
|
|
|
|
add_grid_main_cache_cell(level_main, pos)
|
|
|
|
|
if z == id_max.z:
|
|
|
|
|
mark_white_list.append(pos)
|
|
|
|
|
continue
|
|
|
|
|
var pos_down: Vector3i = Vector3i(x, id_max.y - 1, z)
|
|
|
|
|
if level_main.get_cell_item(pos_down) == GridMap.INVALID_CELL_ITEM:
|
|
|
|
|
var pos_up: Vector3i = Vector3i(x, id_max.y + 1, z)
|
|
|
|
|
var float_pos_check: Vector3 = Util.get_level_float_pos2(pos_up) + Vector3(0.64, 0, 0.64)
|
|
|
|
|
if Global.level_mgr.get_level_by_pos(float_pos_check) and not check_grid(level_main, pos_up):
|
|
|
|
|
continue
|
|
|
|
|
mark_white_list.append(pos)
|
|
|
|
|
else:
|
|
|
|
|
mark_black_list.append(pos)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func check_grid(level_main: GridMap, pos: Vector3i) -> bool:
|
|
|
|
|
var id: int = level_main.get_cell_item(pos)
|
|
|
|
|
return id != GridMap.INVALID_CELL_ITEM
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func add_grid_main_cache_cell(level_main: GridMap, pos: Vector3i) -> void:
|
|
|
|
|
var id: int = level_main.get_cell_item(pos)
|
|
|
|
|
if id == GridMap.INVALID_CELL_ITEM:
|
|
|
|
|
@ -183,9 +237,15 @@ func add_grid_main_cache_cell(level_main: GridMap, pos: Vector3i) -> void:
|
|
|
|
|
grid_main_cache_cells.append(cache_data)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func set_replace(is_active: bool)-> void:
|
|
|
|
|
func set_replace(is_active: bool, last_grid_main_cache_cells: Array[GridMainCacheCellData] = [])-> void:
|
|
|
|
|
var level_main: GridMap = %LevelGridMain as GridMap
|
|
|
|
|
if is_active:
|
|
|
|
|
var id_min: Vector3i = Util.get_level_grid_pos2(pos_min())
|
|
|
|
|
var id_max: Vector3i = Util.get_level_grid_pos2(pos_max())
|
|
|
|
|
for cache_data in last_grid_main_cache_cells:
|
|
|
|
|
if cache_data.pos.x < id_min.x or cache_data.pos.z < id_min.z or cache_data.pos.x > id_max.x or cache_data.pos.z > id_max.z:
|
|
|
|
|
continue
|
|
|
|
|
level_main.set_cell_item(cache_data.pos, cache_data.id, cache_data.orientation)
|
|
|
|
|
for cache_data in grid_main_cache_cells:
|
|
|
|
|
level_main.set_cell_item(cache_data.pos, GridMap.INVALID_CELL_ITEM)
|
|
|
|
|
for pos in mark_white_list:
|
|
|
|
|
@ -217,6 +277,10 @@ func get_level_active_spots() -> Array[LevelActiveSpot]:
|
|
|
|
|
return level_active_spots
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func get_grid_main_cache_cells() -> Array[GridMainCacheCellData]:
|
|
|
|
|
return grid_main_cache_cells
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func pos_min() -> Vector3:
|
|
|
|
|
return get_global_position()
|
|
|
|
|
|
|
|
|
|
|