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

口袋妖怪绿宝石——数据提取与代码分析(4-地图信息提取——Advance Map配置文件)

2022-08-18 16:49 作者:围巾胖头鱼  | 我要投稿

说在前面:

    上期专栏介绍了利用Advance Map提取口袋妖怪绿宝石ROM中的地图信息。虽然Advance Map的功能很强大,但是作为一个超过十年没有更新、并且软件作者表示再也不会修复bug的软件,有缺陷是在所难免的。

    本期专栏的目的只有一个:让Advance Map顺利地打开一个绿宝石系列游戏的ROM。

Advance Map的配置文件

    其实Advance Map不仅能打开绿宝石的ROM,红/蓝宝石、火红/叶绿系列的ROM也能打开,但是对于这些不同的游戏版本,ROM中各种游戏数据所在的地址各不相同,Advance Map是怎样识别ROM的游戏版本、并根据游戏版本找到正确地址上的数据呢?

    答案在于Advance Map的配置文件。

    在Advance Map安装目录下的Ini文件夹中,有一个名为AdvanceMap.ini的文件就是Advance Map的配置文件,可以用VS Code打开看一下:

Advance Map配置文件

    这个文件使用的语言甚至不是英语,而是德语。这给修改配置文件带来了一定程度上的理解困难。本期专栏尽可能把有用的配置都说明一遍。

    第3行:

    这里列举的是Advance Map能够识别的游戏ROM类型,其中BPR是火红,BPG是叶绿,BPE是绿宝石,AXP是蓝宝石,AXV是红宝石。

    112行之前的内容对于打开ROM来说并不需要修改,虽然其中一些配置试图把道具名称和招式名称的数量确定下来,但是软件本身不支持汉化版本,即使能够列举出来也是乱码,就没有修改的必要了。

    从第112行开始,就是更改配置文件的关键所在,从这里之后的信息对于Advance Map能够正确打开ROM文件至关重要!

配置文件112行之后的内容

    从第112行开始,配置文件呈现出段落的特点,每个段落之间用空行隔开,每个段落描述一条配置。

    一条配置描述了一个Advance Map需要用到的游戏数据,包含了它的名称(用中括号括起来的德语单词)、类型(art=所在的行)、寻找该数据在ROM中位置的方法(nach=所在的行,还有其他可能的寻找方法)、适用的游戏版本(spiele所在的行)。这些art, nach, spiele就是Advance Map的作者给它的配置文件定义的一种语法。接下来本专栏会把配置信息中所有可能遇到的语法都解释一遍。

    先来解释第一条配置:

  •     第一行,用中括号括起来的是游戏数据的名称,也就是符号表中的符号。但是这里的符号是用德文写的,为了方便理解,需要把它转换成符号表里的英文符号,然后在源代码项目里找到该符号的用法才能明白这个数据是什么含义。

  •     从第二行开始,每一行的格式都是“……=……”的样子,等号前面表示这个数据的属性,等号后面表示该属性的取值。

  •     第二行,art属性为pointer,表示这个名字叫FlugposHeader的数据类型是一个指针,也就是ROM中的4个字节。后面还会提到,有的数据的art属性为offset,这是ROM中的一个地址。

  •     第三行,nach属性的用途是告诉Advance Map要在ROM的什么位置找到这个数据,等号的后面是一串字节序列,我们用HxD在原版绿宝石ROM中搜索这串字节序列:

搜索nach属性后面的字节序列

    nach在德语中有“之后”的含义,这串字节序列后面的4字节3C F5 59 08就是FlugposHeader了,拼接起来就是0859F53C,可以在符号表中找到它的英文名是sHealLocations

FlugposHeader的英文名

    也就是说,德文名FlugposHeader对应的是符号表里的sHealLocations,转到它的定义:

sHealLocations的定义

    说明sHealLocations的含义是列举每个城镇宝可梦中心的一些信息。如果要使用Advance Map打开一个新的ROM,再搜索nach后面的字节序列可能就没有结果了,这时就需要找到这个新ROM里面的sHealLocations在哪,然后根据指针的位置调整nach后面的字节序列,这样才能让Advance Map找到。

  •     第四行,spiele属性表示这条数据在哪些版本中存在,FlugposHeader这里把5个版本都列举出来,说明对于所有已知的版本都存在这个数据。

    之后的配置格式和第一个配置是相似的,因此接下来只解释一些新出现的属性名。

    这里新出现了一个属性名nummer,它表示的是字节序列的第几个搜索结果。在HxD中搜索nach后面的字节序列,可以看到两个结果:

两个搜索结果

    nummer=1指的是第一个搜索结果对应到AnbindungsListe这条数据。而接下来的

    用的是同一个字节序列,但这里nummer=2,说明第二个搜索结果对应到SpriteHeader。

    这里nach不见了,取而代之的是vor属性,后面仍然跟着一个字节序列。vor在德文中有“之前”的含义,因此这里搜索字节序列后,不是取出字节序列后面的4个字节,而是它前面的4个字节:

vor字节序列

    也就是说,在上图中应该取0850BE38,而不是78004804(这显然不是一个合法的指针)

    新的属性plus,指的是找到字节序列后,还要向后偏移多少个字节才能找到数据:

plus的用法

    这里plus=6,也就是从找到的字节序列末尾(0008EA0A)开始,向后6个字节(0008EA10)处的4个字节拼接起来就是SpritePalHeader,也就是0850BD00。

    这个配置的spiele一行并没有出现BPE,说明这个数据在绿宝石版本的游戏中是不存在的,因此也就没有必要修改。AXP/AXV后面加上的J或者E表示这是发行在哪个国家的游戏版本,J是日本,E是北美、欧洲。

    

    新的属性position,这是直接告知了PokemonNamen2这个指针所在的地址(00000144),只需要把这里的4个字节拼接起来就是它的取值了。000144前面的$符号表示这是一个十六进制数。

    这里没有新的属性,但是nach后面的字节序列中出现了XXXX,这放在HxD中是没办法搜索的。这里的XXXX表示匹配任何字节(有点像正则表达式的用法)。

    这里art属性的取值不再是pointer,而是offset,含义是这个数据表示ROM中的一个位置(同样也是4个字节,但并不是取4个字节拼接而成),nach说明是这个字节序列后面的位置。在HxD中也可以找到这个字节序列:

offset的用法

    图为搜索字节序列200CE000000000的结果(因为XX无法在HxD中搜索),这个字节序列后面的位置(也就是字节FE所在的位置)是0012388E,这就是WeltkarteGroesse的取值。

    nach配合plus属性向后偏移,与之对应的就是vor配合minus属性向前偏移。

minus属性

    这里FlugWert的取值是085A1E3C,也就是vor属性的字节序列在ROM中的位置(00124EE0)向前偏移4个字节(00124EDC),在这个地址向前的4个字节拼接而成。

    新的属性bei,这个bei的含义与nach和vor相对,既不是“在……之前”,也不是“在……之后”,而是“在……位置”的意思。结合art=offset,也就是说这个字节序列在ROM中所在的位置就是GeheimBasisZuordnung的取值:

bei的用法

    从HxD的搜索结果来看,GeheimBasisZuordnung的取值是000E8F9C。

    这条配置定义了两个新的数据tileset和palette,前面的plus表示这两个数据的地址相对于PokeNaveTownTileset的偏移(plus表示加上偏移量)。

需要修改哪些配置    

    第495行的“Einstellungen”指的是Advance Map在上一次打开时的设置情况,从这一行向后的内容就不需要修改了。也就是说,为了成功打开ROM,只需要修改从112行到第495行之间的配置。

    如果只把打开ROM的类型限制在绿宝石系列游戏的改版上,那就并不需要修改从112行到第495行之间所有的配置,只需要修改一部分就可以了。

    每一个用德文命名的数据,在符号表中都可以找到对应的符号名称。下面列举出来需要修改的配置以及它对应在符号表内的名称:

    要成功打开一个绿宝石系列的ROM,只需要修改上面列表里提到的配置就可以了。

打开ROM的步骤

    为了成功打开ROM,利用Advance Map的报错信息也很关键,例如下面这个报错信息:

报错信息1

    这个报错信息说明Advance Map找不到MapBankHeader这个数据的位置,这就说明我们需要修改配置文件中的MapBankHeader这个配置,它在第117行。

    如果这一条配置已经被修改正确,那么再次打开ROM的时候报错信息就会发生变化。可以根据报错信息的提示逐一修改配置文件。

    注意:如果报错信息中提到的配置没有出现在上面那张表格中,则可以忽略不看,此时即使有报错信息,Advance Map仍然能够成功打开地图。

地图名称乱码问题

    下图为经过修改配置之后,使用Advance Map成功打开的某个汉化版绿宝石ROM:

汉化版ROM

    可以看到左侧所有的地图名称都是乱码。并且在试图打开0号地图库的11号地图时,Advance Map还会报错,这是因为名称中出现了没有匹配的括号(有个左括号没有右括号对应),这也是Advance Map不支持汉化的重要缺陷,其实这个地图的信息已经加载到Advance Map中了,但是这个混乱的名称导致它无法被打开。

    解决这个问题的方法就是向Advance Map妥协:修改这个地图的名字。所有地图的名字以列表的形式存储在ROM中,所以使用本系列专栏口袋妖怪绿宝石——数据提取与代码分析(1-字符集与文本信息的提取)的方法可以把所有的地图名称提取出来。在原版ROM中,地图名称的起始地址在085a0b10处,它在符号表中的名字是sMapName_LittlerootTown。在改版的ROM中,可以通过搜索地图名称对应的编码字节序列来找到需要修改的地图名。

    在HxD中,修改ROM十分方便,将光标指向想要修改的地方,直接使用键盘输入即可。

    

    用了一期专栏的时间来讲Advance Map的配置文件如何修改的问题,但实际上有一个最关键的问题没有解决。以MapBankHeader为例,在原版绿宝石中可以通过符号表、源代码项目等资源来找到这个数据的位置以及它的含义,但是在没有符号表和源代码的改版ROM中,找到MapBankHeader的难度还是很大的,这需要对改版ROM的程序有一些基本的了解,这正是本系列专栏后续需要讲到的问题。

    继续感谢众位读者的支持!

口袋妖怪绿宝石——数据提取与代码分析(4-地图信息提取——Advance Map配置文件)的评论 (共 条)

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