ポケモン DP,Pt,HGSS フレームレートを上げて高速化する

※この記事はソフトのROMイメージが吸い出されていることを前提として書いています。
※ROMのバージョンはすべて日本版を想定しています。


ポケットモンスターシリーズ第4世代「ダイヤモンド/パール/プラチナ/ハートゴールド/ソウルシルバー」は、主に戦闘中のテンポが遅いことで有名です。後発の第5世代では60fpsで戦闘できるのに対し、同じくNDS上で実行される第4世代は描画速度が最大で30fpsに制限されています。

Gen 1: RBGY - 30fps
Gen 2: GSC - 30fps
Gen 3: RSE/FRLG - 60fps
Gen 4: DPPt/HGSS - 30fps
Gen 5: BW/B2W2 - 30fps (60fps in battles)
Gen 6: XY/ORAS - 30fps
Gen 7: SM (likely USUM as well) - 30fps

Obviously some of the games have frame-drops, but this is the targeted frame-rate for all the Pokemon games by Generation.
What framerate do the main Pokemon games run at? - PokéBase Pokémon Answers より引用

その理由がどういったものかはさておき、Pokecommunity.comにてフレームレートが制限される仕様を変更し、最大60fpsを実現してゲームのテンポを上げるための手法を公開されている方がおり、とても参考になりましたので、日本版でも同様に制限を解除できるよういくつか方法を紹介します。



エミュレータの機能を使用

・DeSmuMEならconfig>Frame Skip>Limit Framerateのチェックを外す
・melonDSならconfig>Limit Framerateのチェックを外す
最もシンプルな方法。
タイトル画面を含む全ての場面でフレームレートの制限がなくなってテンポが速くなり、また不安定にもなります。音楽や鳴き声まで早送りになってしまうため、いわゆる"ターボモード"じみています。
筆者としては気に入らず、あまり試していません。



②PARチートコード

A.全ての場面でフレームレートの制限を解除
[(ダイヤモンド)/パール] ※ダイヤモンド版未検証
12000D94 00000000

[プラチナ]
12000DF8 00000000

[ハートゴールド/ソウルシルバー]
12000E0C 00000000

途中で最大30fpsに切り替えたい場合は、
チートを一度disableにしてから、上記コードの"00000000"に該当する部分を"00006325"(ダイパは"0000632E")にしたものを使用してください。

チート機能の処理の関係か、DeSmuME 0.9.10, 0.9.11では機能しません
melonDS0.9.5とnds-bootstrap1.0.0で正常に機能することを確認。


ゲーム全体で制限が解除され、テンポが①ほどではないものの上がります。
この方法は戦闘時に関しては60fpsで安定しており、音楽や効果音の変化も小さく(完全に元のままかどうかは不明)、違和感を抑えながらゲームスピードを上げられる点で①より優れています。


ただし、フィールド上の状況によりフレームレートが不安定になる点は①や③(後述)と同じです。家の中や狭いダンジョンでは高速ですが、大きな街のマップではカクつくなど影響が顕著に表れます。
また、ゲーム全体でスピードが変化する以上、まよいのどうくつのギミックやポケスロンなど変更前に比べてプレイヤーが不利になる場面が出てくるかもしれません。


さらに注意点として、4世代ポケモンはフィールド上での十字キーの操作の仕方によってはマップを正常にロードできなくなることが有名ですが(ご存じない方は"コトブキシティ なぞのばしょ"で調べて下さい)、ゲームスピードの上昇でそのような現象を引き起こしやすくする可能性があります。狭い間隔を高速で移動することを避け大雑把な操作を基本とするなど、気をつけていれば十分回避できます。


ゲームスピードの変化は比較するとこんな感じです。(上げても遅いような気がする)



B.戦闘中のみフレームレートの制限を解除

フィールド上で不安定になる等の欠点があるなら、本来一番速くしたい戦闘時にだけ制限を解除すればいいのではないか?
という考えてみればごもっともな発想でコードを書かれた方がRedditにおられましたので、参考にして日本版向けに書き直しました。

[(ダイヤモンド)/パール] ※ダイヤモンド版未検証
922359BA 00002801
A2000D94 00000000
12000D94 00000000
D2000000 00000000
A22359BA 00002801
A2000D94 0000632E
12000D94 0000632E
D2000000 00000000

[プラチナ]
92249D3C 00002801
A2000DF8 00000000
12000DF8 00000000
D2000000 00000000
A2249D3C 00002801
A2000DF8 00006325
12000DF8 00006325
D2000000 00000000

[ハートゴールド/ソウルシルバー]
92246B5A 00002801
A2000E0C 00000000
12000E0C 00000000
D2000000 00000000
A2246B5A 00002801
A2000E0C 00006325
12000E0C 00006325
D2000000 00000000

こちらもDeSmuME上では機能しません!
戦闘が開始されてから終了して暗転するまでフレームレートの制限がなくなります。フィールドに戻ると通常通り最大30fpsを維持します。ゲームスピードの上がり具合はA.と同じです。
ちなみに、バトルレコーダーの再生を終了してからフィールドの画面に戻るまではフレームレートの制限が解除されたままです。



③ROM書き換え
ROMイメージをバイナリエディタで開き、以下の内容で書き換えて保存します。

バージョン 書き換え対象のアドレス 書き換える内容
ダイヤモンド/パール 00004D94~4D95 "2E 63"を"00 00"に
プラチナ 00004DF8~4DF9 "25 63"を"00 00"に
ハートゴールド/ソウルシルバー 00004E0C~4E0D "25 63"を"00 00"に

変化は②のA.と同じです。
エミュレータの種類を問わず機能することがポイントです。
けして少なくない容量のROMファイルが増えること、セーブ管理の負担が増すことが主なデメリットです。
実行環境が限定されたり、チートが使えない場合などには有用かもしれません。




補足:
実機の吸い出し元ROMと③の方法を用いたROM(nds-bootstrap上)で通信プレイを試したところ、交換と対戦どちらもエラーなく遊べることを確認しました。交換アニメーションやHPの増減速度の違いなどでタイミングに差が出た場合には、遅い方に合わせて通信待機が完了するようです。

melonDS上でポケモン交換を試した際の画像。左側の素ROMに対して右側の制限解除版がより早く進行しています。