完善客户端功能并同步差距文档

This commit is contained in:
shenlei
2026-09-03 18:40:01 +09:00
parent f93a172296
commit 13ccb8d02d
135 changed files with 21881 additions and 1259 deletions
+95
View File
@@ -0,0 +1,95 @@
# skybox_test —— 40250 ClientVS22 texture-mode SkyBox -> Godot sky shader。
# 验证真实 texture-mode SkyBoxCapeDragonHead 的五个非空面回退渐变,
# DawnMistWood 的六面天空与云层同时接入并保留参考 UV / 速度参数。
extends SceneTree
var _fail := 0
func _ck(ok: bool, message: String) -> void:
if not ok:
_fail += 1
printerr("FAIL: " + message)
func _make_world(map_path: String) -> Node:
var world: Node = ClassDB.instantiate("Metin2World")
world.set("auto_load", false)
world.set("assets_root", AssetRoot.path())
world.set("map_path", map_path)
world.set("focus_tile", Vector2i(0, 0))
world.set("load_radius_tiles", 0)
world.set("objects_enabled", false)
world.set("splat_enabled", false)
world.set("water_enabled", false)
get_root().add_child(world)
return world
func _init() -> void:
if not ClassDB.class_exists("Metin2World"):
printerr("FAIL: Metin2World extension is not registered")
quit(1)
return
var world := _make_world("metin2_patch_dragon_rock/metin2_map_capedragonhead")
_ck(bool(world.call("load_map")), "CapeDragonHead map loads")
var report: Dictionary = world.call("get_load_report")
_ck(bool(report.get("env_ok", false)), "texture-mode .msenv env_ok")
var env_node := world.get_node_or_null("WorldEnv") as WorldEnvironment
_ck(env_node != null and env_node.environment != null, "WorldEnv has Environment")
if env_node != null:
_ck(int(env_node.get_meta("msenv_sky_face_count", 0)) == 5,
"five non-empty SkyBox faces resolve")
_ck(bool(env_node.get_meta("msenv_sky_texture_mode_applied", false)),
"texture render mode uses six-face shader")
var sky := env_node.environment.sky
_ck(sky != null, "WorldEnv has sky")
if sky != null:
var mat := sky.get_material() as ShaderMaterial
_ck(mat != null, "texture-mode sky uses ShaderMaterial")
if mat != null:
_ck(mat.shader != null and mat.shader.code.find("shader_type sky;") >= 0,
"six-face sky shader is installed")
_ck(bool(mat.get_shader_parameter("has_front")), "front face is present")
_ck(bool(mat.get_shader_parameter("has_back")), "back face is present")
_ck(bool(mat.get_shader_parameter("has_left")), "left face is present")
_ck(bool(mat.get_shader_parameter("has_right")), "right face is present")
_ck(bool(mat.get_shader_parameter("has_top")), "top face is present")
_ck(not bool(mat.get_shader_parameter("has_bottom")),
"empty bottom face falls back to gradient")
world.queue_free()
await process_frame
var cloud_world := _make_world("metin2_patch_dragon_rock/metin2_map_dawnmistwood")
_ck(bool(cloud_world.call("load_map")), "DawnMistWood map loads")
var cloud_report: Dictionary = cloud_world.call("get_load_report")
_ck(bool(cloud_report.get("env_ok", false)), "texture-mode + cloud .msenv env_ok")
var cloud_env := cloud_world.get_node_or_null("WorldEnv") as WorldEnvironment
_ck(cloud_env != null and cloud_env.environment != null, "cloud WorldEnv has Environment")
if cloud_env != null:
_ck(int(cloud_env.get_meta("msenv_sky_face_count", 0)) == 5,
"cloud map five non-empty SkyBox faces resolve")
_ck(bool(cloud_env.get_meta("msenv_sky_texture_mode_applied", false)),
"texture render mode remains active when CloudTexture exists")
_ck(bool(cloud_env.get_meta("msenv_sky_cloud_applied", false)),
"cloud texture is attached to texture-mode sky shader")
var cloud_sky := cloud_env.environment.sky
var cloud_mat := cloud_sky.get_material() as ShaderMaterial if cloud_sky != null else null
_ck(cloud_mat != null, "cloud map uses ShaderMaterial")
if cloud_mat != null:
_ck(bool(cloud_mat.get_shader_parameter("has_cloud")),
"sky shader enables cloud plane")
_ck(cloud_mat.shader != null and cloud_mat.shader.code.find("TIME * cloud_speed") >= 0,
"cloud shader preserves reference UV scroll")
if cloud_mat != null:
var scale := cloud_mat.get_shader_parameter("cloud_scale") as Vector2
_ck(scale != null and is_equal_approx(scale.x, 2000.0) and is_equal_approx(scale.y, 2000.0),
"cloud scale converts reference centimetres to Godot metres")
var speed := cloud_mat.get_shader_parameter("cloud_speed") as Vector2
_ck(speed != null and is_equal_approx(speed.x, 0.001) and is_equal_approx(speed.y, 0.001),
"cloud speed preserves reference seconds parameter")
cloud_world.queue_free()
await process_frame
if _fail == 0:
print("PASS: skybox_test (.msenv six-face texture sky)")
quit(0)
else:
printerr("%d check(s) failed" % _fail)
quit(1)