Nightind 发表于 2013-6-6 20:52:24

绿宝石自己的【内置时钟】,不再依赖模拟器的【真实时钟】

绿宝石自己的【内置时钟】,不再依赖模拟器的【真实时钟】

一直以来时钟问题一直困扰着很多玩家和改版爱好着。
所谓时钟,就是游戏中的时间,同时一些时间的启动是依赖于其中的时间。
而绿宝石的时钟系统只能依赖于模拟器的“真实时钟”选项,否则游戏中的时间将固定在某一点上。
这样,游戏中的“电视购物”,“幻岛出现”,“树果成长”,“涨潮落潮”,“抽奖”等事件将无法正常启动。

现在绿宝石自己的【内置时钟】终于实现了,可以不再依赖模拟器的【真实时钟】。

正文:
本教程仅适用于美版绿宝石(BPEE)。
首先在ROM中搜寻一个相当的空位,将以下代码写入ROM中。
注意:写入的地址的最后一个数字位数一定要在F或者3或者7或者B。

数据代码(感谢zjzj1118建议将0x0200F024改成0x0201f000)
FFB420480068113000901E4C24689A34631C1D4F3D7800787A1C85421CD038701078461C3006000E10703B2814DD002616701E78013E3106090EFF290BD13B261E702678013E3140FF2902D1172100F00CF8217000E01970FFBC0C4801880F4A101C031C4B400A48004707B4054800689830018801390A4A914200DB0649018007BCF746905D000300F0010230010004F105000800800000FFFF0000FF03000094000000

记下这个写入的地址。比如我写入的地址是0xBD80D0。
但是系统调用这个新命令,需要在地址上+1,这是规则。于是就变成0xBD80D1,把它转成指针形式的数据,就是D180BD08。

在0x5e6 写入以下代码:
01B400480047xxxxxxxx01BC

xxxxxxxx就是之前得到的指针。
比如我之前的得到的代入就是
01B400480047D180BD0801BC

在0x2FB06 写入以下数据
C046C046

最后模拟器去掉真实时钟选项,并重新加载游戏即可。

感谢“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,
add   r0,r0, #0x11
str   r0,
ldr   r4,.PLAYER_DATA
ldr   r4,
add   r4,r4, #0x9A
add   r3,r4,#0x1
ldr   r7,.SUM_BUFF
ldrb    r5,
ldrb    r0,
add   r2,r7,#0x1
cmp   r5,r0
beq   Game_Code_and_Return
strb    r0,
ldrb    r0,
add   r6,r0,#0x1
lsl   r0,r6,#0x18
lsr   r0,r0,#0x18
strb    r0,
cmp   r0,#0x3B
ble   Game_Code_and_Return
mov   r6,#0x0
strb    r6,
ldrb    r6,
sub   r6,#0x1
lsl   r1,r6,#0x18
lsr   r1,r1,#0x18
cmp   r1,#0xFF
bne   SOMETHING3
mov   r6,#0x3B
strb    r6,
ldrb    r6,
sub   r6,#0x1
and   r1,r6
cmp   r1,#0xFF
bne   SOMETHING2
mov   r1,#0x17
bl      SOMETHING4

SOMETHING2:

strb    r1,
b       Game_Code_and_Return

SOMETHING3:
                           
strb    r1,

Game_Code_and_Return:

pop   {r0-r7}
ldr   r0,.SUM_GAME_OFF
ldrh    r1,
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,
add   r0,r0, #0x98
ldrh    r1,
sub   r1,#0x1
ldr   r2,=.SUM_VAL2
cmp   r1,r2
blt   SOMETHING1
ldr   r1,.SUM_VAL3

SOMETHING1:                           

strh    r1,
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 编辑 ]

海のLUGIA 发表于 2013-6-6 20:54:50

怎么说呢,大好事啊,不过说实话游戏时间1分钟兑换1分钟过一天那是有点漫长滴~

PS:如果勾上真实时钟,游戏里的实际时间为真实时钟+内置时钟

34520000 发表于 2013-6-6 21:20:30

不错,这是好物

marsviper 发表于 2013-6-7 00:57:49

…的确是漫长,模拟器的加速效果会影响游戏时间么?

钢之波导 发表于 2013-6-7 15:46:14

1分钟比1分钟,那加速会怎么样?

葛布林 发表于 2013-6-7 19:29:13

感谢楼主给我们的分享,谢谢,辛苦了,我慢慢研究去。

浪漫小樱花 发表于 2013-8-25 02:26:00

有点清楚!相信好处是很多的吧!

a825876612 发表于 2014-2-13 11:09:16

好复杂完全看不懂

怒八奇 发表于 2014-9-8 16:50:29

请问楼主,我用改版美版绿宝石ROM的话,会白屏。不知何原因导致。
也没和改版的内容地址冲突,只用了00的空位放置代码,求解

苏维埃传奇 发表于 2016-4-16 18:17:44

有没有火红啊?
页: [1]
查看完整版本: 绿宝石自己的【内置时钟】,不再依赖模拟器的【真实时钟】