Files
mtgodot-poc/project/test_socket_glow_fx_parity.gd
T
shenandshen 66d217b313 feat(client): 完成40250客户端核心功能1:1对齐与桥梁高度采样修复
- 桥梁与静态物体高度采样修复:
  - 严格对齐 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 客户端对拍缺陷发现与修复工程指南
2026-09-19 08:51:25 -07:00

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)