從CE入手,研究女神異聞錄5皇家版(P5R)的暴擊機(jī)制
前言
最近想要研究下P5R的暴擊機(jī)制,翻遍全網(wǎng)都沒找到統(tǒng)一的說法,可謂是眾說紛紜一團(tuán)亂麻。所以我就想做個研究暴擊的專題,但是苦于不會解包。
不過尺有所短寸有所長,最近正好在研究P5R的修改,那干脆用CE,從匯編入手,用笨辦法一點(diǎn)點(diǎn)實(shí)驗(yàn)出來好了。
本文的主旨意在分享一些尋找切入口的思路,希望能起到拋磚引玉的效果。對匯編不感興趣的同學(xué)可以直接搜索并跳轉(zhuǎn)到“省流”部分,查看結(jié)論。

研究問題如下
暴擊的輔助buff:反叛(Rebellion)、革命(Revolution)、勇氣步伐(Brave Step)、斗志營養(yǎng)品(Hustle S),具體暴率為多少,是否可以疊加?
暴擊的被動buff:建言(Apt Pupil)、儀式護(hù)手-飾品(Gauntlet)、槍彈狂熱(Trigger Happy),高壓電流(Fortified Moxy),逆境的覺悟(Adverse Resolve),具體暴率為多少,是否可以疊加?
敵我雙方運(yùn)氣對暴擊率的影響。
通過以上三點(diǎn)的研究,最終推導(dǎo)出整個暴擊率的公式是如何計(jì)算的。

研究的過程(以下的地址基于steam1.03版本,所有測試基于Challenge模式)

1.顯示暴擊率的切入口
首先我們需要梳理代碼邏輯,找到顯示暴擊率的切入口。
從常理上說,每當(dāng)使用可以觸發(fā)暴擊的技能時,程序應(yīng)該會讀取儲存是否存在暴擊buff的地址數(shù)值,如果存在暴擊buff,不管是加法還是乘法,總之會使得暴擊率上升。
所以儲存暴擊buff的地址就是一個很好的切入點(diǎn)。
在這里感謝下那位寫CT表的外國大佬,節(jié)省了我很多時間。
以Mona為測試對象,已知Mona的暴擊率buff地址是[P5R.exe+29E940E]。
對該地址下斷,查找什么訪問了該地址,然后使用一次奇跡拳,發(fā)現(xiàn)只有一個地方讀取了該地址的值:
跟過去,發(fā)現(xiàn)這里代碼是讀取了地址,然后進(jìn)行一些計(jì)算和判斷(我沒仔細(xì)看,但用腳趾頭想都知道一定是讀取暴擊buff數(shù)據(jù)啊,暴擊buff是否存在等操作),直到:
這里是一個非常重要的關(guān)鍵點(diǎn)(簡稱關(guān)鍵點(diǎn)1),因?yàn)樗旧洗_定了,暴擊的輔助buff是加法。
接著往下走,直到:
這里同樣是個很重要的關(guān)鍵點(diǎn),具體的匯編邏輯就是,計(jì)算后的暴擊率如果大于60那么取60,如果小于60那么不變。說明暴擊率的上限不是網(wǎng)傳的70或者67,而是60。
繼續(xù)往下走,直到:
中間一群shr mul的運(yùn)算看的我腦仁疼,我也沒有認(rèn)真去追。
但是我猜啊,如果我是程序員,肯定Random一個100以內(nèi)的隨機(jī)數(shù),用該隨機(jī)數(shù)和暴擊率比大小,最終決定是否暴擊。
所以如果想要寫百分百暴擊的腳本,直接把jnl nop掉即可成功,即:
至此,先總結(jié)下代碼邏輯:
那么關(guān)鍵點(diǎn)1(P5R.exe+E14BFE)
則是一個很好的切入口,因?yàn)榭梢酝ㄟ^它得知暴擊基礎(chǔ)幾率和buff附帶的暴擊幾率分別為多少。

2.記錄數(shù)據(jù)
找到了顯示幾率的切入口,那么接下來就是實(shí)驗(yàn)記錄數(shù)據(jù)了
先以Mona奇跡拳為例子,反復(fù)攻擊同一小怪。得出如下數(shù)據(jù)(0x表示16進(jìn)制,即0xA=10):
從上述數(shù)據(jù)可以得出結(jié)論1:
反叛(Rebellion)、勇氣步伐(Brave Step)、斗志營養(yǎng)品(Hustle S)不可疊加,且暴擊率+=7
革命(Revolution)可與上述buff疊加,且暴擊率+=15

接下來以Mona至高魔彈為例子,反復(fù)攻擊同一小怪。得出如下數(shù)據(jù):
從上述數(shù)據(jù)可以得出結(jié)論2:
儀式護(hù)手-飾品(Gauntlet)、建言(Apt Pupil)不可疊加,且暴擊率=基礎(chǔ)暴擊率x2

繼續(xù):
從上述數(shù)據(jù)可以得出結(jié)論3:
槍彈狂熱(Trigger Happy)與其余所有buff都可疊加,且暴擊率+=25

逆境覺悟和高壓電流我就偷懶直接上結(jié)論了
至此,我們就可以總結(jié)出目前得到的結(jié)論了:
暴擊率=基礎(chǔ)暴擊率+buff附帶的暴擊率,且上限為60。
基礎(chǔ)暴擊率指的是技能自帶的暴擊率,外加雙方運(yùn)差的計(jì)算,最終得出的幾率。
如果帶有建言(Apt Pupil)或者儀式護(hù)手-飾品(Gauntlet),那么基礎(chǔ)暴擊率會翻倍。兩者擇其一即可,不可疊加。
其余所有的暴擊算法都是在建言計(jì)算后,進(jìn)行加法,具體為:
槍彈狂熱(Trigger Happy):+25
反叛(Rebellion)、勇氣步伐(Brave Step)、斗志營養(yǎng)品(Hustle S):+7,且三者互相不可疊加
革命(Revolution):+15
高壓電流(Fortified Moxy):+15
逆境的覺悟(Adverse Resolve):+20

3.運(yùn)差對基礎(chǔ)暴擊率的影響
當(dāng)下我們已經(jīng)得到了buff附帶的暴擊幾率,以及它們之間是否疊加的結(jié)論,只剩下研究敵我雙方的運(yùn)氣對于暴擊率的影響了。
先準(zhǔn)備一只Mona,屬性如下:
力=20 魔=40 耐=60?速=80 運(yùn)=50
然后對同一小怪使用奇跡拳,已知該技能命中=75,暴擊率=45。
已知Mona敏的地址是[P5R.exe+29E9444],對該地址查找訪問,獲取讀取地址
及其Return Address
分別對返回地址進(jìn)行追蹤,發(fā)現(xiàn)
返回rax=0x32=50=己方運(yùn)
返回rax=0x32=50=己方運(yùn)
返回xmm0=(float)50.00=己方運(yùn),儲存在xmm7
不必跳出函數(shù),繼續(xù)跟蹤此段代碼
返回xmm0=(float)36.00=猜測為敵方運(yùn),儲存在xmm6
返回xmm0=(float)45.00=猜測為技能暴擊率,儲存在xmm0
然后往下走
這段代碼已經(jīng)是明示了
向下取整得基礎(chǔ)暴擊率=52

研究的結(jié)論(省流)
最終暴擊率=基礎(chǔ)暴擊率(小數(shù)點(diǎn)向下取整)+buff附帶的暴擊率,且上限為60。
如果帶有建言(Apt Pupil)或者儀式護(hù)手-飾品(Gauntlet),那么基礎(chǔ)暴擊率會翻倍。兩者擇其一即可,不可疊加。
其余所有的暴擊算法都是在建言計(jì)算完成后,進(jìn)行加法,具體為:
槍彈狂熱(Trigger Happy):+25
反叛(Rebellion)、勇氣步伐(Brave Step)、斗志營養(yǎng)品(Hustle S):+7,且三者互相不可疊加
革命(Revolution):+15
高壓電流(Fortified Moxy):+15
逆境的覺悟(Adverse Resolve):+20

舉例1:
????義經(jīng):運(yùn)=80
????拉雯妲:運(yùn)=75
????用義經(jīng)使用八艘跳,那么最大化暴擊率的方式是:
????帶建言+逆境的覺悟(配合松的生命力)+反叛+革命
????基礎(chǔ)暴擊率=(80+50)/(75+50)*5=5
????最終暴擊率=5*2+20+7+15=52
舉例2:
????Mona:運(yùn)=99
????拉雯妲:運(yùn)=75
????那么Mona對拉雯妲用奇跡拳,
????基礎(chǔ)暴擊率=(99+50)/(75+50)*45=53
????也就是說99運(yùn)的Mona只需要一個反叛暴擊buff(+7)即可拉滿暴擊率,前提是得命中