众所周知,如果想将宝可梦从3代《红宝石/蓝宝石/火红/叶绿/绿宝石》中传送到4代中,那么就需要通过伙伴公园来进行联动接收。在NDS(L)的slot1端插入4代《钻石/珍珠/白金/心金/魂银》,在slot2端插入3代卡带。开启4代游戏后便会出现联动选项,可以从3代卡带内选取6只宝可梦进行传送。
关于接收条件需要注意的是:
1、日英法意德西6种语言4代仅能接收对应语言3代。
2、韩版4代可以接收日英3代。
那么是否有办法可以让4代接收任意语言3代呢?以下便是几种跨语言解限的方法(阅读本文需要有一定十六进制基础知识及RomHack经验):
方法一:修改gba端rom头
原理:将rom头的语言值修改为4代对应语言。
做法:以日版4代接收英版红宝石为例。
1.使用十六进制编辑器打开3代rom,在0xA0处可看到POKEMON RUBYAXVE的字样,在AXVE正下方的0xBD处可以看到一个校验值0x41。
2.修改语言值:由于需要让日版4代接收,那么就需要将英版rom伪装成日版,AXVE的最后的E即是语言值,将其改为J以对应日版。
3.修改校验值:可以看到由E变为J后,十六进制内的数据也由0x45变为了0x4A,多增加了0x5。这个时候,就需要将0xBD处的校验值0x41减去对应的数量0x41-0x5=0x3C,将校验值从0x41改为0x3C。
4.这样之后便可以通过模拟器或烧录卡被日版4代进行识别了。以下附上不同语言的语言值代码(注意大写):日-J,英-E,法-F,意-I,德-D,西-S。
方法二:修改nds端语言值
原理:将nds判定gba卡带时的语言值均为nds端语言。
做法:以日版钻石接收英版3代为例。
1.使用CrystalTile2打开钻石rom,搜索”AXVJ”,可以找到若干列类似的字符,为3代5作,各6个语种的识别表。
其中版本:红宝石-AXV,蓝宝石-AXP,火红-BPR,叶绿-BPG,绿宝石-BPE。
其中语言:日语-J,英语-E,法语-F,意大利语-I,德语-D,西班牙语-S。
组合总计30种gba对应卡带游戏代码。
以下对这个表格的结构进行分析,以AXVJ为例,每8个字节为一组查看:
“41 58 56 4A 00 00 01 00”
前4个字节为AXVJ对应的Ascii代码,后半部分只需要注意看第7位的字节即可,0x01,这里作为语言值日语进行判定。
语言值的对应关系是:日语-0x01,英语-0x02,法语-0x03,意大利语-0x04,德语-0x05,西班牙语-0x07。
当插入游戏卡带后,nds端通过比对前4个字节的游戏代码,当寻找到符合的值时,便返回第7位的字节,将语言值告知系统,只有当语言值与nds游戏的语言值相符时,才会开启联动菜单。
2.根据以上内容,那么可以知道只要把30种游戏代码对应返回的语言值全部改为nds的语言值,那么就可以兼容所有语言的Gen3游戏了。在这里日版钻石就需要将30个语言值全部改为0x01日语即可。
3.保存之后便可以让这个日版钻石识别所有语言的Gen3卡带了。需要提醒的是钻石/珍珠/白金的Rom内,该字段均是明文未压缩的,而在心金/魂银中,这部分内容则是被压缩的,无法直接搜索找到,需要首先将overlay9_0074.bin文件(ct2解包后的文件名,其他软件解包后的名字可能不完全相同)解压后,才能找到对应数据,修改完之后,也需将其压缩回去保存。
方法三:修改nds端汇编代码(最便捷)
原理:修改联动判定的函数机制。
做法:
1.文章开头曾提及过 4代日英法意德西只能接收3代同语言,4代韩版却能接收3代日英。故在4代游戏中实质存在两种联动判定机制。
在4代rom中,联动判定函数所在的文件为:
钻石/珍珠:overlay9_0083
白金:overlay9_0097
心金/魂银:overlay9_0074(需解压)
(1)日英法意德西版代码(以pret工程的英版心金为例):见此文件及行号 /asm/overlay_74_thumb.s #L832(以下内容为汇编代码,如看不懂可直接略过,见后文描述)
———————————————————————————————————————
_0222767E:
0x0222767E 1C20 add r0, r4, #0
0x02227680 FF16F5F2 bl sub_0201A4B0
0x02227684 68A8 ldr r0, [r5, #8]
0x02227686 FF69F602 bl Pokedex_GetNatDexFlag
0x0222768A 2800 cmp r0, #0
0x0222768C D00B beq _022276A6
0x0222768E F99BF00C bl PmAgbCartridge_GetLanguage
0x02227692 4905 ldr r1, _022276A8 ; =gGameLanguage
0x02227694 7809 ldrb r1, [r1]
0x02227696 4281 cmp r1, r0
0x02227698 D105 bne _022276A6
0x0222769C FF98FF00C bl PmAgbCartridge_GetVersionInternal
0x0222769E 1C40 add r0, r0, #1
0x022276A0 6268 str r0, [r5, #0x24]
0x022276A2 FCE7F00E bl ov74_02236074
_022276A6:
0x022276A6 BD38 pop {r3, r4, r5, pc}
.balign 4, 0
_022276A8:
0x022276A8 020F5670 .word gGameLanguage
———————————————————————————————————————
此处代码关于联动的大意为:
1)是否获得全国图鉴,若通过则前往2,不通过则结束;
2)检查gba卡带语言值,并与nds卡带语言值对比是否相等,若相等则前往3,不相等则结束;
3)检查gba卡带版本,也即联动时菜单显示的对应gba卡带版本。
(2)韩版代码(以韩版心金为例,部分函数命名仿照pret工程的命名):(以下内容为汇编代码,如看不懂可直接略过,见后文描述)
———————————————————————————————————————
_0222807E:
0x0222807E 1C20 add r0, r4, #0
0x02228080 F9E2F5F2 bl #0x201a448
0x02228084 68A8 ldr r0, [r5, #8]
0x02228086 FBB3F602 bl #0x202a7f0 ;Pokedex_GetNatDexFlag
0x0222808A 2800 cmp r0, #0
0x0222808C D00D beq _022280AA
0x0222808E F9A1F00C bl #0x22343d4 ;PmAgbCartridge_GetLanguage
0x02228092 2801 cmp r0, #1
0x02228094 D003 beq _0222809E
0x02228096 F99DF00C bl #0x22343d4 ;PmAgbCartridge_GetLanguage
0x02228098 2802 cmp r0, #2
0x0222809C D105 bne _022280AA
_0222809E:
0x0222809E F993F00C bl #0x22343c8 ;PmAgbCartridge_GetVersionInternal
0x022280A2 1C40 adds r0, r0, #1
0x022280A4 6268 str r0, [r5, #0x24]
0x022280A6 FCDFF00E bl #0x2236a68
_022280AA:
0x022280AA BD38 pop {r3, r4, r5, pc}
———————————————————————————————————————
此处代码关于联动的大意为:
1)是否获得全国图鉴,若通过则前往2,不通过则结束;
2)检查gba卡带语言值是否为1(即日语),若相等则前往4,不相等则前往3;
3)继续检查gba语言值是否为2(即英语),若相等则前往4,不相等则结束;
4)检查gba卡带版本,也即联动时菜单显示的对应gba卡带版本。
2.那么在这里只需要将“语言值检验不通过时即结束”,改为“不通过也继续按照通过来执行命令”,就可以解除限制了。在上述两种情况中,只需要将0xD105,改为0xD1FF,也即只需改动一个字节0x05→0xFF即可。
以下列出4代各个语言版本里需要改动的0x05所在的地址:
版本 语种 rom地址 ram地址 辅助定位搜索码
钻石/珍珠 日 0x0030169A 0x0223083A E0 04 24 00 E0 03
钻石/珍珠 英 0x002F1718 0x0222D6D8 同上
钻石/珍珠 法 0x002F1918 0x0222D8D8 同上
钻石/珍珠 意 0x002F1918 0x0222D838 同上
钻石/珍珠 德 0x002F1918 0x0222D898 同上
钻石/珍珠 西 0x002F1918 0x0222D8F8 同上
钻石/珍珠 韩 0x002F2D1C 0x0222D83C 同上
白金 日 0x0038D918 0x0222A378 同上
白金 英 0x0038F518 0x0222AF78 同上
白金 法 0x0038F318 0x0222B158 同上
白金 意 0x0038F318 0x0222B0D8 同上
白金 德 0x0038F318 0x0222B118 同上
白金 西 0x0038F518 0x0222B178 同上
白金 韩 0x0039051C 0x0222BE7C 同上
心金/魂银 日 0x00235D09 0x02226BD8 同上
心金/魂银 英 0x00236B0E 0x02227698 同上
心金/魂银 法 0x00236B10 0x022276B8 同上
心金/魂银 意 0x0023670E 0x02227638 00 04 24 00 E0 03
心金/魂银 德 0x00236910 0x02227678 E0 04 24 00 00 E0
心金/魂银 西 0x00236B0F 0x022276B8 E0 04 24 00 E0 03
心金/魂银 韩 0x00237113 0x0222809C E0 04 24 00 E0 00
*辅助定位搜索码用于可能的本地语言化rom中地址发生了变化,通过搜索定位码可以快速定位联动函数及0x05的所在位置。
可见此视频《【宝可梦】跨语言联动(1)-3代汉化(美版)至4代汉化(日版) 》
方法四:金手指修改内存汇编代码(无需修改rom)
原理:同方案三,但不改动rom而仅为改动内存。
做法:
1.基本原理同方案三,由于联动相关代码会载入到内存中运行,故可以通过金手指方式在不修改rom的情况下实现代码变更。实机中也可使用Action Replay、NitroHax等工具为正版3、4代卡带进行跨语言解限(演示操作见视频链接《【宝可梦】跨语言联动(2)-3代正卡至4代正卡》)。
后附已为NitroHax自制软件编辑好的解限代码cheats.xml,按Action Replay格式编写,可单独复制出在模拟器上使用。
NitroHax自制软件及解限专用cheats.xml下载地址:
链接:https://pan.baidu.com/s/1TpUhgr_r0nRT8aktAr8nlA
此处隐藏内容请回复后再查看。
想了想为了避免链接、文件日后可能失传,还是把金手指代码也明文贴出来留个档。
伙伴公园联动语言解限代码:
钻石、珍珠:
日语(含日版汉化):
52230838 D1054281
2223083A 000000FF
英语:
5222D6D8 F009D105
2222D6D8 000000FF
法语:
5222D8D8 F009D105
2222D8D8 000000FF
意大利语:
5222D838 F009D105
2222D838 000000FF
德语:
5222D898 F009D105
2222D898 000000FF
西班牙语:
5222D8F8 F009D105
2222D8F8 000000FF
韩语:
5222D83C F009D105
2222D83C 000000FF
白金:
日语(含日版汉化):
5222A378 F00AD105
2222A378 000000FF
英语:
5222AF78 F00AD105
2222AF78 000000FF
法语:
5222B158 F00AD105
2222B158 000000FF
意大利语:
5222B0D8 F00AD105
2222B0D8 000000FF
德语:
5222B118 F00AD105
2222B118 000000FF
西班牙语:
5222B178 F00AD105
2222B178 000000FF
韩语:
5222BE7C F00AD105
2222BE7C 000000FF
心金、魂银:
日语(含日版汉化):
52226BD8 F00CD105
22226BD8 000000FF
英语:
52227698 F00CD105
22227698 000000FF
法语:
522276B8 F00CD105
222276B8 000000FF
意大利语:
52227638 F00CD105
22227638 000000FF
德语:
52227678 F00CD105
22227678 000000FF
西班牙语:
522276B8 F00CD105
222276B8 000000FF
韩语:
5222809C F00CD105
2222809C 000000FF
此文章将是某个更为有趣的东西的必要前置条件,或许已经有人有猜到了(滑稽.jpg).
有趣的东西已发布,详见《【国庆小礼物】宝可梦3、4代汉化中文联动程序发布》