动画:施法效果 #386
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?
释放火焰/电/冰法术的时候,人物本身应该有动画效果,比如火会从脚下开始出现一个火焰包围的视觉效果
暗黑破坏神 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,法师三大元素系法术完整映射如下:Skills.txtcastoverlaydata/global/overlays/)fire_cast_1FireCast_for_Sorceress.dcc[-55, -127, 117, 164]fire_cast_2FireCast2.dcc[-74, -89, 145, 133]ice_cast_1IceCastNew01.dcc[-49, -90, 97, 55]ice_cast_2IceCastNew02.dcc[-58, -100, 115, 123]ice_cast_3IceCastNew03.dcc[-63, -113, 127, 148]light_cast_1LightningCast.dcc[-79, -107, 164, 144]light_cast_2LightningCastRunesFront.dcc[-73, -154, 147, 190]teleportTeleport.dcc[-61, -108, 136, 154]三、 系统架构与实现方案 (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进行真实调色板色彩映射。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活跃实体管理:executePlayerSkillCast触发施法动作时,根据技能castoverlay生成ActiveOverlay。overlay.frame += overlay.animRate / 25。Math.floor(overlay.frame) >= overlay.maxFrames时,标记expired = true并在 tick 结束时销毁(单次播放不循环)。(caster.x, caster.y)。3. 渲染管线集成 (
src/scene/act-scene.ts)loadOverlayArtMap预载overlays/*.png。trans === 3,切换 Canvas2Dctx.globalCompositeOperation = 'lighter'或 WebGL Additive 混合状态,绘制完成后恢复source-over。drawX = overlay.x + frameMeta.anchorX,drawY = overlay.y + frameMeta.anchorY。四、 验证与回归测试策略
parseSkillsTxt与Skills.txt、Overlay.txt的castoverlay字段及参数完全一致。fire_cast_1在 25 FPS 模拟下,在第 22 个 tick 精确结束并移除。FireCast_for_Sorceress、IceCastNew01、LightningCast纹理图集无缺失、锚点边界无裁切、Additive 模式下正确渲染。施法动画特效 (Cast Overlay) 实现已在分支
issue-386完成并推送到远端仓库6eaeab4(feat(skills): authentic 1.13c Cast Overlay system and elemental spell animations (Fixes #386))fire_cast_1/fire_cast_2、冰系ice_cast_1..3、电系light_cast_1..2、传送teleport)public/overlays/tests/cast-overlay-113c.test.ts13/13 全绿,全局 3,714 个测试 100% 通过,0 回归,TypeScript 0 报错。施法动画半透明方框问题修复与动态光影独立跟踪
renderer.drawSolid绘制双层矩形作为点光源光晕的临时占位。由于目前引擎尚未建立平滑径向衰减(Radial Falloff)或 2.5D 平面光照贴图系统,实心几何四边形在渲染时呈现为两层有棱角的半透明方框。renderer.drawSolid临时光照绘制代码,保留纯净的 1.13c 原版 DCC 精灵 Additive Blending 覆盖动画。15948eb/513ad14(fix(skills): remove translucent solid light boxes during cast overlay animation (#386, #395))