【对决诱导】2 前置知识-如何拆包
本文阅读与否不影响后文对于诱导的讨论,只是希望做出数据从哪来的必要说明,不感兴趣的话可以略过本篇。

拆包工具网络上有很多,炉石的拆包教学也不止本文一篇。但我搜到大多都是关于如何拆包获得卡图资源的教学。而我们需要的则是关于卡牌的逻辑信息,我在网络上没有找到教学,最后在朋友thoroughly的帮助下确定的需要研究的文件和一些相关tag,才最终弄好。
也许未来还会有人想要再淌一遍浑水,因此写下本文。

现成的拆包数据
[所有卡牌](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)
前两个是json格式,后一个是xml格式,就正常使用来说,其实第一个版本也算足够了,但是前者的版本缺少对双种族的处理,这个是我不能忍受的。
后者的版本包罗万象,但我是使用lua语言解析数据,却没找到lua解析xml的库,所以没有继续研究。

拆包步骤
本文使用工具:AssetStudio(官方网址:https://github.com/Perfare/AssetStudio/releases)
安装过程略,太久之前弄的,不记得会遇到什么坑了。
1. 运行AssetStudioGUI.exe
2. 选择File->Load Folder,找到炉石所在文件夹(如我的文件夹是D:\Game\Battle.net\Hearthstone)
3. 选择Asset List,里面就是拆包拿到的东西了
4. 选择Filter Type,由All改为MonoBehaviour,我们需要的信息在这里面
5. 点击两次Size,按照文件大小降序

6. 右边的Preview就是我们需要的东西,但需要被研究的都是大文件,直接盯着看肯定看不出所以然,需要下载下来变成文件了才好处理
7. 如何下载呢,选择Export->Selected assets可以只下载我们选择的文件,而Filtered assets则是下载Filter Type步骤中选择的文件夹。
8. 本次要下载的文件是CARD、CARD_TAG、SUBSET_RULE、CARD_SET_TIMING,相关内容后述,如果仔细观察,会发现我这里拆包出现了两个CARD
9. 下载下来后是json格式,最精确的方法当然是写代码,比如笔者这次使用了lua的cjson库把json文件转换成了lua的table进行处理。如果完全没有代码基础,也可以在网上寻找json转excel的工具。(由于文本达30kb,复制粘贴能容易导致浏览器卡死,建议寻找能将json文件转excel的软件)
无代码基础解析json文件的办法
这里推荐一种无代码的处理办法,需要工具:Excel(至少要2016以上,总之需要支持Power Query功能,笔者使用的是Excel365)
1. 新建一个Excel
2. 选择数据→获取数据→来自文件→从JSON如图

3. 接下来以CARD为例,点击如图

4. 点击转换-到表,弹出提示框后点击确认

5. 点击展开后选择希望看到的内容,然后点击确定,如果展开后的内容还能展开就继续展开,不清楚哪些值是需要的就先全部展开再说

6. 如果觉得之前哪一步需要修改,可以在右边回到之前的步骤进行修改,如果已经完成,则可点击左上的关闭并上载,载入Excel中

7. 之后想要修改,则可点击数据-获取数据-启动Power Query编辑器或者从右边查询&链接中进入pq编辑界面,如果使用新的CARD.json替换掉了之前的文件,点击数据-全部刷新则可更新内容


拆包获得的文件
如果你安装了多个语言包,则会看到多个CARD,CARD_TAG等等文件,其中只有CARD文件有区别(观察Container里面记录的路径,含zhcn的就是中文,enus就是英文)
CARD
关注Records中的列表,最重要的信息如下:
● m_ID:对应一般所说的dbfid,是程序用来找到卡牌的标识码,具有唯一性;
● m_noteMiniGuid:卡牌id,程序员用来找卡牌的标识码,具有唯一性;
● m_name:卡牌名
● m_textInHand:卡牌描述,会使用换行,html的加粗和斜体标记
CARD_TAG
存放与游戏相关的tag,与游戏中的各种结算息息相关,如拉法姆的小鬼识别依赖标签,随从的种族依赖标签,甚至卡牌的费用,攻击生命也是标签决定的。
但是改变标签并不会影响游戏结算,说明相关操作实际是服务器完成的。(标签影响结算最经典的案例大概是螃蟹骑士修改为战吼:本回合获得风怒,突袭,后并没有加入战吼标签,导致沙德沃克无法重复触发这个战吼)
结构如下:
● m_ID:无效属性,不用理睬
● m_cardId:对应CARD中的m_ID
● m_tagId:tagID,如48表示费用
● m_tagValue:该tag对应的值,只会出现整数。(如tagID48,该值为9,则cardId对应随从为9费)
● m_isReferenceTag:引用标签,比如发现一个嘲讽随从,此时嘲讽为引用,1代表true,0代表false
● m_isPowerKerwordTag:关键字标签,如发现一个嘲讽随从的发现为关键字,1代表true,0代表false
对于tag的研究是炉石拆包研究最重要的部分,但限于篇幅,本文不再更进一步解释每一个tag的含义,文末会放出相关代码,如果只想搞懂CARD_TAG的内容,可见`CardTags.lua`中的总结。


CARD_SET_TIMING
记录了卡牌所属的扩展包,结构如下:
● m_ID:无效属性
● m_cardId:对应CARD中的m_ID
● m_cardSetId:一个数字,代表了某个扩展包
● m_eventTimingEvent:怀旧和核心的卡牌涉及到退环境后扩展包变动问题的解决方案,它们被分配了两次扩展包,根据TimingEvent决定现在数据哪一个扩展包。
SUBSET_RULE
从字面上看,记录了一些子集合的规则,对决的被动诱导就是使用了subsetRule实现的,
● m_ID:无效属性
● m_subsetId:subsetID,同ID则为同一个规则
● m_ruleIsNot:0表示false,1表示true,如果是1则表示ban掉符合该规则的牌
● m_minValue:最小值
● m_maxValue:最大值
● m_tagId:tagId,
● m_ruleType :取值范围1-9(但取不到5),已知1表示tag的取值范围应该落在min-max的范围内,若m_ruleIsNot=1则应在范围外;3表示单卡信息,其他情况未知。


我用lua写的拆包代码
首先懒癌,不想打包成exe,其次打包了也没用,因为生成的依旧是lua文件
因此如果要运行,自己装个lua,装lua-cjson库,配置环境,然后再说。
如果是看研究结果,见文件`CardTags.lua`,`Cards.lua`,`SubsetRule.lua`。
[百度网盘](https://pan.baidu.com/s/1D1RRQOV5FBgzxEbi3mdn_A?pwd=1234)
提取码:1234