[M19-P3] 实装 1.13c 物品交易与收购价格计算引擎 (ITEMS_CalculateTransactionCost 0x6FD9B1C0) #483

Closed
opened 2026-09-26 04:22:14 +00:00 by troytt · 1 comment
Owner

背景与目标

100% 还原 D2Common.dll 中的 ITEMS_CalculateTransactionCost (0x6FD9B1C0) 及其 3 个子函数,精确计算任意物品的商人售价 (玩家购买价 BUY)、商人收购价 (玩家出售价 SELL)、铁匠修理费 (REPAIR) 与赌博价 (GAMBLE)。

1.13c Ground Truth 对标 (Items.cpp:1709-2495)

  1. 特殊物品短路与基础成本 (BaseCost):
    • 初始装备 (IFLAG_STARTITEM) 恒返回 1 金币。
    • 防具按当前防御值比例缩放:nAC * dwCost / dwMaxAc。
    • 箭袋按堆叠缩放:qty * dwCost / 1024;书册 (Books.txt) 按书页数量累加:BaseCost + qty * CostPerCharge。
    • 初始累加器:nSellCost = BaseCost, nBuyCost = Math.trunc(BaseCost / 2), nRepCost = BaseCost。
  2. Staffmods 单技能高额加价 (ITEMS_CalculateAdditionalCostsForItemSkill 0x6FD9CB50):
    • 对非全职业固定技能底材 (ItemTypes.StaffMods != 7),遍历物品上的单技能 (STAT_ITEM_SINGLESKILL):
      • nSellCost / nRepCost 增加 (2 * slvl - 1) * (SkillCostAdd + Math.trunc(BaseCost * SkillCostMult / 1024))。
      • nBuyCost(收购价)增加 (2 * slvl - 1) * (SkillCostAdd + Math.trunc(BaseCost * SkillCostMult / 4096))(严格 1/4 比例)。
  3. 品质、词缀与属性逐点加价 (IFLAG_IDENTIFIED):
    • Magic / Rare / Crafted:累加前后缀 dwAdd + BaseCost * dwMultiply / 1024(收购价 /2048)并调用 ITEMS_CalculateAdditionalCostsForBonusStats (0x6FD9ACE0) 按 ItemStatCost.txt 的 Multiply 与 Add 逐点累加(若出现负向词缀导致低于 BaseCost,严格触发保底回退 nSellCost = BaseCost, nBuyCost = BaseCost / 2)。
    • Unique / Set:按 UniqueItems.txt / SetItems.txt 的 cost mult 与 cost add 加成并累加属性成本。
    • Superior:累加超强属性加成;Inferior:扣减 BaseCost / 2。
  4. 镶嵌物、无形与职业专属惩罚:
    • 遍历孔内已镶嵌物品,三者均加上 Math.trunc(Filler.dwCost / 2)。
    • 无形惩罚 (IFLAG_ETHEREAL):收购价 nBuyCost = Math.trunc(nBuyCost / 4)(破损无形归 0)。
    • 职业专属物品惩罚 (ItemTypes.Class < 7):收购价 nBuyCost = Math.trunc(nBuyCost / 4)。
  5. Npc.txt 汇率、任务折扣、难度最高收购上限 (max buy) 与减价属性:
    • 应用 Npc.txt 的 sell mult / buy mult / rep mult (/ 1024) 及已完成任务的 quest*mult (/ 1024)。
    • 难度收购封顶:当 transactionType === 'sell' 时,nBuyCost = Math.min(nBuyCost, NpcTxt.maxBuy[difficulty])(普通 Act 1..5 为 5000 / 10000 / 15000 / 20000 / 25000,噩梦 30000,地狱 35000)。
    • 减价属性 (STAT_ITEM_REDUCEDPRICES):仅对 BUY、REPAIR、GAMBLE 生效(不对 SELL 生效)。

验收标准

  • 完整实现 src/game/item-cost.ts。
  • 全面的单元测试覆盖全部品质、Staffmods、无形/职业专属惩罚、任务折扣与三难度收购上限。
## 背景与目标 100% 还原 `D2Common.dll` 中的 `ITEMS_CalculateTransactionCost (0x6FD9B1C0)` 及其 3 个子函数,精确计算任意物品的**商人售价 (玩家购买价 `BUY`)**、**商人收购价 (玩家出售价 `SELL`)**、**铁匠修理费 (`REPAIR`)** 与**赌博价 (`GAMBLE`)**。 ## 1.13c Ground Truth 对标 (`Items.cpp:1709-2495`) 1. **特殊物品短路与基础成本 (`BaseCost`)**: - 初始装备 (`IFLAG_STARTITEM`) 恒返回 `1` 金币。 - 防具按当前防御值比例缩放:`nAC * dwCost / dwMaxAc`。 - 箭袋按堆叠缩放:`qty * dwCost / 1024`;书册 (`Books.txt`) 按书页数量累加:`BaseCost + qty * CostPerCharge`。 - 初始累加器:`nSellCost = BaseCost`, `nBuyCost = Math.trunc(BaseCost / 2)`, `nRepCost = BaseCost`。 2. **Staffmods 单技能高额加价 (`ITEMS_CalculateAdditionalCostsForItemSkill 0x6FD9CB50`)**: - 对非全职业固定技能底材 (`ItemTypes.StaffMods != 7`),遍历物品上的单技能 (`STAT_ITEM_SINGLESKILL`): - `nSellCost` / `nRepCost` 增加 `(2 * slvl - 1) * (SkillCostAdd + Math.trunc(BaseCost * SkillCostMult / 1024))`。 - `nBuyCost`(收购价)增加 `(2 * slvl - 1) * (SkillCostAdd + Math.trunc(BaseCost * SkillCostMult / 4096))`(严格 1/4 比例)。 3. **品质、词缀与属性逐点加价 (`IFLAG_IDENTIFIED`)**: - **Magic / Rare / Crafted**:累加前后缀 `dwAdd + BaseCost * dwMultiply / 1024`(收购价 `/2048`)并调用 `ITEMS_CalculateAdditionalCostsForBonusStats (0x6FD9ACE0)` 按 `ItemStatCost.txt` 的 `Multiply` 与 `Add` 逐点累加(若出现负向词缀导致低于 `BaseCost`,严格触发保底回退 `nSellCost = BaseCost, nBuyCost = BaseCost / 2`)。 - **Unique / Set**:按 `UniqueItems.txt` / `SetItems.txt` 的 `cost mult` 与 `cost add` 加成并累加属性成本。 - **Superior**:累加超强属性加成;**Inferior**:扣减 `BaseCost / 2`。 4. **镶嵌物、无形与职业专属惩罚**: - 遍历孔内已镶嵌物品,三者均加上 `Math.trunc(Filler.dwCost / 2)`。 - **无形惩罚 (`IFLAG_ETHEREAL`)**:收购价 `nBuyCost = Math.trunc(nBuyCost / 4)`(破损无形归 0)。 - **职业专属物品惩罚 (`ItemTypes.Class < 7`)**:收购价 `nBuyCost = Math.trunc(nBuyCost / 4)`。 5. **`Npc.txt` 汇率、任务折扣、难度最高收购上限 (`max buy`) 与减价属性**: - 应用 `Npc.txt` 的 `sell mult` / `buy mult` / `rep mult` (`/ 1024`) 及已完成任务的 `quest*mult` (`/ 1024`)。 - **难度收购封顶**:当 `transactionType === 'sell'` 时,`nBuyCost = Math.min(nBuyCost, NpcTxt.maxBuy[difficulty])`(普通 Act 1..5 为 `5000 / 10000 / 15000 / 20000 / 25000`,噩梦 `30000`,地狱 `35000`)。 - **减价属性 (`STAT_ITEM_REDUCEDPRICES`)**:仅对 `BUY`、`REPAIR`、`GAMBLE` 生效(不对 `SELL` 生效)。 ## 验收标准 - [ ] 完整实现 `src/game/item-cost.ts`。 - [ ] 全面的单元测试覆盖全部品质、Staffmods、无形/职业专属惩罚、任务折扣与三难度收购上限。
troytt added this to the [M19] 原版商人 NPC 与交易经济系统 (1.13c Ground Truth) milestone 2026-09-26 04:22:14 +00:00
troytt changed title from [M15-P3] 实装 1.13c 物品交易与收购价格计算引擎 (ITEMS_CalculateTransactionCost 0x6FD9B1C0) to [M19-P3] 实装 1.13c 物品交易与收购价格计算引擎 (ITEMS_CalculateTransactionCost 0x6FD9B1C0) 2026-09-26 04:24:35 +00:00
Author
Owner

Implemented and verified in commit 3b993cf (tsc --noEmit 0 errors, vitest 17/17 passing, headless Chrome UI verification passing).

Implemented and verified in commit `3b993cf` (`tsc --noEmit` 0 errors, `vitest` 17/17 passing, headless Chrome UI verification passing).
Sign in to join this conversation.
No Label
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: troytt/diablo2-web#483
No description provided.