公式来自中文站的这个帖子
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系数的办法来实现。
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系数的办法来实现。