木子李皓 发表于 2023-5-27 11:36:12

[70-防御] 发一个护甲和格挡值的换算表

15000护甲,300格挡值下护甲和格挡值在不同伤害的等价换算:
结论:考虑到现在满buff基本在18000血左右,在炽热防御者能应对的范围内,100护甲最多相当于约20格挡值。换言之,如果想要舍弃护甲堆格挡值,每点格挡值不要牺牲超过5点护甲。



基础伤害
格挡后伤害
100护甲等价格挡值
格挡后伤害(炽热防御)
100护甲等价格挡值(炽热防御)

1000
117
1.3
0
0

1500
326
2
138
1.4

2000
534
2.6
284
1.8

2500
743
3.3
430
2.3

3000
951
3.9
576
2.7

3500
1160
4.6
722
3.2

4000
1368
5.2
868
3.6

4500
1577
5.9
1014
4.1

5000
1785
6.5
1160
4.6

5500
1994
7.2
1305
5

6000
2202
7.8
1451
5.5

6500
2411
8.5
1597
5.9

7000
2619
9.1
1743
6.4

7500
2828
9.8
1889
6.8

8000
3036
10.4
2035
7.3

8500
3245
11.1
2181
7.8

9000
3453
11.7
2327
8.2

9500
3662
12.4
2473
8.7

10000
3870
13
2619
9.1

10500
4079
13.7
2765
9.6

11000
4287
14.3
2911
10

11500
4496
15
3057
10.5

12000
4704
15.6
3203
10.9

12500
4913
16.3
3349
11.4

13000
5121
16.9
3495
11.9

13500
5330
17.6
3641
12.3

14000
5538
18.2
3787
12.8

14500
5747
18.9
3933
13.2

15000
5955
19.6
4079
13.7

15500
6164
20.2
4224
14.1

16000
6372
20.9
4370
14.6

16500
6581
21.5
4516
15.1

17000
6789
22.2
4662
15.5

17500
6998
22.8
4808
16

18000
7206
23.5
4954
16.4

18500
7415
24.1
5100
16.9

19000
7623
24.8
5246
17.3

19500
7832
25.4
5392
17.8

20000
8040
26.1
5538
18.2

20500
8249
26.7
5684
18.7

21000
8457
27.4
5830
19.2

21500
8666
28
5976
19.6

22000
8874
28.7
6122
20.1

22500
9083
29.3
6268
20.5

23000
9291
30
6414
21

23500
9500
30.6
6560
21.4

24000
9708
31.3
6706
21.9

24500
9917
31.9
6852
22.4

25000
10125
32.6
6998
22.8

25500
10334
33.2
7144
23.3

26000
10542
33.9
7289
23.7

26500
10751
34.5
7435
24.2

27000
10959
35.2
7581
24.6

27500
11168
35.8
7727
25.1

28000
11376
36.5
7873
25.5

28500
11585
37.1
8019
26

29000
11793
37.8
8165
26.5

29500
12002
38.5
8311
26.9


做这个模拟主要是因为看到新帖iTank中直接给护甲和格挡值评分,没有考虑这两项指标的动态关系(当然我也觉得单一评分没必要考虑动态关系)。如果有玩家需要对特定boss配装,这个表格可能更有参考价值。查表时可以直接看格挡后承伤选择对应的行。比如我知道夜之魇打我大概4700一下,那么100护甲就相当于18~19格挡值。

附上源代码,可以根据自己装备修改数值:


import numpy as np
import pandas as pd
def get_armor_DR(armor, attacker_level=73):
    DR = armor / (armor + 400 + 85 * ((5.5 * attacker_level) - 265.5))
    return DR

def get_damage_before_block(raw_damage, armor, attacker_level=73):
    DR = get_armor_DR(armor, attacker_level)
    damage_before_block = raw_damage * (1-DR)
    return damage_before_block

def get_damage_after_block(raw_damage, armor, block_value, attacker_level=73, ardent_defender=False):
    damage_before_block = get_damage_before_block(raw_damage, armor, attacker_level=attacker_level)
    damage_before_block *= (1-0.06) # righteous fury
    if ardent_defender:
      damage_before_block *= 0.7
    damage_after_block = damage_before_block - block_value
    if damage_after_block < 0:
      damage_after_block = 0
    return damage_after_block

def get_equivalent_armor_block_value(base_armor, base_blockValue, raw_damage, attacker_level=73):
    base_damage_after_block = get_damage_after_block(raw_damage, base_armor, base_blockValue, attacker_level)
    # 10% extra armor from talent
    mod_damage_after_block = get_damage_after_block(raw_damage, base_armor + 100 * 1.1, base_blockValue, attacker_level)
    # 30% extra block value from talent
    equivalent_block_value = (base_damage_after_block - mod_damage_after_block) / 1.3
    base_damage_after_block_with_ardent_defender = get_damage_after_block(raw_damage, base_armor, base_blockValue, attacker_level, ardent_defender=True)
    # 10% extra armor from talent
    mod_damage_after_block_with_ardent_defender = get_damage_after_block(raw_damage, base_armor + 100 * 1.1, base_blockValue, attacker_level, ardent_defender=True)
    # 30% extra block value from talent
    equivalent_block_value_with_ardent_defender = (base_damage_after_block_with_ardent_defender - mod_damage_after_block_with_ardent_defender) / 1.3

    return [round(raw_damage, 0), round(base_damage_after_block, 0), round(equivalent_block_value, 1),
      round(base_damage_after_block_with_ardent_defender, 0), round(equivalent_block_value_with_ardent_defender, 1)]



rawDamage = [*range(1000, 30000, 500)]

base_armor = 15000
base_blockValue = 300

raw_data = list(map(lambda rd: get_equivalent_armor_block_value(base_armor, base_blockValue, rd), rawDamage))

df = pd.DataFrame(np.array(raw_data), columns=[&#39;基础伤害&#39;, &#39;格挡后伤害&#39;, &#39;100护甲等价格挡值&#39;, &#39;格挡后伤害(炽热防御)&#39;, &#39;100护甲等价格挡值(炽热防御)&#39;])

df.to_csv(&#39;护甲格挡值模拟_15000_300.csv&#39;)



7/3调整:表格上现在显示的是装备上的护甲和格挡值,天赋的10%护甲和30%格挡值被整合进了代码里。格挡价值稍有提升

123457108 发表于 2023-5-27 11:40:22

这个东西不错,很有价值,把之前群友们讨论的东西量化了

小菊花之米 发表于 2023-5-27 11:45:54

我怎么记得,格挡成功时,是先用原始伤害值-格挡值,再进行护甲修正。   而不是先护甲修正,再减格挡值。我去翻翻WCL结论:先进行减伤修正,再进行格挡值减免。

慧眼识英雄1 发表于 2023-5-27 11:48:35

感谢分享,本帖由于为细分问题的提供了工具化的数据支撑,按照版规
奖励类:
一、优秀原创主题
3)技术攻略,对某一细分领域(比如某一BOSS/具体天赋/数据/物品/计算 或 原创宏/插件/工具帖)的专项攻略
技术攻略,基础奖励45声望及对应威望;排版优秀奖励30声望及对应威望;长期维护可追加奖励;奖励30声望,如有后续数据分析和总结的话,会补上其他的,
再次感谢

帆影哉 发表于 2023-5-27 11:53:37

我怎么记得,格挡成功时,是先用原始伤害值-格挡值,再进行护甲修正。   而不是先护甲修正,再减格挡值。我去翻翻WCL
先算格挡是dota,wow应该是先算护甲。wcl如果显示是反过来,我改代码

Jacqueline季 发表于 2023-5-27 11:54:47

先算格挡是dota,wow应该是先算护甲。wcl如果显示是反过来,我改代码刷了公会团的数据可以看出,前后两击,坦克的BUFF没有变化前一击,硬吃,8850原始伤害,减免为66.67%(5590点),实际承受为2950点。后一击,格挡(343),6750原始伤害如果是先减格挡值再护甲修正,应该是(6750-343)*(100%-66.67%)= 2135
如果是先护甲修正再减格挡值,应该是6750 *(100%-66.67%)- 343= 1907实际承伤数据显示,应该是那我之前的记忆是错的高护甲下,格挡值的稳定减伤价值还是能看的,会被护甲修正放大。PS:图中坦克为防战,保持全程防御姿态。因此推断其他减伤效果,应该都是在格挡值修正伤害之前的。

特朗普大爷 发表于 2023-5-27 12:00:28

现在应该正常了吧?

小雨粑粑2012 发表于 2023-5-27 12:03:01

现在应该正常了吧?Ok了 多谢

JDLMDJIA 发表于 2023-5-27 12:04:33

面对团本boss时护甲的减伤基本优于格挡值,并且护甲受到一系列buff动态加成,在没法进一步堆护甲的情况下可以选择防御技能和格挡值并存的装备强化有效hp,减少被秒的风险。

武汉嘉瑞 发表于 2023-5-27 12:08:07


面对团本boss时护甲的减伤基本优于格挡值,并且护甲受到一系列buff动态加成,在没法进一步堆护甲的情况下可以选择防御技能和格挡值并存的装备强化有效hp,减少被秒的风险。
满护甲应该当前阶段还做不到,目前先不考虑。至于护甲和格挡值孰优孰劣,我觉得要算一下暴雪默认的护甲/格挡值占装等是多少。假设暴雪认为100护甲和15格挡值占同样的装等,那么单次承伤小于4000时,我会选择同装等格挡值高的,反之则会选护甲高的。另外格挡值在炽热防御者触发后收益更大,这一点也毋庸置疑。如果有生存压力,我可能会偏向参考表格中后两列。晚上有空的话我准备算一下暴雪默认的护甲/格挡值兑换比。
页: [1] 2
查看完整版本: [70-防御] 发一个护甲和格挡值的换算表