作者hotdogee (hotdog)
看板WOW
标题[心得] 4.1 韧性减伤计算公式与推导
时间Sat Apr 23 22:10:59 2011
结果先写在前头:
1%韧性减伤所需的韧性等级
等级 60 70 80 81 82 83 84 85
韧性减伤(4.0.6) 9.583 15.112 31.423 39.223 48.959 61.111 76.280 95.21492
韧性减伤(4.1.0) 7.964 12.558 26.114 32.596 40.687 50.786 63.392 79.12785
4.1 韧性递减公式:X' = 100 - 100 * 0.99 ^ X
X'为递减後之减伤
X 为原始减伤数值
计算范例:85级, 3718韧性等级
X = 3718 / 79.12785
= 46.9872
X' = 100 - 100 * 0.99 ^ 46.9872
= 37.6394
减伤即为37.6394%
----------------------------------------------------------------------------
以下为公式推导过程纪录:
4.1.0 Patch Notes 写道:
Resilience scaling has been modified for linear returns, as opposed to
increasing returns. Under the new formula, going from 30 resilience to
40 resilience gives players the same increase to survivability as going
from 0 to 10. Resilience now scales in the same way armor and magic
resistances do. A player with 32.5% damage reduction from resilience in
4.0.6 should see their damage reduction unchanged in 4.1. Those with less
than 32.5% will gain slightly. Those with more will lose some damage
reduction, increasingly so as their resilience climbs.
1. 看到patch note後,首先要做的就是下载PTR然後开始挖里面的LUA档,运气好的话
公式就会直接写在里面,就不用推导了。不过事与愿违,这公式是用C实作的,所以
看不到原始码。
2. 再来就是挖里面的DBC档,里面可以发现所有等级的韧性减伤都被除了一个常数,
本篇开头那个表就是我直接从DBC档取得的数值。
以85为例,这个常数是95.21492 / 79.12785 = 1.203304778
这个数字其实有点奇怪,因为以往Blizzard想调整参数的时候都会使用一个比较漂亮
的数字,例如1.25或1.2。为什麽他这次会用1.203304778来调整呢?
我们会在最後把这个数字推导出来来回答这个问题。
3. 在能够开始推导公式之前,我们必须要先取得够多的递减前与递减後的数值资料。
Blizzard给了两个API:GetCombatRating(16)可以取得目前角色的韧性等级,
GetCombatRatingBonus(16)可以取得目前角色递减後的韧性减伤(16是韧性的ID)。
以步骤二取得的那个表的资料更新我的LibStatLogic後,
我可以用StatLogic:GetEffectFromRating(resilience, 16)取得递减前的韧性减伤。
所以我就可以写一个小插件来协助我收集资料,我只要一直穿脱我身上的PVP装,
来组合出各种不同的韧性数值即可。
程式码不长,所以顺便贴在这里:
function SaveData()
local res = GetCombatRating(16)
local bonusDr = GetCombatRatingBonus(16)
local bonusOri = StatLogic:GetEffectFromRating(res, 16)
if not GetResilienceDataDB[res] then
GetResilienceDataDB[res] = res..","..bonusOri..","..bonusDr
print("Resilience: "..res..", "..bonusOri..", "..bonusDr)
end
end
local f = CreateFrame("Frame")
f:RegisterEvent("PLAYER_ENTERING_WORLD")
f:RegisterEvent("COMBAT_RATING_UPDATE")
local function OnEvent(self, event, ...)
if event == "PLAYER_ENTERING_WORLD" and not GetResilienceDataDB then
GetResilienceDataDB = {}
else
SaveData()
end
end
f:SetScript("OnEvent", OnEvent)
收集到的资料我放在Google Docs上:
http://goo.gl/R5G8A
这些资料可以画出一个图表:
http://goo.gl/Jp6OA
4. 接下来才是好玩的,思考如何从用递减前的数字计算出递减後的数字。
一开始我被patch note误导以为他会是类似目前护甲减伤与抗性减伤公式类似的形式,
且结果会与生存能力成线性关系,不过用excel计算过後发现递减後依然是递增关系,
而不是线性关系。再来,我开始尝试套用闪招递减公式,不过也是失败的。
所以我们要找的是一个新的公式形式。观察蒐集到的资料可以发现大於1%减伤的,
递减後都小於原本的;但小於1%减伤的,反而会大於递减前的数值,於是我们可以
猜测这个公式输入是1的话,输出应该也是1。经过一段时间的思考後我的到了:
X' = 100 - 100 * 0.99 ^ X
利用这个公式计算的结果,与游戏内取得的结果相比误差在小数点下第五位。
5. 在patch notes里面有提到,如果你4.0.6的韧性减伤为32.5%的话,
你在4.1.0递减後也会是32.5%。所以问题是,要在4.1.0递减後得到32.5%的话,
递减前需要多少%?
解:32.5 = 100 - 100 * 0.99 ^ x
=> 100 * 0.99 ^ x = 67.5
=> 0.99 ^ x = 0.0675
=> x * log(0.99) = log(0.0675)
=> x = log(0.0675) / log(0.99)
= 39.10740833
将39.10740833除以32.5:
39.10740833 / 32.5 = 1.203304872
这就是为什麽要将4.0.6的韧性减伤除以1.203304872得到4.1.0的参数了!
----------------------------------------------------------------------------
虽然patch note写说韧性将与生存能力成线性关系,不过从下表计算结果可以看到依然是
递增关系,只是没有递增的那麽多就是了。
| 递减前 | 递减後
韧性 | 减伤 生存能力 生存能力增长| 减伤 生存能力 生存能力增长
20 | 0.25275 1.00253396 0.000127342 | 0.253705 1.002543505 0.000127499
40 | 0.50551 1.00508079 | 0.506766 1.005093479
------------------------------------------------------------------------------
100 | 1.26377 1.01279953 0.000129966 | 1.262105 1.012782382 0.000128801
120 | 1.51653 1.01539886 | 1.512608 1.015358399
------------------------------------------------------------------------------
220 | 2.78031 1.02859822 0.000134058 | 2.755623 1.028337097 0.000130779
240 | 3.03306 1.03127938 | 3.002337 1.030952679
------------------------------------------------------------------------------
3646 | 46.07733 1.85450765 0.000442098 | 37.06654 1.588979861 0.000202748
3718 | 46.98725 1.88633873 | 37.63944 1.603577713
上表之韧性与减伤是直接从游戏内取得的数值,而生存能力及生存能力增长是计算值。
我们可以看到韧性从20增加到40、100增加到120、220增加到240,3个点都是增加20韧性,
但是生存能力却越来越多。
以递减後20韧性为例,生存能力的计算方式是:1/(1-0.253705/100)=1.002543505
而递减後20增加到40生存能力增长的计算方式是:(1.005093479-1.002543505)/(40-20)
本文章同步发表於:
http://elitistjerks.com/f15/t29453-combat_ratings_level_85_cataclysm/p24/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.28.73
1F:推 Jpswd:我看不懂 04/23 22:14
2F:推 skywaiter:快推不然有人会说看不懂 04/23 22:14
3F:推 ring0409:我真的看不懂.....只能推了 04/23 22:17
4F:推 ivywhip:直接END了= = 04/23 22:17
5F:推 Cycylno:真是认真.... 04/23 22:19
6F:→ a38385588:我的结论是 看不懂 04/23 22:19
7F:推 Uhavemyword:热狗大 推一个 04/23 22:23
8F:→ hatedog:世俗人都看不懂得,多练几年就可以跟我一样 04/23 22:23
9F:推 mantohu:推,很喜欢看这些推导XD 04/23 22:23
10F:推 jerrysimon:楼楼上假热狗 04/23 22:24
11F:→ devidevi:娘子,快出来看上帝~~~~~~~~~~~~~~~~~~~~~~~~ 04/23 22:25
12F:推 mipeach:热狗大!!!!! 04/23 22:25
13F:推 panex0845:恩恩原来如此 果然给我推算的差不多 04/23 22:26
14F:推 mipeach:那要撑多少最刚好阿xd 04/23 22:27
15F:推 jerrysimon:回楼上,还是尽量撑,只是从"超强"→"很强"的属性而已 04/23 22:29
16F:推 kigipaul:推 很棒的推导!! 04/23 22:31
17F:推 ckgegg:虽然我推了 可是我真的看不懂. XD 04/23 22:38
18F:→ CYL009:就是韧性堆越多,生存力跟以前同韧性下比就越来越差的意思? 04/23 22:46
19F:→ CYL009:但是4.1版的"韧性等级"所需也下降了 结果效果根本没差 04/23 22:50
20F:推 OohonaoO:=====================我看不懂======================== 04/23 22:51
21F:→ CYL009:4.1大概就会看到你韧性%数比以前高,但是你的减伤%数却没变 04/23 22:52
22F:推 potionx:应该是因为以後套装的关系吧...可能bz算到最後减伤太高 04/23 22:54
23F:→ potionx:早点把公式弄出来让玩家适应。 04/23 22:54
24F:推 RKO5566:好强,结论就是还是撑越高越好,目前没上限 04/23 23:09
25F:推 orz65535:新公式在韧性约3100以前比旧公式略强 超过3100後则稍弱 04/23 23:12
26F:推 CYL009: 1.原po证明PATCH说的4.1版韧性跟减伤有直线关系是错误的 04/23 23:15
27F:→ CYL009:2. 4.1版韧性威能比4.06版的"稍微"弱了些 就这样 04/23 23:16
29F:→ orz65535:上面这张图每百韧性跟减伤%放反了 04/23 23:18
30F:推 freegreg:嗯嗯 原来如此 04/23 23:27
31F:推 realwind:看到ID就推 04/23 23:29
32F:推 rarex:这样改的话pvp装穿一穿宝石应该都不用塞韧性了.. 04/23 23:33
33F:推 sparking:快推 不然会被人家说看不懂 04/23 23:34
34F:推 luxifir:快推 不然会被人家说看不懂 04/23 23:35
35F:推 flame1983:你们这些XX,真的对不起你们的电脑老师阿 04/23 23:42
36F:→ flame1983:不过呢,我也看不懂(跪) 04/23 23:42
37F:推 dogalan:意思应该是 虽然4.1韧性效益在超过3100後比4.0.6稍弱 04/23 23:45
38F:→ dogalan:但整体而言韧性仍然是叠越多效益越好的属性 04/23 23:45
39F:推 bigsun0709:看不懂 @@ 04/23 23:56
40F:推 apley:快推~ 04/23 23:59
41F:推 feisky:快说看不懂,不然会被人家推 (? 04/24 00:01
42F:推 ironsalami:出现了好多数字公式老板友 XD 推啊 04/24 00:04
43F:推 pttresident:bz说的话,到底能信几分? = =" 04/24 00:09
44F:推 retawaet:结论? 04/24 00:10
45F:推 flamer:推一下热狗 04/24 00:17
46F:→ Heymay123:学长好! 04/24 00:56
47F:推 Fury777:有看有推~ 04/24 01:17
48F:推 para123:原来如此 04/24 05:16
49F:推 asd80602:我只想知道现在3800是40% 以後会变成多少?囧 04/24 07:40
50F:推 foolkids:推热狗大!! 04/24 09:30
51F:推 jerrysimon:回楼楼上,100-100*0.99^40=33.10282 04/24 09:51
52F:→ orz65535:应该是 100-100*0.99^(3800/79.12)=38.29 04/24 10:01
53F:→ orz65535:注意4.1也把等级的换算改低了 04/24 10:02
54F:推 Conigiwaa:热狗这麽多年了热情还是不减,真神人也 04/24 11:00
55F:→ kaojet:完全看不懂 O_o 04/24 11:12
56F:推 ror:只能推了! 04/24 11:32
57F:推 bernon:结论是? 04/24 12:53
58F:推 Nick00:只要告诉我韧性穿到多少就好 (误 04/24 18:33
59F:推 vincehuang:还是看不懂啊啊...... 04/24 20:25
60F:推 qmo668:结论阿阿阿阿阿 04/25 03:32
※ 编辑: hotdogee 来自: 221.120.64.108 (04/25 20:09)