[P3][T5] 接入 LvlPrest.txt 的 Animate 列,还原逐关卡动画速度 #85
Labels
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: troytt/diablo2-web#85
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?
问题
原版的动画瓦片速度是逐关卡数据驱动的,仓库把它硬编码成了统一的 100 ms/帧。
原版逻辑
数据源:
LvlPrest.txt的Animate列(第 6 列,0-based)。完整表头 25 列:传递链(
DrlgPreset.cpp:1182):缺省与推进(
DrlgDrlgAnim.cpp:165-168, 121):即
nAnimationSpeed的单位是 1/256 帧每 tick。缺省
80/256 = 0.3125帧/tick,@ 25 Hz ⇒ 7.8125 FPS ⇒ 128 ms/帧。另外两点原版细节(实现时注意):
TILE_FLAGS_LAVA标志的 tile 参与动画(DrlgDrlgAnim.cpp:175);DRLGANIM_FindAnimatedTileFrame,:142-155),仓库的rarityFrameIndex命名与此一致,这部分已经对了。现状
Animate/animSpeed/AnimSpeed⇒ 零命中,该列从未被读取;src/game/animated-tiles.ts:16硬编码DEFAULT_ANIMATED_TILE_FRAME_DURATION_MS = 100(10 FPS);修改方案
Animate列。照搬 Issue #77 引入KillEdge的做法:在
scripts/pack-act-assets.ts(getMazePieces附近,≈1055 行)增加
cell(tables.lvlprest, row, 'Animate'),解析为整数,写进产物。先跑一遍统计该列的取值分布,确认有多少关卡是非缺省值——若全是 0,
那么改动等价于「把 100 ms 改成 128 ms」,仍然要改,但优先级可以更低。
animSpeed(1/256 帧每 tick)转成毫秒: 把frameDurationMs沿场景传到updateAnimatableTiles的rate参数。那是用更复杂的方式达到同一结果,纯属倒退。
animated-tiles.ts顶部的注释:现在写的是「Default playback speed is 10 frames per second」,与原版不符,一并改掉。
验收标准
pack-act-assets.ts读取LvlPrest.txt的Animate列并写入产物80⇒ 128 ms/帧animated-tiles.ts的文档注释与实际行为一致animSpeed = 0⇒ 128 ms;给定非缺省值 ⇒ 换算正确verify-packs1671/1671(动画速度不影响静态字节输出)溯源
113c-divergence-audit.md(条目编号与本 issue 标题中的 T 编号对应)D2Common.dll,PE 时间戳0x4B95C439= 2010-03-09,ImageBase0x6FD50000修复与验证完成报告 (Issue #85)
本 Issue 要求的
LvlPrest.txtAnimate列解析与逐关卡动画帧速率还原已全部完成并合并至main主干:1. 提交与合并信息
5d6dc8afeat(anim): 接入 LvlPrest.txt 的 Animate 列还原逐关卡动画速度 (Issue #85)2. 暴雪 1.13c 动画速率模型还原
DRLGANIM_AllocAnimationTileGrids/if (nAnimationSpeed == 0) nAnimationSpeed = 80;):animSpeed单位为 1/256 帧每 tick。\text{FPS} = 25 \times \frac{\text{animSpeed}}{256}\text{frameDurationMs} = \frac{256}{\text{animSpeed}} \times \frac{1000}{25}animSpeed = 80:对应 7.8125 FPS => 128 ms/帧。将此前硬编码的 100 ms/帧(10 FPS,比原版快约 28%)修正为符合原版规范的 128 ms。animSpeed = 1对应 10240 ms/帧(超慢速熔岩涌动)。3. 修改模块
scripts/pack-act-assets.ts):LvlPrest.txt中读取第 6 列Animate,转换为数值并在预设片段与关卡配置中透传。animSpeed和换算出的frameDurationMs写入scene.json。src/game/acts.ts,maze.ts,preset.ts,wilderness.ts):animSpeed与frameDurationMs至场景运行时。src/scene/act-scene.ts):updateAnimatableTiles接收对应关卡的frameDurationMs,确保动画瓦片在单一全局时钟驱动下以正确的逐关卡速率推进。tests/animated-tiles-speed.test.ts):4. 质量门禁验证结果
npm run typecheck): 0 errorsnpx vitest run): 69 test files passed (1136 tests passed, 0 failed, 2 skipped)npx tsx scripts/verify-packs.ts): 1671/1671 项断言全部通过