时钟电路漏洞
时钟电路漏洞,在海外多称为称树果漏洞(日文︰きのみ問題,英文︰Berry glitch),是一个最早在《红宝石/蓝宝石》中被发现的漏洞,由原始GBA游戏卡带实时时钟电路(RTC)的设计缺陷导致。因为旧有RTC的设计比较原始,再加上游戏设计者对游戏设计中没有提供一些便利的功能,理论上,早期带有RTC晶振的实时时钟的游戏都会遇到这个问题,只不过由于《宝可梦》系列游戏的知名度,这一问题在宝可梦领域反而是第一次被重视起来。
触发漏洞
此现象在游戏初期版本发生,会在已经游玩超过1年以上的《红宝石/蓝宝石》中出现。该漏洞会在游戏开始后的第366天触发,时间电路缺陷一旦被触发,从而导致以下事件不按现实时间流动而再次出现:
- 树果的生长
- 每日更新的随机事件
- 彩票的开奖
- 绿岭宇宙中心火箭成功发射的次数增加
但以下事件依然会正常触发:
- 浅滩洞穴的潮汐
- 伊布进化为太阳伊布和月亮伊布
漏洞产生的原因
《红宝石/蓝宝石/绿宝石》的游戏卡带拥有时钟电路使用精工S-3511 石英晶振进行电路驱动,但那个年代的GBA卡带中的晶振,既没有对时功能,也不能靠网络获取真实的日期时间对时,其时间计算方式是由一串规则计算而来的相对值:
- 游戏卡带时钟电路启动时的基准时间为“2000/01/01 00:00:00”,之后时钟电路会不断运作,电池电量不耗尽的情况下会一直向未来运作。
- 而当玩家开始《红宝石/蓝宝石/绿宝石》的新游戏,玩家需要在主角家中钟表上设定时间,钟表表面默认为上午10时,而玩家设定的时间会被作为“起始时间戳0时”,游戏的报告会用一个五位数(10进制)记录游戏流逝的时间,其中初始零时记为00000。
- 之后游戏内在每次存档时,会与时钟比对,在此基础上将时钟电路上从“起始时间戳”开始,经过的日、时、分、秒数(年月全部换算为日数)以及星期转化为一串数字,并作为时间戳存储在游戏的报告内,这个经过时间是随着现实时间流逝,与实际游戏时间无关,在游戏关闭的时候,游戏的“经过时间”(并非是游戏的实际游玩时间)依然会向后运作。
- 每次游戏内种植树果和进行周期性事件后,存档会记录下下次事件刷新和树果成熟的时间戳,直到时钟电路的时间运行到这个刷新的时间戳之后,树果才会成熟,周期性事件才会更新。
例:
游戏卡带的时钟电路启动后3小时(电路时间为2000/01/01 03:00:00)玩家开始了新游戏,而玩家一开始在主角家中调整钟表的时间为上午12点(距离游戏内钟表默认时间上午10点相差2小时),并在此时存档,游戏会以此时作为“起始时间0时”开始计算游戏的经过时间。
而在5天后的下午1点再开机并存档的时候,此时时钟电路的时间则是2000/01/06 04:00:00,即便游戏实际只运行了1分钟,游戏存档的时间戳记录的时间仍然是5天1小时。
如果此时种下一颗橙橙果,而第三世代中橙橙果的成熟时间是12个小时,那么时间戳会记录下这株橙橙果的成熟时间戳是“5天13小时”,当时钟电路走到“2000/01/06 16:00:00”的时候,这株橙橙果便会成熟。
用表格表达就是:
红宝石蓝宝石中的时钟漏洞是有官方说明的一个BUG,并且被官方承认。
BUG产生的原因在于程序员将时间戳的记录方式搞错(“技术领先”的Gamefreak),导致晶振时间在“2000年”(不等于现实的2000年)的时候,存档的时间戳反而会忽略累积年份。
这一问题直接导致存档时间戳记录到“第367天”的时候(2000年是闰年),漏洞会导致该时间戳不是“启动后第367天”,而是自动重置到“启动后第1天”,游戏存档时间戳会立刻早于晶振367天。
最终的结果就是:在“第366天”前触发的周期性事件和种下的树果,本应在“第367天”刷新和成熟,但由于时钟电路的“第367天”错误的变为“第1天”,因此所有事件的刷新和树果的成熟将因为没有到达重置的时间而被冻结,直到366天之后,时钟电路进行到“2002/01/02”之后,存档时间戳再度累积到“第367天”到来的时候才会解除。 而游戏启动时时钟电路已经运行到2001/01/01之后的存档则不会触发漏洞。
用表格表达就是:
而游戏启动时时钟电路已经运行到2001/01/01之后的报告则不会触发漏洞。
衍生漏洞
电池耗尽:由于整个时钟电路全是靠一块电池驱动,所以不可避免的出现电池耗尽的情况,当时钟电路的电池耗尽的时候,时钟电路会被强制重置为2000年1月1日 00:00:00,但正常电池耗尽的游戏会在标题屏幕有警告信息来警告时钟无法运作。相反,触发了时钟电路漏洞的游戏反而不会出现这条警告信息。 而游戏虽仍可正常运作并记录,但无法体验时间系统的相关内容。
新电池漏洞
至今为止,几乎所有的GBA带时钟的卡带的时钟电池都是没电的,所以广大玩家基本都尝试采用把旧电池拆掉换上新焊脚电池,当然这里比较推荐的是CR1616贴片电池座(网上有售),可以完美放进卡带内,又不用频繁更换焊脚电池。
在更换电池后,时钟电路依然会从2000/01/01 00:00:00开始重新计算,时钟电路数据将会早于报告的时间戳,导致时间错位,而当错位发生的时候,游戏存档的时间戳将无法到达下一个刷新时间,导致所有的事件都被冻结,直到时钟电路的时间再度运转到和游戏时间戳一致或快于游戏时间戳,然后再运行到时间戳设定的刷新时间之后才会再度恢复正常。
例:
假设游戏的“起始零时”是时钟电路的2000/01/01 00:00:00,而时钟电路已经走到2011/01/01 00:00:00,时间戳则记录为4018天0时,此时种下一颗橙橙果,那么时间戳会设定下一次橙橙果成熟的日期是4018天12时。而假设此时电池突然耗尽,那么更换电池后,时钟电路回到了2000/01/01 00:00:00,那么时钟需要再经过4018天12时,也就是11年零12个小时,这株橙橙果才会成熟,而且时间戳才会更新下一次事件的刷新时间。
用表格表达就是:
理论上,这个漏洞的危害远高于早期的《红蓝宝石》树果漏洞,因为这一漏洞不仅《红宝石/蓝宝石》会触发,包括没有漏洞的《绿宝石》也会触发这种新电池漏洞,而由于此漏洞在游戏发售后多年,时钟耗尽时才会发生,因此官方并未针对这种问题给出解决办法,官方的修复程序也无法修复此漏洞。
2099漏洞
满RTC时钟漏洞又称2099漏洞。当时钟电路运转到2099/12/31 23:59:59 之后,时钟电路将重置回2000/01/01 00:00:00,从而引发漏洞。该漏洞分为两种情况:
- 在游戏关机状态下,时钟电路达到满时间重置。
- 在游戏运行状态下,时钟电路达到满时间重置。
当前者再次开机之后,效果等同于更换新电池漏洞。而后者的存档时间戳记录将会发生错误,产生高达62291天数的数值,该数值产生与建档时初始RTC时间戳相关(“经过RTC”的值按如下计算方式变化:65536-初始RTC的天数。)。
树果漏洞的官方修复方法
由于是宝可梦第一次出现大规模且必定会发生的恶性漏洞,因此任天堂多次对此漏洞进行了批量修复,首先在新版本的《红宝石/蓝宝石》上,已经修补了此漏洞,而对于已经销售的早期版本《红宝石/蓝宝石》,也提供了多种修复方式,除此之外,玩家还可以将游戏卡带寄至任天堂进行修复(寄送维修服务已于2016年9月停止支援)。
修复程序的修复原理具体如下:
- 若初始RTC在2000,且当前RTC在2000/01/01-2000/12/31,则将当前RTC调整为366天后;
- 若初始RTC在2000,且当前RTC在2001/01/01-2002/01/01,则将当前RTC跳到2002/1/2;
- 若初始RTC在2000,且当前RTC在2002/01/02及之后,则无需修复;
- 若初始RTC在2001及之后,则无需修复。
修复程序的修复原理是将位于2001年之前的时钟电路强制调整为2001/01/01,并将存档时间戳一并后延,以跳过发生漏洞的2000年。
《火红/叶绿》和《绿宝石》
任天堂在《火红/叶绿》和《绿宝石》自带修复程序,需要玩家用以下操作进行修复:
- 将一台GBA连接到游戏连接电缆的1P上,插入并打开《火红/叶绿》或《绿宝石》,在游戏标题按select和B,进入修复程序,按A。
- 另一台GBA连接到游戏连接电缆的2P上,插入《红宝石/蓝宝石》,按住select和start开机,进入修复程序,根据提示进行修复。
- 每次重新进行游戏或更换过电池重新进行游戏后,需要再度进行修复。
修复程序
宝可梦XD 暗之旋风 黑暗洛奇亚
- 《红宝石/蓝宝石》与宝可梦XD 暗之旋风 黑暗洛奇亚进行联动后,将会自动下载修复程序。
宝可梦圆形竞技场
- 美版《红宝石/蓝宝石》从宝可梦圆形竞技场的特典光盘中下载竞技场的基拉祈会自动下载修复程序。
宝可梦频道
- 欧版和澳版《红宝石/蓝宝石》从 宝可梦频道~与皮卡丘一起!~ 下载基拉祈会自动下载修复程序。
宝可梦盒子 红宝石&蓝宝石
- 非日版《红宝石/蓝宝石》利用宝可梦盒子 红宝石&蓝宝石的游玩《红宝石/蓝宝石》游戏功能时会自动下载修复程序。
E卡刷卡器
- 而日本方面随杂志附赠特制专用E卡也可以来刷入修复程序。
新电池漏洞的非官方修复方法
重新开存
更换电池后,重新开始游戏会让游戏报告的“时间戳0时”重置,进而会让游戏正常运作,但如果此刻时钟电路的年份并未超过2001年的话,《红宝石/蓝宝石》运行1年后依然会触发原始的漏洞,依然需要官方修复。
修改电路和存档的时间戳
原本的《红宝石/蓝宝石》漏洞,在触发了漏洞后,只要利用官方修复程序即可修复,但这种方法并不能解决新电池漏洞。
新电池漏洞发生于为卡带更换新电池之后的时候。更换新电池的时候,RTC时间会重置为2000/01/01 00:00:00开始计时。而对于一个已经建档的卡带来说,当前RTC时间是远远早于存档内记录的“初始RTC”和“经过RTC”。在5.1的介绍中有提到,对于已经在存档里记录了某个RTC对应的“经过RTC”,将当前RTC更改为早于对应的RTC,是不会让经过RTC发生改变。只有当当前RTC慢慢走回存档里“经过RTC”对应的RTC时间后,才会解除漏洞状态正常累计时间,某种程度上与树果漏洞的影响非常相似。
不同的是树果漏洞只会发生在固定的时间段,而新电池漏洞则会发生在任意卡带(包括已经永久性修复的卡带版本)没电后。官方并未对此给出修复手段。
GBA
DS
RTCRead本质是一个读取卡带RCT时间并可以对其进行修改的软件(注意:它不会对卡带存档进行任何修改)。它在GBA和DS上分别有对应的软件,均需要烧录卡才能进行使用。
通过前文的叙述我们知道,如果要解除新电池漏洞状态,则需要卡带RTC的时间晚于存档记录“经过RTC”时所对应的RTC时间。如果没有修复工具,我们能做的只有等卡带RTC自行走到对应的时间。倘若对应的时间是2015年,那也意味着重置回2000的RTC需要现实里也走2015年才能回到对应RTC,非常不便。而有了修复,我们便可以调过中间的过程,直接接触漏洞状态。
对于已经知道存档时对应的RTC,那么可以直接用rtcread修改到晚于该RTC时间。如果并不清楚对应RTC,那么可以通过种树、水静百货对话抽奖后保存,接着rtcread更改时间后再进入游戏查看是否能收获树果或再次抽奖,来判断是否解除漏洞状态。
2099漏洞的非官方修复方式
2099漏洞的第一种情况可以通过新电池漏洞RTCRead,调整当前RTC至晚于最后保存时对应的RTC时间来恢复,但随着游戏的进行,第一种情况多次修复后最终都会演变成第二种情况。而第二种情况下的游戏,将无法通过单纯RTCRead更改时间来修复。必须对存档内的初始RTC时间戳和经过RTC时长进行修改,再使用RTCRead调整时钟电路,才可修复。但对存档内时间戳进行修改,会导致其他时间相关数值因为并未同步更新变化,而发生此类数值与RTC时间的错位,如幻之岛值。
例:
假设卡带初始RTC天数为12345(2033/10/19),当前RTC为2099/12/31,对应经过RTC天数为24179。当游戏状态下,当前RTC满时间重置回2000/01/01,经过RTC会变为:65536-12345=53191。这是一个正常RTC永远无法达到的天数。
RTC从2000年到2099年总共的最大天数仅有36525天。很明显53191>36525,这种情况是无法通过RTC自己走动或者RTCRead修改来解除漏洞的。可行的修复方法仅有通过修改存档中记录的“经过RTC”变为任意小于36525的值,以及调整“初始RTC”,最后调整对应RTC才能解除。可以通过存档修改器(PKHeX)直接修改,也可以通过修改开启卡带内置重置时间的功能,然后在游戏标题界面按“↓+select+B”来进入重置时间界面修改“经过时间”(虽然游戏内部可以存储天数范围为0-65535,但游戏内置的重置时间功能仅能显示0-9999天,大于9999的天数将显示为?999)。
但是,需要提及的是,直接修改存档数据,并不会同步修改其他与RTC关联的数值。比如幻之岛种子与幻之岛值,连同经过RTC是一一对应的。但若是直接修改了经过RTC,幻之岛种子与幻之岛值并不会对应变化,经过RTC与幻之岛值的标准对应表在这种情况下将会失效。相应的,幻之岛种子将会与修改过的经过RTC对应,同样也能计算出之后的对应的幻之岛值,从而形成一个错位的经过RTC与幻之岛值的非标准对应表。所以如非必要,比如遭遇2099漏洞,不建议大家使用各种手段直接修改经过RTC。
存在漏洞的卡带版本
早期发售的红宝石蓝宝石卡带存在着树果漏洞的问题,在后期的版本更新中,卡带内部被置入了永久性的漏洞修复。以下是是否存在树果漏洞的卡带版本。
是否存在树果漏洞的卡带版本 | |||
---|---|---|---|
卡带版本 | 存在漏洞 | 已修复漏洞 | |
《红宝石/蓝宝石》 | 日版 | 1.0 | 1.1 |
美版&欧版英文 | 1.0、1.1 | 1.2 | |
欧版非英文 | 1.0 | 1.1 | |
《绿宝石》 | 已修复漏洞 |