Files
mtgodot-poc/project/test_privilege_empire_guild_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

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")