
枪手防御重做
重新定义了炮手防御惩罚曲线,使其能更好地处理极端数值。
查看大图需要 STRACKER LOADER 和性能提升器!
总结
将射手防御惩罚调整为与怪物原始攻击值成反比缩放。
缓解了固定修正值在伤害谱极值处的极端差异。
射手在相当数量的攻击下不再被一击必杀,
但仍会受到更高的伤害,
且在剑士会被一击必杀的情况下,射手同样处于一击必杀范围内。
快速详情
枪手防御惩罚最初是在基础游戏中引入的。
其运作方式以及与剑士伤害曲线在相似数值下的关联性,在基础游戏定义的参数范围内是合理的。
到了冰原资料片时,该系统并未经过修订,但数值变得更加极端。
最后随着黑龙更新的到来,公式中涉及的数值出现了显著偏差,以至于它已不在原本设计的范围内正常运作。
这是一个单纯通过提高攻击和防御数值来增加难度,却忽略了底层公式结构的问题。
该模组旨在通过为射手防御惩罚应用曲线修正来解决此问题,使其取决于怪物攻击数值并相应调整比例,以避免终局内容中出现的极端数值失真。
本模组遵循五大原则
- 玩家护甲值越高,同一攻击所受伤害应越低
- 怪物攻击值越高,同一攻击所受伤害应越高
- 远程武器使用者应比近战武器使用者承受更多伤害
- 在80点伤害以下时,惩罚机制应与原版游戏类似
- 超过190点伤害时,远程武器使用者所受伤害应接近近战武器使用者
致谢
感谢 Moonbunnie 在研究伤害函数入口点、防御公式及相关机制方面所做的工作,帮助调试代码中的数学不当问题,并且总体上是一位很棒的朋友/共同模组制作者。
支持模组制作者
非常感谢您的 Patreon 支持:https://www.patreon.com/user?u=21034864 直接捐赠也可以:https://www.paypal.me/AsteriskAmpersand?locale.x=en_US
详细说明
伤害计算公式
在没有物品和技能增益的情况下,伤害计算公式是一个关于3个变量的函数,分别是怪物攻击力、玩家防御力和玩家职业。
设 D: RxRx(0.7,1) → R D(怪物攻击力, 玩家防御力, 职业系数) = 怪物攻击力 * 80/(玩家防御力 * 职业系数 + 80)
我们将把剑豪受到的伤害标记为 D_BM,枪手受到的伤害标记为 D_G: D_BM(x,y) = D(x,y,1) D_G(x,y) = D(x,y,0.7)
设 D_G0 为修改后的炮手伤害函数 D_G0 : RxR -> R D_G0 (x,y)
原则正式化
我们以严格的术语正式定义上述主要原则
D_G0 必须满足:
- d D_G0 /dx >= 0
- d D_G0 /dy < 0
- D_BM(x,y) <= D_G0(x,y) <= D_G(x,y)
- 对于 D_BM^(-1)(190) 中的每一个(x,y),D_G0(x,y) - 190 <= 5
- 对于 D_G^(-1)(80) 中的每一个(x,y),80 - D_G0(x,y) <= 10
前两条是"合理性"条件。
更多的护甲应该总是导致更少的伤害。
更高的怪物攻击力应该总是导致更多的伤害。
第三条是平衡条件,枪手的伤害应大于或等于剑士,且小于或等于原版枪手。
第四和第五是“混合点”条件
为了满足这些条件,实现是通过一个由基础 S 型函数生成的平滑系数完成的。
平滑 S 形函数
使用平滑系数函数 S(k,y),其中对于每个 k0,S(k0,y) 属于 S 形函数族,且 S(x,y) 在 x 上平滑,使得 S(k,y) = 0,S(k,inf) = 1
- dS/dx > 0
- dS/dy > 0
任何类似 Sigmoid 的函数只要满足以下性质即可:我们将其加1后再减半(Sigmoid 函数的输出范围被限制在 -1 到 1 之间)。
D_G0 = H D_G = G D_BM = F
H(x,y) = G(x,y)(1-S(x,y)) + F(x,y)(S(x,y))
dH/dx = dG/dx*(1-S(x,y)) + dF/dx*(S(x,y)) + F(x,y)*dS/dx - G(x,y)*dS/dx
dH/dy = dG/dy*(1-S(x,y)) + dF/dy*(S(x,y)) + F(x,y)*dS/dy - G(x,y)*dS/dy
dG/dx、dF/dx、S(x,y) 和 1-S(x,y) 始终为正函数,而 dF/dy、dG/dy 始终为负,因此实际上我们唯一需要担心的是:
dG/dx*(1-S(x,y)) + dF/dx*(S(x,y)) + F(x,y)*dS/dx > G(x,y)*dS/dx
dG/dy*(1-S(x,y)) + dF/dy*(S(x,y)) + F(x,y)*dS/dy < G(x,y)*dS/dy
- 从结构上我们知道,剑圣的伤害总会超过枪手,因此 F(x,y) > G(x,y)
- 此外,只要我们谨慎处理 S 型函数的组合,dS/dx 和 dS/dy 都是正值
- 因此 F(x,y)*dS/dx > G(x,y)*dS/dx
- 且 F(x,y)*dS/dy > G(x,y)*dS/dy
F(x,y) <= H(x,y) <= G(x,y) 源于 sigmoid 函数被限制在 [-1,1] 区间内且我们正在进行函数的凸组合这一事实
显式 sigmoid 函数
所选用的平滑 S 型函数为: s(x) = (x/√(1+x^2))
在应用了必要的领域转换并将其偏向更极端的两端后: S(x) = ((s(x) +1)/2)^2
我们现在必须转换输入域,使 S 形曲线匹配所需的转换边界。
为此我们定义:
- 平滑因子 = 4
- RightEnd = (玩家防御力 + 80) * 160 / 80
- 左端 = (玩家防御力 * 0.7 + 80) * -20 / 80
- 中心 = (右端 + 左端) / 2
- 跨度 = (右端 - 左端)
左右端数值是在游戏内条件下经过多次函数实验后选定的。
因此,最终平滑系数函数定义为: a(怪物攻击, 玩家防御) = ((S(((怪物攻击 - 中心) * 平滑因子 / 跨度) + 1) / 2)^2
新的显式伤害函数
然后我们可以定义: H(怪物攻击, 玩家防御) = F(怪物攻击, 玩家防御) * (a(怪物攻击, 玩家防御)) + G(怪物攻击, 玩家防御) * (1 - a(怪物攻击, 玩家防御))
精明的读者会发现,这是刀锋大师和枪手伤害公式在单位约束参数上的凸组合。
一个重要警告
这种方法的一个限制是,它没有考虑技能和物品的使用,而是直接输出伤害值,而不是在其余计算之前修改玩家的防御。
要解决这个问题,我们只需解出玩家防御值的伤害方程,使其产生等效的伤害。
鉴于我们的新伤害公式: H(x,y) = x * ( (80/(y+80))(1-a(x,y)) + (80/(y.7+80))*a(x,y))
我们也可以有等效的伤害计算公式: H0(x,y) = x * 80/(z(x,y)+80)
其中 z 是新玩家的防御值,使得 H(x,y) = H0(x,y)
展开等式,我们得到: x * 80/(z(x,y)+80) = x * ( (80/(y+80))(1-a(x,y)) + (80/(y.7+80))*a(x,y))
然后我们解这个关于 z 的方程,得到: z = y * (240 * a(x,y) + 7 * y + 560) / ((10 - 3 * a(x,y)) * y + 800)
因此,我们得到了一个新的玩家防御值,它经过曲线调整,并满足上述所有定义属性。
但元素枪手加成呢?
枪手防御惩罚同样适用于元素抗性,在大部分曲线范围内,这一惩罚会直接盖过抗性加成。
抗性加成本身已经极其微小,任何形式的分数计算都会使其进一步缩水,甚至低于剑士的数值。
即便数值与剑士持平,由于元素抗性的运作机制,这点加成也微不足道。
怪物攻击主要由物理伤害构成,即便最极端的情况下,元素伤害也仅占攻击总伤害的30%左右。
此外,元素抗性的成长性几乎不存在——玩家护甲值实在太低,无法实现可观的减伤效果。
要想获得可见的伤害减免,抗性需要达到三位数区域,而玩家数值通常徘徊在十几点左右。
枪手的加成通常只能提供1点或略高的抗性,实际往往呈现负值,因为枪手惩罚始终处于生效状态。
如果你已经读到这里,恭喜你,你远远超出了我对普通 Nexus 用户的期望,
随时可以在 Discord 上联系我,告诉我你成功穿越了一年级微积分和无尽说教的沼泽。
正在加载版本记录…







正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。