[心得] 4.1 韌性減傷計算公式與推導
結果先寫在前頭:
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
推
04/23 22:14, , 1F
04/23 22:14, 1F
推
04/23 22:14, , 2F
04/23 22:14, 2F
推
04/23 22:17, , 3F
04/23 22:17, 3F
推
04/23 22:17, , 4F
04/23 22:17, 4F
推
04/23 22:19, , 5F
04/23 22:19, 5F
→
04/23 22:19, , 6F
04/23 22:19, 6F
推
04/23 22:23, , 7F
04/23 22:23, 7F
→
04/23 22:23, , 8F
04/23 22:23, 8F
推
04/23 22:23, , 9F
04/23 22:23, 9F
推
04/23 22:24, , 10F
04/23 22:24, 10F
→
04/23 22:25, , 11F
04/23 22:25, 11F
推
04/23 22:25, , 12F
04/23 22:25, 12F
推
04/23 22:26, , 13F
04/23 22:26, 13F
推
04/23 22:27, , 14F
04/23 22:27, 14F
推
04/23 22:29, , 15F
04/23 22:29, 15F
推
04/23 22:31, , 16F
04/23 22:31, 16F
推
04/23 22:38, , 17F
04/23 22:38, 17F
→
04/23 22:46, , 18F
04/23 22:46, 18F
→
04/23 22:50, , 19F
04/23 22:50, 19F
推
04/23 22:51, , 20F
04/23 22:51, 20F
→
04/23 22:52, , 21F
04/23 22:52, 21F
推
04/23 22:54, , 22F
04/23 22:54, 22F
→
04/23 22:54, , 23F
04/23 22:54, 23F
推
04/23 23:09, , 24F
04/23 23:09, 24F
推
04/23 23:12, , 25F
04/23 23:12, 25F
推
04/23 23:15, , 26F
04/23 23:15, 26F
→
04/23 23:16, , 27F
04/23 23:16, 27F
→
04/23 23:16, , 28F
04/23 23:16, 28F
→
04/23 23:18, , 29F
04/23 23:18, 29F
推
04/23 23:27, , 30F
04/23 23:27, 30F
推
04/23 23:29, , 31F
04/23 23:29, 31F
推
04/23 23:33, , 32F
04/23 23:33, 32F
推
04/23 23:34, , 33F
04/23 23:34, 33F
推
04/23 23:35, , 34F
04/23 23:35, 34F
推
04/23 23:42, , 35F
04/23 23:42, 35F
→
04/23 23:42, , 36F
04/23 23:42, 36F
推
04/23 23:45, , 37F
04/23 23:45, 37F
→
04/23 23:45, , 38F
04/23 23:45, 38F
推
04/23 23:56, , 39F
04/23 23:56, 39F
推
04/23 23:59, , 40F
04/23 23:59, 40F
推
04/24 00:01, , 41F
04/24 00:01, 41F
推
04/24 00:04, , 42F
04/24 00:04, 42F
推
04/24 00:09, , 43F
04/24 00:09, 43F
推
04/24 00:10, , 44F
04/24 00:10, 44F
推
04/24 00:17, , 45F
04/24 00:17, 45F
→
04/24 00:56, , 46F
04/24 00:56, 46F
推
04/24 01:17, , 47F
04/24 01:17, 47F
推
04/24 05:16, , 48F
04/24 05:16, 48F
推
04/24 07:40, , 49F
04/24 07:40, 49F
推
04/24 09:30, , 50F
04/24 09:30, 50F
推
04/24 09:51, , 51F
04/24 09:51, 51F
→
04/24 10:01, , 52F
04/24 10:01, 52F
→
04/24 10:02, , 53F
04/24 10:02, 53F
推
04/24 11:00, , 54F
04/24 11:00, 54F
→
04/24 11:12, , 55F
04/24 11:12, 55F
推
04/24 11:32, , 56F
04/24 11:32, 56F
推
04/24 12:53, , 57F
04/24 12:53, 57F
推
04/24 18:33, , 58F
04/24 18:33, 58F
推
04/24 20:25, , 59F
04/24 20:25, 59F
推
04/25 03:32, , 60F
04/25 03:32, 60F
※ 編輯: hotdogee 來自: 221.120.64.108 (04/25 20:09)
討論串 (同標題文章)
完整討論串 (本文為第 1 之 2 篇):
44
60
WOW 近期熱門文章
69
214
PTT遊戲區 即時熱門文章