骑马与砍杀吧 关注:748,760贴子:15,038,604
  • 24回复贴,共1

萌新对骑砍战团伤害计算公式的研究,以及对加强重甲的实现思路

只看楼主收藏回复

公式来自中文站的这个帖子
https://bbs.mountblade.com.cn/thread-1899169-1-1.html
公式如下:
soak_factor = armor * module.ini_soak_factor_for_damage_type
reduction_factor = armor * module.ini_reduction_factor_for_damage_type
if item_flags & itp_extra_penetration:
soak_factor *= module.ini_extra_penetration_soak_factor
reduction_factor *= module.ini_extra_penetration_reduction_factor
randomized_soak = (random.random() * 0.55 + 0.45) * soak_factor
randomized_damage = (random.random() * 0.1 + 0.9) * raw_damage
soaked_damage = randomized_damage - randomized_soak
if (soaked_damage < 0.0):
soaked_damage = 0.0
randomized_reduction = math.exp((random.random() * 0.55 + 0.45) * reduction_factor * 0.014)
reduced_damage = (1.0 - 1.0 / randomized_reduction) * soaked_damage
if (reduction_factor < 0.00001):
reduced_damage = 0.0
damage_difference = round(reduced_damage + randomized_soak)
effective_damage = randomized_damage - damage_difference
通过不断代换得到:
effective_damage = (random.random() * 0.1 + 0.9) * raw_damage -
round( (1.0 - 1.0 / math.exp((random.random() * 0.55 + 0.45) * armor * module.ini_reduction_factor_for_damage_type * 0.014)) *
((random.random() * 0.1 + 0.9) * raw_damage - (random.random() * 0.55 + 0.45) * armor * module.ini_soak_factor_for_damage_type) +
(random.random() * 0.55 + 0.45) * armor * module.ini_soak_factor_for_damage_type)
上面那个太长了,我给化简了一下,去掉随机数:
有效伤害 = 原始伤害 - 取整 { ( 1.0 - 1.0 / math.exp ( ( 护甲 * reduction系数 * 0.014 ) * ( 原始伤害 - 护甲 * soak系数 ) ) ) * 护甲 * soak系数 + 护甲 * soak系数 }
再简化一下护甲系数:
伤害 = 原始伤害
redu护甲 = 护甲 * reduction系数
soak护甲 = 护甲 * soak系数
有效伤害 = 伤害 - 取整 { ( 1.0 - 1.0 / math.exp ( ( redu护甲 * 0.014 ) * ( 伤害 - soak护甲 ) ) ) * soak护甲 + soak护甲 }
经查阅 math.exp( x ) 函数的结果是e^x。比如math.exp(2)就等于e^2。基于此再拆分一下公式,顺便
把用于取整的round函数也简化掉,上面的公式能拆成两部分。令:
伤害差 = 伤害 - soak护甲
x = e ^ ( redu护甲 * 0.014 )
公式:
第一部分:伤害 - soak护甲
第二部分: - ( x - 1.0 ) / x * 伤害差
可能看的还是不太方便,那就用数据模拟下:
module.ini里的redu系数一般小于1
我们来做个估算,假设护甲0,则math.exp( )的结果约等于1,算出来的第二部分伤害就等于:伤害差,总伤害为伤害
如果护甲为50,redu系数为1,则math.exp( )的结果约等于2,算出来的第二部分伤害就等于:- 1/2伤害差,总伤害为伤害差-1/2伤害差
如果护甲为100,redu系数为1,则math.exp( )的结果约等于4,算出来的第二部分伤害就等于:- 3/4伤害差,总伤害为伤害差-3/4伤害差
如果护甲为200,redu系数为1,则math.exp( )的结果约等于16,算出来的第二部分伤害就等于:- 15/16伤害差,总伤害为伤害差-15/16伤害差
再来做个更复杂一点的估算,假设原始伤害为100,
假设护甲0,则math.exp( )的结果约等于1,伤害为100
假设护甲50,soak系数为1,redu系数为1,则math.exp( )的结果约等于2,原始伤害为100,则有效伤害为25
假设护甲50,soak系数为0.5,redu系数为0.5,则math.exp( )的结果约等于1.42,原始伤害为100,则有效伤害为53
假设护甲100,soak系数为1,redu系数为1,则math.exp( )的结果约等于4,原始伤害为100,则有效伤害为0
假设护甲100,soak系数为1,redu系数为0.5,则math.exp( )的结果约等于2,原始伤害为100,则有效伤害为0
假设护甲100,soak系数为0.5,redu系数为1,则math.exp( )的结果约等于4,原始伤害为100,则有效伤害为12.5
假设护甲100,soak系数为0.5,redu系数为0.5,则math.exp( )的结果约等于2,原始伤害为100,则有效伤害为25
可以看出soak系数在其中起到最为关键的作用,直接减免了伤害。而redu系数则影响了经soak减免后的伤害
所以想改变伤害减免的程度,改soak系数是最直接的办法。(soak系数可以大于1。)
但soak系数的减伤能力实在太强了,redu系数造成的减伤是直接乘以伤害差的,soak系数过高会导致伤害被护甲削弱以后伤害差再被redu系数削减以此,导致马刀砍不动连衣裙的糟糕后果。(有些mode里面低等级的时候打高级兵伤害为0很可能就是这个原因。)
所以如果想增强高甲的减伤能力,而不至于让人砍不动低甲,可以用增大redu系数的办法来实现。


IP属地:福建1楼2023-08-11 14:49回复
    嗯嗯,明白了,很有帮助。


    IP属地:山西来自Android客户端2楼2023-08-11 15:50
    收起回复
      由于soak大多涉及直接的减法,所以结果就是soak能抬高所有护甲的一击线,但是对高甲和低甲的区分不大
      由于redu系数和e的次方挂钩,所以结果就是redu系数能加大高甲和低甲免伤效果的分别(注意这里不是直接的减法,而是类似百分比的免伤)


      IP属地:福建3楼2023-08-11 16:30
      回复
        接着说说楼主本人在修改的结果
        参测人员:45力15强击老鸟,2强击6力菜鸟
        老鸟全身板甲,菜鸟游牧甲
        先说结论,实际手感和理论基本吻合
        楼主先是把soak系数翻倍,redu系数不变,结果如下:
        1、普通攻击没法破防老鸟主角的毕业装了,但主角仍然会被核动力标枪一发半血
        2、砍伤变得更加刮痧,就连双手大锤也秒不掉敌人
        3、新手关攻打强盗老巢,裸ti强盗屠宰刀无法破防菜鸟主角的游牧甲,但会被主角秒杀
        4、10强弓弓箭射不动海寇,爆头也是0伤,只能多射几发看看随机数能不能超过护甲的破甲线才能打出伤害
        总结就是很明显的护甲免伤能力变强,但是重甲和轻甲区分度变化不大
        之后soak系数不变,redu系数翻倍,结果如下:
        1、普通攻击没法破防老鸟主角的毕业装,全伤下核动力标枪只打出20点以下的伤害,
        2、砍伤变得刮痧,但大锤不至于秒不掉人,能明显感觉破甲线的变化不大,但护甲免伤比率增大
        3、新手关攻打强盗老巢,裸ti强盗不至于无法破防游牧甲,能打出个位数伤害,同时裸ti强盗会被主角秒杀
        4、10强弓弓箭不至于射不动海寇了
        总结就是护甲免伤能力变强,同时重甲和轻甲的区分度增大


        IP属地:福建4楼2023-08-11 16:39
        回复
          当然这个实验还是存在一些问题
          本次实验简单地将module.ini中的soak系数或者redu系数翻倍
          最后导致的结果就是砍刺钝三种伤害的区分度进一步变大,导致了如下让人啼笑皆非的结果:
          在对redu系数进行翻倍测试的某次实验中,劫匪的屠宰刀只能打出个位数的伤害,但小石头能打出两位数的伤害,直接把菜鸟主角创飞了
          所以后续还需要做一些调整,想要加大重甲和轻甲区分度不能仅仅只是让参数翻倍这么简单,否则就会导致这种明显不符合事实让人发笑的结果


          IP属地:福建5楼2023-08-11 16:43
          回复
            本贴的理论计算和实验则是对以前吧里非常简洁的某个公式提出了怀疑:
            砍, 刺, 钝的护甲免伤程度排序并不是简单的:砍 >刺 >钝
            事实上对于soak系数确实是砍 >刺 >钝,但对于redu系数却是砍 >钝 >刺
            简单来说就是,钝器确实是最容易破甲的,拥有最高的破甲线,但是穿甲能力最好的却是刺(redu系数最低)


            IP属地:福建6楼2023-08-11 16:48
            收起回复
              护甲确实不明显,主要硬直多了


              IP属地:湖南来自Android客户端7楼2023-08-11 17:24
              收起回复
                LZ计算时候是不是忘记round取整了,我按中文站的贴做了个excel,不知道有没有错看下
                链接: https://pan.baidu.com/s/1IfC0ml1ODgHmiLMsAZdRbg?pwd=95vf
                提取码: 95vf


                IP属地:辽宁8楼2023-09-14 14:20
                收起回复
                  请问楼主reduction系数可以调整到大于1吗?


                  IP属地:安徽9楼2023-09-30 00:13
                  收起回复
                    随机数是取0-1,所以要想去掉最好选择0.5代入公式,而不是直接去除


                    IP属地:江西来自Android客户端10楼2023-10-03 04:16
                    回复
                      好贴


                      IP属地:山东来自Android客户端11楼2024-03-18 10:00
                      回复
                        听不大懂,楼主要不用战团的系数举例,比如诺黄打60甲1伤,打50甲10伤,。打40甲20伤这种数值应该改成soak为多少,_reduction为多少,战团这俩分别是1


                        IP属地:江苏12楼2024-07-02 23:39
                        收起回复
                          看后有个想法,soak相当于破甲,应该设为刺>>钝>砍,但redu相当于破甲后伤害,应该是砍>=鈍>>刺,因为刺是点伤害,刺不到要害应该远不如钝的面伤害和砍的线+面伤害。


                          IP属地:北京来自Android客户端13楼2024-11-07 18:19
                          收起回复