异界锁链编码修改,随心所欲创造你想要的编码
平岛象龟
编辑于 2021年05月13日 23:18

注:本文仅讨论技术理论,其它话题一概不做参与。

异界锁链我是相当喜欢的游戏,RPG要素和ACT要素结合的也算恰到好处,唯一不是很满意的就是编码这块儿,刷主线时候还不觉得,通关以后刷挑战的时候就发现这东西真得刷出一些特定的搭配才行。但是本身刷这个就很无聊,加上来回跑任务图读取也很烦。想着干脆玩一套改派。于是就有了下面的东西。

异界锁链的存档

这里看到异界锁链的存档其实有9个,上面那个游戏数据我还没研究过,下面是我们要折腾的存档(游戏里只能看到2个)。

所以第一点是确定下你目前在用的是哪一个存档。这个的话我就不明细写了,而且本来我们就只要改编码,大不了所有存档都改一遍就是了。

接下来分析存档结构,首先看到每个存档大小都是一样的(主机游戏基本都是这样,PC游戏的存档一般是会有大有小的)

固定大小说明存档的结构是完全固定的,也就是说什么字节到什么字节存的是什么是完全定好的。这样正好方便我们分析。

这里随便搞一个16进制的编辑器打开存档开始对比。

打开大概就是这个样子

为了快速定位编码信息所处的位置,我们采用控制变量法,导出存档,然后进游戏改变一下编码状态,然后再导出一份,比较一下两个地方的差异。这个过程枯燥且没有技术含量,不多做赘述。

那么在我做对比之后,找出编码在存档里的位置如下。

光标处就是编码开始的数据块了

618504 Bytes(十进制),记住这个关键的数字,这个偏移开始就是编码的信息了。

如果你能充分理解上面我提过的存档大小固定的意思,那你应该能想到这种结构的存档所存的数据量也是固定的。所以编码信息的数据块必然有一个结束点。

690503 Bytes(十进制),这个就是结束的地方。

实际上上面结束的位置也要通过数次判断才能得到,但是这里我直接放了出来,方便大家理解后面的内容。

好的,现在知道开始和结束的数据块了。

而690503-618504+1=72000(字节)

也就是说总共有72000个数据块(字节)来保存编码道具。那就有两种保存办法。

  1. 种类+数量的保存方式,也就是 A编码X个,B编码X个....

  2. 每个编码自己的信息单独保存,编码A,编码B,编码C...

如果你玩过异界锁链,那你应该不难想到编码的信息必然是第二种保存方式。(编码是各类随机组合不可能用枚举方式)

能走到这一步,基本上你已经开始有点感觉了,但是接下来战斗才刚刚开始。

好了,既然每个编码都单独保存,但是一个编码占多少块呢?

为了能让程序读到数据信息,我想你肯定能理解每个编码占的块(字节)一定是一样的,不可能有长有短。

而编码信息又不可能特别长,所以一段数据应该在几十个数据块(字节)左右,以某个长度划分开后,每段的格式也必然是一模一样的。所以我们大概有一个方向去努力。

反复测试长度以后,我们可以得到每个编码的信息是36个数据块(字节)。

OK,取得关键进展了,但是问题又来了。

编码的信息是在这里面,但是我怎么把实际的各种属性对应进存档里的各种数字?

答案就是猜。

没错,实际上你并没有什么好的方法。但是好在我们也不是无根据的乱想。有很多办法来提高我们猜测的准确率。

首先,思考下异界锁链里的编码有什么信息要存?不知道的可以打开游戏背包看一看。

编码占的槽数    编码的分类

主属性是什么    主属性的数值

副属性1是什么    副属性1的数值

副属性2是什么    副属性2的数值

必要的信息就是这些了。但是还不够,我们还要思考游戏的运作来补充。

想象,当你是游戏系统,你读到存档的这里知道人物有什么编码就够了嘛?显然不是,你要判断哪些编码是装在身上的,哪些是仓库里放着没装的。

该如何判断呢?

又有两种可能了,一种是在编码的某段数据里加一个‘是否装备’的信息,这个信息来确认是否装备了。

第二种是给编码的某段数据里加一个独一无二的标志,然后再存档的另一个地方保存人物装备了哪些‘标志’,然后通过这些标志来查询是哪些编码。

两种方案都有可能,该怎么判断呢?

这个时候就该再去分析存档数据了。假如你还记得前面的内容,那我已经说过了,一个编码占36块(字节),而我们前面分析到已经有8个内容要存了。如果你有用过CE的经验,你应该会知道,数据存储的单位一半会是2或者4字节。那答案已经显而易见了。36/4=9,9-8=1,剩下的这一个字节就是放是否装备的信息的。

回到现在,假如是方案一,那每个编码里剩下的这一个字节,取值只能有6种(每个雷基恩一种,不装的一种)

假如是方案二,这个字节应该是完全不相同的。

答案是哪一种?是不是就很好判断了?看看存档,我们得出结论,是方案二。

好的,总结一下:

从618504 Bytes开始,每36个字节存一个编码。编码内每4个字节存一段信息,其中有一段是编号,不能相同。

走到这里,我们就差临门一脚了。关键就是,这9个信息怎么排列的?它的取值对应实际游戏里的属性是什么?

这是一个枯燥且麻烦的工程。需要不停的在存档数据和游戏里进行对比和判断。

我相信你也不愿意听我讲这部分内容了。我直接放出最终的答案吧。

9个信息从前至后依次为:编号,主槽槽位,主槽能力,主槽属性,副槽1能力,副槽1属性,副槽2能力,副槽2属性,编码分类。

而最关键的对应信息我整理在这边

依次是能力名称,能力说明,能力对应16进制编号,能力对应类别,类别对应16进制编号

我确认过很多次,应该不存在什么错误。但是这里有一个特殊的地方,是最后的自动回复生命值这个能力。

游戏中这个能力对应 大 中 小三个编码。但是实际测试过后,我发现这三种编码都是对应2A这一个编号。而大中小的区分只在随后的槽属性里,1是小,3是中,6是大,只要改变属性,游戏会自动识别到。

所以我这里不建议把这个数值随便设置,有可能会让游戏出错。(但是其它数值你可以最高调整到9999,我测试是不会出错的,不过实际加成似乎并没有真的到那么大)

可能看到这里很多人还是不明白吧。这边我举两个例子帮助理解下。

首先,记住很多时候存档里的数值并不是正常顺序保存,而是倒序排列的。

比如9999这个数字,转成16进制是270F

那它存的形式是0F 27 00 00

接下来规划你想要的编码,比如这里我想要一个

主槽是超级护甲α,副槽是超级护甲β,副槽2是攻击力。整体只占1槽位。

那么按顺序填:

编号:01000000(代表这是第一个,实际上数字随意,只要和其它编码不冲突就行)

主槽槽位编码:01000000(代表这个编码只占一格,相应还有02 03)

主槽能力编码 :08000000

主槽属性:01000000(超级护甲α并不需要数值,设置成1即可)

副槽能力:09000000

副槽属性:01000000

副槽2能力:01000000

副槽2属性:0F270000(加999.9%攻击力)

类别:05000000(类别跟着主槽走,但是这个只影响游戏内的分类,如果无所谓可以在1-6里随便填一个)

那么最终这个你自定义的编码的数据就是

010000000100000008000000010000000900000001000000010000000F27000005000000

把这段数据贴到我前面提的618504这个偏移量下即可,如果后面还要再加,那就在这条信息后面追加,最多可以加到690503这里。

最后一个提示:实际改存档的时候建议卖掉所有编码,不然可能会出现编号冲突,或者存档记录带了某个编号的编码,结果被你覆盖掉了。这种时候一读档打开编码界面就会闪退。