作者:0 DAY-S[EGCG] 转载请注明出处
工具:NO$ GBA,晓月中文版(基于日版汉化)
在晓月中,当装备第51号红魂“杀人玩偶”时,按上B会随机丢出Q版娃娃,但只有苍真和弥娜的坐姿。
(见图一,二)通过查看VRAM图(见图三),发现娃娃有未调用的图。这说明可能存在被屏蔽的娃娃程序。
图一 图二
图三
如何找到该程序呢?思路有两种,一是对装备红魂的内存地址(201325D)设置写断点,按上B中断
后往下跟,注意寄存器中的程序指针;二是对丢出娃娃的声音程序设断(详细见教程(一))。两种
方法均可找到以下程序:Q版娃娃OBJ基址:20005EC
子程序段共3段
00 娃娃初始化程序
01 丢出娃娃程序
02 娃娃消失程序
/////////////////////////////////////////////
0802409C B5F0 push r4-r7,lr
0802409E 464F mov r7,r9
080240A0 4646 mov r6,r8
080240A2 B4C0 push r6,r7
080240A4 1C07 mov r7,r0
080240A6 6978 ldr r0,[r7,14h]
080240A8 4680 mov r8,r0
080240AA 2180 mov r1,80h
080240AC 0049 lsl r1,r1,1h
080240AE 4689 mov r9,r1
080240B0 7AB8 ldrb r0,[r7,0Ah] ;Q版娃娃的程序指针控制
080240B2 2801 cmp r0,1h ;ID等于1
080240B4 D063 beq 802417Eh ;跳
080240B6 2801 cmp r0,1h
080240B8 DC02 bgt 80240C0h ;ID大于1
080240BA 2800 cmp r0,0h
080240BC D004 beq 80240C8h ;ID等于0
080240BE E10F b 80242E0h
080240C0 2802 cmp r0,2h
080240C2 D100 bne 80240C6h
080240C4 E0EC b 80242A0h ;ID等于2
080240C6 E10B b 80242E0h ;ID大于2
080240C8 4848 ldr r0,=80DF904h ;该地址为一图象指针
080240CA 1C01 mov r1,r0
080240CC 3148 add r1,48h
080240CE 6C80 ldr r0,[r0,48h] ;得到娃娃图象数据基指针
080240D0 684D ldr r5,[r1,4h] ;指针
080240D2 688E ldr r6,[r1,8h] ;指针
080240D4 2180 mov r1,80h
080240D6 0249 lsl r1,r1,9h
080240D8 F016FBEA bl 803A8B0h
080240DC 4C44 ldr r4,=84BCA78h
080240DE 6821 ldr r1,[r4]
080240E0 4A44 ldr r2,=131C0h ;关键内存,0D表示娃娃的图
080240E2 1889 add r1,r1,r2
080240E4 6008 str r0,[r1]
080240E6 1C28 mov r0,r5
080240E8 2100 mov r1,0h
080240EA 2201 mov r2,1h
080240EC 2302 mov r3,2h
080240EE F017FBEB bl 803B8C8h
080240F2 6820 ldr r0,[r4]
080240F4 4B3F ldr r3,=131C0h ;关键内存
080240F6 18C0 add r0,r0,r3
080240F8 6802 ldr r2,[r0]
080240FA 1C38 mov r0,r7
080240FC 1C31 mov r1,r6
080240FE 2302 mov r3,2h
08024100 F016FC68 bl 803A9D4h
08024104 F7DCFCC2 bl 8000A8Ch ;随机数生成程序
08024108 1C01 mov r1,r0 ;r0返回随机数
0802410A 2001 mov r0,1h ;(只有0,1。2,3被屏蔽)
0802410C 4001 and r1,r0
0802410E 1C38 mov r0,r7
08024110 2200 mov r2,0h
08024112 2301 mov r3,1h
08024114 F01AF962 bl 803E3DCh ;Q版娃娃动作调用
08024118 4837 ldr r0,=803AA81h ;娃娃动作和坐标处理程序
0802411A 6078 str r0,[r7,4h]
0802411C 1C39 mov r1,r7
0802411E 315C add r1,5Ch
08024120 200D mov r0,0Dh
08024122 7008 strb r0,[r1]
08024124 1C3A mov r2,r7
08024126 3259 add r2,59h
08024128 7810 ldrb r0,[r2]
0802412A 2102 mov r1,2h
0802412C 4308 orr r0,r1
0802412E 7010 strb r0,[r2]
08024130 20E5 mov r0,0E5h ;丢娃娃的声音
08024132 F0B1FED9 bl 80D5EE8h ;声音调用
注意这里:
08024104 F7DCFCC2 bl 8000A8Ch ;随机数生成程序
08024108 1C01 mov r1,r0 ;r0返回随机数
0802410A 2001 mov r0,1h ;(只有0,1。2,3被屏蔽)
0802410C 4001 and r1,r0 ;
0802410E 1C38 mov r0,r7
08024110 2200 mov r2,0h
08024112 2301 mov r3,1h
08024114 F01AF962 bl 803E3DCh ;Q版娃娃动作调用
很显然随机数生成程序靠r0返回结果,并且靠and运算控制范围。
这里的随机数作为Q版娃娃图象数据和程序的寻址参数。
那么我们将0802410A 2001 mov r0,1h 改为 mov r0,3h就可以返回0-3的随机数了。
回到游戏中,经测试果然随机增加了两种娃娃造型,一种是Q版苍真的站姿(见图四),一种
是Q版苍真出剑。(见图五)Y^0^Y
图四 图五
预告:在里篇中我会记录讲解新的Q版娃娃的方法,敬请期待。
PS:因为明天要去看一个朋友,这篇赶工写得很糙。等有空再修改一下好了。这几天暂时不会更新。
呼,写得好累……
回复Comments
作者:
{commentrecontent}