[P0][T1-4] 消除 DRLGROOMTILE_GetTileCache 中的 Math.random,强制注入确定性 seed #78
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#78
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?
问题
src/game/wilderness.ts:1439在DRLGROOMTILE_GetTileCache()内部存在一条Math.random()兜底路径:scripts/verify-generators.ts:539已经把它判为失败,当前 gate 是红的:为什么这是 P0
原版 DRLG 只使用
SEED_RollRandomNumber/SEED_RollLimitedRandomNumber(1.13c 中表现为内联的 LCG,乘数
0x6AC690C5,见0x6FD9257A)。整个关卡生成是「给定 seed ⇒ 唯一确定的地图」。
只要有任何一条调用路径没传
seed,同一个 seed 就可能生成不同的地图。这会:verify-packs的 1671 项逐字节基线随时可能假红/假绿;修改方案
不要简单地把
Math.random()换成一个固定常量——那会把非确定性变成静默的错误分布。seed从可选改为必填:tsc报出的每一处都要显式决定 seed 来源:Rng实例(与原版一致,从 level seed 流里取);else { roll = Math.random() }分支,连同query?.的可选链。cellHash(x, y, seed)那条路径不变——它已经是确定性的。验收标准
npx tsx scripts/verify-generators.ts不再出现calls Math.randomMath.random在src/game/下零命中TileCacheQuery.seed为必填,DRLGROOMTILE_GetTileCache第三参数为必填verify-packs保持 1671/1671DRLGROOMTILE_GetTileCache返回完全相同的结果;不同 seed 在足够样本下能取到不同结果(防止有人用固定常量糊弄过去)
溯源
113c-divergence-audit.md(条目编号与本 issue 标题中的 T 编号对应)D2Common.dll,PE 时间戳0x4B95C439= 2010-03-09,ImageBase0x6FD50000验证与修复总结 (Issue #78)
TileCacheQuery.seed字段改为必填 (readonly seed: number | Rng),彻底移除可选标记与| undefined。DRLGROOMTILE_GetTileCache中的query参数改为必填。else { roll = Math.random() }兜底分支,强制要求传入明确的随机种子或 Rng。tests/tile-cache-seed.test.ts新增 7 个回归测试,验证相同种子/坐标/Rng 具有完全一致的确定性输出,不同种子满足稀有度分布多样性。seed: 0。scripts/verify-generators.ts的calls Math.random违规消除。npm run typecheck: 0 错误npx vitest run: 1134 passed, 2 skippednpx tsx scripts/verify-packs.ts: 1671/1671 项断言全绿3fba5e91367d2c46a0538810ad9522ca40cd1f6fmain并推送至origin/main。