fix(skill): 修复冰尖柱 (Glacial Spike #55) 命中未触发爆炸动画与 64px 群体冰冻伤害判定缺陷 #430
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)
在当前客户端实操与技能实装中,法师 18 级核心冰系技能 冰尖柱 (Glacial Spike, Skill ID: 55) 存在严重的命中结算与原版一致性缺陷:
freezeexplode/FreezeExplodeCenter)与次级碎冰飞溅特效(glacialspikeejecta/FreezeExplodeEjecta),缺乏打击感。frozenTicks > 0,场景渲染层(src/scene/act-scene.ts)仅有chillTicks(减速迟缓)着色逻辑,缺失绝对冰冻(Freeze)的动画帧冻结与高饱和度冰蓝材质着色,导致玩家视觉上误以为怪物完全未被冰冻。暴雪 1.13c 原版权威数据与机制基准 (Blizzard 1.13c Ground Truth Invariants)
根据 Diablo II v1.13c 官方数据表(
Skills.txt、Missiles.txt)与逆向汇编规范:1.
Skills.txt(Row 55: Glacial Spike)55(#055), Class:sor, ReqLevel:18srvmissile = "glacialspike",cltmissile = "glacialspike"ice_cast_24subtiles(即 4 * 16 = 64 像素,在 2:1 等轴测视角下为 64px 椭圆判定,约 2.6 码)0(固定 64px,不随等级扩大)50帧(2.00 秒)3帧 / 级(+0.12 秒 / 级)3(每投入 1 点暴风雪基础技能,冰冻时间延长 +3%)5(每投入 1 点冰弹 / 冰风暴 / 冰封球,冰冷伤害增加 +5%)auralencalc = "ln34 * (100 + skill('Blizzard'.blvl) * par7) / 100"EDmgSymPerCalc = "(skill('Ice Bolt'.blvl) + skill('Ice Blast'.blvl) + skill('Frozen Orb'.blvl)) * par8"2.
Missiles.txt(Row 96: glacialspike)pSrvDoFunc = 1(直线飞行),pSrvHitFunc = 13(原版 MISSMODE_SrvHit13_GlacialSpike)damage radius (0 = skill)-> 引用技能 Param1 (4 subtiles = 64px)freeze length (0 = skill)-> 引用技能 Param3/Param4 及协同公式CltHitSubMissile1 = "freezingarrowexp1"(即freezeexplode/FreezeExplodeCenter,ID 88,AnimLen 15)CltHitSubMissile2 = "freezingarrowexp2"(即glacialspikeejecta/FreezeExplodeEjecta,ID 89,飞溅冰锥)HitSound = "sorceress_iceblast_impact_1"Vel = 16(400 px/s),Range = 40(640 px),CollideKill = 1,LastCollide = 1缺陷根因深度剖析 (Root Cause Analysis)
根因 1:
src/game/skills.ts(tickProjectiles) 投射物命���未分发爆炸投射物与次级投射物在
tickProjectiles中(约 4597–4618 行):当投射物击中非穿透目标时,当前逻辑仅对暴风雪碎片(
isBlizzardShard)推入了爆炸投射物,而对glacialspike、fireball等需要爆裂效果的投射物,完全没有根据explosionMissile/hitSubMissile产生爆破投射物派生!根因 2:
src/game/engine.ts中怪物实例索引与循环下标混淆,导致 AoE 溅射结算脱靶在
engine.tick()(约 440–505 行)中:hit.targetIndex来自targets(即数组下标0, 1, 2, ...),而排除自身时却使用了m.index === hit.targetIndex(m.index为怪物在生成时赋予的 ID,一旦有怪物死亡清理或非连续下标,就会出现自身判定混乱)。m.index,而damageMonster(world, monsterIndex)是按数组下标寻址world.monsters[monsterIndex],造成严重的寻址错位!根因 3:场景渲染层缺失 Solid Freeze 视觉呈现 (
src/scene/act-scene.ts)在
src/scene/act-scene.ts第 5949 行与 5976 行:渲染管线仅检查了减速状态
chillTicks,完全没有处理frozenTicks > 0(绝对冰冻)!monsterAnimators)必须在被冻结期间暂停步进,使怪物在物理上和视觉上完全定格在冰雕状态!根因 4:爆裂动画美术资源未接入次级冰锥 (
glacialspikeejecta)在
src/game/engine.ts中,只读取了单一的mslData?.explosionMissile(freezeexplode),遗漏了 1.13c 原版规范的次级辐射状冰渣飞溅动画glacialspikeejecta(public/missiles/freezeexplodeejecta.png)。修复方案与任务规划 (Remediation Plan)
src/game/skills.ts/src/game/engine.ts):pSrvHitFunc = 13规范:在投射物触碰怪物或撞击墙体时,于命中点正确生成freezeexplode与glacialspikeejecta爆破特效。sorceress_iceblast_impact_1。m.index与world.monsters数组下标的脱节。frozenTicks),自动跳过具备cannot_be_frozen词缀或冰系免疫(Cold Immune)的单位。frozenTicks > 0时,定格当前动画帧(跳过动画步进),渲���层应用亮蓝冰冻着色(Solid Freeze Tint),解冻后恢复行动与常态材质。tests/skills/sor/skill-055-glacial-spike.test.ts,覆盖:cannot_be_frozen保护的怪物仅受伤害不被定身。