6.9 KiB
6.9 KiB
暗黑破坏神 II (v1.13c) 施法视觉效果 (Cast Overlay) 底层调查与实现设计规范
一、 机制调查与 1.13c 真实底层数据 (Ground Truth Invariant)
在暗黑破坏神 II v1.13c 引擎体系(D2Common.dll、D2Client.dll)中,释放法术时角色脚下涌现并包裹全身的动画效果并非角色自身动作(Action Frame)或飞弹(Missile),而是属于 Unit Overlay(单位覆盖动画系统)。
1. 数据驱动关系
Skills.txt:包含列castoverlay,定义技能施展时触发的覆盖效果标识(例如技能 36 火弹绑定fire_cast_1)。Overlay.txt:集中定义所有覆盖效果的物理与渲染属性:Filename:指向 DCC 动画资源路径(位于d2data.mpq: data/global/overlays/{Filename}.dcc)。Frames:动画总帧数。AnimRate:动画播放速率。法术施法特效原版均为 16(代表在 25 FPS 逻辑刻下,每 25 tick 播放 16 帧动画,即步长16 / 25 = 0.64帧/刻,总时长约 0.88 秒)。Trans:混合渲染模式。原版为 3(Additive Blending / 增色叠加混合),呈现火焰、电光与寒冰的自发光半透明视觉质感。PreDraw:渲染层级。原版均为 0(Foreground / 前景层),先绘制施法者角色精灵,再在前景叠加该 Overlay,形成火焰包裹躯干的立体层次。Xoffset/Yoffset/Height1..4:均为 0,严格以施法者单位脚底地面中心点(0, 0)为基准。InitRadius/Radius/Red, Green, Blue:动态点光源参数(半径均为 9 个子网格)。Overlay 激活期间会在角色周围投射对应属性的动态光晕。
二、 核心法术原版 Overlay 映射与 DCC 规格表
经解析 samples/d2/Patch_D2.mpq 与 d2data.mpq,法师三大元素系法术完整映射如下:
| 技能类别 | 技能名称 (Id) | Skills.txt castoverlay |
DCC 文件名 (data/global/overlays/) |
帧数 | DCC 碰撞盒 (Left, Top, W, H) | 光照颜色 (R, G, B, Radius) | 视觉特征 |
|---|---|---|---|---|---|---|---|
| 火焰系 | 火弹 Fire Bolt (36) | fire_cast_1 |
FireCast_for_Sorceress.dcc |
14 | [-55, -127, 117, 164] |
(255, 178, 64, 9) | 从脚底升腾直窜头顶的火焰柱 (即 Issue 附件效果) |
| 火焰系 | 火球 (47), 强化/火焰强化 (46), 火墙 (51), 陨石 (56), 九头海蛇 (62) | fire_cast_2 |
FireCast2.dcc |
16 | [-74, -89, 145, 133] |
(255, 178, 64, 9) | 范围更大、旋转包裹的炽热烈焰 |
| 冰霜系 | 冰弹 (39), 冰封甲 (40), 冰风暴 (45) | ice_cast_1 |
IceCastNew01.dcc |
15 | [-49, -90, 97, 55] |
(81, 81, 255, 9) | 脚下微弱旋起的寒冰碎屑与白霜冷雾 |
| 冰霜系 | 霜之新星 (44), 碎冰甲 (50), 冰尖柱 (55) | ice_cast_2 |
IceCastNew02.dcc |
15 | [-58, -100, 115, 123] |
(81, 81, 255, 9) | 向上旋转升腾的深蓝冰柱与霜雾 |
| 冰霜系 | 暴风雪 (59), 寒冰甲 (60), 冰封球 (64) | ice_cast_3 |
IceCastNew03.dcc |
16 | [-63, -113, 127, 148] |
(81, 81, 255, 9) | 强烈的暴风雪霜华与立体冰凌环绕 |
| 闪电系 | 充能弹 (38), 静电场 (42), 新星 (48), 闪电 (49), 连锁闪电 (53) | light_cast_1 |
LightningCast.dcc |
10 | [-79, -107, 164, 144] |
(255, 255, 255, 9) | 脚底向外炸裂并包裹全身的电弧跳跃 |
| 闪电系 | 心灵传动 (43), 雷云风暴 (57), 能量护盾 (58) | light_cast_2 |
LightningCastRunesFront.dcc |
10 | [-73, -154, 147, 190] |
(255, 255, 255, 9) | 闪电符文闪耀与高耸电光柱 |
| 特殊 | 传送 Teleport (54) | teleport |
Teleport.dcc |
18 | [-61, -108, 136, 154] |
(255, 255, 200, 5) | 金黄色空间坍缩与残影粒子 |
三、 系统架构与实现方案 (diablo2-web)
遵循项目 Zero Runtime MPQ Invariant 及 Anti-Silent Failures 原则:
1. 离线资源烘焙流水线 (scripts/pack-overlays.ts)
- 提取
d2data.mpq中上述 8 个关键施法 Overlay DCC 精灵文件。 - 读取
data/global/palette/ACT1/pal.pl2进行真实调色板色彩映射。 - 将单向动画打包成 PNG 纹理图集并导出 JSON 元数据至
public/overlays/与samples/d2-packs/overlays/。 - 自动生成类型定义
src/render/overlays-meta.ts,提供精确的box.left, box.top, width, height, animRate, trans常量。
2. 运行时数据契约与实体抽象 (src/game/skills.ts & src/game/engine.ts)
- 扩展
SkillDef接口,包含castOverlay?: string。 - 建立
CANONICAL_113C_OVERLAYS真值表,包含 overlay 标识到对应资源与物理属性的映射。 - 在
GameEngine中引入ActiveOverlay活跃实体管理:export interface ActiveOverlay { readonly id: string readonly overlayName: string readonly casterId: string x: number y: number frame: number readonly maxFrames: number readonly animRate: number readonly preDraw: boolean readonly trans: number readonly lightRadius: number readonly lightColor: readonly [number, number, number] expired: boolean } - 生命周期规则:
- 玩家或怪物在
executePlayerSkillCast触发施法动作时,根据技能castoverlay生成ActiveOverlay。 - 每个逻辑 tick(25 FPS):
overlay.frame += overlay.animRate / 25。 - 当
Math.floor(overlay.frame) >= overlay.maxFrames时,标记expired = true并在 tick 结束时销毁(单次播放不循环)。 - Overlay 坐标实时同步施法者当前脚下位置
(caster.x, caster.y)。
- 玩家或怪物在
3. 渲染管线集成 (src/scene/act-scene.ts)
- 资源载入:通过
loadOverlayArtMap预载overlays/*.png。 - 深度层级(Z-Order):
- 角色绘制完成后、飞弹绘制前,执行前景 Overlay 渲染。
- 混合模式(Blend Mode):
- 遇到
trans === 3,切换 Canvas2Dctx.globalCompositeOperation = 'lighter'或 WebGL Additive 混合状态,绘制完成后恢复source-over。
- 遇到
- 锚点投影(Anchor Projection):
- 精确应用 DCC 包围盒偏移:
drawX = overlay.x + frameMeta.anchorX,drawY = overlay.y + frameMeta.anchorY。
- 精确应用 DCC 包围盒偏移:
- 动态光照反馈:
- 在 Overlay 存活期间,将其注册为动态点光源(如火焰投射 9 码的 RGB(255, 178, 64) 暖黄光晕)。
四、 验证与回归测试策略
- 表格对齐测试:验证
parseSkillsTxt与Skills.txt、Overlay.txt的castoverlay字段及参数完全一致。 - 生命周期测试:验证 14 帧的
fire_cast_1在 25 FPS 模拟下,在第 22 个 tick 精确结束并移除。 - 渲染与图集测试:验证
FireCast_for_Sorceress、IceCastNew01、LightningCast纹理图集无缺失、锚点边界无裁切、Additive 模式下正确渲染。 - 全场景稳定性:自动化 Headless 运行,保障全 136 个关卡环境施法 Overlay 无跨法术贴图污染或未定义崩溃。