☰
PathOfBuilding-PoE2 伤害计算机制深度解析:从词缀文本到最终 DPS 的完整指南
2026/10/23 4:08:54 网站建设 项目流程

PathOfBuilding-PoE2 伤害计算机制深度解析:从词缀文本到最终 DPS 的完整指南

【免费下载链接】PathOfBuilding-PoE2项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding-PoE2

PathOfBuilding-PoE2 的伤害计算把每一件装备上的词缀文本解析成结构化 modifier,进入 INC 或 MORE 池后,按"基础伤害 → 伤害转换 → 单次期望 → 每秒频率"的固定管线逐层相乘。这条数据流决定了 Calcs 页面上每一个数字的来历,也决定了你改动任何一项后 DPS 会如何变化。

🧩 PathOfBuilding-PoE2 如何把词缀文本解析进伤害计算数据库

任何计算开始之前,build 必须先变成可查询的数据。src/Modules/ModParser.lua是项目里最大的单个文件(7400 多行),职责是把物品、技能、宝石的词缀文本逐行匹配模式表,把自然语言措辞翻译成带类型的 modifier 记录。一条词缀可以被拆成多条记录:按伤害类型、按关键词标记分别建项,来源字段单独留档,供后面追溯。

这些记录分别进入玩家、敌人、召唤物的ModDB(核心实现在src/Classes/ModList.lua),操作类型分四类:

  • BASE:直接取值,同名多条一般求和,用于基础数值
  • INC:增加/减少池,先把所有条目求和,再以1 + 总和/100统一生效
  • MORE:更多/更少池,每条各自折算成1 + value/100后连乘
  • OVERRIDE与FLAG:强制覆盖和布尔开关,服务特殊规则

查询接口与之对应:Sum("INC", ...)拿到 INC 池总和,More(...)返回 MORE 池乘积。同一份 mod 列表支持父子链——技能自身词缀和全局 build 词缀分层存放、查询时逐级合并,"全局 20% more"能作用于每个技能靠的就是这条链。

真正触发计算时,src/Modules/Calcs.lua的calcs.initEnv以 build 为输入构建完整环境:物品、技能、被动树、敌人配置全部就位,玩家、敌人以及(若主技能召唤则)召唤物各持有独立的 mod 数据库和 output 表,后续calcs.perform只在这个封闭环境内运算。

⚔️ 单次伤害计算管线:基础值、转换与两个乘数池

单次伤害的主体在src/Modules/CalcOffence.lua的calcs.offence里。五种伤害类型的定义列表本身就编码了处理顺序:

local dmgTypeList = {"Physical", "Lightning", "Cold", "Fire", "Chaos"}

每种类型的基础伤害先由三个来源组装:自身基础值、从其他类型"转换"过来的伤害、从其他类型"附加"过来的伤害。转换比例按来源求和,总和超过 100% 时等比压缩,防止转换凭空制造伤害。组装完成后每种类型得到统一的汇总值:

summed = base * (1 - 转出比例) + 转入伤害 + 附加伤害

核心函数calcDamage再对汇总值施加两个乘数池。INC 侧一次性取回所有Damage、LightningDamage这类名字的 modifier 求和,MORE 侧并行查询,两者按固定顺序生效:

-- 单类型单次伤害:INC 与 MORE 两段相乘后取整 return round(summedMin * inc * more * moreMinDamage + addMin), round(summedMax * inc * more * moreMaxDamage + addMax)

注意最小与最大伤害各有独立的 MORE 乘数,"对最小伤害额外增加 X%"就是这样实现的。整个函数被调用两遍:第一遍开启暴击条件、第二遍关闭,只作用于暴击的 modifier 天然被分到不同 pass。对带幸运打击机制的技能,单次均值按最小值占 1/3、最大值占 2/3 加权,再与暴击/非暴击两条路径的期望按概率合成。

🎯 命中、暴击与攻速:PoE2 DPS 计算公式如何拼出每秒输出

此时的单次伤害仍是"理论值",还要乘上三个因素才是每秒输出。

命中率方面,玩家侧Accuracy按base * (1 + inc/100) * more的标准流程算出,再按游戏内精度距离衰减曲线随距离线性折减,与敌人的闪避对照换算出HitChance。物理伤害额外扣减敌人护甲,走的是经典曲线armour / (armour + raw * ArmourRatio) * 100,raw 越高减伤越小。元素伤害则走抗性与穿透通道,"混沌伤害按最低抗性计算"这类特殊规则会先比较四种元素的抗性再挑选对应穿透。单次期望由此拼合:暴击与非暴击的单次值按CritChance混合得到AverageHit,乘上HitChance / 100得AverageDamage。

攻击频率由HitTime与Cooldown共同决定:持续攻击取1 / HitTime,带冷却时取1 / max(HitTime, Cooldown),冷却不会让技能比打击间隔更快。最后四项相乘得到单技能 DPS:

output.TotalDPS = output.AverageDamage * (HitSpeed or Speed) * DpsMultiplier * quantityMultiplier

区域类技能在同一函数里走独立的半径管线:区域加成先经sqrt换算成半径系数再乘基础半径,每一步都做整数舍入以贴合客户端行为,引擎还会反解出半径"跳格"的断点,告诉玩家还需要多少 Area of Effect 才能扩大一圈。

📊 Full DPS 汇总机制:多技能与异常状态如何合并计数

Calcs 页展示的 Total DPS 不是单个主技能的数值,而是calcs.calcFullDPS遍历所有"纳入 Full DPS"组别的技能后的合并结果。对每个技能,引擎把它临时设为主技能重跑一遍calcs.perform,再把TotalDPS、各类异常状态 DPS 等字段收割成快照;技能属于另一武器组时,会另建武器组环境单独计算,召唤物则持有独立 mod 数据库、以召唤技能为入口并入总表。

合并规则按效果类型区分:点燃、中毒、流血这类 DoT 在多个技能都能触发时只取最强的一项(max 模式),避免同一层效果被重复计入;穿刺、Decay 这类可共存效果用求和模式。所有 DoT 之和最后被data.misc.DotDpsCap设置封顶。如果 build 带有 Culling,则按cullingMultiplier - 1对现有总值额外乘出一行独立的 Culling DPS。

这一过程对每个技能都要重算整个 build,开销很大。引擎因此做了输入差分缓存:记录每个技能对外提供的"耦合面"(它贡献的 buff、光环、Exposure)以及自身 mod 列表引用,下一次计算(例如宝石下拉菜单按 DPS 排序)若两者都未变化,该技能直接复用缓存快照,跳过整个 pass。

🔍 验证结果:可逐步展开的伤害计算 breakdown

上述所有乘数都不以黑盒形式存在。每个计算阶段在算出数值的同时,都会往breakdown表写入一行人话描述:基础伤害、转换带入多少、INC 与 MORE 各是多少、暴击混合后的期望、命中率、每种伤害的单次 DPS,逐行落档,括号注释标注各项来源。Calcs 标签页的 breakdown 区可以逐层展开对照,任何一层数值都能反向定位到具体来源词缀。

仓库内的docs/calcOffence.md还专门给贡献者解释了两处 pass 循环的陷阱:攻击类 pass 内output指向主手/副手子表,要写全局输出必须走globalOutput或事后用combineStat合并。页面上任何一个数字,几乎都能沿 breakdown 路径追到具体某行源码。

PathOfBuilding-PoE2 的伤害计算体系本质上是一套可重放的纯函数管线:mod 数据库是输入,单次伤害管线与 Full DPS 汇总是过程,breakdown 是审计日志。理解这条数据流之后,页面上任何 DPS 的变动都能定位到具体 modifier 与具体管线阶段。

【免费下载链接】PathOfBuilding-PoE2项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding-PoE2

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询