【對(duì)決誘導(dǎo)】2 前置知識(shí)-如何拆包
本文閱讀與否不影響后文對(duì)于誘導(dǎo)的討論,只是希望做出數(shù)據(jù)從哪來(lái)的必要說(shuō)明,不感興趣的話可以略過(guò)本篇。

拆包工具網(wǎng)絡(luò)上有很多,爐石的拆包教學(xué)也不止本文一篇。但我搜到大多都是關(guān)于如何拆包獲得卡圖資源的教學(xué)。而我們需要的則是關(guān)于卡牌的邏輯信息,我在網(wǎng)絡(luò)上沒(méi)有找到教學(xué),最后在朋友thoroughly的幫助下確定的需要研究的文件和一些相關(guān)tag,才最終弄好。
也許未來(lái)還會(huì)有人想要再淌一遍渾水,因此寫(xiě)下本文。

現(xiàn)成的拆包數(shù)據(jù)
[所有卡牌](https://api.hearthstonejson.com/v1/latest/zhCN/cards.json)
[可收藏卡牌](https://api.hearthstonejson.com/v1/latest/zhCN/cards.collectible.json)
[包含所有tag的版本](https://api.hearthstonejson.com/v1/latest/CardDefs.xml)
前兩個(gè)是json格式,后一個(gè)是xml格式,就正常使用來(lái)說(shuō),其實(shí)第一個(gè)版本也算足夠了,但是前者的版本缺少對(duì)雙種族的處理,這個(gè)是我不能忍受的。
后者的版本包羅萬(wàn)象,但我是使用lua語(yǔ)言解析數(shù)據(jù),卻沒(méi)找到lua解析xml的庫(kù),所以沒(méi)有繼續(xù)研究。

拆包步驟
本文使用工具:AssetStudio(官方網(wǎng)址:https://github.com/Perfare/AssetStudio/releases)
安裝過(guò)程略,太久之前弄的,不記得會(huì)遇到什么坑了。
1. 運(yùn)行AssetStudioGUI.exe
2. 選擇File->Load Folder,找到爐石所在文件夾(如我的文件夾是D:\Game\Battle.net\Hearthstone)
3. 選擇Asset List,里面就是拆包拿到的東西了
4. 選擇Filter Type,由All改為MonoBehaviour,我們需要的信息在這里面
5. 點(diǎn)擊兩次Size,按照文件大小降序

6. 右邊的Preview就是我們需要的東西,但需要被研究的都是大文件,直接盯著看肯定看不出所以然,需要下載下來(lái)變成文件了才好處理
7. 如何下載呢,選擇Export->Selected assets可以只下載我們選擇的文件,而Filtered assets則是下載Filter Type步驟中選擇的文件夾。
8. 本次要下載的文件是CARD、CARD_TAG、SUBSET_RULE、CARD_SET_TIMING,相關(guān)內(nèi)容后述,如果仔細(xì)觀察,會(huì)發(fā)現(xiàn)我這里拆包出現(xiàn)了兩個(gè)CARD
9. 下載下來(lái)后是json格式,最精確的方法當(dāng)然是寫(xiě)代碼,比如筆者這次使用了lua的cjson庫(kù)把json文件轉(zhuǎn)換成了lua的table進(jìn)行處理。如果完全沒(méi)有代碼基礎(chǔ),也可以在網(wǎng)上尋找json轉(zhuǎn)excel的工具。(由于文本達(dá)30kb,復(fù)制粘貼能容易導(dǎo)致瀏覽器卡死,建議尋找能將json文件轉(zhuǎn)excel的軟件)
無(wú)代碼基礎(chǔ)解析json文件的辦法
這里推薦一種無(wú)代碼的處理辦法,需要工具:Excel(至少要2016以上,總之需要支持Power Query功能,筆者使用的是Excel365)
1. 新建一個(gè)Excel
2. 選擇數(shù)據(jù)→獲取數(shù)據(jù)→來(lái)自文件→從JSON如圖

3. 接下來(lái)以CARD為例,點(diǎn)擊如圖

4. 點(diǎn)擊轉(zhuǎn)換-到表,彈出提示框后點(diǎn)擊確認(rèn)

5. 點(diǎn)擊展開(kāi)后選擇希望看到的內(nèi)容,然后點(diǎn)擊確定,如果展開(kāi)后的內(nèi)容還能展開(kāi)就繼續(xù)展開(kāi),不清楚哪些值是需要的就先全部展開(kāi)再說(shuō)

6. 如果覺(jué)得之前哪一步需要修改,可以在右邊回到之前的步驟進(jìn)行修改,如果已經(jīng)完成,則可點(diǎn)擊左上的關(guān)閉并上載,載入Excel中

7. 之后想要修改,則可點(diǎn)擊數(shù)據(jù)-獲取數(shù)據(jù)-啟動(dòng)Power Query編輯器或者從右邊查詢(xún)&鏈接中進(jìn)入pq編輯界面,如果使用新的CARD.json替換掉了之前的文件,點(diǎn)擊數(shù)據(jù)-全部刷新則可更新內(nèi)容


拆包獲得的文件
如果你安裝了多個(gè)語(yǔ)言包,則會(huì)看到多個(gè)CARD,CARD_TAG等等文件,其中只有CARD文件有區(qū)別(觀察Container里面記錄的路徑,含zhcn的就是中文,enus就是英文)
CARD?
關(guān)注Records中的列表,最重要的信息如下:
●?m_ID:對(duì)應(yīng)一般所說(shuō)的dbfid,是程序用來(lái)找到卡牌的標(biāo)識(shí)碼,具有唯一性;
●?m_noteMiniGuid:卡牌id,程序員用來(lái)找卡牌的標(biāo)識(shí)碼,具有唯一性;
●?m_name:卡牌名
●?m_textInHand:卡牌描述,會(huì)使用換行,html的加粗和斜體標(biāo)記
CARD_TAG?
存放與游戲相關(guān)的tag,與游戲中的各種結(jié)算息息相關(guān),如拉法姆的小鬼識(shí)別依賴(lài)標(biāo)簽,隨從的種族依賴(lài)標(biāo)簽,甚至卡牌的費(fèi)用,攻擊生命也是標(biāo)簽決定的。
但是改變標(biāo)簽并不會(huì)影響游戲結(jié)算,說(shuō)明相關(guān)操作實(shí)際是服務(wù)器完成的。(標(biāo)簽影響結(jié)算最經(jīng)典的案例大概是螃蟹騎士修改為戰(zhàn)吼:本回合獲得風(fēng)怒,突襲,后并沒(méi)有加入戰(zhàn)吼標(biāo)簽,導(dǎo)致沙德沃克無(wú)法重復(fù)觸發(fā)這個(gè)戰(zhàn)吼)
結(jié)構(gòu)如下:
●?m_ID:無(wú)效屬性,不用理睬
●?m_cardId:對(duì)應(yīng)CARD中的m_ID
●?m_tagId:tagID,如48表示費(fèi)用
●?m_tagValue:該tag對(duì)應(yīng)的值,只會(huì)出現(xiàn)整數(shù)。(如tagID48,該值為9,則cardId對(duì)應(yīng)隨從為9費(fèi))
●?m_isReferenceTag:引用標(biāo)簽,比如發(fā)現(xiàn)一個(gè)嘲諷隨從,此時(shí)嘲諷為引用,1代表true,0代表false
●?m_isPowerKerwordTag:關(guān)鍵字標(biāo)簽,如發(fā)現(xiàn)一個(gè)嘲諷隨從的發(fā)現(xiàn)為關(guān)鍵字,1代表true,0代表false
對(duì)于tag的研究是爐石拆包研究最重要的部分,但限于篇幅,本文不再更進(jìn)一步解釋每一個(gè)tag的含義,文末會(huì)放出相關(guān)代碼,如果只想搞懂CARD_TAG的內(nèi)容,可見(jiàn)`CardTags.lua`中的總結(jié)。


CARD_SET_TIMING?
記錄了卡牌所屬的擴(kuò)展包,結(jié)構(gòu)如下:
●?m_ID:無(wú)效屬性
●?m_cardId:對(duì)應(yīng)CARD中的m_ID
●?m_cardSetId:一個(gè)數(shù)字,代表了某個(gè)擴(kuò)展包
●?m_eventTimingEvent:懷舊和核心的卡牌涉及到退環(huán)境后擴(kuò)展包變動(dòng)問(wèn)題的解決方案,它們被分配了兩次擴(kuò)展包,根據(jù)TimingEvent決定現(xiàn)在數(shù)據(jù)哪一個(gè)擴(kuò)展包。
SUBSET_RULE?
從字面上看,記錄了一些子集合的規(guī)則,對(duì)決的被動(dòng)誘導(dǎo)就是使用了subsetRule實(shí)現(xiàn)的,
●?m_ID:無(wú)效屬性
●?m_subsetId:subsetID,同ID則為同一個(gè)規(guī)則
●?m_ruleIsNot:0表示false,1表示true,如果是1則表示ban掉符合該規(guī)則的牌
●?m_minValue:最小值
●?m_maxValue:最大值
●?m_tagId:tagId,
●?m_ruleType :取值范圍1-9(但取不到5),已知1表示tag的取值范圍應(yīng)該落在min-max的范圍內(nèi),若m_ruleIsNot=1則應(yīng)在范圍外;3表示單卡信息,其他情況未知。


我用lua寫(xiě)的拆包代碼
首先懶癌,不想打包成exe,其次打包了也沒(méi)用,因?yàn)樯傻囊琅f是lua文件
因此如果要運(yùn)行,自己裝個(gè)lua,裝lua-cjson庫(kù),配置環(huán)境,然后再說(shuō)。
如果是看研究結(jié)果,見(jiàn)文件`CardTags.lua`,`Cards.lua`,`SubsetRule.lua`。
[百度網(wǎng)盤(pán)](https://pan.baidu.com/s/1D1RRQOV5FBgzxEbi3mdn_A?pwd=1234)
提取碼:1234?