[M10] 真实物品系统:500 基础物品、1000 词缀、TreasureClassEx 掉落树 #25
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#25
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?
背景
demo-data.ts)更关键的是掉落模型:
rollDrop现在的实现完全不是 D2 的模型。D2 的掉落是TreasureClassEx.txt定义的递归树,每个节点按权重向下展开。改动清单
src/game/acts.ts—— 加载Armor.txt、Weapons.txt、Misc.txt、MagicPrefix.txt、MagicSuffix.txt、UniqueItems.txt、SetItems.txt、TreasureClassEx.txt、ItemTypes.txt、Runes.txt、Gems.txtsrc/game/items.ts——itemBaseFromRow/affixFromRow列映射逐列核对真实表。新增:品质等级(普通/魔法/稀有/套装/暗金/符文之语)、插槽、镶嵌、耐久、需求(力量/敏捷/等级)src/game/treasure.ts——TreasureClassEx.txt掉落树src/game/runeword.ts—— 符文之语注意
物品结构的任何变动都会影响 M13(
.d2s存档互通)——.d2s的物品段是位对齐的变长编码,字段一旦定错,往返比对就过不去。建议在本里程碑设计数据结构时就预留
.d2s需要的全部字段(GUID、品质、插槽数、已镶嵌物品、耐久、个性化名称等)。
验收
scripts/verify-items.ts:全量物品表列映射断言TreasureClassEx递归树无环、各节点概率和为 1子 issue 拆分(24 个)
已按「每张表 / 每个算法一个」的粒度拆完,全部挂在本 milestone 下。金标准为 1.13c MPQ 表 + 1.13c DLL 反汇编(非 D2MOO)。
第 0 层 · 地基(阻塞其余全部)
[P0][T23]实现 1.13c PRNG:64 位 LCG(0x6AC690C5)+ per-unit seed[P0][T17]冻结物品数据结构:一次预留.d2s位对齐编码所需的全部字段第 1 层 · 数据加载
[P0][T01]加载 ItemTypes.txt:类型树、Equiv 继承链、TreasureClass 与 Rarity 列[P0][T02]加载 ItemStatCost.txt + Properties.txt:属性层与属性函数[P1][T03]加载 Armor.txt → ItemBase(202 行 × 164 列)[P1][T04]加载 Weapons.txt → ItemBase(306 行 × 166 列)[P1][T05]加载 Misc.txt → ItemBase(151 行 × 168 列)[P1][T06]加载 MagicPrefix.txt / MagicSuffix.txt(637 + 741 行)[P2][T07]加载 RarePrefix.txt / RareSuffix.txt(46 + 155 行)[P2][T08]加载 AutoMagic.txt(36 行)[P1][T09]加载 UniqueItems.txt(401 行,enabled=1 仅 385)[P1][T10]加载 SetItems.txt + Sets.txt(127 + 32 行)[P0][T11]加载 TreasureClassEx.txt(852 行 × 33 列):纯加载与索引第 2 层 · 算法
[P0][T12]实现 auto-TC 运行时生成:armo3-87 / weap3-87 等 100 个虚拟节点[P0][T13]实现 TreasureClassEx 展开:64 帧显式栈 + 前缀和二分 + NoDrop 浮点缩放[P1][T14]实现 ItemRatio 品质判定:严格复刻整数截断顺序[P1][T24]实现 exceptional / elite 基底升级:qf[4] / qf[5] 的两个 1024 判定[P1][T15]实现词缀抽取:alvl 计算、group 冲突排除、rare 3~6 词缀[P2][T16]实现符文之语:Runes.txt 169 行(complete=1 仅 78 条可用)[P2][T18]实现宝石镶嵌:Gems.txt 68 行 × 武器/盾/头盔三套属性第 3 层 · 集成
[P0][T19]用 TC 树替换rollDrop,接线 MonStats.TreasureClass → engine → act-scene[P1][T20]物品名本地化:namestr → string.tbl 三层链第 4 层 · 工具与验收
[P1][T21]重写scripts/verify-items.ts:全量真实表列映射断言 + TC 树不变量[P3][T22]新增loot.html+src/loot.ts:掉落模拟器 / 概率表双 Tab关键路径
#93 / #95 / #96 / #105 / #106 / #108 可随时并行插入。
调查过程中对母 issue 估计值的修正
三个原计划完全没覆盖、调查中发现的必做项
auto-TC 运行时生成(#100) ——
TreasureClassEx.txt的Item列引用了 100 个表中根本不存在的名字(weap3armo3…),由引擎在载入期从ItemTypes.TreasureClass=1的 5 个种子动态生成。不做这个,Act 1 Equip A直接断链,玩家一件装备都掉不出来。exceptional / elite 基底升级(#103) —— TC 的 6 个品质因子里
[4][5]各做一次Rand & 0x3FF判定,对应ubercode/ultracode三档基底升级。不做的话高难度永远掉不出精英基底。物品名本地化(#108) —— 不做的话界面上全是四字母 code。已从 P2 提到 P1。
三个必错的陷阱(已写进对应子 issue)
证据强度说明
.d2s位宽#104 和 #105 的正文里已显式标注证据强度,并附了「把存疑变确证」的实测收敛方法。不要把这两个当成和 #101 / #102 同等可信。
🎉 Milestone M10(真实物品系统)全部 24 个子任务已全部闭环完成!
交付清单
地基与底层规范(Wave 1: #87, #88, #89, #90, #95, #96):
D2Rng) 与 per-unit seed 隔离.d2s位对齐规范文档及字段预留ItemTypes.txt98 种有效类型、Equiv 继承链与 5 个 auto-TC 种子ItemStatCost.txt359 行 +Properties.txt268 行属性解析与位宽映射RarePrefix.txt(46) /RareSuffix.txt(155) 稀有名字词池AutoMagic.txt(36) 职业专属装备自动词缀装备基底与表格加载(Wave 2: #91, #92, #93, #94, #97, #98, #99):
Armor.txt202 护甲基底Weapons.txt306 武器基底(空列头安全防御与 15 个 rarity=0 标记)Misc.txt151 杂项基底(含 33 枚符文索引与金币/药水识别)MagicPrefix(637) /MagicSuffix(741) 共 1378 条全量魔法词缀UniqueItems.txt401 行暗金装备(385 enabled,异构参数支持)SetItems.txt(127) +Sets.txt(32) 套装与多层加成TreasureClassEx.txt852 行全量 TC 节点索引、前缀和预计算与 218 个悬空引用解析核心算法层(Wave 3: #100, #101, #102, #103, #104, #105, #106):
auto-TC运行时生成(weap3..87/armo3..87/bow3..87/mele3..39 共 100 虚拟节点)TreasureClassEx展开引擎(64 层调用栈、尾调用优化、Picks<0 确定性展开与 Picks>=0 玩家数 NoDrop 缩放、品质因子继承与金币倍率解析)ItemRatio.txt6 层阶梯品质判定(Diminishing MF 惩罚曲线、class-specific 调整、fallback 保底降级与耐久衰减)alvl公式、group 互斥与稀有物品 3~6 词缀抽取Runes.txt169 行解析、78 组符文之语与 23 组天梯符文之语装配Gems.txt68 行宝石/符文镶嵌解析(武器/头胸/盾牌分流)与 ilvl 三段插槽上限集成与本地化(Wave 4: #107, #108):
rollDrop,完整接线MonStats.TreasureClass12 列 -> TC group 升级 -> 掉落展开 -> 品质判定 -> 词缀抽取 ->GameEngine->act-scene.ts,并彻底删除 DEMO_BASES / DEMO_AFFIXES 占位数据终验套件与工具(Wave 5: #109, #110):
scripts/verify-items.ts:120 项全量真实 MPQ 断言与 TC 树不变量核验通过loot.html+src/loot.ts(蒙特卡洛模拟 + 解析概率表双 Tab)验证结果
npm run typecheck: 0 errornpx tsx scripts/verify-items.ts: 120 checks, 0 problems (ALL 1.13c REAL MPQ INVARIANTS HOLD)npx vitest run: 97 test files passed, 1565 tests passed, 0 failuresnpm run build: 生产打包全部通过所有分支与 worktree 均已清理完毕,代码已合入
main并推送到远程仓库。