作者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)