先看程序代码逻辑:
防御(护甲)≥0
减免=Math.floor(防御*0.01/(1+0.01*防御)*100)
防御<0
减免=
-Math.floor((1-Math.pow(0.99,Math.abs(防御)))*100)
代码逻辑解读:
Math.floor()表示只取整数
Math.pow()表示前一个作为底数,后一个为底数的次方
上面就是以0.99作为底数,Math.abs(防御)作为次方
Math.abs()表示括号里取绝对值部分
//这里减免算到最后,减免不带百分号(%),因为在编程语言中,%有着其他作用,会产生歧义而导致运行错误
最后只要在伤害运算时加上*0.01就行。
因此,在下面的式子中我会调和出一个百分比,便于语言表述。
基于程序逻辑转换成人话:
护甲防御大于0,减免=防御/(防御+100)
小于0,-减免=1-0.99的防御数值的绝对值次方
这个大家都说烂了,懂的都懂
这里18取的是护甲绝对值,0.99^18这里算出来的所有小数是保留的,到了整个式子最后再只保留两位小数。
因为要方便理解,又要保证精准,所以式子取小数部分作了一点调整。
.
装备延展:
幽冥刺等直接做加加减减就行了,面板也会显示。
--
破山锥等穿透
代码逻辑为
实际伤害 = “破甲伤” + (1 - 减免 * 0.01) * (面板伤害 - “破甲伤”)
上面这个“减免”并没有按照我们转换成人话的描述,而是延续原先的代码逻辑,而原先不能带百分号,所以加上了*0.01。
我们下面说的减免是带有百分号的,并解读一下上面的程序含义
实际伤害=无视减免的这部分伤害+(1-减免)×(面板伤害-无视减免的这部分伤害)
无视减免的这部分伤害=面板伤害×无视减免百分比
//这里说的很绕,但为了避免陷入语言误区、为了更精准,不得已的操作,下面听我娓娓道来。
.
玩家对这类装备特性,大致有这三种不同描述,百分比减甲、百分比无视防御以及有部分伤害为百分比真伤,但都有谬误或者不直观。
因为不管是百分比减甲还是百分比无视防御,它们都是在与防御挂钩,然而我们参与伤害的一系列换算最后还是代入减免,那么严格来讲,它是在和减免挂钩。如果非要认为防御就是减免,那为啥1防御≠1减免,或者为啥1防御≠1%减免?
所以更为精准和直观的描述为,无视减免百分比,即破山锥无视敌方32%的物理减免。
例如,敌方50%减免,如果自身持破山锥32%无视减免,即32%×50%减免=16%减免被无视。那么在这个情况下打出的物伤,对面实则只有34%免伤。
.
//来个实际案例剖析:
这个白袍43护甲,则减免为30%
出了破山锥,Q面板伤害为150的情况下,打了白袍119的实际伤害
按照一般的算法
实际伤害=150×32%+(1-30%)×(150-150×32%)=119
这样固然是正确的
//但更为方便的是,我们直接以破山锥无视敌方32%的物理减免为基准,而不是“无视防御”
白袍30%减免,无视掉32%,即32%×30%=9.6%,那么还有20.4%减免,150×(1-20.4%)=119
(这里不保留小数的情况只有在护甲转化为减免的时候,其他情况是保留的,因为程序里Math.floor就是取整呀)
//所以之后看待破山锥,视作为无视敌方32%的物理减免就行了,也可以说降低敌方已有减免的32%