究极绿宝石5.3

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

究极绿宝石5.3

2024-07-08 06:29| 来源: 网络整理| 查看: 265

说在前面:

    回顾一下上一期的内容,三个有关“金手指”的问题,作者回答了第一个问题:我们想要改的数字在哪里——变量地址查询。并在最后给出了一个可以提前看黄半仙的蛋会孵出什么精灵的彩蛋。这一期专栏,将会回答第二个问题:

    我们要改的数字是什么含义,或者说我们想改的东西对应了什么数字——变量与实体的映射表。

映射与映射表

    映射是计算机编程领域的一个术语,含义是两个概念之间的对应关系。这么说有些抽象,举几个例子就好理解了。第一个例子是交通信号灯,我们常说的“红灯停,绿灯行”就是在灯的颜色和过马路的动作之间建立了一组映射:“红灯”映射到“停”,“绿灯”映射到“行”。第二个例子是我们的身份证号码,一个18位的身份证号码映射到一个公民。第三个例子是上下课的铃声,如果上下课铃声不同的话,那么上课铃就可以映射到“上课”这个消息,下课铃就可以映射到“下课”这个消息。

    映射只是对“对应关系”进行了描述,它并不是“等价”。交通信号灯的红灯让人联想到过马路需要停,但是充电器上的红灯就不会,“红灯”和“停下来”并不等价;18位的身份证号只是一串数字,它并不是某个公民,它只能说对应到某个公民,数字和人不能等价;上下课的铃声如果不是在学校响起的,它代表的含义可能就不再是上课下课,上下课铃声这段音乐和上下课的消息也不是等价的,只能说是在一个具体的环境中,两者存在对应关系。

    回到游戏中来,以上篇专栏最后给出的彩蛋为例,我们可以做出这样的映射:

    变量地址0202450c,映射到:首位精灵的种族

    变量取值02b0,映射到:三首恶龙

    这就是变量到游戏实体的映射。我们看到的金手指,有相当大的一部分是通过这种映射来实现的,变量地址映射到某个想要改的东西,变量取值映射到我们想要它改成的东西。

    上面只有两条映射,如果我们把映射一一列举出来,比如下面这个片段:

    这个列举出来、一条一条展示映射的表格就称为映射表。这还只是变量取值的映射表,变量地址同样也有映射表,比如下面这个片段:

    什么变量地址映射到游戏中的什么含义,什么变量取值映射到什么精灵或者物品,都是设计游戏的人在编写程序时确定的。需要注意的是,变量地址的映射表,对于究极绿宝石5来说只有一张表,因为变量的门牌号(地址的取值范围)限定在了00000000(16)~ffffffff(16)这一条“大街”上,没有另一条“大街”。但是变量取值的映射表却有好多张,比如说精灵种族对应着一张映射表,携带物品也对应着一张映射表,游戏为常用汉字也做了一张映射表,例如02b0在精灵种族的映射表中对应到三首恶龙,在携带物品的映射表中却对应到银色王冠,在常用汉字的映射表中,它又对应到“大葱鸭”里的“葱”这个字。可以说,游戏界面中给你展示出来的一切,都是按照这些大大小小的映射表,从一个个的数字对应到游戏实体的。

变量到实体,究竟是怎么对应的?

    上面一小节抛出了很多让人莫名其妙的事实:为什么0202450e就对应到“队伍中首位精灵的携带物品”了?为什么02b0一会儿代表着“三首恶龙”,一会儿又成了“银色王冠”,一会儿又代表着单个汉字?这有什么道理吗?为了解释清楚这些,我们又要请出VBA模拟器,这次要用到的是查找金手指这个功能。

    VBA模拟器中,点击“金手指——查找金手指”,可以打开“查找金手指”的界面。

查找金手指查找金手指的界面

    有很多使用VBA的读者在看到“查找金手指”的功能时,可能难免激动一番,原来模拟器早就做好了找金手指的功能!可是打开一看,根本不知所云,这东西怎么用啊?跟想象的不一样,想象中的“查找金手指”,应该是有一个类似“搜索”的按钮,点击后出现一个进度条,搜索完之后,把一些代码和对应的含义列在一张表格中任你使用。白日梦该醒醒了,“查找金手指”的功能远没有那么智能,这个功能的实质,需要和第二期专栏里面那个“反汇编——变量地址查看器”结合起来才能解释清楚。

变量地址查看器,转到0202450c的样子

    作者在第二期的专栏中介绍过,“工具——反汇编”这个菜单打开的界面其实是一个“变量地址查看器”,有个功能是在“转到”按钮前的那个输入框内输入一个8位十六进制数,它就会跳到对应的地址,你就可以看到这个地址处变量的取值。简而言之,就是给定地址,找到取值,前半句是条件,后半句是结果。“查找金手指”的功能恰好与此相反,它是给定取值,找到地址,条件和结果对调了一下。给定一个取值,“查找金手指”会找到取值是给定数字的所有变量的地址,也就是说它给的结果可能不止一个,恰好有多个变量取值是一样的,它会把这些变量的地址都列出来。

    下面会介绍几个具体的例子,来解释“查找金手指”的使用方法。

查找金手指例1——游戏金币数量在哪里?

    下面以游戏金币数量为例,来解释“查找金手指”功能应该如何使用。在这里,我们希望找到代表游戏金币数量的变量地址,而变量取值自然就是金币数量。

    以作者一次测试的图为例,下图中主角拥有的金币数是1381241

主角金币数

    然后我们打开“金手指——查找金手指”,界面里出现了一系列选项,其中“查找类型”中的“精确查找”、“比较类型”中的“相等”和右下角那个打了对勾的“刷新数值列表”,通常情况下是不需要更改的。“有/无正负之分”那里也有三个选项:分正负、不分正负和十六进制,这里一般采用的是“不分正负”这个选项。现在就剩下“数据尺寸”这个选项了,需要详细说明一下。

    “数据尺寸”中有三个选项:8位,16位和32位,指的是变量取值的二进制位长度,阅读过第二期专栏的读者们应该都理解是什么意思。这里我们需要多长的数据呢?这就要用到第二期专栏介绍的一个工具:win10自带的计算器,程序员模式。将1381241输入到十进制的栏内,得到如下结果:

win10计算器,程序员模式

    在DEC(十进制)下输入数字后,上面的HEX(十六进制)和下面的BIN(二进制)自动进行了转换。看二进制那一行,共有24位,超出了16位的范围,因此我们需要选择“查找金手指——数据尺寸”中的32位选项。都设置好了之后,在“精确查找的目标值”输入框内输入金币数1381241,然后点击左下角的“开始”按钮,如下图:

查找金手指-开始查找

    点击“开始”后,原本灰色的“查找”按钮现在变得可以点击了。这里,“开始”按钮的含义是重新开始一轮变量取值的搜索,将之前的搜索记录全部忘记。下一步,我们点击“查找”,结果就会显示出来:

查找结果

    我们比较幸运,只通过一次查找,就找到了游戏内金币数的变量地址,是02025e90,这就是我们通过“查找金手指”功能自己找到的一条映射。怎么验证这个地址找的对不对呢?我们先关闭当前页面,在游戏中买一个高级球(1200元),然后再次打开这个页面,如下图所示:

购买物品后,变量取值发生变化

    上图中,02025e90地址处对应的“旧值”还是我们之前的数字1381241,但后面的“新值”变成了1380041,恰好是减去1200元购买高级球的剩余金币数。这是因为我们勾选了右下角的“刷新数值列表”,所以在“查找金手指”的页面中会随游戏进度更新数值。还有另一个验证方法,是用第二期专栏介绍过的方式,从“工具——反汇编”中打开“变量地址查看器”,输入02025e90查询:

变量地址查看器,查看金币数的变量取值

    02025e90处的变量取值是0ec9,这个数字只有16位二进制,我们要的是32位(别忘了在“查找金手指”中我们的设置),剩下的16位在哪里呢?对第二期专栏还有印象的读者,会记得变量的取值是随地址连续的,因此剩下的16位在02025e92处,是0015,而小端序则确定了这两个16位二进制数(也就是4位十六进制数)该怎么拼接:高位放在高地址,低位放在低地址。因此拼接之后的32位二进制数就是00150ec9,这个数的十进制是多少呢?再次用到我们的win10程序员计算器,这次选择HEX一栏进行输入,可以看到:

十六进制转换为十进制

    在DEC一栏的数字是1380041,恰好是主角剩下的金币数。这样,我们就用了两种方式验证了:角色的金币数这个实体概念,可以映射到的变量地址是02025e90。

    这次我们比较幸运,在“查找金手指”中,只用了一次查找就找到了变量地址,下面再举一个例子,需要多次查找。

查找金手指例2——队伍首位精灵的级别在哪里?

    作者拿一个存档进行如下测试:队伍中有三只精灵,级别分别为4级、15级和22级,队首精灵级别为4:

队伍级别情况

    我们打开“金手指——查找金手指”,其他设置和上一个例子没有变化,只有“数据尺寸”这一条需要仔细考虑。由于精灵等级最高100级,对应的十六进制数是64(16),(还不知道十进制怎么转换成十六进制?win10程序员计算器!),说明精灵等级的二进制不会超过8位(2位的十六进制数就是8位二进制数),因此这里的“数据尺寸”需要选择“8位”。然后在“精确查找的目标值”输入框内输入4,先点击“开始”,再点击“查找”,结果如下图:

查找金手指:队伍首位精灵等级

    和上个例子不同,这里变量取值是4的变量有很多,到底哪个才是队伍首位精灵的等级呢?这就需要介绍查找金手指的进阶功能:追踪式变量取值查找。

    注:有的读者可能会在这一步搜索弹出一个对话框“错误,搜索到……条结果,请选择最适合的”,这种情况并不是说搜索失败了,搜索还是成功的,接下来的步骤仍然可以进行下去,详细的解释可以看第八期专栏究极绿宝石5.3——科普向,什么是金手指(八)。

    追踪式变量取值查找:在点击了一次“查找”按钮之后,我们可以先回到游戏进行一些操作,然后再进入“查找金手指”的界面,修改“精确查找的目标值”后面输入框内的数值,然后再次点击“查找”,这样挑选出来的变量就是这样的变量:在第一次查找时符合第一次条件,并且在第二次查找时符合第二次条件的变量。

    为了演示,我们先点击右下角的“确定”按钮退出“查找金手指”的页面,返回游戏,然后将首位精灵和第二位精灵换位一下:

队伍精灵顺序换位

    此时首位精灵的等级变成了15级,我们再次打开“查找金手指”的界面,发现有些原来取值是4的变量,现在发生了变化:

调换精灵顺序后,重新打开查找金手指

    可以看到,目前显示出来的变量,有的还保持着4这个取值,有的变成了0,它们都不是我们要找的变量,我们要找的变量现在应该变成了15才对,因此在“精确查找的目标值”后面输入15,然后点击下面的“查找”(此时不能点击“开始”!因为我们需要“追踪式变量取值查找”,点了“开始”,之前的查找记录就没了),查找的结果如下:

查找15

    现在我们就剩下了2个地址,目标范围大大缩小。再次声明一下“追踪式变量取值查找”的结果,以上图为例,就是第一次查找时取值是4,且第二次查找时取值是15的变量。只满足两个条件中的一条的变量可能很多,但同时满足的就只有这两个地址处的变量。

    结果还是不唯一,到底是哪个呢?我们通过换精灵的方式改变了首位精灵的级别,下面我们再用一个操作改变一下:喂给首位精灵一个神奇糖果,等级+1(需要先点“确定”按钮退出“查找金手指”的界面):

喂给首位精灵神奇糖果

    此时我们再次打开“查找金手指”,也不用再查找了,一眼就能看出来哪个地址是我们的目标:

第三次打开查找金手指界面

    答案是02024540,这个地址处的变量映射到的实体就是首位精灵的等级。通过以上的“追踪式变量取值查找”过程,我们可以发现,这个过程像极了用筛子去筛选粗沙子中的细沙,每一遍筛选都能去掉一些不符合条件的变量,最后剩下的就是我们的目标。(注:另一个地址02024532也有它的含义,是队伍首位精灵被捕捉时的等级)

    这个过程和网上一个修改程序内存的工具——Cheat Engine(也被称作CE修改器)——的修改原理是完全相同的,可以认为VBA模拟器把Cheat Engine的功能整合在了里面。

    怎么验证这个地址映射正不正确呢?可以仿照上一个例子,用两种方法——“查找金手指”和“变量地址查看器”——来验证,相信跟着例子操作的读者们应该不会有问题的!

难度稍微大一点的金手指查找

    上面举的两个例子有个共同的特点:我们想要找的变量都是游戏中的数字。可是游戏中不仅仅有数字,还有各种各样的东西,精灵种族、道具、文字,等等。尽管阅读过第一期专栏的读者们知道,它们本质上都是数字,但是怎么从这些实体映射到数字,我们还不知道。此时,我们就需要借助网络的力量,从前人的经验中找到线索。

    搜索“究极绿宝石金手指”,网上有多种渠道告诉你各式各样的金手指代码,其中有一类“原始代码”(英文名raw code),指的就是直接修改变量地址处的取值。这些代码有个共同的特点,就是前面是8位带有数字和字母的东西,后面用空格或者冒号隔开,然后再跟一个东西,这个东西长度可就不一定了,有时候是8位,有时候是4位,有时候又是2位。抽象总结一下,原始代码的金手指大概长成这个样子(冒号分隔):

或者(空格分隔)

    我们暂且不管这些金手指怎么使用,只需要知道,冒号/空格前面的那8位(现在大家知道了这些夹杂着字母和数字的东西是十六进制数)就是我们在本次专栏中提到的变量地址,而冒号/空格后面的那些2位或4位或8位的十六进制数,就是变量取值。

    上次专栏的彩蛋——“黄半仙送的蛋里面是什么?”——里面,留下来两个问题,也就是

    为什么:变量地址0202450c映射到首位精灵的种族?

    为什么:变量取值02b0映射到三首恶龙?

    第一个问题,是因为网上的金手指中,有这么一条说是“任意修改队伍首位精灵种族”,代码是“0202450c:YYYY”,类型是“原始代码”。且不管这条金手指管不管用,也且不管这条金手指用了之后有没有副作用,起码作者了解到了,存在这么一个变量到实体的映射,是地址0202450c到队伍首位精灵种族的映射。

    第二个问题,它涉及到精灵种族的映射表,这个映射表可以自己去构造,接下来说一下构造的方法。

    按照第二期专栏的“变量地址查看器”使用方法,首先把自己想要找到映射的精灵放在队伍首位,比如现在作者放了一个烈空坐在队伍首位:

队伍首位是烈空坐

    然后打开“工具——反汇编”(也就是作者说的“变量地址查看器”),在“转到”之前的输入框输入0202450c,点击“转到”按钮,查看结果:

变量地址查看器

    发现结果是0196,这是一个十六进制数,并不是“一百九十六”,这样我们就建立了烈空坐到数字0196(16)的映射。如果把首位精灵换成别的,就可以建立其他映射,这样一个精灵种族的映射表就建立起来了。

    可能读者还有一个疑问,为什么精灵种族对应的十六进制数是4位的,而不是2位的或者8位的?(比如之前金币的那个例子,金币数就是个8位十六进制的变量,而精灵等级就是个2位十六进制的变量)这得从游戏中总共有多少精灵种族说起。按照百度贴吧中制作组的官方说明,究极绿宝石5共收录了第一到第八代共898只精灵,但实际上,各种mega、地区形态,或者银伴战兽和阿尔宙斯的形态等等也是单独的映射。这些精灵种族全算到一起,也不会超过4位十六进制数能表示的范围(65536=2^16),但却超出了2位十六进制数的范围(256=2^8),因此表示精灵种族的变量是4位十六进制数,2位不够,8位的话会浪费空间,编写游戏的程序员不会这么做的。至于为什么不能是3位5位,第二期专栏说过,变量的长度必须是字节的整数倍,一个字节是8位二进制,2位十六进制。

自己动手来尝试

    通过阅读本专栏,或者从网上找的金手指,读者可以找到队伍首位精灵携带物品可以映射到哪个变量地址,然后通过在游戏中变换首位精灵携带的道具,又可以制造一张携带物品映射到变量取值的映射表,完全理解本篇专栏内容的读者,不妨自己动手试一试。

    注:用这种方式制作映射表是非常费时费力的,因此仅建议读者在尝试过程中了解其原理即可,制作映射表有利用程序处理、非常高效的办法,在作者的另一个系列的专栏中(口袋妖怪绿宝石——数据提取与代码分析)有所介绍。

    下一期专栏作者还是继续介绍变量与实体的映射表。内容涉及到一些难度更大的金手指查找,例如个体值、努力值、性格、对战开拓区的印记等等。例如:6项个体值全满(6V)映射到什么变量取值?速度0,其他5V的个体值又会映射到什么变量取值?对战开拓区里,要对战塔、对战巨蛋是金色印记,对战水管、对战竞技场是银色印记,其他对战设施没有印记,这又会映射到什么变量取值?

    内容难度肯定是有的,各位读者能读到此处实属不易,不过前方还有更高的山峰等着我们去攀登。大家有问题欢迎在讨论区交流,谢谢大家的支持!



【本文地址】


今日新闻


推荐新闻


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