[P1][T24] 实现 exceptional / elite 基底升级:qf[4] / qf[5] 的两个 1024 判定 #103
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#103
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?
问题
D2 的装备有三档基底:普通(
normcode)/ 精华 exceptional(ubercode)/ 精英 elite(ultracode)。同一个Cap在地狱难度可能掉成xap(War Hat)或uap(Shako)。这个机制原计划完全没有覆盖 —— 是反汇编时发现的。不实现的话,高难度永远掉不出精英基底,暗金里那些绑在
ultracode上的顶级装备(Shako 等)就永远出不来。金标准数据
T-13 沿 TC 链传播的 6 个品质因子里,
[0..3]是 Magic/Rare/Set/Unique(给 T-14 用),而[4]和[5]各做一次独立的 1024 判定:注意是
Rand(seed) & 0x3FF(取低 10 位,即 0..1023),不是Rand(seed, 1024)—— 虽然对 1024 这个 2 的幂来说两者等价,但写法要一致。genFlags随后传给物品创建函数D2Game!6FC31880(pGame, nItemId, nQuality, pMonster, dwGenFlags)。数值来源:Difficultylevels.txt
数值尺度与 1024 判定吻合(
40/1024 ≈ 3.9%)。Normal 全 0 → 普通难度永不升级,符合游戏常识。基底三档的列(Armor.txt / Weapons.txt)
实现要求
data\global\excel\Difficultylevels.txt,取UberCodeOdds*/UltraCodeOdds*四列。qf[4]/qf[5]各做一次判定,产出genFlags。genFlags:0x04→ 用ubercode替换基底,0x10→ 用ultracode替换。ubercode/ultracode为空或为xxx时不升级(保持原基底)。level(qlvl)、rarity、需求等,T-14 的品质判定要用升级后的 qlvl。ItemRatio的Uber列(=1)就是给这些升级后的基底用的 —— T-14 选行时要据此判断。陷阱
验收标准
Difficultylevels.txt的四列加载正确,三个难度的值与上表一致genFlags恒为 0(因为 odds 全 0)odds/1024吻合ubercode为空或xxx时不升级,不报错ItemRatio的Uber=1行,且用新 qlvlUberCodeOdds*改成 1024,验证普通基底 100% 变成 exceptional待实测确认
溯源
data\global\excel\下的Difficultylevels.txt/Armor.txt/Weapons.txt/ItemRatio.txt(本机/usr/local/google/home/taodao/d2-data,挂载序 d2data → d2exp → Patch_D2,Patch_D2 优先)D2Game!6FC32380/D2Game!6FC31880(objdump -d,D2Common 基址0x6FD50000、D2Game0x6FC10000)已完成并通过 1.13c Difficultylevels.txt 与 qf[4]/qf[5] 1024 判定实测验证(ubercode/ultracode 基底升级,isUber 标记与新 qlvl 继承),合并入 main (commit
94be8ce)。