Site icon 时鹏亮的Blog

Switch Breeze 金手指制作教程五:使用Breeze进行长距离跳转的修改思路

请知悉:本文最近一次更新为 5个月 前,文中内容可能已经过时。

以下内容完整转载自:超绝可爱陆陆酱 原创发布:【工具教程5】使用Breeze进行长距离跳转的修改思路

本篇内容偏进阶向,不是小白能够理解的内容,因此很多名词、术语也不会做很详细的解释。都写到第五篇了还讲什么基础的东西,显得我太没水准了。

小白想学习金手指可以去看之前的基础教程,跟E大的教程。

本篇适合至少已经具备制作金手指,拥有自己分析、编写程序的能力,想进一步提高自己的修改技术,这类人进行参考。

这两天我跟隔壁论坛tom大佬交流了一下,主要是聊这个问题,百英雄传港版的地址完全不够用,美版的地址被压缩得更为严重。

再加上之前也有坛友问过我,main地址不够用的时候怎么办。刚好五一放假了有点时间,那么我就和大家聊一下这个。

问:为什么要进行长跳转,什么时候需要用到长跳转?

对于有的游戏,main分区下地址不够用,需要将code cave写到别的分区,比如说multimedia分区。

地址不够用,就会限制作者的发挥空间,有想法也写不出来。那么使用长跳转,跨分区写入代码,就有了更多可以使用的地址,能够更好的发挥,放飞自我。

如果直接从原程序的地址跳转到multimedia分区的地址,不是每个游戏都能够适用的。有的游戏中间可能还隔了一个分区,地址之间距离太长,超出了指令的跳转范围,无法跳转。

遇到这种情形时,就需要长跳转了。在原程序跳转到code cave这个步骤的中间过程,添加1个至若干个跳转的支点,实现多级跳转。

正常的code cave的修改顺序是:

原程序→code cave程序→原程序

而长跳转code cave的修改顺序则是:

原程序→跳转支点→code cave程序→跳转支点→原程序

长跳转是最新的Breeze 89k才更新的功能,因此需要更新一下。

https://github.com/tomvita/Breeze-Beta/releases/tag/beta89

接下来我会以百英雄传 港版v1.0.4版本,以长跳转的方式,制作1个功能的代码作为演示。

代码是从之前我做的1.0.2版本的代码升级过来,不再重新找。

[百英雄传].Eiyuden Chronicle Hundred Heroes 港版 v1.0.2 (15项修改)

这是已经升级过,但还没有修改的代码

BID:FA8085BD53ADC258

[不遇敌(no encounter enemies)]
04000000 0245502C 1E202820

那么接下来开始正文

先把代码导进机器,用Breeze查看

fadd s0,s1,s0

接下来打开拓展菜单(expand menu),选择跳转到程序(Jump to ASM),打开到ASM窗口,简单分析下程序,以及看一下修改思路。(主要是距离上一次发代码,已经过了很长时间,我也忘了)

思路分析:

对于暗雷遇敌的游戏,用来表示遇敌概率的数值,人物每走一步,这个数值就会自增或者自减,增加或者减少到某个阈值的时候,就会进入到战斗。

所以我们修改不遇敌,只需要修改让它不增加或者不减少就好。改还是比较好改的,找起来难不难就要因游戏而异了。

看看程序

str s0,[x0,#0x10] 的这一行,把数值s0写进内存[x0,#0x10]这个位置

然后再看上一行

fadd s0,s1,s0,让s0等于s1加上s0,就是影响数值变动的加法程序
然后再接上一行,ldr s1,[x0,#0x10],加载当前的数值。

再上面两行就是控制每次增加的具体数值,可能受到游戏中别的元素的影响,没什么意思,当然要拿来改也可以的。

这样是不是就能跟上面的思路联系起来了,人物每走一步,程序会把当前情况下遇敌率的数值加载到s1,既ldr s1,[x0,#0x10],  然后让s0=s1+s0,既fadd s0,s1,s0,再把s0写回去,既str s0,[x0,#0x10]。

然后是修改的部分:

我们要改它的话,只需要它不增加就好。

返回代码界面,选择Asm composer,编写一下模板文件。

我们这次要使用长跳转的改法去写,所以我们要先创建一个跳转支点。

支点的代码不会很复杂,只需要两行代码就够了。

{Original}
b code1+4

在Asm composer界面下选择Original也会自动生成一行原程序的代码,选择PasteBelow 在下一行添加一行空代码,按X手动改成 b code1+4,然后返回Add ASM,将模板文件导入。

自动给我们跳转,分配到了main+66B3F00这个地址上。

接下来跟最开始的步骤一样,选中main+66B3F00这一行,Jump to ASM,跳转到ASM窗口,然后Add to Cheat,把这行代码添加过来。

改一下名字,改成no encounter enemies long jump。

这里也可以选择Jump to target跳转到内存去看看,还有多少行可以用。

从66B3F00到66B3FF0,翻不动了,也就17×4,一共68行空地址,可以给我们拿来写code cave的。

依照我平时写代码的习惯,我会每项修改都集还原码、修改码、开关控制三套功能一体,让我的代码可以随开随关,而不是一个on,一个off这种写法。

这么写的话一项功能至少都需要十多个地址,能让我用的地址都不够我写几项的。

当然这不重要,我们来写一下修改的代码。

进Asm composer 编写一下模板

ASM 模板
ldr w7,.+16
cbnz w7,.+16 控制开关
————————————————
{Original}
b code1+4 还原码
————————————————
.word 1 控制代码开关的flag数
————————————————
ldr s7,.+16 程序修改区,浮点数加法的倍率修改
fmul s0,s0,s7
{Original}
b code1+4
.float 1000 倍率修改的具体倍数
————————————————

修改思路

控制开关会读取flag数作为判断,使用cbnz指令判断,如果为0,执行原本的程序,不作任何修改,跳回游戏原本的进程。如果不为0,执行修改后的代码,再跳回原本的游戏进程。

既然原本程序是一道加法,如果控制增加的倍数等于0,就等于说遇敌率不增加,而提高倍数到1000倍,游戏中走一步等于走1000步,就能立即遇敌。

我比较喜欢的改法,默认不遇敌,某个按键强制遇敌。

写完模板文件后,由于是写在multimedia分区的代码,所以要先把Alt ASM=1打开,这也是本次Breeze89k新增的功能。

接下来和平时一样Add ASM导入模板,然后我们就得到了这样的一串代码。

此时我们还要对代码再简单改一下,添加按键打开的功能。

把修改程序中最后一行,代表倍率的浮点数,copy →paste below,多复制3行出来

将原本的那行改成00000000,改成0倍的话,就是不增加了,乘以0等于0嘛,很好理解。

那么复制出来的三行,第一行改成80000000,第二行不改,保持.flote 1000的数值,第三行改成20000000。然后在80000000这行上选择,ASM/keycombo edit,按两下ZL,为0C384B24这行代码添加ZL触发的功能。

到这,我们的代码就加工完了,把两段代码从机器里导出来组合一下。

[no encounter enemies(跳转支点 )]
04000000 0245502C 1E202820 (这行不要)
04010000 0245502C 15097BB5
04010000 066B3F00 1E202820 (同上,不要)
04010000 066B3F04 16F6844B

[no encounter enemies long jump(主修改程序)]
04000000 066B3F00 1E202820 (同上,不要)
04010000 066B3F00 15734300
04010000 0C384B00 18000087
04010000 0C384B04 35000087
04010000 0C384B08 1E202820
04010000 0C384B0C 168CBCFE
04010000 0C384B10 00000001
04010000 0C384B14 1C000087
04010000 0C384B18 1E270800
04010000 0C384B1C 1E202820
04010000 0C384B20 168CBCF9
04010000 0C384B24 00000000
80000100
04010000 0C384B24 447A0000
20000000

由于修改code cave中已经包含还原码,所以上述不要的都是已经有重复的了。

把不要的删了,再在把比较关键的,一个是控制代码开关的flag数,一个是添加了按键开关,控制倍率的倍数,单独筛选出来,最后变成这个样子。

{master code//必须码}
04010000 0245502C 15097BB5
04010000 066B3F00 15734300
04010000 066B3F04 16F6844B
04010000 0C384B00 18000087
04010000 0C384B04 35000087
04010000 0C384B08 1E202820
04010000 0C384B0C 168CBCFE
04010000 0C384B10 00000000
04010000 0C384B14 1C000087
04010000 0C384B18 1E270800
04010000 0C384B1C 1E202820
04010000 0C384B20 168CBCF9
04010000 0C384B24 00000000


[不遇敌 按住ZL移动强制遇敌]
04010000 0C384B10 00000001
80000100
04010000 0C384B24 447A0000
20000000

原程序从0245502C这个地址,跳转到支点066B3F00,再经由支点跳转到code cave所在地址0C384B00。

地址跨度非常大,到这我们就完成了一次长跳转的修改。

教程看起来有点长,不过熟练了实际操作也就一两分钟的事情而已

虽然说除了长跳转以外,还有另一种解法,使用br指令可以跳转到任意地址。但在我实际的使用过程中,遇见过很多莫名其妙的BUG,使用br、bl、ret这种跳转指令虽然说跳转的范围更大,但是有可能会顶掉储存在寄存器里的跳回地址,游戏毕竟不是单线程,被顶掉的话就不知道return到那里去了,游戏会报错的。

所以我一般都不太爱用,更经常使用b……b这种绝对值的方式进行跳转,至少它非常稳定,不会乱跳。

缺点可能会是代码比较长,但对于Breeze这种自动生成代码的方式下,可以说忽略不计了。

结尾

无关紧要的个人主观输出:

无论我们论坛还是隔壁gbatemp论坛,都陆续有很多位大佬退坑或者半退坑的状态,目前还处在活跃状态的金手指作者加起来都不够十个人,产能低下。

90%以上的游戏,是没有人做金手指的,或者没有人更新的,这才是常态。天天看到综合区有人发帖求金手指,100%是不可能求得到的。

只能说欢迎各位比较有意向的,能够自给自足。

想要自己做去,求那就是没有。

老陆我要呢,又发资源,也要做金手指来发,又要清理学习区的废帖,身兼数职,身心俱疲,也不知道能还撑多久,随时都有想要退坑的冲动,本来就少的作者又-1。

每一个大佬都是从,没有人做自己喜欢的游戏的金手指,开始尝试自己去做,到成为一个金手指大佬。

我非计算机科班毕业,懂得不多,B大也不是,不是什么硬性需求。愿意花一点时间学,总能会一点。

作为先驱者的,顶级的大师像tom、Eiffel2018都已经编写了非常便利的工具,也写过很多教程,原来需要花半个钟或者一个钟去做的代码,现在只需要几分钟就能做好,学习成本其实并不高。

论坛也有几个本身有别的平台游戏、PC端的CE、手机端的GG,比较丰富的修改经验,再花一两个小时学一下十来个常用的汇编指令,稍微指点一下,就能上手写代码了,修改游戏这东西就是一通百通。

难点也仅在修改思路这个上,ns的资料不多,但CE、GG的修改经验,网上一搜全都是。

改的游戏多了,就能应对不同的游戏,针对不同的情况,见招拆招,纯凭个人经验积累了。当然遇到不懂的,也可以请教修改经验丰富的大佬,或者参考同一个游戏,不同平台的修改思路。

那种自己不想学,上来直接求代码的,我一般会直接骂人的。哦,一句你没时间学,我就有时间给你做?对吧,每个人的时间都是有限的,对于自己的兴趣该有的投入,只能自己去买单了。


如您从本文得到了有价值的信息或帮助,请考虑扫描文末二维码捐赠和鼓励。

尊重他人劳动成果。转载请务必附上原文链接,我将感激不尽。


与《Switch Breeze 金手指制作教程五:使用Breeze进行长距离跳转的修改思路》相关的博文:

Exit mobile version