#伤害计算 #战法机制
用引擎的真实计算公式和一场实战模拟证明:同一人身上的多个百分比效果是加法叠加,但攻击方和防御方的系数是乘法关系——数值对等的增伤和减伤并不会互相抵消。
很多人看到自己一身战法写着"造成伤害+20%",对面又有一条"受到伤害-20%",第一反应是"20减20等于0,两个正好抵消,没影响";同理,身上叠了两条"-15%受到伤害"的减伤效果时,又会怀疑"是不是叠了也会打折,不划算"。这两个直觉其实都不对,而且错的方向还不一样。下面直接用引擎里 `core/engine/damage_calculator.py` 的真实公式和两组实测数字把这件事说清楚。
用引擎自带的伤害计算器做一次干净测试:兵力5000、双方均无任何加成时,一次普通攻击的基线伤害是 **80.0**。给防御方叠一条"-15%受到伤害",伤害变成 **68.0**,正好是 80×(1-0.15)。再叠加一条同类型(buff_type=受到伤害)的"-12.5%受到伤害",伤害变成 **58.0**——这精确对应加法算法 80×(1-0.15-0.125)=58.0,而不是乘法算法 80×0.85×0.875=59.5。
引擎源码里也写得很直白:同一个人身上、同一个 buff_type 的所有百分比效果,会先逐条 `pct += val` 累加成一个总百分比,最后才套进伤害公式。也就是说,不管你在同一个人身上叠几层同类型的减伤或者增伤,都不存在"边际递减"——第五个15%和第一个15%一样值钱,放心往上叠。
另一组测试:攻击方单独带"+20%造成伤害"时,伤害从80变成 **96**(1.2倍,符合直觉)。但如果防御方同时也带着"-20%受到伤害",最终伤害是 **76.8**,只有裸基础值的0.96倍——也就是净效果是 **-4%**,而不是很多人以为的"两个20%互相抵消,等于都没有buff"。
原因就在公式本身:`增减伤系数 = (1+攻方百分比) × (1-防方百分比)`,是两个系数相乘,不是相减。1.2×0.8=0.96,数学上天生就比1小。换句话说,**当增伤和减伤数值相等时,防守方永远占一点点便宜**,这是乘法复合的必然结果,不是哪个战法刻意设计成这样。
光看抽象数字可能没感觉,用真实战法跑一场战斗看看。队伍A:曹操(主将)、张辽、荀彧,骑兵;队伍B:关羽(主将)、张飞、赵云,枪兵;50级、随机种子42模拟一场对局。
战斗记录显示,曹操的自带战法〖乱世奸雄〗本场一共触发了 **9次**(每回合一次),实际给他自己叠出的"受到伤害降低"是 **-26%~-27%**(战报中多次出现"-27%已施加"),比图鉴描述的基础区间(9%→18%)还要高——这是战法自带的智力加成继续往上叠的结果,属于正常现象,不是数值错误。同一场对局里,关羽命中〖威震华夏〗时也给自己叠出了 **+36%造成伤害提升**(本场触发3次)。
把这两个真实数值代入上一节的公式:(1+0.36)×(1-0.27)=**0.9928**——关羽这36%的增伤,正面撞上曹操27%的减伤时,最终只比"两人都没有任何加成"低了0.72%,而不是很多人以为的"净赚9个百分点"。最终这场对局打成平局:曹操靠着这条自身减伤撑到战斗结束还剩5564/10000兵力,而同样吃到〖乱世奸雄〗团队增伤(+24%造成伤害)却没有自身减伤的张辽、荀彧全部阵亡——**同一条战法里,给自己的减伤和给队友的增伤,覆盖范围可能完全不同**,别看描述里提到"友军"就以为效果雨露均沾。
- 想在同一个人身上叠多层同类型的"受到伤害降低"或"造成伤害提升"(战法、装备、缘分皆可)?放心叠,同类型是加法,不存在"叠了也白叠"的边际递减。
- 但如果想用自己的增伤去"打平"对面的减伤(或者反过来),记住乘法公式意味着数值相等时你总是略亏一点,不要指望正好清零。
- 看图鉴战法描述里给出的百分比区间时,记得那只是基础值,很多战法还会随智力/统率等属性继续往上叠,实战里看到比描述数值更高完全正常。
- 同一条战法可能同时给"自己"和"友军"两种不同 target_side 的buff(比如乱世奸雄),别假设整条战法效果对全队一视同仁,具体要看每一条效果的目标范围。
增伤和减伤看着都是"百分比",但同一个人身上的多条效果是加法、攻防双方之间又是乘法——两条规则混在一起用,才是配将和评估战法强度时最容易被忽略的细节。下次看到"数值对等就能抵消"的说法,可以用这篇的公式自己代一遍数字验证。