[P0][T13] 实现 TreasureClassEx 展开:64 帧显式栈 + 预计算前缀和二分 + NoDrop 浮点缩放 #101
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#101
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?
问题
rollDrop现在是三行:与 D2 的模型毫无关系。本 issue 实现真正的 TC 展开。
金标准数据(全部逐指令确证)
主循环在
D2Game!6FC32380,入口包装在D2Game!6FC32D60。调用链
⭐ NoDrop 与队伍人数缩放(x87 双精度)
stat 100 = monster_playercount已在 1.13cItemStatCost.txt核对 ✓。NoDrop'在每一次 pick 都重算(纯确定性,只是重复开销)。⭐ Picks 的两条分支
等价于「第 k 个条目掉
Prob_k次」。1.13c 数据里 Champ / Unique / Super / Countess / Griswold / Smith 这 184 行(21.6%)就是这么配的。⭐ 64 帧显式栈(不是递归)
{ pTC(4), picksRemaining(4), qualityFactors 6×u16(12) },放在 0x52C 字节栈帧里。depth >= 0x40→ 断言失败并FatalExit(断言行号 0xFCD = 4045)。上限 64,没有环检测。ResolveTreasureClass(entry.id, 0)—— 子层不再做 group 升级。品质因子沿链传播
6 个 u16:
[0]=Magic [1]=Rare [2]=Set [3]=Unique(RollQuality 读 +0/+2/+4/+6),[4][5]交给 T-24。其它确证细节
entry.flags & 1→ quality = 7(unique);& 2→ quality = 5(set)。id 取entry.param + 1,跳过 RollQuality。gold = GetStat(item, 14 /*gold*/) * param >> 8—— 这就是gld,mul=N的实现(N/256,所以 1280/1536/2048 → ×5/×6/×8)。version >= 100的物品时退回重抽,全函数累计重抽上限 10 次,超出后用硬编码回退码(字节为"lsd ",在 1.13c 三张表里查不到 —— 【存疑】)。定点验算
Act 1 H2H A:NoDrop=100,ΣProb = 21+16+21+2 = 60,分母 160 → 62.5% 空掉落(单人)。Cow (H):NoDrop=100,ΣProb = 19+19+19+3 = 60→ 同样 62.5%。实现要求
src/game/treasure.ts(母 issue 指定的文件名)。r^n建议按反汇编的 8 连乘展开复现,最后Math.trunc。D2Rng,用怪物的 seed。max传播,输出给 T-14 / T-24。陷阱
验收标准
Act 1 H2H A单人空掉落率实测收敛到 62.5%(±统计误差)Cow (H)同样收敛到 62.5%Act 1 H2H A的完整展开与手算概率树一致(gld13.125% /Act 1 Equip A10% /Act 1 Junk13.125% /Act 1 Good1.25%)Countess (H)(Picks=-2)必定各掉 1 组 Item + 1 组 Rune,且不消耗 RNGgld,mul=2048产出 ×8 金币npm run typecheck0 errornpx vitest run全绿npx tsx scripts/verify-items.ts新增断言通过溯源
data\global\excel\下的TreasureClassEx.txt/MonStats.txt/ItemStatCost.txt(本机/usr/local/google/home/taodao/d2-data,挂载序 d2data → d2exp → Patch_D2,Patch_D2 优先)D2Game!6FC32380/D2Game!6FC32D60/D2Game!6FC32690(objdump -d,D2Common 基址0x6FD50000、D2Game0x6FC10000)"lsd "回退码【存疑】已完成 TreasureClassEx 64层调用栈、Picks<0 确定性展开与 Picks>=0 玩家数 NoDrop 缩放、品质因子继承与金币倍率解析,合并入 main (commit
bc05af8)。