欢迎光临散文网 会员登陆 & 注册

【对决诱导】2 前置知识-如何拆包

2023-02-06 03:59 作者:穿山辛  | 我要投稿

本文阅读与否不影响后文对于诱导的讨论,只是希望做出数据从哪来的必要说明,不感兴趣的话可以略过本篇。

拆包工具网络上有很多,炉石的拆包教学也不止本文一篇。但我搜到大多都是关于如何拆包获得卡图资源的教学。而我们需要的则是关于卡牌的逻辑信息,我在网络上没有找到教学,最后在朋友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`中的总结。

战棋中的某张牌经过处理后的结果,储存方式有些冗余(为了方便查值),但可以看到tag决定的内容其实是非常多的,除开负责逻辑判断以外,也会负责作为其他卡牌或是其他对象的的索引

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表示单卡信息,其他情况未知。

图为晶化宝石的诱导规则,tagId48表示费用,ruleIsNot为1说明范围在min-max之外,即费用在0-3以外的牌能诱导晶化宝石


我用lua写的拆包代码

首先懒癌,不想打包成exe,其次打包了也没用,因为生成的依旧是lua文件

因此如果要运行,自己装个lua,装lua-cjson库,配置环境,然后再说。

如果是看研究结果,见文件`CardTags.lua`,`Cards.lua`,`SubsetRule.lua`。

[百度网盘](https://pan.baidu.com/s/1D1RRQOV5FBgzxEbi3mdn_A?pwd=1234)

提取码:1234 


【对决诱导】2 前置知识-如何拆包的评论 (共 条)

分享到微博请遵守国家法律