- 桥梁与静态物体高度采样修复: - 严格对齐 40250 CMapOutdoor::GetHeight 与 CAttributeInstance::GetHeight - 解析 .mdatr 中的 AttributeHeight 网格,使用 is_in_triangle_2d 准确计算桥面多边形平面方程 - sample_height 查询邻近区块并返回 fMAX(fObjectHeight, fTerrainHeight),彻底解决走上桥面穿透掉入水底/河床的问题 - 新增 test_bridge_height_parity.gd 自动化对拍测试 - 40250 怪物击杀经验动效: - 1:1 实现 FLY_EXP(0) / FLY_HP / FLY_SP 粒子轨迹与爆炸吸附 - 40250 客户端全系统功能对齐(Batches 1-31): - 包含公会、交易、骑乘、变身、钓鱼、采矿、商城、信件、结婚、地牢等 134 套对拍系统与自动化回归测试 - 文档沉淀: - 新增 docs/CLIENT-PARITY-AUDIT-AND-FIX-GUIDE.md 客户端对拍缺陷发现与修复工程指南
133 lines
5.0 KiB
GDScript
133 lines
5.0 KiB
GDScript
# test_socket_glow_fx_parity.gd —— 40250 装备灵石镶嵌发光流光粒子 1:1 回归测试套件
|
|
extends SceneTree
|
|
|
|
const SocketGlowFxSystem = preload("res://socket_glow_fx_system.gd")
|
|
|
|
var _passed := 0
|
|
var _failed := 0
|
|
|
|
func _assert(cond: bool, msg: String) -> void:
|
|
if cond:
|
|
_passed += 1
|
|
print(" [PASS] %s" % msg)
|
|
else:
|
|
_failed += 1
|
|
printerr(" [FAIL] %s" % msg)
|
|
|
|
func _init() -> void:
|
|
print("\n=== Running test_socket_glow_fx_parity (Direction 3: Socket Glow FX 1:1) ===")
|
|
_test_stone_color_roster()
|
|
_test_base_refine_auras()
|
|
_test_socket_stone_glow_blending()
|
|
_test_material_application()
|
|
_finish()
|
|
|
|
func _test_stone_color_roster() -> void:
|
|
print("\n--- Test 1: Spirit Stone Color Roster ---")
|
|
_assert(SocketGlowFxSystem.STONE_COLORS.size() >= 8, "Has at least 8 Spirit Stone colors defined")
|
|
_assert(SocketGlowFxSystem.STONE_COLORS.has(28430), "Warrior Stone +4 defined")
|
|
_assert(SocketGlowFxSystem.STONE_COLORS.has(28432), "Sura Stone +4 defined")
|
|
_assert(SocketGlowFxSystem.STONE_COLORS.has(28436), "Cooldown Stone +4 defined")
|
|
_assert(SocketGlowFxSystem.STONE_COLORS.has(28438), "Protection Stone +4 defined")
|
|
|
|
func _test_base_refine_auras() -> void:
|
|
print("\n--- Test 2: Base Refine Auras (+0~+6 vs +7/+8/+9) ---")
|
|
var sys := SocketGlowFxSystem.new()
|
|
|
|
# +6 without stones
|
|
var item_plus6 := {"vnum": 10, "refine_level": 6, "sockets": []}
|
|
var g6 = sys.calculate_equipment_glow(item_plus6)
|
|
_assert(g6["is_glowing"] == false, "+6 item without stones has no glow")
|
|
_assert(g6["glow_intensity"] == 0.0, "Intensity is 0.0")
|
|
|
|
# +7 item
|
|
var item_plus7 := {"vnum": 10, "refine_level": 7, "sockets": []}
|
|
var g7 = sys.calculate_equipment_glow(item_plus7)
|
|
_assert(g7["is_glowing"] == true, "+7 item glows")
|
|
_assert(g7["glow_intensity"] == 0.6, "+7 intensity is 0.6")
|
|
_assert(g7["particle_rate"] == 12, "+7 particle rate is 12")
|
|
|
|
# +8 item
|
|
var item_plus8 := {"vnum": 10, "refine_level": 8, "sockets": []}
|
|
var g8 = sys.calculate_equipment_glow(item_plus8)
|
|
_assert(g8["glow_intensity"] == 1.2, "+8 intensity is 1.2")
|
|
_assert(g8["has_trail"] == true, "+8 has weapon swing trail")
|
|
|
|
# +9 item
|
|
var item_plus9 := {"vnum": 10, "refine_level": 9, "sockets": []}
|
|
var g9 = sys.calculate_equipment_glow(item_plus9)
|
|
_assert(g9["glow_intensity"] == 2.2, "+9 intensity is 2.2")
|
|
_assert(g9["swirl_enabled"] == true, "+9 has mythic swirling aura")
|
|
_assert(g9["particle_rate"] == 55, "+9 particle rate is 55")
|
|
|
|
func _test_socket_stone_glow_blending() -> void:
|
|
print("\n--- Test 3: Socket Stones Color & Intensity Blending ---")
|
|
var sys := SocketGlowFxSystem.new()
|
|
|
|
var sig_data := {"fired": false, "vnum": 0, "intensity": 0.0}
|
|
sys.glow_profile_updated.connect(func(v: int, i: float, _c: Color):
|
|
sig_data["fired"] = true
|
|
sig_data["vnum"] = v
|
|
sig_data["intensity"] = i
|
|
)
|
|
|
|
# +9 Poison Sword with Warrior Stone (28430, Red)
|
|
var sword_red := {
|
|
"vnum": 189,
|
|
"refine_level": 9,
|
|
"sockets": [28430]
|
|
}
|
|
var g_red = sys.calculate_equipment_glow(sword_red)
|
|
_assert(g_red["is_glowing"] == true, "Glowing active")
|
|
_assert(g_red["glow_intensity"] > 2.2, "Intensity boosted by spirit stone (> 2.2)")
|
|
_assert(g_red["primary_color"].r > 0.9, "Warrior stone creates vivid red color")
|
|
_assert(sig_data["fired"] == true and sig_data["vnum"] == 189, "glow_profile_updated signal fired")
|
|
|
|
# +9 Sword with Sura Stone (28432, Dark Violet)
|
|
var sword_purple := {
|
|
"vnum": 189,
|
|
"refine_level": 9,
|
|
"sockets": [28432]
|
|
}
|
|
var g_purple = sys.calculate_equipment_glow(sword_purple)
|
|
_assert(g_purple["primary_color"].b > 0.9, "Sura stone creates deep violet/blue tone")
|
|
|
|
# Item with 3 stones: Red + Purple + Gold
|
|
var sword_tri := {
|
|
"vnum": 189,
|
|
"refine_level": 9,
|
|
"sockets": [28430, 28432, 28436]
|
|
}
|
|
var g_tri = sys.calculate_equipment_glow(sword_tri)
|
|
_assert(g_tri["stone_count"] == 3, "3 socket stones counted")
|
|
_assert(g_tri["secondary_color"] == SocketGlowFxSystem.STONE_COLORS[28430]["color"], "Secondary color tracks slot 0 primary stone")
|
|
|
|
func _test_material_application() -> void:
|
|
print("\n--- Test 4: StandardMaterial3D Direct Injection ---")
|
|
var sys := SocketGlowFxSystem.new()
|
|
var mat := StandardMaterial3D.new()
|
|
|
|
var item_plus9 := {"vnum": 10, "refine_level": 9, "sockets": [28430]}
|
|
var glow = sys.calculate_equipment_glow(item_plus9)
|
|
|
|
sys.apply_to_material(mat, glow)
|
|
_assert(mat.emission_enabled == true, "Material emission enabled")
|
|
_assert(mat.emission == glow["primary_color"], "Emission color matches primary color")
|
|
_assert(is_equal_approx(mat.emission_energy_multiplier, glow["glow_intensity"]), "Energy multiplier matches glow intensity")
|
|
|
|
# Apply empty glow
|
|
sys.apply_to_material(mat, sys._empty_glow())
|
|
_assert(mat.emission_enabled == false, "Emission disabled for non-glowing item")
|
|
|
|
func _finish() -> void:
|
|
print("\n==========================================")
|
|
print("Socket Glow FX Parity Tests Finished:")
|
|
print("Passed: %d, Failed: %d" % [_passed, _failed])
|
|
print("==========================================")
|
|
if _failed > 0:
|
|
printerr("FAILED: Some tests did not pass.")
|
|
quit(1)
|
|
else:
|
|
print("SUCCESS: All Socket Glow FX parity tests passed!")
|
|
quit(0)
|