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

156 lines
6.2 KiB
GDScript

# test_solo_guild_domain_parity.gd —— 40250 个人公会领地与建筑建造 1:1 回归测试套件
extends SceneTree
const SoloGuildDomainSystem = preload("res://solo_guild_domain_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_solo_guild_domain_parity (Direction 2: Solo Guild Domain 1:1) ===")
_test_claim_domain()
_test_construct_and_upgrade_buildings()
_test_guild_blacksmith_refining()
_test_guardian_altar_passives()
_finish()
func _test_claim_domain() -> void:
print("\n--- Test 1: Claiming Guild Domain ---")
var sys := SoloGuildDomainSystem.new()
var poor_player := {"gold": 1000}
# Fail on low gold
var fail_gold = sys.claim_domain("神圣殿堂", 10, poor_player)
_assert(fail_gold["ok"] == false and fail_gold["reason"] == "NOT_ENOUGH_GOLD", "Rejected: not enough gold")
# Fail on low guild level
var rich_player := {"gold": 50000000}
var fail_lvl = sys.claim_domain("神圣殿堂", 8, rich_player)
_assert(fail_lvl["ok"] == false and fail_lvl["reason"] == "GUILD_LEVEL_TOO_LOW", "Rejected: guild level < 10")
# Success
var claim_sig := {"fired": false, "name": "", "cost": 0}
sys.domain_claimed.connect(func(gname: String, cost: int):
claim_sig["fired"] = true
claim_sig["name"] = gname
claim_sig["cost"] = cost
)
var res = sys.claim_domain("神圣殿堂", 12, rich_player)
_assert(res["ok"] == true, "Claimed domain")
_assert(sys.has_domain == true, "has_domain is true")
_assert(rich_player["gold"] == 30000000, "Cost 20M deducted (50M -> 30M)")
_assert(claim_sig["fired"] == true and claim_sig["name"] == "神圣殿堂", "domain_claimed signal emitted")
# Duplicate claim rejected
var fail_dup = sys.claim_domain("再次开辟", 12, rich_player)
_assert(fail_dup["ok"] == false and fail_dup["reason"] == "ALREADY_HAS_DOMAIN", "Duplicate claim rejected")
func _test_construct_and_upgrade_buildings() -> void:
print("\n--- Test 2: Constructing & Upgrading Buildings ---")
var sys := SoloGuildDomainSystem.new()
var player := {"gold": 50000000}
sys.claim_domain("东方荣耀", 10, player) # 50M -> 30M
var build_sig := {"fired": false, "btype": 0}
sys.building_constructed.connect(func(btype: int, _n: String, _l: int):
build_sig["fired"] = true
build_sig["btype"] = btype
)
# Construct Guild Blacksmith (10M gold)
var c_res = sys.construct_building(SoloGuildDomainSystem.BuildingType.BLACKSMITH, player)
_assert(c_res["ok"] == true, "Blacksmith constructed")
_assert(player["gold"] == 20000000, "Cost 10M deducted (30M -> 20M)")
_assert(sys.constructed_buildings.has(SoloGuildDomainSystem.BuildingType.BLACKSMITH), "Blacksmith in buildings list")
_assert(build_sig["fired"] == true and build_sig["btype"] == 1, "building_constructed emitted")
# Re-construct rejected
var fail_c = sys.construct_building(SoloGuildDomainSystem.BuildingType.BLACKSMITH, player)
_assert(fail_c["ok"] == false and fail_c["reason"] == "ALREADY_CONSTRUCTED", "Cannot build twice")
# Upgrade Blacksmith (Lv 1 -> Lv 2, cost: 8M)
var up_sig := {"fired": false, "lvl": 0}
sys.building_upgraded.connect(func(_b: int, lvl: int):
up_sig["fired"] = true
up_sig["lvl"] = lvl
)
var up_res = sys.upgrade_building(SoloGuildDomainSystem.BuildingType.BLACKSMITH, player)
_assert(up_res["ok"] == true and up_res["new_level"] == 2, "Upgraded Blacksmith to Lv 2")
_assert(up_sig["fired"] == true and up_sig["lvl"] == 2, "building_upgraded emitted")
_assert(player["gold"] == 12000000, "8M upgrade cost deducted (20M -> 12M)")
func _test_guild_blacksmith_refining() -> void:
print("\n--- Test 3: Guild Blacksmith Enhanced Refining ---")
var sys := SoloGuildDomainSystem.new()
var player := {"gold": 50000000}
sys.claim_domain("锻造公会", 10, player)
sys.construct_building(SoloGuildDomainSystem.BuildingType.BLACKSMITH, player)
var item := {"vnum": 10, "name": "巨剑", "refine_level": 7}
var ref_sig := {"fired": false, "succ": false, "lvl": 0}
sys.guild_refine_result.connect(func(succ: bool, lvl: int):
ref_sig["fired"] = true
ref_sig["succ"] = succ
ref_sig["lvl"] = lvl
)
# Refine with force_success = true (+7 -> +8)
var res1 = sys.guild_blacksmith_refine(item, player, true)
_assert(res1["ok"] == true and res1["success"] == true, "Refined to +8")
_assert(item["refine_level"] == 8, "Item refine level is now 8")
_assert(ref_sig["fired"] == true and ref_sig["succ"] == true, "guild_refine_result emitted")
# Refine to +9
sys.guild_blacksmith_refine(item, player, true)
_assert(item["refine_level"] == 9, "Item refine level is now 9 (+9 max)")
# Further refine at +9 must fail
var fail_max = sys.guild_blacksmith_refine(item, player, true)
_assert(fail_max["ok"] == false and fail_max["reason"] == "ALREADY_MAX_REFINE", "Cannot refine past +9")
func _test_guardian_altar_passives() -> void:
print("\n--- Test 4: Guild Guardian Altar Passive Auras ---")
var sys := SoloGuildDomainSystem.new()
var player := {"gold": 50000000}
sys.claim_domain("神坛公会", 10, player)
# No altar yet
_assert(sys.get_altar_passive_buffs().is_empty(), "No buffs without Altar")
# Build Guardian Altar (Lv 1)
sys.construct_building(SoloGuildDomainSystem.BuildingType.GUARDIAN_ALTAR, player)
var b1 = sys.get_altar_passive_buffs()
_assert(b1["max_hp"] == 1500, "Lv 1 Altar gives +1500 Max HP")
_assert(b1["exp_rate_pct"] == 10, "Lv 1 Altar gives +10% Exp")
_assert(b1["all_stats"] == 5, "Lv 1 Altar gives +5 All Stats")
# Upgrade Altar to Lv 2
sys.upgrade_building(SoloGuildDomainSystem.BuildingType.GUARDIAN_ALTAR, player)
var b2 = sys.get_altar_passive_buffs()
_assert(b2["max_hp"] == 3000, "Lv 2 Altar gives +3000 Max HP")
_assert(b2["exp_rate_pct"] == 20, "Lv 2 Altar gives +20% Exp")
_assert(b2["all_stats"] == 10, "Lv 2 Altar gives +10 All Stats")
func _finish() -> void:
print("\n==========================================")
print("Solo Guild Domain 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 Solo Guild Domain parity tests passed!")
quit(0)