[TODO] 动画系统:实现完整 1.13c EIAS 攻击速度公式 #144

Open
opened 2026-09-21 12:15:48 +00:00 by troytt · 0 comments
Owner

背景

动画系统首版(feat/animation-system)的动画速度仅使用 AnimData.D2 的基础 animationSpeed:

ticksPerCycle = framesPerDirection × 256 / animationSpeed    (25 Hz sim tick)

等价实现:每 tick 给 8.8 定点累加器加 animationSpeed,frameIndex = acc >> 8。

首版的 ActorAnimator.tick(speedScale) 已预留 speedScale 入参(8.8 定点,256 = 1×),但调用方目前恒传 256。

缺失的部分

装备上的 IAS(Increased Attack Speed)词条目前在视觉与实际攻速上都不生效。完整 1.13c 攻速链路需要:

  1. WSM(Weapon Speed Modifier):Weapons.txt 第 20 列 speed,已由 src/game/weapons.ts 解析。
  2. EIAS(Effective IAS):EIAS = floor(120 × IAS / (120 + IAS)) —— IAS 的递减收益。
  3. 合成:animationSpeed_effective = base × (256 + EIAS − WSM) / 256,并下限钳制(1.13c 有每动作的最小帧数下限,需从 D2Common 反编译确认精确钳制点)。
  4. 技能特例:部分技能(如野蛮人 Frenzy、狂热光环)有独立的 IAS 来源与叠加规则。
  5. 怪物侧:怪物的 IAS 来自词缀(Extra Fast 等),走 MonStats.txt / MonUMod.txt。

实现注意

ActorAnimator.tick() 内部对 (index, next] 区间逐帧扫描帧事件,因此 IAS 加速导致单 tick 跨多帧时不会漏掉命中帧(code=1 ATTACK / code=2 MISSILE)。这一性质必须在本 issue 落地后由单测继续保证。

验收

  • EIAS 公式有独立单测,覆盖 IAS = 0 / 20 / 50 / 100 / 200 的递减曲线
  • WSM 从装备武器读取,换武器后攻速立即变化
  • 高 IAS(单 tick 跨多帧)下,帧事件触发次数与顺序仍严格正确
  • 攻速下限钳制值来自 1.13c 反编译/官方表,不得编造
## 背景 动画系统首版(`feat/animation-system`)的动画速度**仅使用 `AnimData.D2` 的基础 `animationSpeed`**: ``` ticksPerCycle = framesPerDirection × 256 / animationSpeed (25 Hz sim tick) ``` 等价实现:每 tick 给 8.8 定点累加器加 `animationSpeed`,`frameIndex = acc >> 8`。 首版的 `ActorAnimator.tick(speedScale)` **已预留 `speedScale` 入参**(8.8 定点,256 = 1×),但调用方目前恒传 256。 ## 缺失的部分 装备上的 **IAS(Increased Attack Speed)词条目前在视觉与实际攻速上都不生效**。完整 1.13c 攻速链路需要: 1. **WSM(Weapon Speed Modifier)**:`Weapons.txt` 第 20 列 `speed`,已由 `src/game/weapons.ts` 解析。 2. **EIAS(Effective IAS)**:`EIAS = floor(120 × IAS / (120 + IAS))` —— IAS 的递减收益。 3. **合成**:`animationSpeed_effective = base × (256 + EIAS − WSM) / 256`,并**下限钳制**(1.13c 有每动作的最小帧数下限,需从 D2Common 反编译确认精确钳制点)。 4. **技能特例**:部分技能(如野蛮人 Frenzy、狂热光环)有独立的 IAS 来源与叠加规则。 5. **怪物侧**:怪物的 IAS 来自词缀(Extra Fast 等),走 `MonStats.txt` / `MonUMod.txt`。 ## 实现注意 `ActorAnimator.tick()` 内部对 `(index, next]` 区间**逐帧扫描帧事件**,因此 IAS 加速导致单 tick 跨多帧时**不会漏掉命中帧**(code=1 ATTACK / code=2 MISSILE)。这一性质必须在本 issue 落地后由单测继续保证。 ## 验收 - [ ] EIAS 公式有独立单测,覆盖 IAS = 0 / 20 / 50 / 100 / 200 的递减曲线 - [ ] WSM 从装备武器读取,换武器后攻速立即变化 - [ ] 高 IAS(单 tick 跨多帧)下,帧事件触发次数与顺序仍严格正确 - [ ] 攻速下限钳制值来自 1.13c 反编译/官方表,**不得编造**
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#144
No description provided.