地图设计

master
chendian 10 months ago
parent 29b456c805
commit 9237c8225f

@ -88,8 +88,6 @@ func short_cut_index_pressed(index: int):
print("[", item_id, "]", mesh_library.get_item_name(item_id), "::", material_name) print("[", item_id, "]", mesh_library.get_item_name(item_id), "::", material_name)
elif short_cut_path == "func_fix_mesh": elif short_cut_path == "func_fix_mesh":
var material_grid_block: Material = load("res://render/material/level_grid_block.tres") as Material var material_grid_block: Material = load("res://render/material/level_grid_block.tres") as Material
var material_grid_water: Material = load("res://render/material/level_grid_water.tres") as Material
var material_grass: Material = load("res://render/material/level_grass.tres") as Material
var dir_path: String = "res://resource/mesh_library" var dir_path: String = "res://resource/mesh_library"
var dir: DirAccess = DirAccess.open(dir_path) var dir: DirAccess = DirAccess.open(dir_path)
@ -104,10 +102,6 @@ func short_cut_index_pressed(index: int):
var mesh: Mesh = mesh_library.get_item_mesh(item_id) var mesh: Mesh = mesh_library.get_item_mesh(item_id)
var mesh_name: String = mesh_library.get_item_name(item_id) var mesh_name: String = mesh_library.get_item_name(item_id)
var material_set: Material = material_grid_block var material_set: Material = material_grid_block
if mesh_name.contains("water"):
material_set = material_grid_water
if mesh_name.contains("grass"):
material_set = material_grass
for surface_id: int in range(mesh.get_surface_count()): for surface_id: int in range(mesh.get_surface_count()):
if not mesh.surface_get_material(surface_id) == material_set: if not mesh.surface_get_material(surface_id) == material_set:
fix_count += 1 fix_count += 1

@ -0,0 +1,8 @@
[gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://c0dpl6wyx3b2d"]
[ext_resource type="Shader" uid="uid://4mnjdo06f0o7" path="res://render/shader/effect_debug.gdshader" id="1_n56k0"]
[resource]
render_priority = 0
shader = ExtResource("1_n56k0")
shader_parameter/is_hide = true

@ -1,7 +1,12 @@
shader_type spatial; shader_type spatial;
render_mode unshaded,wireframe; render_mode unshaded,wireframe;
uniform bool is_hide = false;
void fragment() { void fragment() {
if(is_hide){
discard;
}
ALBEDO = COLOR.rgb; ALBEDO = COLOR.rgb;
ALPHA = COLOR.a; ALPHA = COLOR.a;
} }

Binary file not shown.

@ -1,18 +0,0 @@
[remap]
importer="MagicaVoxel.With.Extensions.To.Mesh"
type="Mesh"
uid="uid://br8t5hqrax0gq"
path="res://.godot/imported/sub_grass.vox-02f4f01ca790a4bfefb33ce31c52d03a.mesh"
[deps]
source_file="res://resource/mesh_level/sub_grass.vox"
dest_files=["res://.godot/imported/sub_grass.vox-02f4f01ca790a4bfefb33ce31c52d03a.mesh"]
[params]
Scale=0.02
GreedyMeshGenerator=true
SnapToGround=false
FirstKeyframeOnly=true

Binary file not shown.

@ -1,18 +0,0 @@
[remap]
importer="MagicaVoxel.With.Extensions.To.Mesh"
type="Mesh"
uid="uid://ioh8eayxto03"
path="res://.godot/imported/sub_water.vox-15e65b0d001c8f576f5550056f968414.mesh"
[deps]
source_file="res://resource/mesh_level/sub_water.vox"
dest_files=["res://.godot/imported/sub_water.vox-15e65b0d001c8f576f5550056f968414.mesh"]
[params]
Scale=0.02
GreedyMeshGenerator=true
SnapToGround=false
FirstKeyframeOnly=true

File diff suppressed because one or more lines are too long

@ -0,0 +1,7 @@
[gd_scene load_steps=2 format=3 uid="uid://bowb22her54ay"]
[ext_resource type="PackedScene" uid="uid://bscaegmui5h5s" path="res://scene/level_active/grass_high.tscn" id="1_yhtq5"]
[node name="SceneActive" type="Node3D"]
[node name="GrassMesh" parent="." instance=ExtResource("1_yhtq5")]

@ -14,7 +14,7 @@ point_count = 3
[node name="OmniLight3D" type="OmniLight3D" parent="View/SoulLight" index="0"] [node name="OmniLight3D" type="OmniLight3D" parent="View/SoulLight" index="0"]
light_color = Color(0.768627, 1, 1, 1) light_color = Color(0.768627, 1, 1, 1)
light_energy = 0.1 light_energy = 0.05
omni_range = 2.0 omni_range = 2.0
[node name="Throw" parent="." index="10"] [node name="Throw" parent="." index="10"]

File diff suppressed because one or more lines are too long

@ -1,11 +1,7 @@
[gd_scene load_steps=4 format=3 uid="uid://tgf6koi2ojeg"] [gd_scene load_steps=3 format=3 uid="uid://tgf6koi2ojeg"]
[ext_resource type="Script" path="res://script/level/level_instance.gd" id="1_ohsal"] [ext_resource type="Script" uid="uid://l1s4qhbxinlu" path="res://script/level/level_instance.gd" id="1_ohsal"]
[ext_resource type="Shader" path="res://render/shader/effect_debug.gdshader" id="2_sqcq8"] [ext_resource type="Material" uid="uid://c0dpl6wyx3b2d" path="res://render/material/debug.tres" id="2_01ccf"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_i1ugl"]
render_priority = 0
shader = ExtResource("2_sqcq8")
[node name="LevelInstance" type="Node3D"] [node name="LevelInstance" type="Node3D"]
script = ExtResource("1_ohsal") script = ExtResource("1_ohsal")
@ -13,4 +9,4 @@ script = ExtResource("1_ohsal")
[node name="LevelRange" type="CSGBox3D" parent="."] [node name="LevelRange" type="CSGBox3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.4, 3.2, 3.2) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.4, 3.2, 3.2)
size = Vector3(12.8, 6.4, 6.4) size = Vector3(12.8, 6.4, 6.4)
material = SubResource("ShaderMaterial_i1ugl") material = ExtResource("2_01ccf")

@ -0,0 +1,19 @@
[gd_scene load_steps=5 format=3 uid="uid://bscaegmui5h5s"]
[ext_resource type="Material" uid="uid://nufv335woq2s" path="res://render/material/level_grass.tres" id="1_7v81s"]
[ext_resource type="ArrayMesh" uid="uid://ddvgn8mvwnjka" path="res://render/mesh/grass_triangle.obj" id="2_u7lt8"]
[ext_resource type="Script" uid="uid://bhpy71py00ss7" path="res://script/editor_tool/grass_mesh.gd" id="3_iww1o"]
[sub_resource type="MultiMesh" id="MultiMesh_i0fnp"]
transform_format = 1
instance_count = 40
mesh = ExtResource("2_u7lt8")
buffer = PackedFloat32Array(0.850267, 0, 0, -0.236901, 0, 0.850267, 0, 0, 0, 0, 0.850267, 0.011678, 0.885421, 0, 0, -0.28987, 0, 0.885421, 0, 0, 0, 0, 0.885421, -0.299164, 0.753295, 0, 0, -0.208137, 0, 0.753295, 0, 0, 0, 0, 0.753295, -0.104484, 0.763127, 0, 0, 0.293253, 0, 0.763127, 0, 0, 0, 0, 0.763127, -0.237958, 0.875643, 0, 0, -0.300975, 0, 0.875643, 0, 0, 0, 0, 0.875643, 0.174365, 0.812294, 0, 0, 0.279535, 0, 0.812294, 0, 0, 0, 0, 0.812294, -0.196263, 0.805134, 0, 0, 0.0703121, 0, 0.805134, 0, 0, 0, 0, 0.805134, -0.0421476, 0.762721, 0, 0, -0.0287569, 0, 0.762721, 0, 0, 0, 0, 0.762721, 0.122738, 0.787612, 0, 0, -0.0149276, 0, 0.787612, 0, 0, 0, 0, 0.787612, -0.228186, 0.812725, 0, 0, 0.129561, 0, 0.812725, 0, 0, 0, 0, 0.812725, 0.289499, 0.890968, 0, 0, -0.258548, 0, 0.890968, 0, 0, 0, 0, 0.890968, -0.0983578, 0.722272, 0, 0, -0.142265, 0, 0.722272, 0, 0, 0, 0, 0.722272, 0.00631809, 0.763407, 0, 0, 0.0242455, 0, 0.763407, 0, 0, 0, 0, 0.763407, -0.0644098, 0.798859, 0, 0, 0.0546614, 0, 0.798859, 0, 0, 0, 0, 0.798859, -0.179269, 0.844168, 0, 0, 0.309653, 0, 0.844168, 0, 0, 0, 0, 0.844168, -0.15087, 0.819652, 0, 0, -0.131903, 0, 0.819652, 0, 0, 0, 0, 0.819652, 0.238383, 0.738998, 0, 0, 0.0488455, 0, 0.738998, 0, 0, 0, 0, 0.738998, 0.0430205, 0.7594, 0, 0, 0.206912, 0, 0.7594, 0, 0, 0, 0, 0.7594, -0.281935, 0.781441, 0, 0, 0.183891, 0, 0.781441, 0, 0, 0, 0, 0.781441, -0.221743, 0.704245, 0, 0, 0.290893, 0, 0.704245, 0, 0, 0, 0, 0.704245, -0.137151, 0.807799, 0, 0, 0.239029, 0, 0.807799, 0, 0, 0, 0, 0.807799, -0.0187869, 0.826738, 0, 0, -0.0219874, 0, 0.826738, 0, 0, 0, 0, 0.826738, -0.278481, 0.809137, 0, 0, -0.00259447, 0, 0.809137, 0, 0, 0, 0, 0.809137, 0.0512622, 0.801655, 0, 0, 0.00857547, 0, 0.801655, 0, 0, 0, 0, 0.801655, 0.214294, 0.854602, 0, 0, 0.134782, 0, 0.854602, 0, 0, 0, 0, 0.854602, -0.0262177, 0.70378, 0, 0, -0.148668, 0, 0.70378, 0, 0, 0, 0, 0.70378, 0.148927, 0.856184, 0, 0, 0.235763, 0, 0.856184, 0, 0, 0, 0, 0.856184, 0.178996, 0.713512, 0, 0, -0.0637904, 0, 0.713512, 0, 0, 0, 0, 0.713512, 0.000412762, 0.722176, 0, 0, 0.00617713, 0, 0.722176, 0, 0, 0, 0, 0.722176, -0.193158, 0.775462, 0, 0, 0.0303999, 0, 0.775462, 0, 0, 0, 0, 0.775462, -0.0277684, 0.786996, 0, 0, 0.0209769, 0, 0.786996, 0, 0, 0, 0, 0.786996, -0.206117, 0.89983, 0, 0, 0.180177, 0, 0.89983, 0, 0, 0, 0, 0.89983, 0.286512, 0.802054, 0, 0, -0.0968045, 0, 0.802054, 0, 0, 0, 0, 0.802054, 0.15324, 0.737515, 0, 0, -0.127443, 0, 0.737515, 0, 0, 0, 0, 0.737515, -0.0427554, 0.809675, 0, 0, 0.275429, 0, 0.809675, 0, 0, 0, 0, 0.809675, -0.319483, 0.742134, 0, 0, 0.0211135, 0, 0.742134, 0, 0, 0, 0, 0.742134, 0.212784, 0.798657, 0, 0, 0.0671035, 0, 0.798657, 0, 0, 0, 0, 0.798657, 0.117133, 0.822658, 0, 0, -0.184188, 0, 0.822658, 0, 0, 0, 0, 0.822658, -0.158328, 0.834859, 0, 0, -0.055608, 0, 0.834859, 0, 0, 0, 0, 0.834859, -0.0925495, 0.846971, 0, 0, 0.0535535, 0, 0.846971, 0, 0, 0, 0, 0.846971, 0.24802)
[node name="GrassMesh" type="MultiMeshInstance3D"]
material_override = ExtResource("1_7v81s")
cast_shadow = 2
multimesh = SubResource("MultiMesh_i0fnp")
script = ExtResource("3_iww1o")
extents = Vector2(0.32, 0.32)
scale_basic = 0.8

@ -0,0 +1,18 @@
[gd_scene load_steps=5 format=3 uid="uid://cugqj3mjnb3k8"]
[ext_resource type="Material" uid="uid://nufv335woq2s" path="res://render/material/level_grass.tres" id="1_mi2yd"]
[ext_resource type="ArrayMesh" uid="uid://ddvgn8mvwnjka" path="res://render/mesh/grass_triangle.obj" id="2_mqml2"]
[ext_resource type="Script" uid="uid://bhpy71py00ss7" path="res://script/editor_tool/grass_mesh.gd" id="3_sbbi8"]
[sub_resource type="MultiMesh" id="MultiMesh_i0fnp"]
transform_format = 1
instance_count = 60
mesh = ExtResource("2_mqml2")
buffer = PackedFloat32Array(0.422679, 0, 0, -0.31932, 0, 0.422679, 0, 0, 0, 0, 0.422679, 0.222035, 0.565589, 0, 0, -0.163921, 0, 0.565589, 0, 0, 0, 0, 0.565589, 0.166128, 0.557743, 0, 0, 0.231122, 0, 0.557743, 0, 0, 0, 0, 0.557743, 0.157646, 0.436782, 0, 0, -0.108736, 0, 0.436782, 0, 0, 0, 0, 0.436782, -0.213432, 0.472302, 0, 0, -0.0302663, 0, 0.472302, 0, 0, 0, 0, 0.472302, -0.101251, 0.459377, 0, 0, -0.0367711, 0, 0.459377, 0, 0, 0, 0, 0.459377, -0.0663798, 0.41596, 0, 0, 0.143099, 0, 0.41596, 0, 0, 0, 0, 0.41596, 0.309669, 0.462596, 0, 0, 0.122331, 0, 0.462596, 0, 0, 0, 0, 0.462596, 0.236068, 0.588548, 0, 0, -0.0276043, 0, 0.588548, 0, 0, 0, 0, 0.588548, 0.0835775, 0.592027, 0, 0, 0.0622364, 0, 0.592027, 0, 0, 0, 0, 0.592027, 0.240621, 0.482222, 0, 0, -0.0598195, 0, 0.482222, 0, 0, 0, 0, 0.482222, -0.185888, 0.508889, 0, 0, -0.31975, 0, 0.508889, 0, 0, 0, 0, 0.508889, -0.0251259, 0.57917, 0, 0, 0.116746, 0, 0.57917, 0, 0, 0, 0, 0.57917, 0.207793, 0.476953, 0, 0, -0.0256726, 0, 0.476953, 0, 0, 0, 0, 0.476953, 0.313863, 0.552328, 0, 0, -0.140257, 0, 0.552328, 0, 0, 0, 0, 0.552328, 0.131966, 0.534333, 0, 0, -0.309444, 0, 0.534333, 0, 0, 0, 0, 0.534333, -0.080676, 0.480466, 0, 0, 0.143088, 0, 0.480466, 0, 0, 0, 0, 0.480466, -0.0384474, 0.595769, 0, 0, -0.0051313, 0, 0.595769, 0, 0, 0, 0, 0.595769, 0.173477, 0.471711, 0, 0, -0.0842564, 0, 0.471711, 0, 0, 0, 0, 0.471711, -0.149921, 0.493693, 0, 0, 0.0253143, 0, 0.493693, 0, 0, 0, 0, 0.493693, 0.163388, 0.524832, 0, 0, 0.119908, 0, 0.524832, 0, 0, 0, 0, 0.524832, 0.00929523, 0.517474, 0, 0, 0.229999, 0, 0.517474, 0, 0, 0, 0, 0.517474, 0.0641421, 0.43585, 0, 0, 0.252399, 0, 0.43585, 0, 0, 0, 0, 0.43585, -0.291608, 0.408826, 0, 0, 0.209503, 0, 0.408826, 0, 0, 0, 0, 0.408826, -0.267097, 0.474232, 0, 0, 0.187525, 0, 0.474232, 0, 0, 0, 0, 0.474232, -0.192769, 0.415695, 0, 0, -0.22959, 0, 0.415695, 0, 0, 0, 0, 0.415695, 0.317299, 0.459235, 0, 0, 0.133561, 0, 0.459235, 0, 0, 0, 0, 0.459235, -0.105574, 0.515192, 0, 0, 0.261943, 0, 0.515192, 0, 0, 0, 0, 0.515192, 0.216434, 0.550368, 0, 0, 0.127448, 0, 0.550368, 0, 0, 0, 0, 0.550368, 0.0934071, 0.57073, 0, 0, 0.0705428, 0, 0.57073, 0, 0, 0, 0, 0.57073, -0.064085, 0.542206, 0, 0, -0.080071, 0, 0.542206, 0, 0, 0, 0, 0.542206, -0.24098, 0.599446, 0, 0, 0.229488, 0, 0.599446, 0, 0, 0, 0, 0.599446, 0.230828, 0.562075, 0, 0, -0.121035, 0, 0.562075, 0, 0, 0, 0, 0.562075, 0.205745, 0.477919, 0, 0, 0.0221415, 0, 0.477919, 0, 0, 0, 0, 0.477919, -0.136622, 0.408849, 0, 0, 0.235256, 0, 0.408849, 0, 0, 0, 0, 0.408849, 0.200507, 0.577776, 0, 0, -0.316105, 0, 0.577776, 0, 0, 0, 0, 0.577776, 0.109228, 0.489896, 0, 0, 0.039913, 0, 0.489896, 0, 0, 0, 0, 0.489896, 0.266593, 0.55952, 0, 0, -0.251103, 0, 0.55952, 0, 0, 0, 0, 0.55952, -0.237683, 0.424979, 0, 0, -0.0163222, 0, 0.424979, 0, 0, 0, 0, 0.424979, -0.135474, 0.544441, 0, 0, -0.114926, 0, 0.544441, 0, 0, 0, 0, 0.544441, -0.125013, 0.441275, 0, 0, 0.276719, 0, 0.441275, 0, 0, 0, 0, 0.441275, -0.0566853, 0.441208, 0, 0, 0.284965, 0, 0.441208, 0, 0, 0, 0, 0.441208, -0.170354, 0.545374, 0, 0, 0.22708, 0, 0.545374, 0, 0, 0, 0, 0.545374, -0.0750098, 0.483538, 0, 0, 0.166933, 0, 0.483538, 0, 0, 0, 0, 0.483538, -0.0592494, 0.501156, 0, 0, 0.0648109, 0, 0.501156, 0, 0, 0, 0, 0.501156, 0.310273, 0.416906, 0, 0, -0.101839, 0, 0.416906, 0, 0, 0, 0, 0.416906, 0.114669, 0.580051, 0, 0, -0.0869363, 0, 0.580051, 0, 0, 0, 0, 0.580051, 0.0148138, 0.486025, 0, 0, -0.0506034, 0, 0.486025, 0, 0, 0, 0, 0.486025, -0.111222, 0.561763, 0, 0, -0.132322, 0, 0.561763, 0, 0, 0, 0, 0.561763, -0.279143, 0.588378, 0, 0, -0.156966, 0, 0.588378, 0, 0, 0, 0, 0.588378, 0.264466, 0.587942, 0, 0, 0.00191143, 0, 0.587942, 0, 0, 0, 0, 0.587942, -0.271856, 0.422839, 0, 0, -0.180986, 0, 0.422839, 0, 0, 0, 0, 0.422839, -0.257386, 0.583304, 0, 0, 0.166498, 0, 0.583304, 0, 0, 0, 0, 0.583304, 0.299894, 0.469133, 0, 0, -0.0869951, 0, 0.469133, 0, 0, 0, 0, 0.469133, 0.258686, 0.501141, 0, 0, -0.0690251, 0, 0.501141, 0, 0, 0, 0, 0.501141, 0.211844, 0.445388, 0, 0, 0.0627016, 0, 0.445388, 0, 0, 0, 0, 0.445388, 0.196344, 0.505713, 0, 0, 0.267159, 0, 0.505713, 0, 0, 0, 0, 0.505713, -0.315608, 0.561086, 0, 0, 0.231257, 0, 0.561086, 0, 0, 0, 0, 0.561086, -0.190699, 0.544177, 0, 0, 0.169978, 0, 0.544177, 0, 0, 0, 0, 0.544177, 0.167157, 0.487531, 0, 0, -0.274127, 0, 0.487531, 0, 0, 0, 0, 0.487531, 0.245489)
[node name="GrassMesh" type="MultiMeshInstance3D"]
material_override = ExtResource("1_mi2yd")
multimesh = SubResource("MultiMesh_i0fnp")
script = ExtResource("3_sbbi8")
extents = Vector2(0.32, 0.32)
scale_basic = 0.5

@ -0,0 +1,18 @@
[gd_scene load_steps=5 format=3 uid="uid://bjqr42b8i5aqe"]
[ext_resource type="Material" uid="uid://nufv335woq2s" path="res://render/material/level_grass.tres" id="1_l4t4d"]
[ext_resource type="ArrayMesh" uid="uid://ddvgn8mvwnjka" path="res://render/mesh/grass_triangle.obj" id="2_7id7u"]
[ext_resource type="Script" uid="uid://bhpy71py00ss7" path="res://script/editor_tool/grass_mesh.gd" id="3_4bfc1"]
[sub_resource type="MultiMesh" id="MultiMesh_i0fnp"]
transform_format = 1
instance_count = 20
mesh = ExtResource("2_7id7u")
buffer = PackedFloat32Array(0.447556, 0, 0, 0.214988, 0, 0.447556, 0, 0, 0, 0, 0.447556, -0.179775, 0.402864, 0, 0, 0.00355405, 0, 0.402864, 0, 0, 0, 0, 0.402864, 0.153977, 0.466052, 0, 0, -0.0347098, 0, 0.466052, 0, 0, 0, 0, 0.466052, -0.0682281, 0.377455, 0, 0, -0.0436905, 0, 0.377455, 0, 0, 0, 0, 0.377455, -0.312027, 0.388893, 0, 0, 0.0321143, 0, 0.388893, 0, 0, 0, 0, 0.388893, 0.316336, 0.433887, 0, 0, 0.00524941, 0, 0.433887, 0, 0, 0, 0, 0.433887, -0.0804169, 0.423926, 0, 0, 0.177719, 0, 0.423926, 0, 0, 0, 0, 0.423926, -0.0279486, 0.386352, 0, 0, 0.24718, 0, 0.386352, 0, 0, 0, 0, 0.386352, 0.217906, 0.372492, 0, 0, 0.10613, 0, 0.372492, 0, 0, 0, 0, 0.372492, -0.129829, 0.482979, 0, 0, 0.215392, 0, 0.482979, 0, 0, 0, 0, 0.482979, -0.301264, 0.403461, 0, 0, -0.304334, 0, 0.403461, 0, 0, 0, 0, 0.403461, 0.28521, 0.305712, 0, 0, 0.133187, 0, 0.305712, 0, 0, 0, 0, 0.305712, 0.237432, 0.467374, 0, 0, 0.242138, 0, 0.467374, 0, 0, 0, 0, 0.467374, 0.276226, 0.340186, 0, 0, 0.196599, 0, 0.340186, 0, 0, 0, 0, 0.340186, -0.0352196, 0.359262, 0, 0, -0.286212, 0, 0.359262, 0, 0, 0, 0, 0.359262, -0.290231, 0.428309, 0, 0, -0.296598, 0, 0.428309, 0, 0, 0, 0, 0.428309, -0.132031, 0.307916, 0, 0, 0.135875, 0, 0.307916, 0, 0, 0, 0, 0.307916, -0.0619626, 0.331092, 0, 0, -0.0777463, 0, 0.331092, 0, 0, 0, 0, 0.331092, 0.202209, 0.342283, 0, 0, -0.187628, 0, 0.342283, 0, 0, 0, 0, 0.342283, -0.000626862, 0.454191, 0, 0, 0.311841, 0, 0.454191, 0, 0, 0, 0, 0.454191, 0.106484)
[node name="GrassMesh" type="MultiMeshInstance3D"]
material_override = ExtResource("1_l4t4d")
multimesh = SubResource("MultiMesh_i0fnp")
script = ExtResource("3_4bfc1")
extents = Vector2(0.32, 0.32)
scale_basic = 0.4

@ -136,8 +136,6 @@ func refresh_mesh_library(path_list: Array, from_editor_tool: bool = false):
var mesh_library_chara_id_list: Array[int] = [] var mesh_library_chara_id_list: Array[int] = []
var material_grid_block: Material = load("res://render/material/level_grid_block.tres") as Material var material_grid_block: Material = load("res://render/material/level_grid_block.tres") as Material
var material_grid_water: Material = load("res://render/material/level_grid_water.tres") as Material
var material_grass: Material = load("res://render/material/level_grass.tres") as Material
var reimport_files: Array[String] = [] var reimport_files: Array[String] = []
for file_name_full in path_list: for file_name_full in path_list:
@ -174,10 +172,6 @@ func refresh_mesh_library(path_list: Array, from_editor_tool: bool = false):
if has_material: if has_material:
var material_set: Material = material_grid_block var material_set: Material = material_grid_block
if mesh_name.contains("water"):
material_set = material_grid_water
if mesh_name.contains("grass"):
material_set = material_grass
if from_editor_tool: if from_editor_tool:
reimport_files.append(file_name_full) reimport_files.append(file_name_full)
else: else:

@ -7,12 +7,10 @@ func on_init() -> void:
original_position_y = position.y original_position_y = position.y
func on_set_open(is_open_set: bool) -> void: func on_set_open(is_open_set: bool) -> void:
print("[on_set_open]", is_open_set) pass
func on_process_open(rate: float) -> void: func on_process_open(rate: float) -> void:
print("LevelActivePlatLift on_process_open", rate)
var offset_y = rate * 2.56 var offset_y = rate * 2.56
position.y = original_position_y + offset_y position.y = original_position_y + offset_y
print(original_position_y)
for character in character_list: for character in character_list:
character.emit_pos_changed() character.emit_pos_changed()

@ -5,10 +5,12 @@ class_name LevelInstance
@export_tool_button("视野锁定", "Callable") @export_tool_button("视野锁定", "Callable")
var view_focus_on: Callable = func() -> void: var view_focus_on: Callable = func() -> void:
grid_block_material.set_shader_parameter("is_focus", true) grid_block_material.set_shader_parameter("is_focus", true)
debug_material.set_shader_parameter("is_hide", true)
set_focus_editor() set_focus_editor()
@export_tool_button("视野解锁", "Callable") @export_tool_button("视野解锁", "Callable")
var view_focus_off: Callable = func() -> void: var view_focus_off: Callable = func() -> void:
grid_block_material.set_shader_parameter("is_focus", false) grid_block_material.set_shader_parameter("is_focus", false)
debug_material.set_shader_parameter("is_hide", false)
set_focus() set_focus()
@export var size: Vector3i = Vector3i.ONE: @export var size: Vector3i = Vector3i.ONE:
@ -85,6 +87,7 @@ var print_item: Callable = func() -> void:
@onready var grid_block_material: Material = load("res://render/material/level_grid_block.tres") as Material @onready var grid_block_material: Material = load("res://render/material/level_grid_block.tres") as Material
@onready var debug_material: Material = load("res://render/material/debug.tres") as Material
#character #character
var level_area_cfg: LevelAreaCfg var level_area_cfg: LevelAreaCfg

@ -17,10 +17,7 @@ func _process(_delta: float) -> void:
return return
refresh_debug_info("硬直等级", str(player.get_status("break_level"))) refresh_debug_info("硬直等级", str(player.get_status("break_level")))
refresh_debug_info("姿态", str(player.get_status("stance"))) refresh_debug_info("姿态", str(player.get_status("stance")))
refresh_debug_info("位置", str(player.pos())) refresh_debug_info("位置", Global.level_mgr.get_cur_level_name() + str(Util.get_level_grid_pos2(player.pos())))
refresh_debug_info("关卡", Global.level_mgr.get_cur_level_name())
refresh_debug_info("关卡坐标", str(Util.get_level_grid_pos2(player.pos())))
refresh_debug_info("关卡浮点坐标", str(Util.get_level_float_pos2(Util.get_level_grid_pos2(player.pos()))))
func refresh_debug_info(label_value: String, value: String) -> void: func refresh_debug_info(label_value: String, value: String) -> void:

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

@ -0,0 +1,96 @@
import json
from igraph import Graph, plot
with open('data.json', 'r', encoding='utf-8') as file:
data = json.load(file)
g = Graph(directed=True)
vertices_num = len(data)
bbox =(2048, 2048)
node_labels_raw = [] #原始节点名
node_labels = [] #节点名
node_pos = [] #节点坐标
node_color = [] #节点颜色
node_label_color = [] #节点字体颜色
node_size = [] #节点大小
node_width = [] #节点宽度
node_height = [] #节点高度
edge_labels = []
edge_label_colors = []
edge_arrow_size = []
edges = []
for node_name in data:
#区域
node_info = data[node_name]
node_labels_raw.append(node_name)
is_battle = node_name.startswith('战斗-')
node_labels.append(node_name[3:] if is_battle else node_name)
node_pos.append(node_info['pos'])
node_color.append('red' if is_battle else 'gray')
node_label_color.append('black' if is_battle else 'black')
node_size.append(60 if is_battle else 80)
node_width.append(60 if is_battle else 80)
node_height.append(60 if is_battle else 80)
#key_get
if not 'key_get' in node_info:
continue
key_get = node_info['key_get']
if len(key_get) == 0:
continue
vertices_num += len(key_get)
for i in range(len(key_get)):
node_labels_raw.append(key_get[i])
node_labels.append(key_get[i])
node_pos.append((node_info['pos'][0],node_info['pos'][1]+0.1*(i+1)))
node_color.append('white')
node_label_color.append('blue')
node_size.append(0)
node_width.append(50)
node_height.append(20)
for node_name in data:
node_info = data[node_name]
for path_to in node_info['path_to']:
edges.append((node_labels_raw.index(node_name), node_labels_raw.index(path_to['name'])))
key_need = ''
key_need_color = 'red'
if 'key_need' in path_to:
key_need = path_to['key_need']
if key_need.startswith('战斗-'):
key_need = key_need[3:]
key_need_color = 'red'
elif key_need.startswith('单向门'):
key_need = '单向门'
key_need_color = "purple"
elif key_need.startswith('任务-'):
key_need = key_need[3:]
key_need_color = 'green'
else:
key_need = key_need
key_need_color = 'blue'
edge_labels.append(key_need)
edge_label_colors.append(key_need_color)
edge_arrow_size.append(1 if 'is_one_way' in path_to else 0.001)
g.add_vertices(vertices_num)
g.add_edges(edges)
g.vs["label"] = node_labels
g.vs["size"] = node_size
g.vs["width"] = node_width
g.vs["height"] = node_height
g.vs["label_color"] = node_label_color
g.vs["color"] = node_color
g.vs["shape"] = ["rectangle"] * len(data)
g.vs["font"] = ["SimHei"] * len(data)
g.es["label"] = edge_labels
g.es["label_color"] = edge_label_colors
g.es["font"] = ["SimHei"] * len(edge_labels)
g.es["arrow_size"] = edge_arrow_size
p = plot(g, layout=node_pos, bbox=bbox, margin=100, target="output_graph.png")

@ -0,0 +1,162 @@
import json
from igraph import Graph, plot
with open('data.json', 'r', encoding='utf-8') as file:
data_raw = json.load(file)
data = json.loads(json.dumps(data_raw))
#数据补充
for node_name in data_raw:
node_info_raw = data_raw[node_name]
node_info = data[node_name]
for path_to in node_info_raw['path_to']:
is_key_need = 'key_need' in path_to
key_need = path_to['key_need'] if is_key_need else ''
is_one_way_door = key_need == '单向门'
is_one_way = not is_one_way_door and 'is_one_way' in path_to
if is_one_way_door:
if not 'key_get' in node_info:
node_info['key_get'] = []
is_key_need = True
key_need = f'单向门-{node_name}-{path_to['name']}'
node_info['key_get'].append(key_need)
node_info['path_to']
if not is_one_way:
target_node_info = data[path_to['name']]
append_path = {'name':node_name}
if is_key_need:
append_path['key_need'] = key_need
target_node_info['path_to'].append(append_path)
#多余数据删除
for node_name in data:
node_info = data[node_name]
for path_to in node_info['path_to']:
is_key_need = 'key_need' in path_to
key_need = path_to['key_need'] if is_key_need else ''
is_one_way_door = key_need == '单向门'
is_one_way = not is_one_way_door and 'is_one_way' in path_to
if is_one_way_door:
key_need = f'单向门-{node_name}-{path_to['name']}'
path_to['key_need'] = key_need
path_to.pop('is_one_way', None)
#BFS
start_node_name = '破碎遗迹'
end_node_name = '战斗-魂魄妖忌'
start_node = (start_node_name,set(),set(),[start_node_name],'') #namekey_get, key_usepathportal
stack = [start_node]
close_set = set()
useless_node_list = []
useless_key_list = []
while True:
if len(stack)==0:
break
current = stack.pop(0)
current_name = current[0]
current_key_get = current[1]
current_key_use = current[2]
current_path = current[3]
current_portal = current[4]
if current_name == '白玉楼' and current_portal == '':
current_portal = current_name
if current_name == end_node_name:
useless_node = []
useless_key = []
for node_name in data:
if not node_name in current_path:
useless_node.append(node_name)
if 'key_get' in data[node_name]:
for key_get in data[node_name]['key_get']:
if not key_get in current_key_use:
useless_key.append(key_get)
useless_node_list.append(useless_node)
useless_key_list.append(useless_key)
continue
if 'key_get' in data[current_name]:
for key_get in data[current_name]['key_get']:
if not key_get in current_key_get:
current_key_get.add(key_get)
current_path.append(f'获取({key_get})')
for path_to in data[current_name]['path_to']:
is_key_need = 'key_need' in path_to
if is_key_need and not path_to['key_need'] in current_key_get:
continue
next_name = path_to['name']
current_key_list = list(current_key_get)
current_key_list.sort()
next_name_with_key = next_name + ':' + ','.join(current_key_list)
if next_name_with_key in close_set:
continue
close_set.add(next_name_with_key)
next_path = current_path.copy()
next_path.append(next_name)
next_key_use = current_key_use.copy()
if is_key_need and path_to['key_need'] in current_key_get:
next_key_use.add(path_to['key_need'])
next_node = (next_name, current_key_get.copy(), next_key_use, next_path, current_portal)
stack.insert(-1,next_node)
#传送
if current_name == '白玉楼' and not current_portal == '':
next_name = current_portal
current_key_list = list(current_key_get)
current_key_list.sort()
next_name_with_key = next_name + ':' + ','.join(current_key_list)
if next_name_with_key in close_set:
continue
close_set.add(next_name_with_key)
next_path = current_path.copy()
next_path.append(f'传送({next_name})')
next_node = (next_name, current_key_get.copy(), current_key_use.copy(), next_path, current_portal)
stack.insert(-1,next_node)
if not current_name == '白玉楼' and not current_portal == '':
next_name = '白玉楼'
current_key_list = list(current_key_get)
current_key_list.sort()
next_name_with_key = next_name + ':' + ','.join(current_key_list)
if next_name_with_key in close_set:
continue
close_set.add(next_name_with_key)
next_path = current_path.copy()
next_path.append(f'传送({next_name})')
next_node = (next_name, current_key_get.copy(), current_key_use.copy(), next_path, current_name)
stack.insert(-1,next_node)
success_count = len(useless_node_list)
key_set = set()
useless_node_dict = {}
useless_key_dict = {}
for node_name in data:
useless_node_dict[node_name] = 0
if 'key_get' in data[node_name]:
for key_get in data[node_name]['key_get']:
if not key_get in key_set:
key_set.add(key_get)
useless_key_dict[key_get] = 0
node_max = len(data)
key_max = len(key_set)
for useless_node in useless_node_list:
for key in useless_node:
useless_node_dict[key] += 1
for useless_key in useless_key_list:
for key in useless_key:
useless_key_dict[key] += 1
useless_node_count_sum = sum(map(lambda x: len(x), useless_node_list))
print('success_count:', success_count)
print('useless_node_avg:', "{:.2f}%".format(useless_node_count_sum / success_count / node_max * 100))
for useless_node in useless_node_dict:
print("{} {:.2f}%".format(useless_node,useless_node_dict[useless_node] / success_count * 100))
print("-"*20)
for useless_key in useless_key_dict:
print("{} {:.2f}%".format(useless_key,useless_key_dict[useless_key] / success_count * 100))

@ -0,0 +1,749 @@
{
"破碎遗迹": {
"pos": [
5,
4
],
"path_to": [
{
"name": "战斗-黑色剑士"
}
]
},
"破碎遗迹下": {
"pos": [
5,
5
],
"path_to": [
{
"name": "破碎遗迹",
"key_need": "单向门",
"is_one_way": true
},
{
"name": "冥界洞穴右"
},
{
"name": "深暗遗迹上",
"key_need": "振翅"
}
]
},
"战斗-黑色剑士": {
"pos": [
5,
3.5
],
"path_to": [
{
"name": "白玉楼左"
}
]
},
"白玉楼": {
"pos": [
6,
3
],
"key_get": [
"下砸"
],
"path_to": [
{
"name": "峡谷上层",
"key_need": "单向门",
"is_one_way": true
}
]
},
"白玉楼左": {
"pos": [
5,
3
],
"path_to": [
{
"name": "冥界森林",
"key_need": "下砸"
},
{
"name": "冥界森林上",
"key_need": "大冲"
},
{
"name": "白玉楼"
}
]
},
"幽冥结界": {
"pos": [
6,
2
],
"path_to": [
{
"name": "白玉楼"
}
]
},
"峡谷上层": {
"pos": [
7,
3
],
"path_to": [
{
"name": "彼岸"
},
{
"name": "峡谷中层",
"key_need": "缓落",
"is_one_way": true
}
]
},
"峡谷中层": {
"pos": [
7,
4
],
"path_to": [
{
"name": "地狱上层"
},
{
"name": "峡谷下层",
"key_need": "缓落",
"is_one_way": true
}
]
},
"峡谷下层": {
"pos": [
7,
5
],
"path_to": [
{
"name": "战斗-火焰猫燐"
}
]
},
"战斗-火焰猫燐": {
"pos": [
7.5,
5
],
"key_get": [
"火焰"
],
"path_to": [
{
"name": "地狱深道"
}
]
},
"冥界森林": {
"pos": [
4,
3
],
"path_to": [
{
"name": "冥界洞穴左"
},
{
"name": "冥界森林上",
"key_need": "火焰"
}
]
},
"冥界森林上": {
"pos": [
4,
2
],
"path_to": [
{
"name": "战斗-琪露诺"
}
]
},
"战斗-琪露诺": {
"pos": [
4,
1.5
],
"key_get": [
"冰冻"
],
"path_to": []
},
"冥界洞穴左": {
"pos": [
4,
5
],
"path_to": [
{
"name": "堕落神殿",
"key_need": "缓落"
},
{
"name": "破碎遗迹下"
}
]
},
"冥界洞穴右": {
"pos": [
6,
4
],
"path_to": [
{
"name": "峡谷中层"
},
{
"name": "白玉楼",
"key_need": "单向门",
"is_one_way": true
}
]
},
"深暗遗迹上": {
"pos": [
6,
5
],
"path_to": [
{
"name": "冥界洞穴右"
},
{
"name": "峡谷下层"
},
{
"name": "战斗-村纱水蜜"
}
]
},
"战斗-村纱水蜜": {
"pos": [
6,
5.5
],
"path_to": [
{
"name": "深暗遗迹下"
}
]
},
"深暗遗迹下": {
"pos": [
6,
7
],
"path_to": [
{
"name": "堕落神殿"
},
{
"name": "静寂神殿",
"key_need": "夜视"
}
]
},
"堕落神殿": {
"pos": [
4,
7
],
"path_to": [
{
"name": "堕落神殿下",
"key_need": "激光"
}
]
},
"堕落神殿下": {
"pos": [
4,
8
],
"path_to": [
{
"name": "战斗-摩多罗",
"key_need": "冰冻"
}
]
},
"战斗-摩多罗": {
"pos": [
4,
8.5
],
"key_get": [
"祝福"
],
"path_to": []
},
"静寂神殿": {
"pos": [
7,
7
],
"path_to": [
{
"name": "静寂神殿下",
"key_need": "缓落",
"is_one_way": true
}
]
},
"静寂神殿下": {
"pos": [
7,
8
],
"path_to": [
{
"name": "战斗-饕餮尤魔",
"key_need": "大冲"
},
{
"name": "堕落神殿下",
"key_need": "单向门",
"is_one_way": true
}
]
},
"战斗-饕餮尤魔": {
"pos": [
9.5,
8
],
"path_to": [
{
"name": "血池地狱"
}
]
},
"彼岸": {
"pos": [
8,
3
],
"path_to": [
{
"name": "山脚",
"key_need": "大冲"
},
{
"name": "战斗-小鸡"
}
]
},
"战斗-小鸡": {
"pos": [
8,
3.5
],
"key_get": [
"振翅"
],
"path_to": [
{
"name": "地狱上层"
}
]
},
"山脚": {
"pos": [
12,
3
],
"path_to": [
{
"name": "战斗-文文"
},
{
"name": "间歇泉"
}
]
},
"战斗-文文": {
"pos": [
12,
2.5
],
"path_to": [
{
"name": "山顶"
}
]
},
"间歇泉": {
"pos": [
13,
3
],
"path_to": [
{
"name": "电梯上层",
"key_need": "缓落",
"is_one_way": true
}
]
},
"山顶": {
"pos": [
12,
2
],
"path_to": [
{
"name": "神社",
"key_need": "大冲"
},
{
"name": "幽冥结界",
"key_need": "单向门",
"is_one_way": true
},
{
"name": "战斗-早苗"
}
]
},
"战斗-早苗": {
"pos": [
12,
1.5
],
"key_get": [
"大冲"
],
"path_to": []
},
"神社": {
"pos": [
13,
2
],
"key_get": [
"缓落"
],
"path_to": [
{
"name": "间歇泉",
"key_need": "缓落",
"is_one_way": true
},
{
"name": "战斗-青蛙",
"key_need": "激光"
}
]
},
"战斗-青蛙": {
"pos": [
13,
1.5
],
"key_get": [
"祝福"
],
"path_to": []
},
"幻想风穴": {
"pos": [
12,
4
],
"path_to": [
{
"name": "地狱深道",
"key_need": "夜视"
},
{
"name": "矿坑上层",
"key_need": "缓落",
"is_one_way": true
},
{
"name": "战斗-土蜘蛛"
}
]
},
"战斗-土蜘蛛": {
"pos": [
12,
3.5
],
"key_get": [
"夜视"
],
"path_to": [
{
"name": "山脚"
}
]
},
"矿坑上层": {
"pos": [
12,
5
],
"path_to": [
{
"name": "矿坑下层",
"key_need": "缓落",
"is_one_way": true
}
]
},
"矿坑下层": {
"pos": [
12,
7
],
"path_to": [
{
"name": "旧都下城",
"key_need": "激光"
}
]
},
"电梯上层": {
"pos": [
13,
4
],
"path_to": [
{
"name": "电梯中层"
},
{
"name": "幻想风穴",
"key_need": "单向门",
"is_one_way": true
}
]
},
"电梯中层": {
"pos": [
13,
5
],
"path_to": [
{
"name": "电梯下层",
"key_need": "通行证"
},
{
"name": "矿坑上层"
}
]
},
"电梯下层": {
"pos": [
13,
7
],
"path_to": [
{
"name": "反应炉"
},
{
"name": "矿坑下层",
"key_need": "单向门",
"is_one_way": true
}
]
},
"反应炉": {
"pos": [
13,
8
],
"path_to": [
{
"name": "血池地狱",
"key_need": "单向门",
"is_one_way": true
},
{
"name": "战斗-空"
}
]
},
"战斗-空": {
"pos": [
13,
8.5
],
"key_get": [
"激光"
],
"path_to": []
},
"地狱上层": {
"pos": [
8,
4
],
"path_to": [
{
"name": "地狱下层"
},
{
"name": "幻想风穴",
"key_need": "振翅"
}
]
},
"地狱下层": {
"pos": [
8,
5
],
"path_to": []
},
"地狱深道": {
"pos": [
9,
5
],
"key_get": [
"通行证"
],
"path_to": [
{
"name": "旧都入口",
"key_need": "冰冻"
},
{
"name": "矿坑上层",
"key_need": "夜视"
}
]
},
"旧都入口": {
"pos": [
9,
6
],
"path_to": [
{
"name": "旧都"
}
]
},
"旧都": {
"pos": [
10,
6
],
"path_to": [
{
"name": "地灵殿",
"key_need": "锁链"
},
{
"name": "旧都下城"
},
{
"name": "战斗-萃香"
}
]
},
"战斗-萃香": {
"pos": [
10,
5.5
],
"key_get": [
"锁链"
],
"path_to": []
},
"地灵殿": {
"pos": [
11,
6
],
"path_to": [
{
"name": "战斗-古明地恋"
}
]
},
"战斗-古明地恋": {
"pos": [
11.5,
6
],
"key_get": [
"无意识"
],
"path_to": []
},
"旧都下城": {
"pos": [
10,
7
],
"path_to": [
{
"name": "战斗-勇仪"
},
{
"name": "血池地狱",
"key_need": "无意识"
}
]
},
"战斗-勇仪": {
"pos": [
9.5,
7
],
"path_to": [
{
"name": "静寂神殿",
"key_need": "冰冻"
}
]
},
"血池地狱": {
"pos": [
10,
8
],
"path_to": [
{
"name": "要石"
}
]
},
"要石": {
"pos": [
10,
9
],
"path_to": [
{
"name": "战斗-魂魄妖忌",
"key_need": "祝福"
}
]
},
"战斗-魂魄妖忌": {
"pos": [
10,
9.5
],
"path_to": []
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Loading…
Cancel
Save