[Skill 56] 陨石 (Meteor) 1.13c 原版机制与高阶投射物复现规范 #401

Closed
opened 2026-09-23 12:04:39 +00:00 by troytt · 1 comment
Owner

[Skill 56] 陨石 (Meteor) 1.13c 原版机制与高阶投射物复现规范

技能属性:法师火焰系终极轰炸技能 (Skill ID: 56, Meteor)
底层真值参考:D2Game.dll (v1.13c), D2Common.dll, Skills.txt, Missiles.txt, Overlay.txt
开发指南:docs/frozen-orb-skill-development-guide.md
核心原则:Diablo II Parity (1.13c Ground Truth), Zero Runtime MPQ, Anti-Silent Failures, 2:1 Isometric Projection


1. 原版底层数据溯源 (Ground Truth Analysis)

1.1 Skills.txt 核心参数 (Row 56 — Meteor)

字段 (Column) 1.13c 取值 说明与算法依据
skill / Id Meteor / 56 索格林女巫 (Sorceress) 火焰系 24 级高阶技能
srvdofunc / cltdofunc 28 / 28 施法服务端逻辑 (SKILLS_SrvDo28, VA 0x6FC63FA0)
srvmissilea meteorcenter 控制器投射物 (ID 101)
delay 30 施法延迟 (Cast Delay): 30 逻辑刻 (1.20 秒)
mana / lvlmana / manashift 34 / 1 / 7 法力消耗公式: \text{ManaCost}(\text{slvl}) = 34 + (\text{slvl} - 1) (slvl 1: 34, slvl 10: 43, slvl 20: 53)
castoverlay fire_cast_2 施法者脚底地火印记 (FireCast2.dcc, 16 帧, Trans: 3, RGB: 255, 178, 64)
stsound / dosound sorceress_cast_fire / sorceress_meteor 施法启动与投射物下落音效
Param1 (calc1: ln12) 6 主爆炸 AOE 半径: 6 次格子 (subtiles) = 4 码 (~120px)
Param3 / Param4 30 / 15 地表残余火海存活刻数: 30 + (\text{slvl} - 1) \times 15 刻 (slvl 1: 30 刻/1.2s, slvl 10: 165 刻/6.6s, slvl 20: 315 刻/12.6s)
HitShift 8 爆炸伤害定点数精度 (2^8 = 256)
EMin / EMax 80 / 100 基础爆炸火焰伤害下限/上限 (无物理伤害,100% 纯火焰伤害)
5 阶成长 EMinLev [23, 39, 79, 81, 83] 5 阶段每级最小伤害增量
5 阶成长 EMaxLev [25, 41, 81, 83, 85] 5 阶段每级最大伤害增量
EDmgSymPerCalc (skill('Fire Bolt'.blvl)+skill('Fire Ball'.blvl))*par8 协同加成: 火弹 (36) 与火球 (47) 纯基础硬点数每级 +5% 火焰伤害
ApplyMastery 1 火焰支配 (Fire Mastery) 乘算增幅 (+30% + (\text{slvl}_{\text{FM}}-1) \times 7%)

1.2 Missiles.txt 级联投射物族群体系

投射物标识 ID pSrvDoFunc pSrvHitFunc 存活 (Range) 速度 (Vel) 贴图资源 (CelFile) 帧数 混合 (Trans) 碰撞/生命周期行为
meteorcenter 101 0 14 60 刻 (2.4s) 0 MeteorTargetIndicator 17 1 (Additive) 地面瞄准光环,60 刻后触发 pSrvHitFunc 14 引爆 AOE 并生成 18 团地火
meteor 100 0 0 60 刻 (2.4s) 0 Meteor 12 1 (Additive) 核心火球,从天空高程沿斜向对角线滑降至地面目标点
meteortail 102 0 0 60 刻 (2.4s) 0 MeteorTail 12 1 (Additive) 火焰拖尾,紧随 core 同步滑降,朝向左上方拉伸
meteorexplode 103 0 0 16 刻 (0.64s) 0 ExpArrowExplode 16 1 (Additive) 地面引爆视觉特效,单次播放 16 帧爆裂火球 (LoopAnim: 0)
meteorfire 240 5 0 动态 (30+15(s-1)) 0 groundFireMedium 37 1 (Additive) 地表持续灼烧火海,播放前 12 帧萌发后进入 12..36 帧循环,周期伤害

1.3 D2Game.dll 18 坐标点地火阵列真值 (0x6FD1C918 & 0x6FD1C8D0)

在 MISSMODE_CreateMeteor_MoltenBoulderSubmissiles (VA 0x6FC5CEC0) 中,原地火海生成严格读取两张 18 项 int16_t 偏移表:

export const METEOR_FIRE_SUBTILE_OFFSETS: readonly { readonly x: number; readonly y: number }[] = Object.freeze([
  { x:  2, y: -2 }, // [0]  Inner Ring
  { x: -2, y: -2 }, // [1]  Inner Ring
  { x:  0, y:  2 }, // [2]  Inner Ring
  { x:  0, y:  5 }, // [3]  North Tip
  { x: -3, y:  3 }, // [4]  North-West Outer
  { x:  0, y:  3 }, // [5]  Center-North
  { x:  3, y:  3 }, // [6]  North-East Outer
  { x: -1, y:  2 }, // [7]  Center Cluster
  { x:  1, y:  1 }, // [8]  Center Cluster
  { x: -1, y: -1 }, // [9]  Center Cluster
  { x:  2, y: -1 }, // [10] Center Cluster
  { x: -4, y: -2 }, // [11] West Tip
  { x: -3, y: -2 }, // [12] West Outer
  { x: -1, y: -3 }, // [13] South-West Outer
  { x:  0, y: -4 }, // [14] South Tip
  { x:  1, y: -3 }, // [15] South-East Outer
  { x:  3, y: -3 }, // [16] East Outer
  { x:  4, y: -2 }, // [17] East Tip
]);
  • 2:1 二等角投影大地坐标映射:
    \text{TargetPosX} = G_x + \text{offset}_x \times 20
    \text{TargetPosY} = G_y + \text{offset}_y \times 10 \quad (20 \times 0.5)
  • 碰撞剔除:若目标点存在 COLLIDE_WALL | COLLIDE_BLANK 阻挡,则跳过生成该团地火。
  • 残余地火伤害公式:
    • 基础数值:15-25,5 阶段成长 [4, 5, 6, 6, 6],HitShift: 3 (2^3 = 8 精度单位)
    • 协同加成:地狱火 (Inferno) 纯硬点数每级 +3%
    • 每秒伤害:\text{DPS} = \text{RawDamage} \times \frac{25 \times 8}{256} = \text{RawDamage} \times 0.78125

2. 离线资产烘焙与零运行时 MPQ (Zero Runtime MPQ Invariant)

  1. DCC 提取与 PNG 烘焙清单:
    • Meteor.dcc: 核心火球 (12 帧, 22x22px, Trans: 1)
    • MeteorTail.dcc: 火焰拖尾 (12 帧, 77x125px, Trans: 1)
    • MeteorTargetIndicator.dcc: 地面光环 (17 帧, 112x74px, Trans: 1, 2:1 椭圆)
    • ExpArrowExplode.dcc: 爆裂火球 (16 帧, 208x174px, Trans: 1, LoopAnim: 0)
    • groundFireMedium.dcc: 残余火海 (37 帧, 66x136px, Trans: 1, SubLoop 12..36)
    • groundFireSmall.dcc: 外围小地火 (37 帧, 66x89px, Trans: 1)
  2. 零黑边 Alpha 阈值过滤:
    • 过滤条件:if (Math.max(r, g, b) <= 4) alpha = 0; else alpha = Math.min(255, Math.round(((m - 4) / 56) * 255));
    • 确保在 2D Canvas 与 WebGL 下加色混合 (ctx.globalCompositeOperation = 'lighter') 呈现纯净魔法质感,无任何黑斑黑框。

3. 7 维全覆盖验证验收清单 (Acceptance Criteria)

  • 维度 1:静态数据真值校验 (Skills.txt ID 56, Missiles.txt ID 100-103, 240, delay 30, mana 34+(slvl-1), radius 6)
  • 维度 2:烘焙资产与图集元数据完整性 (meteor, meteortail, meteorcenter, meteorexplode, meteorfire 存在于 public/missiles/ 与 src/render/missiles-meta.ts,零黑边)
  • 维度 3:60 刻瞄准倒计时与无害发射体判定 (meteorcenter 存活 60 刻,下落阶段不造成直接接触碰撞伤害)
  • 维度 4:主爆炸伤害与 5 阶数值及协同 (slvl 1: 80-100, slvl 10: 319-357, slvl 20: 869-927, 火弹/火球 +5%/点,火支配乘算)
  • 维度 5:爆炸 AOE 范围与 2:1 椭圆判定 (半径 120px,垂直分量乘入 ISO_GROUND_ASPECT_RATIO = 0.5 椭圆判定)
  • 维度 6:18 偏移点地火阵列与寿命公式 (精确匹配 18 组汇编偏移,寿命 30 + (slvl - 1) * 15 刻,SubLoop 12..36)
  • 维度 7:残余火海周期跳字与 NextDelay = 0 重叠杀伤 (HitShift 3 周期扣血,地狱火 +3%/点协同,多火堆重叠独立结算)
# [Skill 56] 陨石 (Meteor) 1.13c 原版机制与高阶投射物复现规范 > **技能属性**:法师火焰系终极轰炸技能 (Skill ID: 56, `Meteor`) > **底层真值参考**:`D2Game.dll` (v1.13c), `D2Common.dll`, `Skills.txt`, `Missiles.txt`, `Overlay.txt` > **开发指南**:`docs/frozen-orb-skill-development-guide.md` > **核心原则**:Diablo II Parity (1.13c Ground Truth), Zero Runtime MPQ, Anti-Silent Failures, 2:1 Isometric Projection --- ## 1. 原版底层数据溯源 (Ground Truth Analysis) ### 1.1 `Skills.txt` 核心参数 (Row 56 — Meteor) | 字段 (Column) | 1.13c 取值 | 说明与算法依据 | | :--- | :--- | :--- | | `skill` / `Id` | `Meteor` / `56` | 索格林女巫 (Sorceress) 火焰系 24 级高阶技能 | | `srvdofunc` / `cltdofunc` | `28` / `28` | 施法服务端逻辑 (`SKILLS_SrvDo28`, VA 0x6FC63FA0) | | `srvmissilea` | `meteorcenter` | 控制器投射物 (ID 101) | | `delay` | `30` | **施法延迟 (Cast Delay)**: 30 逻辑刻 (1.20 秒) | | `mana` / `lvlmana` / `manashift` | `34` / `1` / `7` | 法力消耗公式: $\text{ManaCost}(\text{slvl}) = 34 + (\text{slvl} - 1)$ (slvl 1: 34, slvl 10: 43, slvl 20: 53) | | `castoverlay` | `fire_cast_2` | 施法者脚底地火印记 (`FireCast2.dcc`, 16 帧, Trans: 3, RGB: 255, 178, 64) | | `stsound` / `dosound` | `sorceress_cast_fire` / `sorceress_meteor` | 施法启动与投射物下落音效 | | `Param1` (`calc1: ln12`) | `6` | **主爆炸 AOE 半径**: 6 次格子 (subtiles) = 4 码 (~120px) | | `Param3` / `Param4` | `30` / `15` | **地表残余火海存活刻数**: $30 + (\text{slvl} - 1) \times 15$ 刻 (slvl 1: 30 刻/1.2s, slvl 10: 165 刻/6.6s, slvl 20: 315 刻/12.6s) | | `HitShift` | `8` | 爆炸伤害定点数精度 ($2^8 = 256$) | | `EMin` / `EMax` | `80` / `100` | 基础爆炸火焰伤害下限/上限 (无物理伤害,100% 纯火焰伤害) | | 5 阶成长 `EMinLev` | `[23, 39, 79, 81, 83]` | 5 阶段每级最小伤害增量 | | 5 阶成长 `EMaxLev` | `[25, 41, 81, 83, 85]` | 5 阶段每级最大伤害增量 | | `EDmgSymPerCalc` | `(skill('Fire Bolt'.blvl)+skill('Fire Ball'.blvl))*par8` | 协同加成: 火弹 (36) 与火球 (47) 纯基础硬点数每级 +5% 火焰伤害 | | `ApplyMastery` | `1` | 火焰支配 (Fire Mastery) 乘算增幅 ($+30% + (\text{slvl}_{\text{FM}}-1) \times 7%$) | --- ### 1.2 `Missiles.txt` 级联投射物族群体系 | 投射物标识 | ID | `pSrvDoFunc` | `pSrvHitFunc` | 存活 (`Range`) | 速度 (`Vel`) | 贴图资源 (`CelFile`) | 帧数 | 混合 (`Trans`) | 碰撞/生命周期行为 | | :--- | :---: | :---: | :---: | :---: | :---: | :--- | :---: | :---: | :--- | | **`meteorcenter`** | 101 | 0 | **14** | 60 刻 (2.4s) | 0 | `MeteorTargetIndicator` | 17 | 1 (Additive) | 地面瞄准光环,60 刻后触发 pSrvHitFunc 14 引爆 AOE 并生成 18 团地火 | | **`meteor`** | 100 | 0 | 0 | 60 刻 (2.4s) | 0 | `Meteor` | 12 | 1 (Additive) | 核心火球,从天空高程沿斜向对角线滑降至地面目标点 | | **`meteortail`** | 102 | 0 | 0 | 60 刻 (2.4s) | 0 | `MeteorTail` | 12 | 1 (Additive) | 火焰拖尾,紧随 core 同步滑降,朝向左上方拉伸 | | **`meteorexplode`** | 103 | 0 | 0 | 16 刻 (0.64s) | 0 | `ExpArrowExplode` | 16 | 1 (Additive) | 地面引爆视觉特效,单次播放 16 帧爆裂火球 (`LoopAnim: 0`) | | **`meteorfire`** | 240 | **5** | 0 | 动态 ($30+15(s-1)$) | 0 | `groundFireMedium` | 37 | 1 (Additive) | 地表持续灼烧火海,播放前 12 帧萌发后进入 12..36 帧循环,周期伤害 | --- ### 1.3 `D2Game.dll` 18 坐标点地火阵列真值 (`0x6FD1C918` & `0x6FD1C8D0`) 在 `MISSMODE_CreateMeteor_MoltenBoulderSubmissiles` (VA `0x6FC5CEC0`) 中,原地火海生成严格读取两张 18 项 `int16_t` 偏移表: ```typescript export const METEOR_FIRE_SUBTILE_OFFSETS: readonly { readonly x: number; readonly y: number }[] = Object.freeze([ { x: 2, y: -2 }, // [0] Inner Ring { x: -2, y: -2 }, // [1] Inner Ring { x: 0, y: 2 }, // [2] Inner Ring { x: 0, y: 5 }, // [3] North Tip { x: -3, y: 3 }, // [4] North-West Outer { x: 0, y: 3 }, // [5] Center-North { x: 3, y: 3 }, // [6] North-East Outer { x: -1, y: 2 }, // [7] Center Cluster { x: 1, y: 1 }, // [8] Center Cluster { x: -1, y: -1 }, // [9] Center Cluster { x: 2, y: -1 }, // [10] Center Cluster { x: -4, y: -2 }, // [11] West Tip { x: -3, y: -2 }, // [12] West Outer { x: -1, y: -3 }, // [13] South-West Outer { x: 0, y: -4 }, // [14] South Tip { x: 1, y: -3 }, // [15] South-East Outer { x: 3, y: -3 }, // [16] East Outer { x: 4, y: -2 }, // [17] East Tip ]); ``` - **2:1 二等角投影大地坐标映射**: $$\text{TargetPosX} = G_x + \text{offset}_x \times 20$$ $$\text{TargetPosY} = G_y + \text{offset}_y \times 10 \quad (20 \times 0.5)$$ - **碰撞剔除**:若目标点存在 `COLLIDE_WALL | COLLIDE_BLANK` 阻挡,则跳过生成该团地火。 - **残余地火伤害公式**: - 基础数值:15-25,5 阶段成长 `[4, 5, 6, 6, 6]`,`HitShift: 3` ($2^3 = 8$ 精度单位) - 协同加成:地狱火 (Inferno) 纯硬点数每级 +3% - 每秒伤害:$\text{DPS} = \text{RawDamage} \times \frac{25 \times 8}{256} = \text{RawDamage} \times 0.78125$ --- ## 2. 离线资产烘焙与零运行时 MPQ (Zero Runtime MPQ Invariant) 1. **DCC 提取与 PNG 烘焙清单**: - `Meteor.dcc`: 核心火球 (12 帧, 22x22px, Trans: 1) - `MeteorTail.dcc`: 火焰拖尾 (12 帧, 77x125px, Trans: 1) - `MeteorTargetIndicator.dcc`: 地面光环 (17 帧, 112x74px, Trans: 1, 2:1 椭圆) - `ExpArrowExplode.dcc`: 爆裂火球 (16 帧, 208x174px, Trans: 1, LoopAnim: 0) - `groundFireMedium.dcc`: 残余火海 (37 帧, 66x136px, Trans: 1, SubLoop 12..36) - `groundFireSmall.dcc`: 外围小地火 (37 帧, 66x89px, Trans: 1) 2. **零黑边 Alpha 阈值过滤**: - 过滤条件:`if (Math.max(r, g, b) <= 4) alpha = 0; else alpha = Math.min(255, Math.round(((m - 4) / 56) * 255));` - 确保在 2D Canvas 与 WebGL 下加色混合 (`ctx.globalCompositeOperation = 'lighter'`) 呈现纯净魔法质感,无任何黑斑黑框。 --- ## 3. 7 维全覆盖验证验收清单 (Acceptance Criteria) - [ ] **维度 1:静态数据真值校验** (Skills.txt ID 56, Missiles.txt ID 100-103, 240, delay 30, mana 34+(slvl-1), radius 6) - [ ] **维度 2:烘焙资产与图集元数据完整性** (meteor, meteortail, meteorcenter, meteorexplode, meteorfire 存在于 public/missiles/ 与 src/render/missiles-meta.ts,零黑边) - [ ] **维度 3:60 刻瞄准倒计时与无害发射体判定** (meteorcenter 存活 60 刻,下落阶段不造成直接接触碰撞伤害) - [ ] **维度 4:主爆炸伤害与 5 阶数值及协同** (slvl 1: 80-100, slvl 10: 319-357, slvl 20: 869-927, 火弹/火球 +5%/点,火支配乘算) - [ ] **维度 5:爆炸 AOE 范围与 2:1 椭圆判定** (半径 120px,垂直分量乘入 ISO_GROUND_ASPECT_RATIO = 0.5 椭圆判定) - [ ] **维度 6:18 偏移点地火阵列与寿命公式** (精确匹配 18 组汇编偏移,寿命 30 + (slvl - 1) * 15 刻,SubLoop 12..36) - [ ] **维度 7:残余火海周期跳字与 NextDelay = 0 重叠杀伤** (HitShift 3 周期扣血,地狱火 +3%/点协同,多火堆重叠独立结算)
Author
Owner

[Skill 56] 陨石 (Meteor) 1.13c 原版全量复现与主分支合并交付报告

1. 提交与合并集成信息 (Integrated Commits)

  • 96eee67 feat(skills): implement Skill #056 Meteor with 1.13c ground truth parity (Ref #401)
  • 84c7730 fix(skills): implement falling meteor dual sprite trajectory, frame indexing, exact tick-60 detonation, and wall collision
  • 分支状态: 已完成 Fast-forward 合并进入 main,并成功推送到 origin/main (39de193..84c7730)。
  • 工作区清理: 临时工作树 .worktrees/skill-meteor 已完全移除,特性分支 feat/skill-56-meteor 已删除。

2. 1.13c 原版机制与底层真值复现细节 (Diablo II v1.13c Parity)

  1. 技能参数与消耗 (Skills.txt Row 56):
    • 技能类型: 索格林女巫 (Sorceress) 24 级高阶火焰技能。
    • 施法延迟 (Cast Delay): 30 逻辑刻 (1.20 秒),正确触发 STATE_SKILLDELAY。
    • 法力消耗公式: 34 + (\text{slvl} - 1) (slvl 1: 34, slvl 10: 43, slvl 20: 53)。
    • 施法脚底印记: fire_cast_2 (FireCast2.dcc, 16 帧, Trans: 3)。
  2. 双层投射物天顶斜向滑降与加色混合 (Dual Sprite Descent & Additive Blending):
    • 遵循 Missiles.txt 100 (meteor) 与 102 (meteortail):
      Z(t) = \text{remainingTicks} \times 25, X(t) = -\text{remainingTicks} \times 15。
    • 在 60 刻倒计时期间自左上方斜向滑降至地面目标点,以 blendMode: "additive" (Trans: 1) 渲染纯净魔法火焰。
    • 在纯无头/降级环境下提供完整程序化火焰拖尾回退绘制。
  3. 精准 Tick 60 爆炸与 2:1 椭圆 AOE 判定:
    • 地面瞄准光环 meteorcenter (ID 101) 倒计时 60 刻,前 59 刻为无害瞄准阶段 (isHarmlessEmitter),第 60 刻准时触发爆炸。
    • 主爆炸火焰伤害基于 5 阶成长曲线 [23, 39, 79, 81, 83] / [25, 41, 81, 83, 85] 与火弹/火球 +5%/硬点数协同及火焰支配乘算加成。
    • 主爆炸 AOE 半径 120px,垂直方向乘入 ISO_GROUND_ASPECT_RATIO = 0.5 进行 2:1 椭圆距离判定。
  4. 18 偏移点地表火海阵列与墙体剔除 (D2Game.dll 0x6FD1C918 & 0x6FD1C8D0):
    • 引爆瞬间严格按汇编两张 18 项偏移表生成 meteorfire (ID 240) 残余地火阵列。
    • 寿命公式: 30 + (\text{slvl} - 1) \times 15 刻。
    • 贴图序列播放: 前 12 帧萌发单次播放,后续帧数在 12..36 循环 (SubLoop 12..36)。
    • 结合地图碰撞体判定,落在墙体内部的火堆自动剔除。
    • 周期跳字伤害基于 HitShift = 3,地狱火 +3%/点协同,NextDelay = 0 支持多堆火海独立重叠杀伤。
  5. 零运行时 MPQ 原则与资产烘焙:
    • meteor, meteortail, meteorcenter, meteorexplode, meteorfire, firemedium, firesmall 均烘焙为 32-bit RGBA PNG 图集及 JSON 元数据。
    • 经过零黑边 Alpha 阈值过滤,无任何黑斑或伪影。

3. 全维度自动化验证结果 (Verification Evidence)

  • TypeScript 静态类型检查: npm run typecheck (tsc --noEmit) -> 0 errors, Exit code 0。
  • 陨石专属验证套件 (tests/skills/sor/skill-056-meteor.test.ts, tests/meteor-stress.test.ts, tests/meteor-adversarial-stress.test.ts):
    • 39 / 39 测试全部通过 (100%)。
  • 法师全系技能回归套件 (tests/skills/sor/):
    • 30 个测试文件全部通过,102 / 102 项测试通过 (100%)。
  • 法医级审计 (Forensic Audit):
    • 零 MPQ/DCC 运行时调用,零黑边违规,零假实现/硬编码 mock,完整保持真实状态与 1.13c 物理仿真。

4. 交付与结项确认 (Conclusion)

  • 本技能已完全实现并通过团队审查与审计,工作树已清理,分支已合并推送到 origin/main。
  • 感谢 Master 的指导与监督!本 Issue 正式闭环关闭。
## [Skill 56] 陨石 (Meteor) 1.13c 原版全量复现与主分支合并交付报告 ### 1. 提交与合并集成信息 (Integrated Commits) - `96eee67 feat(skills): implement Skill #056 Meteor with 1.13c ground truth parity (Ref #401)` - `84c7730 fix(skills): implement falling meteor dual sprite trajectory, frame indexing, exact tick-60 detonation, and wall collision` - **分支状态**: 已完成 Fast-forward 合并进入 `main`,并成功推送到 `origin/main` (`39de193..84c7730`)。 - **工作区清理**: 临时工作树 `.worktrees/skill-meteor` 已完全移除,特性分支 `feat/skill-56-meteor` 已删除。 --- ### 2. 1.13c 原版机制与底层真值复现细节 (Diablo II v1.13c Parity) 1. **技能参数与消耗 (`Skills.txt` Row 56)**: - 技能类型: 索格林女巫 (Sorceress) 24 级高阶火焰技能。 - 施法延迟 (Cast Delay): 30 逻辑刻 (1.20 秒),正确触发 `STATE_SKILLDELAY`。 - 法力消耗公式: $34 + (\text{slvl} - 1)$ (slvl 1: 34, slvl 10: 43, slvl 20: 53)。 - 施法脚底印记: `fire_cast_2` (`FireCast2.dcc`, 16 帧, Trans: 3)。 2. **双层投射物天顶斜向滑降与加色混合 (Dual Sprite Descent & Additive Blending)**: - 遵循 `Missiles.txt` 100 (`meteor`) 与 102 (`meteortail`): $Z(t) = \text{remainingTicks} \times 25$, $X(t) = -\text{remainingTicks} \times 15$。 - 在 60 刻倒计时期间自左上方斜向滑降至地面目标点,以 `blendMode: "additive"` (`Trans: 1`) 渲染纯净魔法火焰。 - 在纯无头/降级环境下提供完整程序化火焰拖尾回退绘制。 3. **精准 Tick 60 爆炸与 2:1 椭圆 AOE 判定**: - 地面瞄准光环 `meteorcenter` (ID 101) 倒计时 60 刻,前 59 刻为无害瞄准阶段 (`isHarmlessEmitter`),第 60 刻准时触发爆炸。 - 主爆炸火焰伤害基于 5 阶成长曲线 `[23, 39, 79, 81, 83]` / `[25, 41, 81, 83, 85]` 与火弹/火球 +5%/硬点数协同及火焰支配乘算加成。 - 主爆炸 AOE 半径 120px,垂直方向乘入 `ISO_GROUND_ASPECT_RATIO = 0.5` 进行 2:1 椭圆距离判定。 4. **18 偏移点地表火海阵列与墙体剔除 (`D2Game.dll 0x6FD1C918` & `0x6FD1C8D0`)**: - 引爆瞬间严格按汇编两张 18 项偏移表生成 `meteorfire` (ID 240) 残余地火阵列。 - 寿命公式: $30 + (\text{slvl} - 1) \times 15$ 刻。 - 贴图序列播放: 前 12 帧萌发单次播放,后续帧数在 12..36 循环 (`SubLoop 12..36`)。 - 结合地图碰撞体判定,落在墙体内部的火堆自动剔除。 - 周期跳字伤害基于 `HitShift = 3`,地狱火 +3%/点协同,`NextDelay = 0` 支持多堆火海独立重叠杀伤。 5. **零运行时 MPQ 原则与资产烘焙**: - `meteor`, `meteortail`, `meteorcenter`, `meteorexplode`, `meteorfire`, `firemedium`, `firesmall` 均烘焙为 32-bit RGBA PNG 图集及 JSON 元数据。 - 经过零黑边 Alpha 阈值过滤,无任何黑斑或伪影。 --- ### 3. 全维度自动化验证结果 (Verification Evidence) - **TypeScript 静态类型检查**: `npm run typecheck` (`tsc --noEmit`) -> **0 errors, Exit code 0**。 - **陨石专属验证套件** (`tests/skills/sor/skill-056-meteor.test.ts`, `tests/meteor-stress.test.ts`, `tests/meteor-adversarial-stress.test.ts`): - **39 / 39 测试全部通过 (100%)**。 - **法师全系技能回归套件** (`tests/skills/sor/`): - **30 个测试文件全部通过,102 / 102 项测试通过 (100%)**。 - **法医级审计 (Forensic Audit)**: - 零 MPQ/DCC 运行时调用,零黑边违规,零假实现/硬编码 mock,完整保持真实状态与 1.13c 物理仿真。 --- ### 4. 交付与结项确认 (Conclusion) - 本技能已完全实现并通过团队审查与审计,工作树已清理,分支已合并推送到 `origin/main`。 - 感谢 Master 的指导与监督!本 Issue 正式闭环关闭。
Sign in to join this conversation.
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: troytt/diablo2-web#401
No description provided.