昆恩法印修复 - 强力攻击现在可以穿透法术

昆恩法印修复 - 强力攻击现在可以穿透法术

看起来,在战斗中滥用基础昆恩能力并非设计初衷,而是昆恩实现上的缺陷。由于调用了"MaxF"而非"MinF",昆恩能够减少比其自身生命值更多的伤害,从而防止穿透。此模组

Bug修复

摘要

看起来,在战斗中滥用基础昆恩术的能力并非设计初衷,而是昆恩术实现中的一个缺陷。由于调用了"MaxF"而非"MinF",昆恩术可以减少比其自身生命值更多的伤害,从而防止穿透。这个模组修复了这个问题,因此强大的攻击即使不摧毁昆恩术,也可能穿透它。

我无法保证这个修复后游戏仍保持平衡,但其中未包含任何额外改动。
我预计某些Boss战会变得更加困难,因为昆恩法印的滥用将不再有效。
不过我进行了一些快速测试,发现游戏体验反而更好了。

精确缺陷

问题出在文件 "scripts\game\gameplay\items\spells\quenEntity.ws" 中,其中我们可以看到:

542 如果(受到的伤害小于护盾生命值)
543   减少伤害 = 受到的伤害;
544 其他
545   减免伤害 = MaxF(所受伤害, 护盾生命值);

原版逻辑如下: 如果 incomingDamage 小于 shieldHealth,那么 reducedDamage 就是全部的 incomingDamage
如果 incomingDamage 大于 shieldHealth,那么 reducedDamage 会从 (incomingDamage, shieldHealth) 中选取最大值,因此依然是全部的 incomingDamage

这样的代码毫无意义,总是会全额减免受到的伤害。如果开发者本意如此,他们应该直接使用单行代码 "reducedDamage = incomingDamage;",而不是加上 "if" 条件判断。

示例原版伤害处理

遇到这个问题,我记录的示例原始伤害处理过程是: "1Hand"用劈砍伤害=1294.89和银制伤害=38.8716击中了"巫师",经过护甲抵抗后实际生命值伤害=453.994。由于生命值伤害=453.994而昆恩护盾生命值=200,昆恩护盾本应减免...整整453.994,这超过了护盾生命值上限!这是由于错误的数值比较导致的。正确的处理应该是昆恩护盾减免200点伤害,巫师实际承受253.994点生命值损失。随后护盾生命值的消耗并非按照全额减免伤害计算(如部分玩家预期),而是会施加法术强度(约1..3倍)的衰减系数。因此减免伤害=453.994除以法术强度=1.98后,实际消耗护盾生命值=228。昆恩护盾生命值(200)被消耗至...-28!由此可见,原版昆恩护盾本应在较高法术强度下承受多次穿透攻击。但由于这个漏洞而无法实现。

修复

我将 "MaxF" 修正为 "MinF",这样当 incomingDamage 大于 shieldHealth 时,reducedDamage 将仅被限制为 shieldHealth 的值。

我还发现,由于现在昆恩护盾的生命值削减机制已正确运作,必须设定一个终止昆恩效果并最终触发爆裂护盾的阈值。若不如此,就会产生无限递减的无用护盾生命值序列(例如100%、33%、11%、3.6%、1.22%、0.41%、0.136%)。

根据我的日志记录,我使用了昆恩护盾最大生命值的40%到20%。

合并

该模组修改了 "scripts\game\gameplay\items\spells\quenEntity.ws" 文件,可能需要进行合并。与FCR3的合并过程非常简单(自动完成)。

该模组包含一个多行日志记录和两个单行修复:

reducedDamage = MaxF(incomingDamage, parent.shieldHealth);      ->      reducedDamage = MinF(incomingDamage, parent.shieldHealth);
if( parent.shieldHealth <= 0 )             ->      if( parent.shieldHealth <= 40 /*是20%*/)

示例

我进行了包含三个测试用例的测试,这样你可以看到它是如何工作的。我附上了视频,日志如下。

示例1:水鬼是弱敌,昆恩能抵挡第一击的大部分伤害。猎魔人法术强度低,因此昆恩在每第二次攻击时被摧毁,爆炸护盾激活 [https://youtu.be/4UlqkKM6U8Q]

召唤昆恩
活力伤害:310 - 200 [昆恩减免] = 110;昆恩护盾生命值:200 - (200 / 1.39 [法术强度]) = 56;
活力伤害:314 -  56 [昆恩减免] = 258;昆恩护盾生命值: 56 - ( 56 / 1.39 [法术强度]) = 15;
召唤昆恩
活力伤害:307 - 200 [昆恩减免] = 107;昆恩护盾生命值:200 - (200 / 1.39 [法术强度]) = 56;
活力伤害:360 -  56 [昆恩减免] = 304;昆恩护盾生命值: 56 - ( 56 / 1.39 [法术强度]) = 15;
召唤昆恩
活力伤害:351 - 200 [昆恩护盾减免] = 151;昆恩护盾生命值:200 - (200 / 1.39 [法术强度]) = 56;
活力伤害:368 -  56 [昆恩减免] = 312;昆恩护盾生命值: 56 - ( 56 / 1.39 [法术强度]) = 15;

示例2:轻甲,因此昆恩法印穿透效果显著。法术强度更高,因此昆恩能承受三次攻击。最后,单手武器在昆恩仍激活状态下击杀猎魔人——这是法术穿透的结果 [https://youtu.be/N5AsfccumhA]

召唤昆恩
活力伤害:1115  - 200 [昆恩减免] =  915;昆恩护盾生命值:200 - (200 / 2.081 [法术强度]) = 104;
活力伤害: 978  - 104 [昆恩减免] =  874; 昆恩护盾生命值:104 - (104 / 2.081 [法术强度]) = 54;
活力伤害:1092  -  54 [昆恩减免] = 1038;昆恩护盾生命值: 54 - ( 54 / 2.081 [法术强度]) = 28;
召唤昆恩
活力伤害:1079  - 200 [昆恩减免] =  879;昆恩护盾生命值:200 - (200 / 2.081 [法术强度]) = 104;
活力伤害:1032  - 104 [昆恩减免] =  928;昆恩护盾生命值:104 - (104 / 2.081 [法术强度]) = 54;
活力伤害:1214  -  54 [昆恩减免] = 1160;昆恩护盾生命值: 54 - ( 54 / 2.081 [法术强度]) = 28;
召唤昆恩
活力伤害:1089  - 200 [昆恩减伤] =  889;昆恩护盾生命值:200 - (200 / 2.081 [法术强度]) = 104;
巫师已死

示例3:重甲与强化昆恩放电,可怜的双手斧自取灭亡 [https://youtu.be/_JJqD8A8wwo]

召唤昆恩
活力伤害:692 - 200 [昆恩减免] = 492;昆恩护盾生命值:200 - (200 / 2.131 [法术强度]) = 106;
活力伤害:598 - 106 [昆恩减伤] = 492;昆恩护盾生命值:106 - (106 / 2.131 [法术强度]) = 56;
活力伤害:618 -  56 [昆恩减免] = 561;昆恩护盾生命值: 56 - ( 56 / 2.131 [法术强度]) = 29;
召唤昆恩
活力伤害:687 - 200 [昆恩护盾减免] = 487;  
昆恩护盾生命值:200 - (200 / 2.131 [法术强度]) = 106;
活力伤害:577 - 106 [昆恩法印减免] = 471;昆恩护盾生命值:106 - (106 / 2.131 [法术强度]) = 56;
活力伤害:605 -  56 [昆恩减免] = 549;昆恩护盾生命值: 56 - ( 56 / 2.131 [法术强度]) = 29;
Axe2h 死亡。
Last Quen 生命值低于40时总会结束 Quen。

有时被穿透的昆恩护盾会被一次性耗尽以防止踉跄。这似乎是《巫师3》中的一项特性,产生日志:

[增益效果] EffectManager.InternalAddEffect: 杰洛特已激活昆恩护盾,因此护盾破裂但不会造成硬直。