fix(skill): 修复寒冰装甲/碎冰甲/冰封装甲/能量护盾等持续性 Buff 视觉效果在施放其他技能时被意外清除的缺陷 #432
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
问题背景与缺陷表现 (Background & Defect Analysis)
在当前客户端实战(
src/scene/act-scene.ts与src/game/engine.ts)中,法师的持续性增益状态技能(Buffs)存在严重的视觉特效生命周期缺陷:暴雪 1.13c 原版权威数据与底层机制基准 (Blizzard 1.13c Ground Truth Invariants)
根据 Diablo II v1.13c 官方数据表(
Skills.txt、States.txt、Overlay.txt)及底层生命周期规范:1. 特效类型分层规范 (Cast Overlay vs State Overlay)
castoverlay):Skills.txt的castoverlay列指定(如ice_cast_1,ice_cast_2,fire_cast_1,light_cast_1,teleport等);loop = false),常规播放 14–16 帧(约 0.5 秒)后自然消亡;States.txtOverlay):frozenarmor,shiverarmor,chillingarmor,energyshield,enchant,thunderstorm);loop = true),其生命周期完全由 Buff 剩余帧数(coldArmorTicks,energyshieldTicks等)控制。2. 状态互斥与共存规则 (Exclusion & Coexistence Rules)
缺陷根因深度剖析 (Root Cause Analysis)
根因 1:
src/game/engine.ts中spawnOverlay误将所有非光环特效视为施法光晕并强制清除 (Line 358–365)在
src/game/engine.ts中:开发者在实现 Issue #386(防施法光晕叠加过饱和)时,误以为角色身上除了光环(
isAura)以外就只有瞬时施法光晕。由于冰系装甲与能量护盾虽然传入了
{ loop: true },但并未带有isAura标记,因此被该循环无差别误杀!根因 2:
src/scene/act-scene.ts每次施法均前置生成瞬发光晕 (Line 1225–1229)在
src/scene/act-scene.ts的castSkill主调度入口中:无论玩家施放火弹(
fire_cast_1)、冰尖柱(ice_cast_2)还是传送(teleport),都会无条件调用一次engine.spawnOverlay。这直接触发了根因 1 的擦除逻辑,导致已挂载在角色身上的
chillingarmor、shiverarmor、frozenarmor、energyshield等持续光效在一瞬间被清除出特效数组。根因 3:Buff 光效的自然消亡代码被架空
在
src/game/engine.ts第 632–675 行中,虽然已经写好了根据player.coldArmorTicks <= 0或player.energyshieldTicks <= 0清理 Overlay 的正确代码,但由于特效在施法第一秒就被根因 1 误杀,这些正确的计时到期清理逻辑实际沦为了摆设。修复方案与任务规划 (Remediation Plan)
spawnOverlay中的替换判定逻辑 (src/game/engine.ts):!options?.loop && !options?.isBuff),则仅清理旧的施法光晕(即!ov.loop && !ov.isAura && !ov.isBuff);loop: true或属于 Buff 状态的持续特效!src/scene/act-scene.ts):frozenarmor/shiverarmor/chillingarmor),确保新装甲替换旧装甲;engine.tick中持续性 Buff 光效全程紧跟玩家坐标移动,直到持续时间归零(coldArmorTicks <= 0/energyshieldTicks <= 0)后才被清除。expired === false),且坐标与玩家保持一致;coldArmorTicks倒计时归零时,装甲特效正常自然过期清除。Resolved in commit d9ad6df:
isCastOverlay) from State Overlays (isStateOverlay).frozenarmor,shiverarmor,chillingarmor).tests/skills/sor/issue-432-buff-visual-persistence.test.ts(9 tests passing).npm run typecheck(tsc --noEmit) and all related test suites.