- 桥梁与静态物体高度采样修复: - 严格对齐 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 客户端对拍缺陷发现与修复工程指南
126 lines
5.1 KiB
GDScript
126 lines
5.1 KiB
GDScript
# test_guild_skill_parity.gd —— 40250 公会等级与 7 大神龙技能 1:1 纯净回归测试套件
|
|
extends SceneTree
|
|
|
|
const GuildSkillSystem = preload("res://guild_skill_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_guild_skill_parity (Direction 3: Guild Skills 1:1) ===")
|
|
_test_guild_leveling_and_points()
|
|
_test_skill_leveling_and_passive_spirit()
|
|
_test_skill_casting_and_formulas()
|
|
_test_cooldowns_and_buff_decay()
|
|
_finish()
|
|
|
|
func _test_guild_leveling_and_points() -> void:
|
|
print("\n--- Test 1: Guild EXP Donation & Leveling ---")
|
|
var gss := GuildSkillSystem.new()
|
|
_assert(gss.guild_level == 1, "Initial guild level is 1")
|
|
_assert(gss.skill_points == 0, "Initial skill points is 0")
|
|
|
|
# Donate EXP to level up to 2 (needed: 50,000)
|
|
var res = gss.donate_exp(50000)
|
|
_assert(res["ok"] == true and res["leveled_up"] == true, "Leveled up successfully")
|
|
_assert(gss.guild_level == 2, "Guild level is now 2")
|
|
_assert(gss.skill_points == 1, "Awarded 1 skill point")
|
|
|
|
# Donate huge amount to level up to 10
|
|
gss.donate_exp(5000000)
|
|
_assert(gss.guild_level > 2, "Guild level increased with large EXP donation")
|
|
_assert(gss.skill_points > 1, "Multiple skill points accumulated")
|
|
|
|
func _test_skill_leveling_and_passive_spirit() -> void:
|
|
print("\n--- Test 2: Skill Leveling & Dragon Eyes (151) Passive ---")
|
|
var gss := GuildSkillSystem.new()
|
|
gss.skill_points = 10 # Provide test points
|
|
|
|
# Level up 151 (Dragon Eyes) to 7 (Max)
|
|
for i in range(7):
|
|
var res = gss.level_up_skill(GuildSkillSystem.SKILL_DRAGON_EYES)
|
|
_assert(res["ok"] == true, "Dragon Eyes upgraded to level %d" % (i + 1))
|
|
|
|
_assert(gss.skill_levels[GuildSkillSystem.SKILL_DRAGON_EYES] == 7, "Dragon Eyes is level 7 (Max)")
|
|
_assert(gss.max_spirit == 200, "Max Dragon Spirit expanded from 100 to 200")
|
|
|
|
# 8th level attempt rejected
|
|
var res = gss.level_up_skill(GuildSkillSystem.SKILL_DRAGON_EYES)
|
|
_assert(res["ok"] == false and res["reason"] == "MAX_SKILL_LEVEL", "Cannot exceed max skill level 7")
|
|
|
|
func _test_skill_casting_and_formulas() -> void:
|
|
print("\n--- Test 3: Skill Casting & 40250 Formula Scaling ---")
|
|
var gss := GuildSkillSystem.new()
|
|
gss.skill_points = 21
|
|
|
|
# Max out 151 (Dragon Eyes), 152 (Dragon Blood) and 156 (Dragon Rage)
|
|
for i in range(7):
|
|
gss.level_up_skill(GuildSkillSystem.SKILL_DRAGON_EYES)
|
|
gss.level_up_skill(GuildSkillSystem.SKILL_DRAGON_BLOOD)
|
|
gss.level_up_skill(GuildSkillSystem.SKILL_DRAGON_RAGE)
|
|
gss.current_spirit = 200
|
|
|
|
# Cannot cast unlearned skill (154 Holy Armor)
|
|
var res = gss.cast_guild_skill(GuildSkillSystem.SKILL_HOLY_ARMOR)
|
|
_assert(res["ok"] == false and res["reason"] == "NOT_LEARNED", "Cannot cast unlearned skill")
|
|
|
|
# Cannot cast passive skill (151)
|
|
res = gss.cast_guild_skill(GuildSkillSystem.SKILL_DRAGON_EYES)
|
|
_assert(res["ok"] == false and res["reason"] == "PASSIVE_SKILL", "Cannot cast passive skill")
|
|
|
|
# Cast 152 Dragon Blood (Level 7 -> k=1.0 -> Max HP +20%)
|
|
res = gss.cast_guild_skill(GuildSkillSystem.SKILL_DRAGON_BLOOD)
|
|
_assert(res["ok"] == true, "Dragon Blood cast successfully")
|
|
_assert(is_equal_approx(float(res["value"]), 20.0), "Level 7 Dragon Blood gives +20% Max HP")
|
|
_assert(gss.current_spirit == 180, "Spirit deducted: 200 - 20 = 180")
|
|
|
|
# Cast 156 Dragon Rage (Level 7 -> k=1.0 -> Crit +50%)
|
|
res = gss.cast_guild_skill(GuildSkillSystem.SKILL_DRAGON_RAGE)
|
|
_assert(res["ok"] == true, "Dragon Rage cast successfully")
|
|
_assert(is_equal_approx(float(res["value"]), 50.0), "Level 7 Dragon Rage gives +50% Critical")
|
|
|
|
var bonuses = gss.get_active_bonuses()
|
|
_assert(is_equal_approx(float(bonuses["max_hp_pct"]), 20.0), "Active bonus has +20% HP")
|
|
_assert(is_equal_approx(float(bonuses["critical_pct"]), 50.0), "Active bonus has +50% Crit")
|
|
|
|
func _test_cooldowns_and_buff_decay() -> void:
|
|
print("\n--- Test 4: Cooldown Enforcement & Buff Decay ---")
|
|
var gss := GuildSkillSystem.new()
|
|
gss.skill_points = 7
|
|
for i in range(7):
|
|
gss.level_up_skill(GuildSkillSystem.SKILL_DRAGON_BLOOD)
|
|
|
|
# 1st cast enters cooldown
|
|
gss.cast_guild_skill(GuildSkillSystem.SKILL_DRAGON_BLOOD)
|
|
_assert(gss.skill_cooldowns.has(GuildSkillSystem.SKILL_DRAGON_BLOOD), "Skill is in cooldown")
|
|
|
|
# 2nd cast blocked by cooldown
|
|
var res = gss.cast_guild_skill(GuildSkillSystem.SKILL_DRAGON_BLOOD)
|
|
_assert(res["ok"] == false and res["reason"] == "COOLDOWN_ACTIVE", "Recasting blocked by cooldown")
|
|
|
|
# Fast forward 61 seconds (cooldown is 60s, buff is 300s)
|
|
gss.update(61.0)
|
|
_assert(gss.skill_cooldowns.has(GuildSkillSystem.SKILL_DRAGON_BLOOD) == false, "Cooldown expired after 61s")
|
|
_assert(gss.active_buffs.has(GuildSkillSystem.SKILL_DRAGON_BLOOD) == true, "Buff remains active after 61s")
|
|
|
|
# Fast forward remaining 240 seconds -> buff expires
|
|
gss.update(240.0)
|
|
_assert(gss.active_buffs.has(GuildSkillSystem.SKILL_DRAGON_BLOOD) == false, "Buff expired after 300s total")
|
|
|
|
func _finish() -> void:
|
|
print("\n=== SUMMARY: %d passed, %d failed ===" % [_passed, _failed])
|
|
if _failed == 0:
|
|
print("ALL TESTS PASSED!\n")
|
|
quit(0)
|
|
else:
|
|
printerr("SOME TESTS FAILED!\n")
|
|
quit(1)
|