- 桥梁与静态物体高度采样修复: - 严格对齐 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 客户端对拍缺陷发现与修复工程指南
121 lines
5.5 KiB
GDScript
121 lines
5.5 KiB
GDScript
# test_privilege_empire_guild_parity.gd —— Metin2 40250 官方帝国与公会恩泽特权 1:1 测试套件
|
|
extends SceneTree
|
|
|
|
const PrivilegeEmpireGuildSystem = preload("res://privilege_empire_guild_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_privilege_empire_guild_parity (Direction 4: Privileges & Rates 1:1) ===")
|
|
|
|
test_empire_and_guild_privileges()
|
|
test_effective_privilege_max_calculation()
|
|
test_unique_items_stacking()
|
|
test_privilege_expiration()
|
|
test_serialization()
|
|
|
|
print("\n=======================================================")
|
|
print("Privilege System Tests: %d Passed, %d Failed" % [_passed, _failed])
|
|
print("=======================================================\n")
|
|
|
|
if _failed > 0:
|
|
quit(1)
|
|
else:
|
|
quit(0)
|
|
|
|
func test_empire_and_guild_privileges() -> void:
|
|
print("\n--- Test 1: Empire & Guild Privileges Setup (40250 1:1) ---")
|
|
var system = PrivilegeEmpireGuildSystem.new()
|
|
|
|
# 辛秀帝国 (1) 开启双倍经验 (+100% EXP, 持续 3600 秒)
|
|
system.set_empire_privilege(1, PrivilegeEmpireGuildSystem.PRIV_EXP, 100, 3600.0)
|
|
# 公会 (ID: 501) 开启爆率加成 (+50% Item Drop, 持续 1800 秒)
|
|
system.set_guild_privilege(501, PrivilegeEmpireGuildSystem.PRIV_ITEM_DROP, 50, 1800.0)
|
|
|
|
# 辛秀国民查询经验加成
|
|
var exp_bonus = system.get_effective_privilege(1001, 1, 0, PrivilegeEmpireGuildSystem.PRIV_EXP)
|
|
_assert(exp_bonus == 100, "Shinsoo citizen enjoys +100% EXP bonus")
|
|
|
|
# 敌国 (Chunjo 2) 查询经验加成
|
|
var enemy_exp = system.get_effective_privilege(2001, 2, 0, PrivilegeEmpireGuildSystem.PRIV_EXP)
|
|
_assert(enemy_exp == 0, "Chunjo citizen has 0% EXP bonus")
|
|
|
|
# 公会 501 成员查询爆率加成
|
|
var drop_bonus = system.get_effective_privilege(1001, 1, 501, PrivilegeEmpireGuildSystem.PRIV_ITEM_DROP)
|
|
_assert(drop_bonus == 50, "Guild 501 member enjoys +50% Item Drop bonus")
|
|
|
|
func test_effective_privilege_max_calculation() -> void:
|
|
print("\n--- Test 2: Effective Privilege MAX Rule (40250 1:1) ---")
|
|
var system = PrivilegeEmpireGuildSystem.new()
|
|
|
|
# 全服全境特权: +20% EXP
|
|
system.set_empire_privilege(0, PrivilegeEmpireGuildSystem.PRIV_EXP, 20, 3600.0)
|
|
# 辛秀专属帝国特权: +50% EXP
|
|
system.set_empire_privilege(1, PrivilegeEmpireGuildSystem.PRIV_EXP, 50, 3600.0)
|
|
# 辛秀第一公会 (888) 特权: +80% EXP
|
|
system.set_guild_privilege(888, PrivilegeEmpireGuildSystem.PRIV_EXP, 80, 3600.0)
|
|
|
|
# 依据 40250 原版 priv_manager.cpp:
|
|
# val = MAX(val_ch, GetPrivByEmpire(0, type)) -> 20
|
|
# val = MAX(val, GetPrivByEmpire(ch->GetEmpire(), type)) -> 50
|
|
# val = MAX(val, GetPrivByGuild(ch->GetGuild()->GetID(), type)) -> 80
|
|
var final_exp = system.get_effective_privilege(1001, 1, 888, PrivilegeEmpireGuildSystem.PRIV_EXP)
|
|
_assert(final_exp == 80, "Computed MAX value (80%) among global, empire, and guild")
|
|
|
|
func test_unique_items_stacking() -> void:
|
|
print("\n--- Test 3: Experience Ring & Thief Glove Stacking (40250 1:1) ---")
|
|
var system = PrivilegeEmpireGuildSystem.new()
|
|
system.set_empire_privilege(1, PrivilegeEmpireGuildSystem.PRIV_EXP, 50, 3600.0)
|
|
system.set_empire_privilege(1, PrivilegeEmpireGuildSystem.PRIV_ITEM_DROP, 25, 3600.0)
|
|
|
|
# 佩戴经验指环 (+50% EXP) -> 50 + 50 = 100%
|
|
var exp_with_ring = system.get_effective_privilege(1001, 1, 0, PrivilegeEmpireGuildSystem.PRIV_EXP, true, false)
|
|
_assert(exp_with_ring == 100, "EXP stacked with Experience Ring (+50% = 100%)")
|
|
|
|
# 佩戴小偷手套 (+100% Drop) -> 25 + 100 = 125%
|
|
var drop_with_glove = system.get_effective_privilege(1001, 1, 0, PrivilegeEmpireGuildSystem.PRIV_ITEM_DROP, false, true)
|
|
_assert(drop_with_glove == 125, "Drop rate stacked with Thief Glove (+100% = 125%)")
|
|
|
|
func test_privilege_expiration() -> void:
|
|
print("\n--- Test 4: Privilege Expiration with Delta Time ---")
|
|
var system = PrivilegeEmpireGuildSystem.new()
|
|
system.set_empire_privilege(1, PrivilegeEmpireGuildSystem.PRIV_EXP, 100, 500.0)
|
|
system.set_guild_privilege(777, PrivilegeEmpireGuildSystem.PRIV_GOLD_DROP, 30, 200.0)
|
|
|
|
# 推进 300 秒 (公会 200 秒特权已过期,帝国 500 秒特权尚存)
|
|
system.update(300.0)
|
|
var guild_gold = system.get_effective_privilege(1001, 1, 777, PrivilegeEmpireGuildSystem.PRIV_GOLD_DROP)
|
|
_assert(guild_gold == 0, "Guild privilege expired after 300s")
|
|
var emp_exp = system.get_effective_privilege(1001, 1, 777, PrivilegeEmpireGuildSystem.PRIV_EXP)
|
|
_assert(emp_exp == 100, "Empire privilege still active")
|
|
|
|
# 推进 300 秒 (帝国特权也过期)
|
|
system.update(300.0)
|
|
emp_exp = system.get_effective_privilege(1001, 1, 777, PrivilegeEmpireGuildSystem.PRIV_EXP)
|
|
_assert(emp_exp == 0, "Empire privilege expired after 600s")
|
|
|
|
func test_serialization() -> void:
|
|
print("\n--- Test 5: Privilege State Serialization ---")
|
|
var system = PrivilegeEmpireGuildSystem.new()
|
|
system.set_empire_privilege(1, PrivilegeEmpireGuildSystem.PRIV_EXP, 75, 1000.0)
|
|
system.set_character_privilege(999, PrivilegeEmpireGuildSystem.PRIV_GOLD_DROP, 15)
|
|
|
|
var data = system.serialize()
|
|
_assert(data.has("empire_privs") and data.has("char_privs"), "Serialized data")
|
|
|
|
var restored = PrivilegeEmpireGuildSystem.new()
|
|
restored.deserialize(data)
|
|
var emp_exp = restored.get_effective_privilege(1001, 1, 0, PrivilegeEmpireGuildSystem.PRIV_EXP)
|
|
_assert(emp_exp == 75, "Restored 75% empire EXP")
|
|
var char_gold = restored.get_effective_privilege(999, 1, 0, PrivilegeEmpireGuildSystem.PRIV_GOLD_DROP)
|
|
_assert(char_gold == 15, "Restored 15% character gold drop")
|