[Parity][render][S2][H][F] missile 动画参数取自烘焙 meta,而不是 missiles.txt 行;SubLoop / RandStart / 偏移被忽略;按 celFile 借用别行的 art #612

Closed
opened 2026-10-02 11:42:46 +00:00 by troytt · 0 comments
Owner

1.13c 客户端保真度审计立项(基准快照:7bd1090 / main @ 77a20c7)

证据标记说明:V-data = 1.13c MPQ 数据表 (.txt / animdata.d2 / .tbl / pal.pl2);V-src = D2MOO 逆向源码;V-bin = 1.13c DLL 反汇编;K = 1.13c 公认行为。

来源审计项:render#12 — [S2][H][F] missile 动画参数取自烘焙 meta,而不是 missiles.txt 行;SubLoop / RandStart / 偏移被忽略;按 celFile 借用别行的 art

  • 位置:src/client/scene/world-renderer.ts:915-936(art = missileArtMap.get(missileKey) ?? missileArtMap.get(celFile)、速度用 art.meta.animSpeed*16、帧数用 group.length、方向 % dirCount);src/client/view/unit-drawables.ts:387-389(numDirections || 16、totalFrames ?? animLen ?? 8)、:284-305(computeMissileClipDirection 不合法时默认 16 方向,最后 % 兜底)
  • 原版(V-data missiles.txt):
    • #56 chargedbolt:AnimLen 10,SubLoop 1 / SubStart 2 / SubStop 8
    • #69 firewall:AnimLen 37,SubLoop 1 / 12 / 36,NumDirections 1
    • #114 teeth:AnimLen 30,SubLoop 1 / SubStop 15
    • #27 magicarrow:AnimLen 1(代码用 DCC 组长度 8)
    • #98 lightningbolt:CelFile null、AnimLen 2、NumDirections 1、LoopAnim 2(代码借用 LightningStrike 的图)
    • #260 frozenorb:NumDirections 1,但 common/skills/missiles-data.ts 写成 16(范围外数据,第 5 节)
    • RandStart(如 fireexplode 5)、xoffset / yoffset / zoffset 没有使用
    • docs/d2kb/kb_364_Missiles.txt.txt:103-115:AnimSpeed = 每秒帧数,RandStart = 起始帧,SubLoop 在射程足够时在 SubStart..SubStop 之间循环
    • D2MOO 服务器端用 animrate(Units.cpp:799)
    • 比对烘焙 meta 与 AnimLen 的结果:frozenorbexplode 16 vs 18,twister/tornado 40 vs 41,firewallmaker 2 vs 37,magicarrow/guidedarrow 8 vs 1
  • 影响:火墙、电荷弹、牙齿等的循环段错了(整段循环,或者应该停住的地方没停);帧数和数据表不一致;celFile 兜底让不同 missile 共用别行的 meta(速度、方向数);缺数据时 ?? 8、|| 16 静默替换。
  • 建议:帧数、循环段、起始帧、方向数、偏移全部取 missiles.txt 当前行;速度列的语义按待确认 #2 确定后统一;art 只按本行 CelFile 加载,找不到就报错,不借用别行。
  • 已有 issue:—(#550 修的是法术视觉,没有改这些参数)
> **1.13c 客户端保真度审计立项**(基准快照:`7bd1090` / `main @ 77a20c7`) > 证据标记说明:`V-data` = 1.13c MPQ 数据表 (`.txt` / `animdata.d2` / `.tbl` / `pal.pl2`);`V-src` = D2MOO 逆向源码;`V-bin` = 1.13c DLL 反汇编;`K` = 1.13c 公认行为。 ### 来源审计项:`render#12` — [S2][H][F] missile 动画参数取自烘焙 meta,而不是 missiles.txt 行;SubLoop / RandStart / 偏移被忽略;按 celFile 借用别行的 art - 位置:`src/client/scene/world-renderer.ts:915-936`(`art = missileArtMap.get(missileKey) ?? missileArtMap.get(celFile)`、速度用 `art.meta.animSpeed*16`、帧数用 `group.length`、方向 `% dirCount`);`src/client/view/unit-drawables.ts:387-389`(`numDirections || 16`、`totalFrames ?? animLen ?? 8`)、`:284-305`(`computeMissileClipDirection` 不合法时默认 16 方向,最后 `%` 兜底) - 原版(V-data `missiles.txt`): - #56 chargedbolt:AnimLen 10,SubLoop 1 / SubStart 2 / SubStop 8 - #69 firewall:AnimLen 37,SubLoop 1 / 12 / 36,NumDirections 1 - #114 teeth:AnimLen 30,SubLoop 1 / SubStop 15 - #27 magicarrow:AnimLen 1(代码用 DCC 组长度 8) - #98 lightningbolt:CelFile `null`、AnimLen 2、NumDirections 1、LoopAnim 2(代码借用 LightningStrike 的图) - #260 frozenorb:NumDirections 1,但 `common/skills/missiles-data.ts` 写成 16(范围外数据,第 5 节) - RandStart(如 fireexplode 5)、xoffset / yoffset / zoffset 没有使用 - `docs/d2kb/kb_364_Missiles.txt.txt:103-115`:AnimSpeed = 每秒帧数,RandStart = 起始帧,SubLoop 在射程足够时在 SubStart..SubStop 之间循环 - D2MOO 服务器端用 animrate(`Units.cpp:799`) - 比对烘焙 meta 与 AnimLen 的结果:frozenorbexplode 16 vs 18,twister/tornado 40 vs 41,firewallmaker 2 vs 37,magicarrow/guidedarrow 8 vs 1 - 影响:火墙、电荷弹、牙齿等的循环段错了(整段循环,或者应该停住的地方没停);帧数和数据表不一致;`celFile` 兜底让不同 missile 共用别行的 meta(速度、方向数);缺数据时 `?? 8`、`|| 16` 静默替换。 - 建议:帧数、循环段、起始帧、方向数、偏移全部取 `missiles.txt` 当前行;速度列的语义按待确认 #2 确定后统一;art 只按本行 CelFile 加载,找不到就报错,不借用别行。 - 已有 issue:—(#550 修的是法术视觉,没有改这些参数)
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#612
No description provided.