▶ 打开物品价格换算台 —— 纯客户端,不上传任何东西。

为什么需要它

<INTEGER>VALUE:定价配方,不是价格。物品创建那一刻,CEquipment::computePrices 把它乘上一条按物品等级走的百分比曲线, ceil 成整数后缓存进四个字段 —— 买入 +0x2A8、卖出 +0x2AC、未鉴定买 +0x2B0、未鉴定卖 +0x2B4。 商人窗口再拿这些缓存值现算堆叠、商人乘数、插槽与角色修正。

所以「我把 VALUE 写成 7500,玩家要掏多少金」这个问题,答案取决于三件事,缺一不可:

  • 物品等级。1 级的普通物品买价是 VALUE × 60%,105 级同一件是 VALUE × 1204% —— 差 20 倍。
  • 定价档。同样 1 级、同样 VALUE,普通档买价 60%,Unique 档 2880% —— 差 48 倍。而且档位是引擎判出来的,不是你在 DAT 里选的
  • 鉴定与否。未鉴定物品永远按 NORMAL 两条曲线算,跟它实际是什么档无关。鉴定前后价格会跳,就是这个原因。

两个反直觉的地方

GREEN 档在 105 级封顶。 十条价格曲线里有八条带 INFER_PASSED_END:true,超过末点继续外推; PRICE_PLAYERBUY_GREENPRICE_PLAYERSELL_GREEN 这两条没有这个键,而它的默认值是 false。 于是求值落回曲线对象自己的 DynamicAttributeCurved::getValue,那里对超出末点的 x 直接返回末点的 Y。 结果:一件 130 级的「带词缀普通装」按 105 级定价,而同一件东西如果 UNITTYPE 里有 Magic 就会继续涨。

买价不看已镶嵌的宝石,卖价看。 getPlayerSellValue 会逐颗遍历已镶嵌且 UNITTYPE ⊃ Socketable 的宝石, 按 SOCKETED_SELL_PCT(原版 75)把它们各自的卖价加进去;getPlayerBuyPrice 完全没有这一段。 插槽数量的加成(SOCKET_VALUE_BONUS_PCT,原版 10)两边都算。

它不算什么

只算商人买卖。附魔师的收费走另一条曲线(PRICE_ENCHANT = 245 + 55L,再乘 ENCHANTER_PRICE_PER_ENCHANT), 祛魔、洗点、传送卷轴这些固定价的东西也不在里面。 地图物品(UNITTYPE ⊃ Map)在定价前还会乘一个运行期系数,那个系数的来源没有追下去,工具按 1.0 算。

公式的每一行都在页面的「公式与出处」一节里给了函数地址,没确认的部分单列在「没确认的部分」里 —— 定价这种事, 错的公式比没有工具更糟,所以宁可标着不确定,也不补一个看起来合理的数。