| 
 | 
 
 本帖最后由 jiangzhengwenjz 于 2019-6-21 11:58 编辑  
 
首先前言,解限可能会给你的rom带来无数的bug,甚至死机。还请提前备份 
 
2019修正:by 口袋妖怪制作者 
 
好的,依旧前言。解限确实是个很大的突破,在第三代平台上让精灵的数量不再是411只,但是随着解限,bug也造成的越多,所以要花更多的时间去修复,完善。这些下面会一一分析。当然,其实第三代的精灵并不止411,而是439,分别为386原精灵+25空位+27未知图腾+1蛋。25空位相信大家已经非常熟悉了,就不多做解释。而这27个未知图腾,为386中未知图腾 A形态以外的剩余27个,除了图片不同以外,其他完全相同,包括精灵编号。但是奇葩的是,老任放着25个原未知图腾的位置不用,反而去再建立一个空间来放这些是为什么我也不知道。在未知图腾的后面,还有一个彩蛋的图片。名字则是———这样的,作用未知(楼主懒得测)这没有什么用,保留就是。 
而解限的突破,应该算是有很长一段时间了,貌似雷电在2013年就解限了龙鳞之怒,国外的,也是由原作者doesntknowhowtoplay 
在火红上解限,随后才由Chaos Rush移植到了绿宝石之上,而最近老外论坛更新了一次sky high的分析帖  
 
好了,废话完了,进入主题,这个教程首先需要基础如下 
1:会winhex 
2:至少有一段时间的改版时间 
3:会点数据。 
4:会编译asm(这个不是很重要,最后有段asm,我会把编译后的也贴上) 
 
恩,差不多就这样,接下来工具 
 
1:一个绿宝石ROM(最好是完全没改过的美版,或者纯汉化版,因为改动过大的rom可能会有些数据不同造成bug) 
2:一个VBA模拟器 
3:一个十六进制编辑器(推荐winhex) 
4:程序型计算器 
5:thumb编译工具(这个随便) 
6:解限之后的乱七八糟的工具我就不说了,什么unlz、rv啥的 
 
 
Step1:首先,我们在任意一处空位插入以下这段数据 
- FF 23 1B 01 5B 18 98 88 00 28 09 D0 04 28
 
 - 0A D0 0D 28 0C D0 0D 2D 1C DD 01 20 08 BC 98 46
 
 - F0 BD C4 21 08 4A 06 E0 8E 21 89 00 07 4A 02 E0
 
 - BA 21 09 01 06 4A 04 3B 18 68 10 60 04 3A 04 39
 
 - 00 29 F8 D1 E7 E7 C0 46 C0 D8 03 02 F8 DA 03 02
 
 - 98 E6 03 02 00 48 00 47 2D 2E 15 08 FF FF FF FF
 
 - FF 27 3F 01 CF 19 F8 80 BE 88 00 2E 08 D0 04 2E
 
 - 09 D0 0D 2E 0B D0 00 00 00 48 00 47 53 28 15 08
 
 - C4 23 08 4A 06 E0 8E 23 9B 00 07 4A 02 E0 BA 23
 
 - 1B 01 06 4A 04 3F 10 68 38 60 04 3A 04 3B 00 2B
 
 - F8 D1 E9 E7 C0 D8 03 02 F8 DA 03 02 98 E6 03 02
 
 
  复制代码 这是一段已经编译过的ASM源码。根据老外的资料,我个人的理解是,新建一个表。让捕捉/遇见的精灵寄存在这个表之中。也就是图鉴的作用。 
 
接下来,我们让这串数据在游戏中发挥它的用途 
0x152E98:00 48 00 47 [XX+1 XX XX 08] 
0x15284E:38 47 
0x15288C:[YY+61 YY YY 08] 
0x0D9CC6:38 47 
0x0D9D04:[YY YY YY 08] 
0x0DA284:00 48 00 47 [XX XX XX 08] 
 
 
注释 这里的XX+1 XX XX 08为地址偏移+1后的指针,例如01 00 00 00,+1后的指针则是01 00 00 09,+61则是 61 00 00 09 
 
 
 
修改从0x5CDC00地址开始的数据为以下: 
- 00 00 2C 0F 00 00 F0 0F F0 0F F0 0F E0 1F F0 0F D0 2F B8
 
 - 0D 00 00 F0 0F F0 0F F0 0F E0 1F F0 0F D0 2F F0 0F C0 3F F0 0F B0 4F F0 0F
 
 - A0 5F F0 0F 90 6F F0 0F 80 7F 50 04
 
 
  复制代码 Step2:得到自由的flag,重定义flag,扩容图鉴 
 
 
这一步就到了重点了,恩,重点,首先确定宠物数量,把它除以8,得到xx,换成十六进制数据,比如721除以8就是90,再换成16进制就是5A,这里需要用到程序员计算器 
然后,你要知道0203D800这个内存它是完全没有用过的,然后把它+你的宠物数量,比如0203D800+5A=0203D85A 
 
 
得到了两个地址: 
遭遇flag内存:0203D800 
捕捉flag内存:0203D85A 
反写: 
00 D8 03 02 
5A D8 03 02 
记住这个数值,接下来该修改数据了 
 
 
 
 
C06EC: 遭遇flag 
C06AC: 00 00 
C06AE: 00 00 
C0744: 捕捉flag 
C06FE: 00 00 
C0700: 00 00 
C0702: 00 00 
C0710: 15 E0 
C0720: 0D E0 
C07C8: 遭遇flag 
C079E: 00 00 
C07A0: 00 00 
C07AC: 1C E0 
C07F0: 捕捉flag 
C07DA: 00 00 
C07DC: 00 00 
 
 
然后,我们需要计算一个新的地址,把捕捉flag地址再加一次,比如5A再加一次5A得到新的地址0203D8B4 
反写得到:B4 D8 03 02 
记住这个数值 
843BC:新的flag 
8439A:20 1C 00 00 
843A0:XX 22 。XX为你的宠物数量/8 
843A6:20 1C  
843A8:YY 30 。这里不需要改,YY跟XX有可能是相同的,但是它没有。所以这里可以无视。不过我还是把他列出来了。 
843AC:XX 22 。XX为你的宠物数量/8 
 
Step的作用  让图鉴的原内存更换成新的,确保遭遇/捕捉时不会造成bug。将确切的精灵数量除以8之后转换为十六进制,这是老外的一个算法,但是经过测试之后,该算法最终的精灵数量有差距,不可能完美,当然,这并不影响游戏。我们可以用老任的数据设定来让显示的数量截止在你想要的数量内,例如493、649、721、或者其他更多的数量 
 
 
 
 
 
 
 
Step3:重定义精灵数据 
 
 
这里表格居多,还请有心理准备 
 
 
宠物种族数据表:3203CC  
2D10字节 
每1C字节为一只精灵,至于编程方式,我就不说了,自己摸索摸索很快会知道。 
 
蛋组:3203DD  
有两个指针指向这儿,为了确保解限之后的精灵能够获得正确的蛋组,我们需要改变这两个指针,具体修改方法:在重定向种族数据表之后的第18(十进制)个字节就是新的位置,转换成指针之后,替换原指针。 
 
 
升级技能表:32937C  
670字节 
这里为指针形式,重定向之后跟着改就好了,具体方法参照技能修改。 
 
 
 
 
解限: 
6B944:00 00 00 00 00 00 
 
 
宠物正面图:30A18C DC0字节 
宠物背面图:3028B8 DC0字节 
这是宠物图片,指针形式。如果不会,回家自行狂补基础。 
 
解限: 
346D6:07 E0 
34AC2:07 E0 
34BFE:07 E0 
 
 
普通色板:303678 DC0字节 
闪光色板:304438 DC0字节 
这是宠物图片的色板,如上 
 
解限: 
6E750:04 E0 
 
 
宠物Y轴(我方):3021D8,6E0字节 
宠物Y轴(敌方):300D38,6E0字节 
高度:305DCC 19C字节 
 
Y轴是什么呢,有的精灵素材可能会造成在战斗场地上不上很协调的那种例如这样图片的位置不对时,可以利用Y轴来调整,每只精灵4字节
Y轴 
 
 
至于高度就是这东西了
高度 
 
0没有影子,0以上都有影子,只限对手方,配合Y轴调整可完美调整 
 
 
解限: 
A5F82:03 E0 
A5EB6:03 E0 
 
 
小图标:57BCA8,6E0字节 
图标色板:57C388,1B8字节 
小图标,指针形式,每一只为1024字节,每一只有两帧。图标色板每只占用1字节。有0、1、2三种,代码分别为00、01、02,其他的会造成bug。修改时如果色板0不行就换1,1不行就换2,如果都不行,抱歉你的素材有问题。 
 
解限: 
D2E3A:01 E0 
D2D20:00 00 00 00 
、 
 
 
 
 
Step4:图鉴 
 
 
 
 
编号表:31DC82,336字节 
两个字节一编号。反写 例:00 01编号为妙蛙种子,写入时应该为01 00 这样 
 
 
图鉴信息:56B5B0,3060字节 
每只精灵24字节(十六进制)原版只完善到第386只的信息,后面的要靠自己来了,详情可以看这贴:http://tieba.baidu.com/p/3915771323 
 
 
 
Step5:图鉴字节更改 
 
 
C06FC: 11 48 
C06AA: 10 48 
C06BE: 3E E0 
C07D8: 05 49 
C079C: 0A 49 
BB6AC: 00 20 
6D42C: 00 00  
 
 
如果你的宠物超过510 
BC91A: 5D 21 C9 00 
 
 
如果你的宠物没超过510 
BC91A: XX 21 C9 00 。XX为你的宠物数量/2 
 
 
BB42C: 12 01 
BD87C: 09 01 
BD54C: 12 01 
BD4B0: 09 01 
 
 
BD5B8: 2D 01 
BD082: 12 01 
BD57E: 1B 01 
BCF9E: 09 01 
 
 
BCFBA: 09 01 
BCFDC: 1B 01 
BCFFE: 12 01 
BD01A: 12 01 
BB456: 12 01 
BD3B8: 12 01 
 
 
BD826: 09 01 
BD844: 1B 01 
 
 
BD02A: 12 01 
BD044: 09 01 
BD05E: 09 01 
 
 
BBD8C: 12 01 
BBDBA: 1B 01 
 
 
BC42E: 1B 01 
 
 
BB8CA: 09 01 
BBABE: 12 01 
BBBA8: 24 01 
BBBD4: 12 01 
BBF96: 09 01 
BC140: 09 01 
BC288: 1B 01 
BC2B4: 12 01 
BE892: 09 01 
 
 
BC4CE: 1B 01 
C1808: 12 01 
C23F2: 1B 01 
 
 
 
 
 
这里我跳过了老外的砍双帧,会单独列一楼讨论,我也没弄清楚 
 
 
 
这段数据的作用,我不是很清楚,应该是修复了图鉴显示的问题,可直接修改。 
 
 
 
 
 
 
Step6:字节大量更改 
 
 
从偏移量0x00000000开始 
搜索81 01 00 00替换E7 02 00 00 
搜索9B 01 00 00替换0D 03 00 00 
 
 
选块BB6AC-C5000 
 
 
搜索06 00 00替换0D 00 00 
 
另一种方法 
- start = 0xBB6AC
 
 - end = 0xC5000
 
 - rom_path = "insert file path to GBA ROM here"
 
 - search = "\x06\x00\x00"
 
 - replace = "\x0D\x00\x00"
 
 - with open(rom_path, "r+b") as rom:
 
 -     rom.seek(start)
 
 -     read = rom.read(end-start)
 
 -     write = ""
 
 -     start_search = 0
 
 -     while True:
 
 -         find = read.find(search, start_search)
 
 -         if find == -1:
 
 -             write += read[start_search:]
 
 -             break
 
 -         else:
 
 -             write += read[start_search:find]+replace
 
 -             start_search = (3+find)
 
 -             print start_search, "|", find
 
 -     rom.seek(start)
 
 - rom.write(write)
 
  
  复制代码 这里的作用,修改的图鉴显示的数量、精灵数量等等。 
 
 
 
Step7:修复一些错误的字节 
 
 
42730: 81 01 
5DF10: 81 01 
6F100: 81 01 
A5EA4: 81 01 
 
 
A35A2: 01 1C 11 E0 
 
 
34A16: 07 E0 
 
 
以下几处为个人找出的字节,不是非常确定 
 
 
31E2EC: 9B 01 
304354: 9B 01 
304284:81 01 2D2CA1:81 01(修复了火焰拳重启的bug) 
 
作用不解释,修复了前面的错误部分 
 
 
Step8:修复BUG 
 
 
把这段thumb源码编译到足够大的空位 
- .text
 
 - .align 2
 
 - .thumb
 
 - .thumb_func
 
 - .global positionfix
 
  
 
- main:
 
 - push {r0-r3}
 
 - ldr r0, .FirstCheck
 
 - ldrb r0, [r0]
 
 - mov r1, #0xFF
 
 - cmp r0, r1 /*compares .FirstCheck value to FF. If not, you're outside*/
 
 - bne Outside
 
 - b Inside
 
  
 
- Inside:
 
 - ldr r0, .Counter1Inside
 
 - ldrb r0, [r0]
 
 - ldr r1, .Counter2Inside
 
 - ldrb r1, [r1]
 
 - cmp r0, r1
 
 - bne next1
 
 - b End
 
  
 
- next1:
 
 - mov r2, #0x0
 
 - ldr r3, .FinalPosInside
 
 - strh r2, [r3]
 
 - b End
 
  
 
- Outside:
 
 - ldr r0, .Counter1Outside
 
 - ldrb r0, [r0]
 
 - ldr r1, .Counter2Outside
 
 - ldrb r1, [r1]
 
 - cmp r0, r1
 
 - bne next2
 
 - b End
 
  
 
- next2:
 
 - mov r2, #0x0
 
 - ldr r3, .FinalPosOutside
 
 - strh r2, [r3]
 
 - b End
 
  
 
- End:
 
 - pop {r0-r3}
 
 - ldr r0, .NextRoutine
 
 - str r0, [r6]
 
 - pop {r4-r7}
 
 - pop {r0}
 
 - bx r0
 
  
 
 
 
- .align
 
 - .FirstCheck: .word 0x02000D1C
 
 - .Counter1Inside: .word 0x02000F9E
 
 - .Counter2Inside: .word 0x02000FA0
 
 - .FinalPosInside: .word 0x02000F9A
 
  
 
- .Counter1Outside: .word 0x02000D22
 
 - .Counter2Outside: .word 0x02000D24
 
 - .FinalPosOutside: .word 0x02000D1E
 
  
 
- .NextRoutine: .word 0x080C1D39
 
  
  复制代码 接着修改以下部分 
 
 
 
 
BBD94: 0E 4A 
BBDD0: 9C 0F 00 02 
C1808: 12 01 
C1814: 00 48 00 47  
C1818: XX XX XX 08 (ASM地址+1) 
 
编译后的源码- 0F B4 11 48 00 78 FF 21 88 42 0B D1 FF E7 0F 48
 
 - 00 78 0F 49 09 78 88 42 00 D1 0E E0 00 22 0D 4B
 
 - 1A 80 0A E0 0C 48 00 78 0C 49 09 78 88 42 00 D1
 
 - 03 E0 00 22 0A 4B 1A 80 FF E7 0F BC 09 48 30 60
 
 - F0 BC 01 BC 00 47 C0 46 1C 0D 00 02 9E 0F 00 02
 
 - A0 0F 00 02 9A 0F 00 02 22 0D 00 02 24 0D 00 02
 
 - 1E 0D 00 02 39 1D 0C 08
 
  复制代码 由于ASM领域我暂未接触,也不知道这段源码的作用。 
 
 
 
至此,教程结束,以下几张为测试图
测试 
 
测试 
 
测试 
 
 
 
 
 
By:EVE 
数据提供:Chaos Rush 
特别鸣谢:Chaos Rush、doesntknowhowtoplay 
 
 
 
附带几个表格 
- 绿宝石精灵数据表
 
  
- 名字表:3185C8 11B4字节  
 
  
- 宠物种族数据表:3203CC 2D10字节 
 
  
- 蛋组指针:3203DD  
 
  
- 升级技能表:32937C  670字节  
 
  
- 进化表:32531C 
 
  
- 宠物正面图:30A18C  DC0字节  
 
  
- 宠物背面:3028B8  DC0字节 
 
  
- 普通色板:303678  DC0字节 
 
  
- 闪光色板:304438  DC0字节 
 
  
- 宠物坐标(我方):3021D8,6E0字节
 
  
- 宠物坐标(敌方):300D38,6E0字节
 
  
- 高度:305DCC  19C字节 
 
  
- 小图标:57BCA8,6E0字节 
 
  
- 图标色板:57C388,1B8字节 
 
  
- 叫声主表:69DCF4
 
  
- 叫声主表2:69EF24
 
  
- 叫声副表:31F61C
 
  
- 脚印表: 56E694
 
  
- 定点技能教学相性表:615048
 
  
- 正面动画表:3299EC
 
  
- 背面动画表:60A8C8
 
  
- 编号表:31DC82,336字节  
 
  
- 图鉴信息:56B5B0,3060字节  
 
  
- 控制精灵动作:309AAC-30A18B  4字节一只  308CBC 8字节一只  3299EC  60A8C8
 
  复制代码 |   
 
评分
- 
查看全部评分
 
 
 
 
 
 |