究极绿宝石5.3

您所在的位置:网站首页 金手指是什么游戏 究极绿宝石5.3

究极绿宝石5.3

2024-07-09 12:19| 来源: 网络整理| 查看: 265

说在前面:

    本期是这个系列专栏正文的最后一期(后面可能会有作为内容补充的专栏),以V3格式码的一个高级用法结束对金手指的介绍。

    上期专栏的末尾提到:原始格式的金手指只能做到修改变量,而V3格式的金手指可以做到写程序。今天要介绍的金手指——随身携带的精灵中心,就是用V3格式码实现的一个小程序。

No$GBA Debugger

    首先要给大家介绍一个非常强大的工具:No$GBA Debugger,官方网站在这里:https://problemkaputt.github.io/gba.htm

    这个工具的中文名称叫做“没钱GBA调试器”。调试是计算机领域的术语,指的是在程序运行的过程中通过查看变量、修改变量等方式,对程序中可能出现的错误进行修正。

    如果只是用来探索金手指的话,我们当然不需要在游戏运行的时候对程序进行什么修正,但是No$GBA给我们提供的“运行时查看变量”的功能是十分强大的,对于“随身携带的精灵中心”这个金手指的发现也是至关重要的。

    首先来看一下它的界面:

No$GBA界面

    这个界面里显示了很多内容,我们能用到的是左侧上下两个信息栏。左上的信息栏和VBA模拟器的“变量地址查看器”很像,也是左侧的一列排列出来变量地址,右侧列举出变量取值,只不过在No$GBA中,它的当前地址基本上都是08开头的,回忆一下第五期专栏的内容,08开头的地址含义是游戏程序代码。No$GBA作为调试器,当然是在程序运行的时候提供查看变量的功能,所以它左上信息栏中的变量取值一般来说都是程序代码。

    左下信息栏目前显示的也是“变量地址查看器”,只不过右侧是以单字节的形式展示变量取值,功能和左上信息栏稍微有些重复。我们之后添加断点的时候,这个左下信息栏会变成断点查看器,断点的概念会在下面给出。

    现在先通过菜单中的“File-Cartridge menu (FileName)”,或者在win10系统上按下F12按键,来加载游戏的GBA文件。加载时可能会提示有错,不过没关系,按OK键跳过即可。加载成功后,会出现一个新的窗口,这个窗口就是平时玩游戏的模拟器窗口:

No$GBA游戏界面,左侧是新出现的模拟器窗口

    左侧的模拟器是可以正常玩游戏的,在玩的过程中,如果切换回右边的调试器界面,游戏就会暂停,左上信息栏会停止在当前正在运行的代码处,这是它的第一个功能。这个功能在本期专栏用不上,因为我们不需要知道代码是什么内容。

    工具先暂时介绍到这里,为了实现“随身携带的精灵中心”金手指,我们还需要介绍几个概念。

按键触发事件

    想要实现“随身携带的精灵中心”这个功能,我们希望在游戏中达到这样的效果:通过按下某个组合键,进入到和精灵中心护士的对话,完成队伍中全部精灵的回复后,返回到正常的游戏流程。因为是随时随地可以实现精灵回复,所以才将这个金手指称为“随身携带的精灵中心”。

    这条金手指和之前用原始格式代码修改变量取值的金手指有很大的不同,它不能通过简单地修改变量来实现,仔细看一下功能的描述就会知道,我们在开启这条金手指之后,还需要在游戏中按下某些特定的按键才能实现功能,而不像之前的金手指开启之后马上就能看到效果。

    这种按键实现的方式也是非常方便的,如果是开启金手指之后马上就进入和精灵中心护士的对话,反而可能出问题,比如游戏一直卡在和护士的第一句对话上,无法进入接下来的精灵回复阶段等等。

    因为这条金手指的功能需要按下特定按键才能触发,因此它也被称作按键触发事件。

    其实正常游戏中就有按键触发事件,例如我们按“上”键的时候主角就会向上走,按“Start”键的时候就会打开菜单。我们想要把“按键”这个关键因素结合到金手指代码中来,首先需要找到按键对应的变量地址在哪里。

    在第五期专栏中,作者给出了一个简单版的GBA文件内存视图,里面只画出了2个区域:游戏存档区和游戏本体区,其他的灰色区域并没有做过多的解释。其实完整的GBA文件内存视图可以在No$GBA这个程序的“帮助”界面找到,打开“Help-GBA Specs”

GBA详情GBA帮助界面

    上面给出的这个帮助界面是全英文内容,里面对GBA文件的组织结构进行了详细介绍,其中“GBA Memory Map”就是GBA的完整内存视图。本期专栏只介绍从里面提取出的相关内容,也就是“GBA Keypad Input”里有关键盘输入的部分。下面直接介绍结论。

    以0400开头的变量地址描述的是和游戏程序输入/输出相关的变量,电脑的键盘或者手机的按键可以看做是游戏程序的输入,而04000130这个位置描述的是当前键盘按键的情况,变量长度为2个字节。

    “按键情况”这个变量是不能通过金手指修改的,因为它的变量地址不是0202或者0203开头的,我们只能“看”,不能“改”。如果读者利用“变量地址查看器”去游戏中查看这个变量,会发现它通常情况下的变量取值都是03FF。但是,如果在游戏界面中,我们按住键盘上对应到“Select”键的那个按键不放手,然后再用鼠标去选择“工具——反汇编”去查看变量,就会发现它的变量取值发生了改变,变成了03FB。用类似的方法,我们可以探索出全部按键的映射表:

按键映射表

    按键映射表的第三行列举的是变量取值和03FF的按位异或值,“按位异或”这个操作在第七期专栏中介绍“闪光精灵”的时候提到过。仔细观察一下第三行,我们会发现每个数值转换为二进制后,只有1位是1,其他的位都是0。这么设计是什么原因呢?是为了方便表示组合按键的变量取值。

    比如说我们想按下“Select+上”这个组合按键,那么它对应的变量取值就是

    (0040 or 0004) xor 03FF = 03BB

    先将两个数进行“按位或”操作,然后再和“03FF”进行“按位异或”操作。“按位或”,或者说“或”(or)这个运算,不严格来说也是针对0和1的运算,它的含义是:

0 or 0 = 0, 0 or 1 = 1, 1 or 0 = 0, 1 or 1 = 1

    也就是说两个运算数中至少有一个1,结果就是1,只有运算数都是0的时候结果才是0。

    将两个数“按位或”起来,可以直观上理解为同时包含两种情况。在上面那个例子中,就是“按下Select键”和“按下上键”两种情况同时发生。

    通过查看04000130这个位置处的变量,我们就能得知当前游戏中什么按键被按下了。

对话程序

    在游戏中,我们会与各种各样的人物对话,一旦触发对话后,后续的对话或者选择都是由游戏程序设计好的,因此这种通过人物对话触发的剧情可以被称作对话程序:

对话程序

    主角来到精灵中心,和护士对话后会触发精灵回复的功能,这也是一个“对话程序”。这个“对话程序”,我们可以看做是一个变量,它的变量取值控制着当前的游戏页面上显示出来什么样的对话,或者控制着主角触发什么样的剧情或者功能。

    对于“对话程序”的变量,GBA帮助界面给出有关它们的几个事实:

“对话程序”变量的变量地址是以0300开头的,它的长度是4个字节。由于不是0202或者0203开头,因此它的变量取值不能任意修改,只能修改成游戏程序中写好的那些有意义的取值。

在游戏中没有触发对话的情况下,对应的变量取值固定是0。触发了对话后,变量取值会根据对话内容和剧情发生变化。

    有了以上几个事实,我们可以利用第八期专栏介绍的“模糊查找”功能,找到对话程序的变量地址:03000e48,长度是4个字节。

组装第一条金手指

    介绍了“按键触发事件”和“对话程序”这两个概念后,我们可以尝试着“组装”一下“随身携带的精灵中心”这个金手指了。

    这个金手指的第一行,我们想要达到这样的效果:

    按下某个组合键之后,会让下一条金手指执行;没有按下这个组合键的时候,什么都不做。

    想达到这样的效果,先来回答两个问题。

    第一个问题:为什么是按下组合键,而不是单个的某个按键呢?

    因为单个按键在游戏中都有它固定的作用,比如A键可以触发对话、确认选项,B键可以退出对话、取消选项,Start键可以打开菜单,等等。每个单个按键的功能已经确定,如果我们的金手指写成了“按A键触发精灵回复”这种样子,那就会出现以下两种情况之一:要么A键只能触发精灵回复,之前的作用就消失了,比如按A键再也无法与游戏里的人物对话了;要么A键还是之前的功能,这条金手指怎么也用不了。无论是哪种情况都是我们不想遇到的。

    第二个问题:选择什么组合键呢?

    组合键可以是2个按键一起按下,也可以是3个按键一起按下,甚至更多。但是为了操作方便,通常是选择2个按键一起按。

    那么选哪两个按键呢?根据作者的测试,发现这两个按键中有一个必须是Select键,否则组合键不会生效。而且使用Select键时,必须解除它登记到的背包中重要物品,如下图:

重要道具的登记功能

    这里的“登记”功能是让Select键成为一个使用重要道具的快捷键,比如登记了“音速自行车”之后,按Select键就能马上骑上自行车,不再需要到背包中选择“音速自行车”使用了。但是,为了使用“随身携带的精灵中心”这条金手指,只好牺牲了这个功能,让Select键发挥更强大的作用。

    剩下的第二个按键,需要考虑我们使用金手指的场景,在使用场景中,越是不经常使用的按键,作为组合键越合适。我们使用“随身携带的精灵中心”的时候,通常是主角在战斗之外,没有和任何人对话的情况下,这个时候按B键是没有作用的(除了在水下的情况,按B键是选择是否浮出水面);除此之外,L键和R键使用到的情况也非常少。因此,比较理想的组合是Select+B、Select+L、Select+R这三种组合键(组合键没有前后顺序,Select+B和B+Select是同样的组合键)。

    解答了这两个问题,就可以组装第一条金手指了。我们以组合键Select+B为例。

    Select键是0004,B键是0002,按照公式,Select+B同时按下的时候,04000130这个变量的取值应该是:

    (0004 or 0002) xor 03FF = 03F9

    下一步是要实现这个功能:Select+B键按下的时候,执行下一条金手指;否则什么都不做。

    这个功能要求我们去The Secrets of Professional GameShark(tm) Hacking这个文档里去AR V3 Codes Types这个表格中找对应的代码类型,这在第九期专栏有详细的介绍。我们来看“Type 05”这个代码类型:

Type 05类型

    这个类型的代码含义是:

    如果位于XXXXXXXX的双字节变量等于ZZZZ,那么就执行下一条金手指

    Halfword这个词是“半字”的意思,其实就是两个字节。

    我们把对应的地址和取值套进去:

    如果位于04000130的双字节变量等于03F9,那么就执行下一条金手指

    这恰好就是我们想要的效果。现在来看这个原始代码怎么转换到中间代码。

    根据“Type 05”类型的“原始代码转换规则”——02024EA4 -> 0A224EA4,我们需要把004000130变成0A400130,类比一下即可。

    所以第一条金手指的中间代码就是:

组装第二条金手指

    第二条金手指就是满足组合键按下的情况下,我们想要触发“精灵中心回复”这个功能。它的原理是修改03000e48这个地址处的变量,让它切换到和精灵中心护士的对话程序中,这样就相当于我们此时此刻就站在精灵中心的护士面前,和她进行对话了。

    那我们应该把这个变量改成什么呢?

    先来尝试一下,VBA模拟器中的“变量地址查看器”是不是可以。让主角来到精灵中心和护士对话:

查看对话程序的变量取值

    此时位于03000e48的变量取值是08271338,游戏中是精灵中心的护士刚刚说完第一句话。这个取值能不能用呢?很遗憾,不行,有兴趣的读者可以用这个变量按照接下来的流程走一遍,会发现用这个变量组装成的金手指没有预期效果。

    为什么这个变量不起作用呢?我们再来尝试一下,这一次需要一点手速,在按下A键开始和护士对话、但护士还没来得及说出第一个字的时候,打开“变量地址查看器”:

拼手速来查看变量取值

    此时的变量取值是0827192a,和刚才的不一样。这说明刚才的那个变量取值不能对应到这段对话程序的开始,而是对应到对话程序的中间某一步,如果我们用了上面那个取值,运行的对话程序将是不完整的,这就是08271338不起作用的原因。

    那么0827192a可以用吗?也不行。事实上,这个变量是多少取决于手速,在按下A键之后但护士说出第一个字之前,打开“变量地址查看器”的时机,决定了这个变量的取值是多少。换句话说,这个变量取值变化得十分迅速,但我们想要的是刚刚按下A键之后它的取值,也就是从0变到不是0的那第一个取值,这个取值是无论你手速有多快都找不到的。

    我们怎么能把找变量取值这种事情交给不靠谱的手速呢?更靠谱的办法,是要利用No$GBA调试器提供的断点功能。

    断点是让程序运行时强制暂停的一个标记,如果程序因断点的存在而暂停执行,我们就说这个断点被触发了。可以通过设置断点的条件来让程序在条件满足的时候暂停执行,这种断点也被称作条件断点。

    我们用No$GBA来玩一局究极绿宝石5,让主角走到精灵中心的护士面前,然后回到No$GBA的主界面来设置断点:

设置条件断点

    按Ctrl+B,或者在菜单中选择“Debug-Define Break/Condition”,会出现一个输入条件断点的输入框,在框中输入:

    将变量地址03000E48用中括号包含起来,然后在后面加一个叹号(都是英文字符)。这个条件断点的含义可以在“帮助”菜单内找到,是当03000E48这个地址的变量被程序修改时,触发断点让程序暂停。

    为了看到03000E48这个位置处的变量,我们可以用Ctrl+I(HIJK里面的那个I),或者在菜单中选择“Debug-Define Watchpoint”,来添加一个查看特定变量的标记(术语叫监视变量):

设置监视变量

    这个框里输入的就是变量地址了。现在No$GBA主界面的左下框应该是这个样子:

断点/监视变量窗口

    里面有两条,第一条是我们的监视变量,可是它只监视了1个字节,但我们需要4个字节。所以我们需要将03000E49、03000E4A、03000E4B也添加进我们的监视变量里面:

完整的监视变量

    前四行就是被监视的4个字节,它们拼起来是0,因为还没有触发对话。第五行是设置的条件断点。

    回到No$GBA的游戏界面,我们可以在其中任意走动,但是一旦和精灵中心的护士对话,游戏就会卡死,说明我们成功触发了断点:

触发断点

    此时就是按下了A键,但是护士还没来得及说出第一个字的时刻。用断点的方法可以确保我们找到的一定是这个变量第一次发生变化的情况,和手速就无关了。我们可以看到,现在被监视的4个字节拼起来是081FC01A(按小端序拼接),这就是和精灵中心护士的对话程序对应的变量取值了。

    有一点需要注意:触发断点时,当前程序界面会自动从游戏界面切换回No$GBA的主界面,此时千万不要再手动切换回游戏界面!因为切换回游戏界面的含义是跳过当前断点,让程序继续执行,那我们就错过了当前断点的变量取值了。

    081FC01A是我们在VBA模拟器中无论手速有多么快都获取不到的变量取值,而No$GBA的断点功能则确保我们可以得到它。因此No$GBA的功能是十分强大的!

    我们的第二行金手指的原始代码就组装好了:

    下一步是把它转换成中间代码,又需要查找AR V3 Codes Types这个表格了:

Type 02

    这次用到的是“Type 02”这个类型,代码含义是:

    把地址XXXXXXXX处的变量设置为ZZZZZZZZ

    按照原始代码转换规则,我们应该把03000E48变成04300E48,因此第二行中间代码就是:

    最后一步,用AR Crypt将两行中间代码加密成V3格式码:

最后一步加密过程

    我们的“随身携带的精灵中心”这条金手指就组装成功了!

    它的格式是V3格式码,赶快到VBA模拟器中试一下!

金手指效果评估

    来到VBA模拟器中的游戏,在“金手指列表”的“GameShark”选项中输入V3格式码,回到游戏后,看看金手指管不管用:

输入金手指

    我们试试按Select+B这个组合键管不管用。这个组合键有三种按法:

先按住Select,然后按B

先按住B,然后按Select

争取Select和B一起按

    虽然三种按法都能触发金手指,但是实践证明第2个方法最好,因为当Select键没有登记到重要物品时,单独按Select键会跳出一个介绍Select键功能的对话框,如果按组合键的时候Select键按下去的时间比B键早,就会多出来这么一句对话,而先按B就没有这个问题。金手指效果如下:

随身携带的精灵中心

    目前主角的身边空无一人,但按下B+Select之后,仿佛精灵中心的护士就在面前,这就是随身携带的精灵中心,只要是在对战和对话之外,随时随地都可以回复队伍中的全部精灵!

    注意上面这个条件:对战和对话之外。所以单挑彩虹火箭队6位首领时这条金手指就用不上了,连续的对战和对话让你根本没有使用这条金手指的条件!

    仔细回想一下,今天介绍的金手指实际上就是实现了下面这个小程序:

如果Select键和B键同时按下:

那么:游戏切换到和精灵中心护士的对话程序

否则:什么都不做

    这就是V3格式码真正的强大之处。原始格式码只能给变量赋值,是无论如何也实现不了这种功能的。

自己动手来尝试

    还有一个和“随身携带的精灵中心”一样有用的金手指,被称作“随身电脑”,就是对话和对战外随时随地到自己的电脑仓库中更换精灵或者存取道具。它的原理和“随身携带的精灵中心”几乎完全相同:和电脑对话同样也是对话程序。有兴趣的话不妨自行探索一下!效果如下图所示:

随身电脑

    给个小提示:和电脑对话时,对应的对话程序变量取值是08271D92,可以验证一下读者用No$GBA的断点功能是否熟练。不熟练的话也没关系,大家完全可以从这一步开始组装“随身电脑”这个金手指,难度已经大大降低了!

专栏结语

    作者用了十期专栏,以究极绿宝石5为例,详细回答了“什么是金手指”这个问题。内容难度逐渐上升,从前面几期较为直观的现象开始,到后面几期涉及到编程等计算机理论知识,如果读者能够弄清楚其中的道理,当你再次看到金手指的时候,想必会站在一个更高的视角,得到更深刻的理解。

    然而学无止境。作者在第五期专栏提到过,08或09开头的金手指修改的是游戏代码本身,因此用了这种金手指就相当于对游戏进行了改版,用了之后你玩的游戏就不再是究极绿宝石5了。那些代码的修改为什么能起到作用?这需要涉及到一个更加专业的知识:反汇编。这就不是这个系列专栏所能解释清楚的问题了。作者将这一部分进阶的内容留到另一个专栏中去介绍。

    某个游戏中的反派有一句很有意思的话,分享给大家:

You can pick the game, but you cannot change the rules. By Dimitri Rascalov.

玩什么游戏是你的自由,但你不能破坏游戏规则。

    最后,感谢大家的支持!如果有什么疑问或者建议、意见,欢迎到评论区回复!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3