feat(combat/pvp): 完善 PvP 对决机制与受击减免完整流水线(1/6伤害惩罚、元素吸收、DTGM与护盾分流) #40

Closed
opened 2026-09-17 02:13:02 +00:00 by troytt · 0 comments
Owner

背景与现状

在 Issue #24(里程碑 M9)中,项目已完整实现了核心战斗数学库 src/game/formulas.ts 与独立测试对决擂台 arena.html:

  • 命中率公式(AR vs DR、等级权重、5%~95% 截断)
  • 忽略目标防御(ITD,普通怪生效/Boss失效)
  • 降低目标防御(-% Def,Boss 强制折半规则)
  • 奔跑中姿态(DR=0,格挡折 1/3 且上限 25%)
  • 技能致命一击 (CS) 与装备双倍打击 (DS) 独立投骰、互斥判定与物理限定
  • 压碎打击 (CB) 阶梯比例削减、物理抗性交互与负物抗 1.0 封顶
  • 撕开伤口 (OW) 200帧(8秒)五段流血公式、Boss减半与禁止自愈
  • 生命与法力偷取(实际物理伤害结算、汲取效率与难度惩罚)
  • 冻结目标(Freezes Target +X)概率/持续时间与 Boss 降级减速 (Chilled)
  • 受击硬直(FHR)伤害占比门槛与击退基础判定

在玩家对抗玩家(PvP / 对决 Duel)以及高阶角色受击减免(Damage Taken Pipeline)场景中,原版《暗黑破坏神 II》具有一套极其严密且独特的平衡性衰减与计算顺序。为确保后续多人联机对决(Net / PvP)及高阶配装与伤害抵御的真实还原,需在本 Issue 中立项跟踪与实现。


需补充的 PvP 与高阶受击减免机制清单

1. PvP 1/6 (17%) 伤害衰减惩罚 (PvP Handicap / Penalty)

  • 机制规则:在玩家对决(PvP)或攻击敌对玩家雇佣兵时,所有技能伤害、物理伤害以及元素附加伤害在进入任何防御与减伤计算之前,强制乘算 17\%(1.10+ 官方规定的 1/6 惩罚因子)。
  • 必要性:暗黑 2 角色中后期的单次法术/物理技能伤害通常高达几千至数万,而玩家血量普遍在 1,000~4,000,若不施加 1/6 惩罚,对决将变成纯粹的互秒(One-shot)。

2. 完整的 8 层受击伤害结算管线 (Damage Taken Pipeline)

原版中在判定攻击命中并击穿格挡后,受到伤害的扣除顺序有着严格的法律级先后次序(The Amazon Basin 权威顺序):

flowchart TD
    Raw["1. 原始伤害 (已应用 PvP 1/6 惩罚与暴击)"] --> ES["2. 能量护盾 (Energy Shield, ES)\n按百分比优先分流至法力值承担"]
    ES --> Armor["3. 骨甲 / 旋风护体 (Bone / Cyclone Armor)\n抵消固定物理/元素伤害点数"]
    Armor --> Flat["4. 整数伤害减免 (Flat DR & MDR) ★已实现★\nDamage Reduced by X / Magic DR by X"]
    Flat --> Res["5. 百分比抗性与物免 (% Resistance / % DR) ★已实现★\n物理抗性(玩家上限50%) / 元素抗性(上限75%~95%)"]
    Res --> PctAbsorb["6. 百分比吸收 (% Absorb)\n最高上限 40% (如鬼火戒指 20% 雷电吸收)"]
    PctAbsorb --> IntAbsorb["7. 整数吸收 (+Direct Absorb)\n如雷神之力 +20 雷电吸收"]
    IntAbsorb --> DTGM["8. 伤害转法力 (Damage Taken Goes to Mana, DTGM)\n根据最终扣减生命的真实点数,等比回蓝 (不减伤)"]
  • 吸收机制 (Absorb):
    • 百分比吸收 (% Absorb):在抗性之后生效,上限 40\%。先扣减该伤害,并在随后等额回复玩家生命。
    • 整数吸收 (+Direct Absorb):直接扣减该固定数值,并在随后等额回复玩家生命。
    • 净伤害公式:\text{Net Damage} = \text{Incoming Damage} - 2 \times \text{Absorbed Damage}(若吸血超过伤害,净结算为治疗,但生命不可超过 MaxHP)。
  • 伤害转法力 (DTGM):
    • 如塔拉夏腰带(37% DTGM)。它不是减免,而是按最终实际失去的生命点数比例,为玩家恢复法力值。
  • 能量护盾 (Energy Shield):
    • 在进入抗性前将 X\% 伤害直接转化为法力扣除,是法师 PvP 的核心生存机制。

3. 格挡硬直与格挡帧率 (Faster Block Rate, FBR)

  • 格挡硬直:格挡成功后角色必须播放格挡动画,期间无法移动或施法(即格挡锁 Block Lock)。
  • FBR 档位:装备上的 FBR 词缀能够缩短格挡硬直帧数(例如圣骑士开启神圣之盾后格挡仅需 2 帧,普通角色需 5~9 帧)。
  • 刺客爪格挡 (Weapon Block):双爪刺客独有的被动格挡,站立时有效、奔跑时无效,且不仅能格挡物理攻击,还能格挡几乎所有魔法、元素法术与飞弹攻击(如骨矛、火球、暴风雪)。

4. 受击硬直帧率档位表 (Faster Hit Recovery, FHR Breakpoints)

  • 当前已实现伤害超过 MaxHP/16 触发硬直的概率。
  • 需引入各职业基于动画帧率的 FHR 档位表(如野蛮人、法师、圣骑士在不同 FHR% 下分别对应 9帧、8帧、7帧、6帧受击恢复速度)。

5. 无法被冻结 (Cannot Be Frozen, CBF) 与 冻结减半 (Half Freeze Duration)

  • CBF(如乌鸦之霜、都瑞尔的壳):免疫物理附带的冰冻与冰系法术冻结持续时间。
  • 神圣冰冻特例:CBF 对圣骑士的神圣冰冻光环减速完全无效(这是 PvP 中神圣冰冻能够稳定粘人减速的关键特性)。

6. 对远程攻击防御力 (Defense vs. Missile)

  • 针对投掷武器、弓箭、飞矢等飞弹类物理判定增加专门的防御附加值,在百分比防御计算之后、目标防御降低 (-% Def) 之前应用。

交付目标与实施建议

  1. 在 src/game/formulas.ts 中扩展:
    • calculatePvPDamage(damage, isTargetPlayerOrMerc):应用 1/6 伤害衰减。
    • calculateDamageAbsorb(damage, pctAbsorb, flatAbsorb):实现百分比与固定吸收及回血净值结算。
    • calculateDamageTakenGoesToMana(damageDealtToLife, dtgmPercent):实现实际扣血转法力。
    • calculateFhrFrames(charClass, fhrPercent) 与 calculateFbrFrames(charClass, fbrPercent, hasHolyShield):加入标准动画档位表。
  2. 在 arena.html 中:
    • 增加吸收属性(% Absorb、+Absorb)、DTGM、FBR 控件。
    • 当目标设定为 Player PvP 时,自动在推导日志中展示 PvP 1/6 惩罚与吸收抵御细节。
## 背景与现状 在 [Issue #24](https://git.projectdiablo2.cn/troytt/diablo2-web/issues/24)(里程碑 M9)中,项目已完整实现了核心战斗数学库 `src/game/formulas.ts` 与独立测试对决擂台 `arena.html`: - 命中率公式(AR vs DR、等级权重、5%~95% 截断) - 忽略目标防御(ITD,普通怪生效/Boss失效) - 降低目标防御(-% Def,Boss 强制折半规则) - 奔跑中姿态(DR=0,格挡折 1/3 且上限 25%) - 技能致命一击 (CS) 与装备双倍打击 (DS) 独立投骰、互斥判定与物理限定 - 压碎打击 (CB) 阶梯比例削减、物理抗性交互与负物抗 1.0 封顶 - 撕开伤口 (OW) 200帧(8秒)五段流血公式、Boss减半与禁止自愈 - 生命与法力偷取(实际物理伤害结算、汲取效率与难度惩罚) - 冻结目标(Freezes Target +X)概率/持续时间与 Boss 降级减速 (Chilled) - 受击硬直(FHR)伤害占比门槛与击退基础判定 在玩家对抗玩家(PvP / 对决 Duel)以及高阶角色受击减免(Damage Taken Pipeline)场景中,原版《暗黑破坏神 II》具有一套极其严密且独特的平衡性衰减与计算顺序。为确保后续多人联机对决(Net / PvP)及高阶配装与伤害抵御的真实还原,需在本 Issue 中立项跟踪与实现。 --- ## 需补充的 PvP 与高阶受击减免机制清单 ### 1. PvP 1/6 (17%) 伤害衰减惩罚 (PvP Handicap / Penalty) * **机制规则**:在玩家对决(PvP)或攻击敌对玩家雇佣兵时,所有技能伤害、物理伤害以及元素附加伤害在进入任何防御与减伤计算**之前**,强制乘算 **$17\%$(1.10+ 官方规定的 $1/6$ 惩罚因子)**。 * **必要性**:暗黑 2 角色中后期的单次法术/物理技能伤害通常高达几千至数万,而玩家血量普遍在 1,000~4,000,若不施加 1/6 惩罚,对决将变成纯粹的互秒(One-shot)。 ### 2. 完整的 8 层受击伤害结算管线 (Damage Taken Pipeline) 原版中在判定攻击命中并击穿格挡后,受到伤害的扣除顺序有着严格的法律级先后次序(The Amazon Basin 权威顺序): ```mermaid flowchart TD Raw["1. 原始伤害 (已应用 PvP 1/6 惩罚与暴击)"] --> ES["2. 能量护盾 (Energy Shield, ES)\n按百分比优先分流至法力值承担"] ES --> Armor["3. 骨甲 / 旋风护体 (Bone / Cyclone Armor)\n抵消固定物理/元素伤害点数"] Armor --> Flat["4. 整数伤害减免 (Flat DR & MDR) ★已实现★\nDamage Reduced by X / Magic DR by X"] Flat --> Res["5. 百分比抗性与物免 (% Resistance / % DR) ★已实现★\n物理抗性(玩家上限50%) / 元素抗性(上限75%~95%)"] Res --> PctAbsorb["6. 百分比吸收 (% Absorb)\n最高上限 40% (如鬼火戒指 20% 雷电吸收)"] PctAbsorb --> IntAbsorb["7. 整数吸收 (+Direct Absorb)\n如雷神之力 +20 雷电吸收"] IntAbsorb --> DTGM["8. 伤害转法力 (Damage Taken Goes to Mana, DTGM)\n根据最终扣减生命的真实点数,等比回蓝 (不减伤)"] ``` * **吸收机制 (Absorb)**: * **百分比吸收 (% Absorb)**:在抗性之后生效,上限 $40\%$。先扣减该伤害,并在随后等额**回复玩家生命**。 * **整数吸收 (+Direct Absorb)**:直接扣减该固定数值,并在随后等额回复玩家生命。 * **净伤害公式**:$\text{Net Damage} = \text{Incoming Damage} - 2 \times \text{Absorbed Damage}$(若吸血超过伤害,净结算为治疗,但生命不可超过 MaxHP)。 * **伤害转法力 (DTGM)**: * 如塔拉夏腰带(37% DTGM)。它**不是减免**,而是按最终实际失去的生命点数比例,为玩家恢复法力值。 * **能量护盾 (Energy Shield)**: * 在进入抗性前将 $X\%$ 伤害直接转化为法力扣除,是法师 PvP 的核心生存机制。 ### 3. 格挡硬直与格挡帧率 (Faster Block Rate, FBR) * **格挡硬直**:格挡成功后角色必须播放格挡动画,期间无法移动或施法(即格挡锁 Block Lock)。 * **FBR 档位**:装备上的 FBR 词缀能够缩短格挡硬直帧数(例如圣骑士开启神圣之盾后格挡仅需 2 帧,普通角色需 5~9 帧)。 * **刺客爪格挡 (Weapon Block)**:双爪刺客独有的被动格挡,**站立时有效、奔跑时无效**,且不仅能格挡物理攻击,还能格挡几乎所有魔法、元素法术与飞弹攻击(如骨矛、火球、暴风雪)。 ### 4. 受击硬直帧率档位表 (Faster Hit Recovery, FHR Breakpoints) * 当前已实现伤害超过 $MaxHP/16$ 触发硬直的概率。 * 需引入各职业基于动画帧率的 FHR 档位表(如野蛮人、法师、圣骑士在不同 FHR% 下分别对应 9帧、8帧、7帧、6帧受击恢复速度)。 ### 5. 无法被冻结 (Cannot Be Frozen, CBF) 与 冻结减半 (Half Freeze Duration) * **CBF**(如乌鸦之霜、都瑞尔的壳):免疫物理附带的冰冻与冰系法术冻结持续时间。 * **神圣冰冻特例**:**CBF 对圣骑士的神圣冰冻光环减速完全无效**(这是 PvP 中神圣冰冻能够稳定粘人减速的关键特性)。 ### 6. 对远程攻击防御力 (Defense vs. Missile) * 针对投掷武器、弓箭、飞矢等飞弹类物理判定增加专门的防御附加值,在百分比防御计算之后、目标防御降低 (-% Def) 之前应用。 --- ## 交付目标与实施建议 1. 在 `src/game/formulas.ts` 中扩展: - `calculatePvPDamage(damage, isTargetPlayerOrMerc)`:应用 1/6 伤害衰减。 - `calculateDamageAbsorb(damage, pctAbsorb, flatAbsorb)`:实现百分比与固定吸收及回血净值结算。 - `calculateDamageTakenGoesToMana(damageDealtToLife, dtgmPercent)`:实现实际扣血转法力。 - `calculateFhrFrames(charClass, fhrPercent)` 与 `calculateFbrFrames(charClass, fbrPercent, hasHolyShield)`:加入标准动画档位表。 2. 在 `arena.html` 中: - 增加吸收属性(% Absorb、+Absorb)、DTGM、FBR 控件。 - 当目标设定为 `Player PvP` 时,自动在推导日志中展示 PvP 1/6 惩罚与吸收抵御细节。
Sign in to join this conversation.
No Label
No Milestone
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#40
No description provided.