- 桥梁与静态物体高度采样修复: - 严格对齐 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 客户端对拍缺陷发现与修复工程指南
117 lines
4.5 KiB
GDScript
117 lines
4.5 KiB
GDScript
# test_system_setting_parity.gd —— 40250 系统视听与战斗选项 1:1 纯净回归测试套件
|
|
extends SceneTree
|
|
|
|
const SystemSettingSystem = preload("res://system_setting_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_system_setting_parity (Direction 1: System Setting & PK Mode 1:1) ===")
|
|
_test_audio_and_display_settings()
|
|
_test_pk_modes_and_rules()
|
|
_test_import_export_settings()
|
|
_finish()
|
|
|
|
func _test_audio_and_display_settings() -> void:
|
|
print("\n--- Test 1: Audio & Display Settings Clamping & Signals ---")
|
|
var sss := SystemSettingSystem.new()
|
|
|
|
var signal_data := {"fired": false, "name": "", "val": null}
|
|
sss.setting_changed.connect(func(n: String, v: Variant):
|
|
signal_data["fired"] = true
|
|
signal_data["name"] = n
|
|
signal_data["val"] = v
|
|
)
|
|
|
|
# BGM volume clamping (1.5 -> 1.0)
|
|
sss.bgm_volume = 1.5
|
|
_assert(sss.bgm_volume == 1.0, "BGM volume clamped to 1.0")
|
|
_assert(signal_data["fired"] == true and signal_data["name"] == "bgm_volume", "setting_changed signal fired for bgm")
|
|
|
|
# SFX volume clamping (-0.2 -> 0.0)
|
|
sss.sfx_volume = -0.2
|
|
_assert(sss.sfx_volume == 0.0, "SFX volume clamped to 0.0")
|
|
|
|
# Camera distance clamping (50.0 -> 40.0)
|
|
sss.camera_distance = 50.0
|
|
_assert(sss.camera_distance == 40.0, "Camera distance clamped to 40.0")
|
|
|
|
# Fog & Shadow levels
|
|
sss.fog_level = 2
|
|
_assert(sss.fog_level == 2, "Fog level is 2")
|
|
sss.shadow_quality = 0
|
|
_assert(sss.shadow_quality == 0, "Shadow quality is 0")
|
|
|
|
func _test_pk_modes_and_rules() -> void:
|
|
print("\n--- Test 2: 4 PK Modes & Combat Rule Matrix ---")
|
|
var sss := SystemSettingSystem.new()
|
|
|
|
var pk_signal := {"fired": false, "mode": -1, "name": ""}
|
|
sss.pk_mode_changed.connect(func(m: int, n: String):
|
|
pk_signal["fired"] = true
|
|
pk_signal["mode"] = m
|
|
pk_signal["name"] = n
|
|
)
|
|
|
|
# 1. Monster target is ALWAYS attackable
|
|
_assert(sss.can_attack_target(false) == true, "Monsters always attackable in Peace mode")
|
|
|
|
# 2. PEACE Mode (Default)
|
|
_assert(sss.can_attack_target(true, 5000) == false, "Cannot attack positive karma player in Peace mode")
|
|
_assert(sss.can_attack_target(true, -5000) == false, "Cannot attack red name player in Peace mode")
|
|
|
|
# 3. REVENGE Mode (善恶反击)
|
|
sss.set_pk_mode(SystemSettingSystem.PkMode.REVENGE)
|
|
_assert(pk_signal["fired"] == true and pk_signal["mode"] == SystemSettingSystem.PkMode.REVENGE, "pk_mode_changed signal fired")
|
|
_assert(sss.can_attack_target(true, 5000) == false, "Cannot attack positive karma player in Revenge mode")
|
|
_assert(sss.can_attack_target(true, -5000) == true, "CAN attack red name player in Revenge mode")
|
|
|
|
# 4. GUILD Mode (阵营保护)
|
|
sss.set_pk_mode(SystemSettingSystem.PkMode.GUILD)
|
|
_assert(sss.can_attack_target(true, 5000, 100, 100) == false, "Cannot attack same guild player (guild 100 vs 100)")
|
|
_assert(sss.can_attack_target(true, 5000, 101, 100) == true, "CAN attack enemy guild player (guild 101 vs 100)")
|
|
|
|
# 5. FREE Mode (自由对决)
|
|
sss.set_pk_mode(SystemSettingSystem.PkMode.FREE)
|
|
_assert(sss.can_attack_target(true, 5000) == true, "Can attack anyone in Free mode")
|
|
|
|
func _test_import_export_settings() -> void:
|
|
print("\n--- Test 3: Import & Export Configuration Dictionary ---")
|
|
var sss := SystemSettingSystem.new()
|
|
sss.bgm_volume = 0.5
|
|
sss.sfx_volume = 0.6
|
|
sss.camera_distance = 32.0
|
|
sss.set_pk_mode(SystemSettingSystem.PkMode.REVENGE)
|
|
sss.show_critical_hit = false
|
|
|
|
var exported := sss.export_settings()
|
|
_assert(exported["bgm_volume"] == 0.5, "Exported BGM volume 0.5")
|
|
_assert(exported["current_pk_mode"] == SystemSettingSystem.PkMode.REVENGE, "Exported PK mode Revenge")
|
|
_assert(exported["show_critical_hit"] == false, "Exported show_critical_hit false")
|
|
|
|
# Create new instance and import
|
|
var sss2 := SystemSettingSystem.new()
|
|
sss2.import_settings(exported)
|
|
_assert(sss2.bgm_volume == 0.5, "Imported BGM volume restored")
|
|
_assert(sss2.camera_distance == 32.0, "Imported camera distance restored")
|
|
_assert(sss2.current_pk_mode == SystemSettingSystem.PkMode.REVENGE, "Imported PK mode restored")
|
|
_assert(sss2.show_critical_hit == false, "Imported show_critical_hit restored")
|
|
|
|
func _finish() -> void:
|
|
print("\n==========================================")
|
|
print("System Setting Parity Test Results: %d Passed, %d Failed" % [_passed, _failed])
|
|
print("==========================================")
|
|
if _failed > 0:
|
|
quit(1)
|
|
else:
|
|
quit(0)
|