口袋改版资源吧 关注:223,660贴子:1,455,842

【宝可梦】Gen4伙伴公园联动Gen3 跨语言解限的若干方法

只看楼主收藏回复

众所周知,如果想将宝可梦从3代《红宝石/蓝宝石/火红/叶绿/绿宝石》中传送到4代中,那么就需要通过伙伴公园来进行联动接收。在NDS(L)的slot1端插入4代《钻石/珍珠/白金/心金/魂银》,在slot2端插入3代卡带。开启4代游戏后便会出现联动选项,可以从3代卡带内选取6只宝可梦进行传送。
关于接收条件需要注意的是:
1、日英法意德西6种语言4代仅能接收对应语言3代。
2、韩版4代可以接收日英3代。
那么是否有办法可以让4代接收任意语言3代呢?以下便是几种跨语言解限的方法(阅读本文需要有一定十六进制基础知识及RomHack经验):


IP属地:日本1楼2023-03-10 12:24回复
    本楼自占用作补链层


    IP属地:日本3楼2023-03-10 12:27
    收起回复
      方法一:修改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。


      IP属地:日本4楼2023-03-10 12:28
      回复
        方法二:修改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解包后的文件名,其他软件解包后的名字可能不完全相同)解压后,才能找到对应数据,修改完之后,也需将其压缩回去保存。


        IP属地:日本5楼2023-03-10 12:29
        回复
          方法三:修改nds端汇编代码(最便捷)
          原理:修改联动判定的函数机制。
          做法:
          1.文章开头曾提及过4代日英法意德西只能接收3代同语言,4代韩版却能接收3代日英。故在4代游戏中实质存在两种联动判定机制。
          在4代rom中,联动判定函数所在的文件为:
          钻石/珍珠:overlay9_0083
          白金:overlay9_0097
          心金/魂银:overlay9_0074


          IP属地:日本6楼2023-03-10 12:29
          回复
            (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卡带语言值对比是否相等,若相等则前往2,不相等则结束;
            3)检查gba卡带版本,也即联动时菜单显示的对应gba卡带版本。


            IP属地:日本7楼2023-03-10 12:30
            收起回复

              (2)韩版代码(以韩版心金为例,部分函数命名仿照pret工程的命名):(以下内容为汇编代码,如看不懂可直接略过,见后文描述)
              ———————————————————————————————————————
              _0222807E:
              0x0222807E 1C20 addr0, r4, #0
              0x02228080 F9E2F5F2 bl#0x201a448
              0x02228084 68A8 ldrr0, [r5, #8]
              0x02228086 FBB3F602 bl#0x202a7f0 ;Pokedex_GetNatDexFlag
              0x0222808A 2800 cmpr0, #0
              0x0222808C D00D beq_022280AA
              0x0222808E F9A1F00C bl#0x22343d4 ;PmAgbCartridge_GetLanguage
              0x02228092 2801 cmpr0, #1
              0x02228094 D003 beq_0222809E
              0x02228096 F99DF00C bl#0x22343d4 ;PmAgbCartridge_GetLanguage
              0x02228098 2802 cmpr0, #2
              0x0222809C D105 bne_022280AA
              _0222809E:
              0x0222809E F993F00C bl#0x22343c8 ;PmAgbCartridge_GetVersionInternal
              0x022280A2 1C40 addsr0, r0, #1
              0x022280A4 6268 strr0, [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卡带版本。


              IP属地:日本8楼2023-03-10 12:31
              回复
                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的所在位置。


                IP属地:日本9楼2023-03-10 12:32
                收起回复
                  方法四:金*手*指修改内存汇编代码(无需修改rom)
                  原理:同方案三,但不改动rom而仅为改动内存。
                  做法:
                  1.基本原理同方案三,由于联动相关代码会载入到内存中运行,故可以通过金*手*指方式在不修改rom的情况下实现代码变更。实机中也可使用Action Replay、nitrohax等工具为正版3、4代卡带进行跨语言解限(见视频链接)。
                  后附已为nitrohax编辑好的解限代码cheat.xml,按Action Replay格式编写,可单独复制出在模拟器上使用。


                  IP属地:日本11楼2023-03-10 12:33
                  收起回复
                    本文完。
                    此文章将是某个更有趣的东西的必要前置条件,或许有人可能已经猜到了(滑稽.jpg)。


                    IP属地:日本12楼2023-03-10 12:34
                    回复
                      大佬是太厉害了 不过我更期待你说的更有趣的东西


                      IP属地:内蒙古来自iPhone客户端13楼2023-03-10 15:08
                      回复


                        IP属地:广东来自Android客户端14楼2023-03-10 15:13
                        回复
                          大佬


                          IP属地:福建来自Android客户端15楼2023-03-10 15:49
                          回复
                            微尘NB


                            IP属地:江西来自Android客户端16楼2023-03-10 18:20
                            回复
                              牛逼看来新汉化要来了


                              IP属地:上海来自Android客户端17楼2023-03-13 00:12
                              收起回复