[心得] 4.1 韌性減傷計算公式與推導

看板WOW (魔獸世界)作者 (hotdog)時間13年前 (2011/04/23 22:11), 編輯推噓44(44016)
留言60則, 46人參與, 最新討論串1/2 (看更多)
結果先寫在前頭: 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
直接END了= =
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
推,很喜歡看這些推導XD
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
那要撐多少最剛好阿xd
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
雖然我推了 可是我真的看不懂. XD
04/23 22:38, 17F

04/23 22:46, , 18F
就是韌性堆越多,生存力跟以前同韌性下比就越來越差的意思?
04/23 22:46, 18F

04/23 22:50, , 19F
但是4.1版的"韌性等級"所需也下降了 結果效果根本沒差
04/23 22:50, 19F

04/23 22:51, , 20F
=====================我看不懂========================
04/23 22:51, 20F

04/23 22:52, , 21F
4.1大概就會看到你韌性%數比以前高,但是你的減傷%數卻沒變
04/23 22:52, 21F

04/23 22:54, , 22F
應該是因為以後套裝的關係吧...可能bz算到最後減傷太高
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
新公式在韌性約3100以前比舊公式略強 超過3100後則稍弱
04/23 23:12, 25F

04/23 23:15, , 26F
1.原po證明PATCH說的4.1版韌性跟減傷有直線關係是錯誤的
04/23 23:15, 26F

04/23 23:16, , 27F
2. 4.1版韌性威能比4.06版的"稍微"弱了些 就這樣
04/23 23:16, 27F

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
看到ID就推
04/23 23:29, 31F

04/23 23:33, , 32F
這樣改的話pvp裝穿一穿寶石應該都不用塞韌性了..
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
你們這些XX,真的對不起你們的電腦老師阿
04/23 23:42, 35F

04/23 23:42, , 36F
不過呢,我也看不懂(跪)
04/23 23:42, 36F

04/23 23:45, , 37F
意思應該是 雖然4.1韌性效益在超過3100後比4.0.6稍弱
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
出現了好多數字公式老板友 XD 推啊
04/24 00:04, 42F

04/24 00:09, , 43F
bz說的話,到底能信幾分? = ="
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
我只想知道現在3800是40% 以後會變成多少?囧
04/24 07:40, 49F

04/24 09:30, , 50F
推熱狗大!!
04/24 09:30, 50F

04/24 09:51, , 51F
回樓樓上,100-100*0.99^40=33.10282
04/24 09:51, 51F

04/24 10:01, , 52F
應該是 100-100*0.99^(3800/79.12)=38.29
04/24 10:01, 52F

04/24 10:02, , 53F
注意4.1也把等級的換算改低了
04/24 10:02, 53F

04/24 11:00, , 54F
熱狗這麼多年了熱情還是不減,真神人也
04/24 11:00, 54F

04/24 11:12, , 55F
完全看不懂 O_o
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)
文章代碼(AID): #1DijtsBx (WOW)
文章代碼(AID): #1DijtsBx (WOW)