|
绿宝石自己的【内置时钟】,不再依赖模拟器的【真实时钟】
一直以来时钟问题一直困扰着很多玩家和改版爱好着。
所谓时钟,就是游戏中的时间,同时一些时间的启动是依赖于其中的时间。
而绿宝石的时钟系统只能依赖于模拟器的“真实时钟”选项,否则游戏中的时间将固定在某一点上。
这样,游戏中的“电视购物”,“幻岛出现”,“树果成长”,“涨潮落潮”,“抽奖”等事件将无法正常启动。
现在绿宝石自己的【内置时钟】终于实现了,可以不再依赖模拟器的【真实时钟】。
正文:
本教程仅适用于美版绿宝石(BPEE)。
首先在ROM中搜寻一个相当的空位,将以下代码写入ROM中。
注意:写入的地址的最后一个数字位数一定要在F或者3或者7或者B。
数据代码(感谢zjzj1118建议将0x0200F024改成0x0201f000)
FFB420480068113000901E4C24689A34631C1D4F3D7800787A1C85421CD038701078461C3006000E10703B2814DD002616701E78013E3106090EFF290BD13B261E702678013E3140FF2902D1172100F00CF8217000E01970FFBC0C4801880F4A101C031C4B400A48004707B4054800689830018801390A4A914200DB0649018007BCF746905D000300F0010230010004F105000800800000FFFF0000FF03000094000000
记下这个写入的地址。比如我写入的地址是0xBD80D0。
但是系统调用这个新命令,需要在地址上+1,这是规则。于是就变成0xBD80D1,把它转成指针形式的数据,就是D180BD08。
在0x5e6 写入以下代码:
01B400480047xxxxxxxx01BC
xxxxxxxx就是之前得到的指针。
比如我之前的得到的代入就是
01B400480047D180BD0801BC
在0x2FB06 写入以下数据
最后模拟器去掉真实时钟选项,并重新加载游戏即可。
感谢“pokecommunity”的Gamer2020编写了此命令。
参考http://www.pokecommunity.com/showthread.php?t=297913
原代码
.text
.align 2
.thumb
.thumb_func
.global emeraldclockfix
/*At 80005e6 write 01B400480047xxxxxxxx01BC with xxxxxxxx being the offset for this routine.
To disable the error code text write C046C046 at 0802FB06
Offset 0200F024 may not be safe in emerald but this can be changed to anything desired.
This code seems to work but is not fully tested. Use at your own risk.*/
main:
push {r0-r7}
ldr r0,.PLAYER_DATA
ldr r0, [r0]
add r0,r0, #0x11
str r0,[sp]
ldr r4,.PLAYER_DATA
ldr r4, [r4]
add r4,r4, #0x9A
add r3,r4,#0x1
ldr r7,.SUM_BUFF
ldrb r5,[r7]
ldrb r0,[r0]
add r2,r7,#0x1
cmp r5,r0
beq Game_Code_and_Return
strb r0,[r7]
ldrb r0,[r2]
add r6,r0,#0x1
lsl r0,r6,#0x18
lsr r0,r0,#0x18
strb r0,[r2]
cmp r0,#0x3B
ble Game_Code_and_Return
mov r6,#0x0
strb r6,[r2]
ldrb r6,[r3]
sub r6,#0x1
lsl r1,r6,#0x18
lsr r1,r1,#0x18
cmp r1,#0xFF
bne SOMETHING3
mov r6,#0x3B
strb r6,[r3]
ldrb r6,[r4]
sub r6,#0x1
and r1,r6
cmp r1,#0xFF
bne SOMETHING2
mov r1,#0x17
bl SOMETHING4
SOMETHING2:
strb r1,[r4]
b Game_Code_and_Return
SOMETHING3:
strb r1,[r3]
Game_Code_and_Return:
pop {r0-r7}
ldr r0,.SUM_GAME_OFF
ldrh r1,[r0]
ldr r2,.SUM_VAL
mov r0,r2
mov r3,r0
eor r3,r1
ldr r0,.RETURN_OFFSET
bx r0
SOMETHING4:
push {r0-r2}
ldr r0,.PLAYER_DATA
ldr r0, [r0]
add r0,r0, #0x98
ldrh r1,[r0]
sub r1,#0x1
ldr r2,=.SUM_VAL2
cmp r1,r2
blt SOMETHING1
ldr r1,.SUM_VAL3
SOMETHING1:
strh r1,[r0]
pop {r0-r2}
mov r15,r14
.align 2
.PLAYER_DATA:
.word 0x03005D90
.SUM_BUFF:
.word 0x0200F024
.SUM_GAME_OFF:
.word 0x04000130
.RETURN_OFFSET:
.word 0x080005F1
.SUM_VAL2:
.hword 0x8000
.hword 0x0000
.SUM_VAL3:
.hword 0xFFFF
.hword 0x0000
.SUM_VAL:
.hword 0x3FF
另特别感谢zjzj1118关注此问题,为研究内置时钟作出的贡献。
感谢海のLUGIA给予此问题的探讨的帮助。
测试
1.如勾选“真实时钟”,真实时钟依然有效,且优先于“内置时钟”。
2.内置时钟走动速度是参照,游戏本身的“游戏时间”的,1分钟比1分钟速度走动。
3.进入战斗后BUG,屏幕右下会出现一个8*8的坏点,已修复。
[ 本帖最后由 Nightind 于 2013-6-7 12:49 编辑 ] |
|