[Skill Parity] 陨石 (Meteor) 落地地面残留火焰燃烧持续时间过短,且未实装火焰缩小熄灭衰减动画 (瞬间猝灭) #437

Closed
opened 2026-09-24 08:25:22 +00:00 by troytt · 0 comments
Owner

问题描述 (Bug Description)

在当前游戏中,法师技能 陨石 (Meteor, 技能 ID 56) 落地爆炸后,在地面上残留铺开的火焰持续燃烧区域存在以下两处与原版不符的严重缺陷:

  1. 地面火焰燃烧持续时间过短:

    • 当前在 src/game/skills.ts 与 src/scene/act-scene.ts 中,地面火焰持续时间硬编码为 30 + (slvl - 1) * 15 ticks。在 1 级技能下,火焰仅仅持续 30 帧 (1.2 秒)。
    • 玩家刚看到火焰升起,火焰立刻猝灭,完全无法形成有效的封路与持续灼烧控场,与原版体验严重脱节。
  2. 缺少火焰缩小熄灭的过渡动画,瞬间断崖式消失:

    • 当前火焰动画在进入 12..36 帧的稳定大火循环后,一旦 ttl <= 0,投射物便直接从引擎与渲染树中剔除。
    • 视觉表现为熊熊燃烧的巨大火团在毫无征兆、毫无过渡的情况下“一帧黑屏消失”,极其生硬突兀;原版中火焰并非瞬间截断,而是有一个火焰逐渐变小、收缩至余烬并熄灭的完整衰减消散过程。

原版 1.13c 地面真理 (Diablo II 1.13c Ground Truth Invariants)

1. 持续时间规范 (Skills.txt & Missiles.txt)

  • 陨石落地生成的地面火投射物为 meteorfire (Missiles.txt ID 240)。
  • 在 Missiles.txt 中:
    • Range: 90 (基础持续时间为 90 帧 / 3.6 秒,而不是 30 帧)。
    • LevRange: 15 (每级增加 15 帧 / 0.6 秒)。
    • Range 公式:90 + (slvl - 1) \times 15。即使在 1 级,地面火焰也至少维持 3.6 秒的燃烧时间。

2. 火焰动画结构与消散机制 (groundFireMedium.dc6 / Missiles.txt)

  • 动画素材为 groundFireMedium(共 37 帧):
    • AnimLen: 37,SubLoop: 1,SubStart: 12,SubStop: 36。
    • 帧 0 ~ 11 (Emergence / 起火阶段):火星与小火苗从地面迅速向上窜起长成大火。
    • 帧 12 ~ 36 (Sustain Loop / 稳定燃烧阶段):25 帧循环的熊熊大火。
    • 消散阶段 (Extinction / Shrink & Fade):
      • 原版客户端在地面火寿命终结阶段,绝不瞬间切除实体,而是播放熄灭收敛过渡——反向播放起火序列(帧 11 收缩回 0,大火逐步变小萎缩为余烬火星),或者通过 scale 缩小 + alpha 渐隐淡出直至完全消散。

缺陷代码定位 (Root Cause Analysis)

  1. 持续时间硬编码错误:

    • 在 src/game/skills.ts (行 4231-4232):
      const slvl = Math.max(1, projectile.slvl ?? 1)
      const fireDuration = projectile.fireDuration ?? (30 + (slvl - 1) * 15)
      
    • 在 src/scene/act-scene.ts (行 4336):
      const duration = shot.fireDuration ?? (30 + (Math.max(1, shot.slvl ?? 1) - 1) * 15)
      
    • 基准持续时间 30 严重缩水(原版基准为 90 帧)。
  2. 缺少衰减生命周期状态机与渲染过渡:

    • 在 src/scene/act-scene.ts (行 4333-4339):
      const animStep = Math.floor((elapsed * missileArt.meta.animSpeed) / 16)
      frameIndex = animStep < 12 ? animStep : 12 + ((animStep - 12) % 25)
      
    • 动画在 elapsed 到达后始终在 12..36 帧全盛大火状态循环。当 shot.ttl <= 0 时被立即销毁,缺少 dying / extinguishing 状态以及缩小/渐隐逻辑。

修复建议 (Proposed Fix)

  1. 修正燃烧持续时间:
    • 将地面火焰投射物 meteorfire 的基准持续时间从 30 帧修正为 90 帧:
      const fireDuration = projectile.fireDuration ?? (90 + (slvl - 1) * 15)。
  2. 引入火焰逐渐变小与熄灭衰减机制:
    • 在投射物进入寿命末期(例如剩余 12~15 帧,或在 ttl 归零后转入衰减消亡阶段):
      • 动画收缩:将帧序号从 11 反向回溯至 0,展现大火逐步变小、萎缩至火星的效果;
      • 缩放与透明度渐隐:在衰减区间内,同步应用 scale(从 1.0 渐变至 0.2)与 opacity(从 1.0 渐变至 0.0)线性衰减,杜绝突兀硬断。
  3. 协同渲染:
    • 确保陨石落点四周扩散的多团地面火独立计算衰减进度,呈现自然重叠与层次熄灭。
### 问题描述 (Bug Description) 在当前游戏中,法师技能 **陨石 (Meteor, 技能 ID 56)** 落地爆炸后,在地面上残留铺开的火焰持续燃烧区域存在以下两处与原版不符的严重缺陷: 1. **地面火焰燃烧持续时间过短**: - 当前在 `src/game/skills.ts` 与 `src/scene/act-scene.ts` 中,地面火焰持续时间硬编码为 `30 + (slvl - 1) * 15` ticks。在 1 级技能下,火焰仅仅持续 **30 帧 (1.2 秒)**。 - 玩家刚看到火焰升起,火焰立刻猝灭,完全无法形成有效的封路与持续灼烧控场,与原版体验严重脱节。 2. **缺少火焰缩小熄灭的过渡动画,瞬间断崖式消失**: - 当前火焰动画在进入 `12..36` 帧的稳定大火循环后,一旦 `ttl <= 0`,投射物便直接从引擎与渲染树中剔除。 - 视觉表现为熊熊燃烧的巨大火团在毫无征兆、毫无过渡的情况下“一帧黑屏消失”,极其生硬突兀;原版中火焰并非瞬间截断,而是有一个火焰逐渐变小、收缩至余烬并熄灭的完整衰减消散过程。 --- ### 原版 1.13c 地面真理 (Diablo II 1.13c Ground Truth Invariants) #### 1. 持续时间规范 (`Skills.txt` & `Missiles.txt`) - 陨石落地生成的地面火投射物为 **`meteorfire` (Missiles.txt ID 240)**。 - 在 `Missiles.txt` 中: - `Range: 90` (基础持续时间为 **90 帧 / 3.6 秒**,而不是 30 帧)。 - `LevRange: 15` (每级增加 **15 帧 / 0.6 秒**)。 - `Range` 公式:$90 + (slvl - 1) \times 15$。即使在 1 级,地面火焰也至少维持 3.6 秒的燃烧时间。 #### 2. 火焰动画结构与消散机制 (`groundFireMedium.dc6` / `Missiles.txt`) - 动画素材为 `groundFireMedium`(共 37 帧): - `AnimLen: 37`,`SubLoop: 1`,`SubStart: 12`,`SubStop: 36`。 - **帧 0 ~ 11 (Emergence / 起火阶段)**:火星与小火苗从地面迅速向上窜起长成大火。 - **帧 12 ~ 36 (Sustain Loop / 稳定燃烧阶段)**:25 帧循环的熊熊大火。 - **消散阶段 (Extinction / Shrink & Fade)**: - 原版客户端在地面火寿命终结阶段,绝不瞬间切除实体,而是播放熄灭收敛过渡——反向播放起火序列(帧 11 收缩回 0,大火逐步变小萎缩为余烬火星),或者通过 scale 缩小 + alpha 渐隐淡出直至完全消散。 --- ### 缺陷代码定位 (Root Cause Analysis) 1. **持续时间硬编码错误**: - 在 `src/game/skills.ts` (行 4231-4232): ```typescript const slvl = Math.max(1, projectile.slvl ?? 1) const fireDuration = projectile.fireDuration ?? (30 + (slvl - 1) * 15) ``` - 在 `src/scene/act-scene.ts` (行 4336): ```typescript const duration = shot.fireDuration ?? (30 + (Math.max(1, shot.slvl ?? 1) - 1) * 15) ``` - 基准持续时间 `30` 严重缩水(原版基准为 `90` 帧)。 2. **缺少衰减生命周期状态机与渲染过渡**: - 在 `src/scene/act-scene.ts` (行 4333-4339): ```typescript const animStep = Math.floor((elapsed * missileArt.meta.animSpeed) / 16) frameIndex = animStep < 12 ? animStep : 12 + ((animStep - 12) % 25) ``` - 动画在 `elapsed` 到达后始终在 `12..36` 帧全盛大火状态循环。当 `shot.ttl <= 0` 时被立即销毁,缺少 `dying` / `extinguishing` 状态以及缩小/渐隐逻辑。 --- ### 修复建议 (Proposed Fix) 1. **修正燃烧持续时间**: - 将地面火焰投射物 `meteorfire` 的基准持续时间从 30 帧修正为 **90 帧**: `const fireDuration = projectile.fireDuration ?? (90 + (slvl - 1) * 15)`。 2. **引入火焰逐渐变小与熄灭衰减机制**: - 在投射物进入寿命末期(例如剩余 12~15 帧,或在 `ttl` 归零后转入衰减消亡阶段): - **动画收缩**:将帧序号从 11 反向回溯至 0,展现大火逐步变小、萎缩至火星的效果; - **缩放与透明度渐隐**:在衰减区间内,同步应用 `scale`(从 1.0 渐变至 0.2)与 `opacity`(从 1.0 渐变至 0.0)线性衰减,杜绝突兀硬断。 3. **协同渲染**: - 确保陨石落点四周扩散的多团地面火独立计算衰减进度,呈现自然重叠与层次熄灭。
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#437
No description provided.