ポケモンRSEmの時計電池切れ問題とその対処方法

どういうわけかここ最近第3世代熱が再燃して古いカートリッジを引っ張りだしてRSEmやFRLGをプレイする日々が続いている。その中でRSEmの電池交換に伴う不具合についての記事を目にした。

ポケモンのゲームに実時間と連動する「時間」の概念が与えられたのは第2世代からであるが,時計機能を持たないゲームボーイをハードとする第2,第3世代はカートリッジそのものに時計機能をもたせている。

第2世代はセーブ機能に用いられている電池がそのまま時計の電池としても動作している。電池が切れるとセーブデータも同時に消失してしまう。

第3世代以降でもスケルトン仕様のカートリッジからボタン電池を目視できるが,セーブデータは不揮発性のメモリに保存されるため,時計機能専用になっている。これが切れてもセーブデータ自体は消失しないため,引き続きゲームをプレイすることが可能である。

2016年まで任天堂はバックアップ電池の交換修理を行っていたようだが,現在では自力あるいは非公式の代行業者の手を借りて交換するしかない。

もちろんサポート対象外となるが,GBAに関するサポート自体が既に終了しているので気にする必要はないかもしれない。

実際に「ルビー サファイア 電池交換」などと検索すると自力で電池を交換した人の写真付きレポートが大量に出てくる。

注意すべきなのは,[1]にもあるように,自力で電池を交換するだけではRSEmの一部の時間関連のイベントは復活しないことである。

[1]では

「セーブデータ作成時点から電池切れまでの時間が保持されて」いるため

「電池を入れ替えた場合は0からその時間に達するまで一部の時間イベントが発生しない」

と推測されているが,

どうやら実際には(発生する不具合は上記を仮定した場合と論理的にはほぼ同じなのであるが)

(1)

セーブデータ内にレポートを書いた日時が記録されており,新たにレポートを書くとき,

カートリッジの内部時計の日時が前に記録されていたレポートの日時より過去である場合はレポートの日時は更新せずにセーブされる

(2)

カートリッジの内部時計用のボタン電池が切れた時点で内部時計の日時が2000年1月1日にリセットされる

という仕様になっているようで,電池を交換しても内部時計は2000年1月1日から時を刻み始めるため,セーブデータに記録されている時刻が経過するまでセーブデータ内の日時が更新されることはない。ゲーム内の時計関連イベントの発生はセーブデータ内の日時からの差分を見て判定しているため,セーブデータ内の日時が更新されるまでは時間イベンドが発生しない,

という現象が起きているようである [2]。

[3]でも推測されているが,任天堂での修理サービスによって再び時間イベントが発生するようになっていたのは,任天堂が内蔵電池を交換していただけでなく,実際にはセーブデータ内の日時または内部時計の日時(あるいはその両方)の改変も行っていたためだと思われる。

ルビーとサファイアに関しては発生当時大騒ぎになりあらゆる方面から総力をあげて提供された「きのみもんだいしゅうりプログラム」を用いることで,セーブデータを保持したままこの問題を解決することができるようである(ただし内部電池が生きている状態で適用するという条件付き) [1]。

「きのみ問題」の発生の根本原因は公にはされていないが,[4]によると,ゲーム開始からの経過日数を内部時計から計算する機能の欠陥が原因であったようである。

金銀やDPPtとは異なり,RSEmでは特定の曜日や日付に関わるイベントが存在しないため,内部時計の「年月日」の情報は単なる「日」にまず換算される。このとき,年に関しては2001年を起点として「経過年×365日」(うるう年の場合は366日)の日数が加算される仕組みになっているようである。ここで,内部時計の日時が2000年または2001年である場合はどちらの場合も「0年経過で日数加算なし」として扱われているらしい。

そのため,内部時計が2000年1月1日にセットされる最初のゲーム開始から内部時計の日時が2000年であるうちは「0年+経過日数」と正しく日数をカウントできているのであるが,内部時計が2001年1月1日になった(つまりプレイ開始から1年が経過した)時点で内部時計から計算される経過日数が再び「0日」に戻ってしまい,内部時計とセーブデータ内の日時との間に1年近い時差が生じてしまうようだ。(1)の仕様のため,この状態では実時間でさらに1年近い日数が経過しない限り,電池交換後の状態と同様に一向にセーブデータ内の日時が更新できない状態が続いてしまう。

「きのみもんだいしゅうりプログラム」にはこれを回避するため,ゲーム開始から1年が経過しておらず症状が発生していないカートリッジの場合は内部時計を366日進め,既に症状が発生しているカートリッジの場合は内部時計を2002年1月2日にセットする効果があるようである [4]。

本来であればカートリッジの内部時計さえ修正すれば,その後にゲーム内でレポートを書くことによってセーブデータ内の日時も自動で更新されるはずであるが,この手間を省くため実際には同時にセーブデータ内の日時にも同じような変更を加えているものと思われる(※)。

この効果のおかげで,電池を交換した後でも修理プログラムを適用することでセーブデータ内の時刻と内部時計との時差が解消され,時間イベントが再び発生するようになっているのだろう。

※ 未検証だがセーブデータ内の日時が2002年1月2日よりも後になるまで経過していれば(つまりきのみ問題の発生から1年我慢していれば),理論上はきのみ問題の不具合は解消されているはずであるためそもそもプログラムを適用する必要は無いのだが,このような仕様になっているため「きのみもんだいしゅうりプログラム」が図らずも電池交換後の不具合を解決する手段になってしまっているのだと考えている

もちろん,これほど大騒ぎになったバグなのでエメラルドではこの問題は修正されており,当然修理プログラムの適用対象にはなっていない

そのため,エメラルドに限り内蔵電池交換によって生じたセーブデータと内部時計の時差を解消する正規の手段が,セーブデータの初期化以外に存在しない

しかし原因はセーブデータと内部時計の時差と明らかになっているため,どちらかを改変することでセーブデータを保持したまま時差は解消できると考えられる。

正規の手段にこだわらなければ,以下の対策を講じることができるようである(ただしいずれもグレー)[2]。

1. セーブデータ内の日時情報を内部時計より過去になるように改変する

もちろんやっていることはセーブデータの改造そのものである。

2. カートリッジの内部時計をセーブデータ内の日時情報より未来になるように改変する

カートリッジの内部時計に直接アクセスし改変するのは[3]にあるようにかなり敷居が高い。[2]ではゲーム機を通して内部時計を改変する自作GBAソフトやDSソフトが提供されており手軽にはなっているが実行には非公式の外部機器が必要である。

以上,ポケモンRSEmの時計電池切れ問題とその対処方法をまとめた。ポケモンルビーサファイアは発売から16年以上が経過しているが,そこで捕まえられるポケモンは現行のSMやUSUMに移行できるし,今なお冒険に連れていくことができるため,当時のまま長く遊びたいと考えるトレーナーは少なくないはずだ(もちろん私もその1人である)。

今回の第3世代熱の再燃によりこの問題を知り調査に至ったのだが,思いの外この問題について詳細に調べている日本語記事が少なかったため,調査内容を本記事として公開することにした。

本記事がホウエン地方で止まっていた時間を再び動かす一助になっていれば幸いである。

【参考サイト】

[1] GBA版ポケットモンスタールビー・サファイア・エメラルド版の電池交換について

http://www2u.biglobe.ne.jp/~kakeru/pokemon_a/battery.htm

[2] Pokemon Ruby/Sapphire New Battery Glitch - Furlock's Forest Wiki

http://furlocks-forest.net/wiki/?page=Pokemon_Ruby/Sapphire_New_Battery_Glitch

(※リンク切れ中→アーカイブ:https://archive.is/vXpTT

[3] プログラミングな日々: ポケモン「サファイア」の時計を復活させる

https://days-of-programming.blogspot.com/2016/01/blog-post.html

[4] Berry glitch - Bulbapedia, the community-driven Pokémon encyclopedia

https://bulbapedia.bulbagarden.net/wiki/Berry_glitch