PSPエミュレーター「PPSSPP」の開発ブランチで、RetroAchievementsのHardcore Modeに関連したセーブステート処理の問題が修正されました。2026年9月5日、修正を行うPull Request #22236「Fix savestate loads slipping past hardcore mode during boot」がmasterへマージされています。
●GitHub Pull Request #22236
https://github.com/hrydgard/ppsspp/pull/22236
今回修正されたのは、Hardcore Modeを有効にしているにもかかわらず、ゲーム起動直後の特定のタイミングではセーブステートの読み込み処理がチェックをすり抜ける場合があったというものです。なかでも「Auto load savestate」については、開発者自身が確実にすり抜ける状態だったと説明しています。
ただし、Hardcore Modeそのものが常時機能していなかったわけではありません。ゲーム起動時に行われるRetroAchievements側のゲーム識別と、PPSSPPのセーブステート処理のタイミングが組み合わさることで発生していた問題です。
なぜHardcore Modeなのにセーブステートを読み込めたのか?
RetroAchievementsのHardcore Modeは、セーブステートなど一部の便利な機能を制限し、より実機に近い条件で実績への挑戦を楽しむためのモードです。そのため、本来ならHardcore Modeが有効な状態では、こうしたセーブステートの読み込みはブロックされます。
ところが従来のPPSSPPでは、セーブステートを実際に読み込む瞬間ではなく、処理をキューへ登録する「Enqueue」の段階でHardcore Modeが有効かどうかをチェックしていました。登録された処理はその場ですぐ実行されるわけではなく、後から「Process」によって適用される仕組みです。
一方、ゲーム起動直後にはRetroAchievementsがゲームを非同期で識別している時間帯が存在します。この識別が完了するまではHardcore Modeの判定が一時的にfalseとなるため、その間に登録されたセーブステート処理はチェックを通過してしまいます。その後、ゲーム識別が完了してHardcore Modeが有効になってから、キューに残っていた処理が実際に適用されてしまう場合がありました。
「Auto load savestate」は確実にチェックをすり抜けていた
今回のPRでは、問題につながるいくつかの経路が挙げられています。なかでも特徴的なのが、ゲーム起動時に自動でセーブステートを読み込む「Auto load savestate」です。
PPSSPPではゲームの起動完了処理でRetroAchievementsによるゲーム識別を開始し、その少し後でHardcore Modeが有効かどうかを確認していました。しかし、その時点ではまだ識別処理が完了していないため、Hardcore Modeの判定はfalseになります。つまり、この機能については単にタイミング次第で発生するというより、従来の処理順ではHardcore Modeのチェックを確実に通過してしまう状態でした。
このほか、コマンドラインからセーブステートを指定する「–state FILE」や、ゲーム識別中にロードステートのホットキーを押した場合、ポーズメニューから読み込みを実行した場合なども影響を受けていたとされています。
セーブステートを「適用する直前」にもう一度チェック
今回の修正では、この問題を個別の読み込み経路ごとに塞ぐのではなく、セーブステート処理を実際に適用する「Process」の段階でHardcore Modeをもう一度チェックする仕組みが追加されました。
このタイミングならRetroAchievementsによるゲーム識別は完了しており、Hardcore Modeが有効かどうかを正しく判断できます。つまり、起動直後にセーブステート処理がいったんキューへ登録されてしまったとしても、実際に読み込まれる直前のチェックによってブロックできるというわけです。
この方法なら、ホットキーやAuto load savestate、コマンドラインの「–state」に加えて、ポーズメニューやWebSocket debugger、rewindなど、複数の経路をまとめてカバーできます。
開発者向けのFreeze-frameもHardcore Modeでは使用不可に
今回の修正では、PPSSPPの開発者向け機能「Freeze-frame」にも対策が施されています。この機能は毎フレーム保存された状態を復元する仕組みになっており、通常のセーブステート用キューを経由せず、直接セーブステートを読み込んでいました。
そのため、従来は今回問題となったHardcore Modeのチェック自体を通っていませんでした。修正後は開発者メニューでFreeze-frameを有効にする段階に加えて、レンダリング処理側でもチェックされ、Hardcore Mode有効時には利用できないようになっています。
また、Hardcore Modeによってセーブステート操作が拒否された場合の挙動も改善されました。これまで一部の経路では操作しても何も起こらず、なぜ読み込めないのか分かりにくい状態でしたが、修正後は標準の警告メッセージが表示されます。
オンライン接続時のセーブステート拒否も分かりやすく
同様の改善はオンライン接続時のセーブステート制限にも加えられています。PPSSPPでは状況によってオンライン接続中のセーブステート操作を許可しない場合がありますが、従来はこうした処理が拒否されても、そのまま何も起こらないケースが存在していました。
今回の変更では、セーブまたはロードが許可されていない場合に標準の警告を表示する処理へ変更されています。Hardcore Modeの問題とは直接別のものですが、操作を拒否した理由をユーザーへ明確に伝えるという点では共通した改善です。
なお、当サイトでは9月5日にPCSX2 v2.8.2で行われたRetroAchievements関連の修正についても紹介していますが、こちらはFullscreen UIでRetroAchievementsを有効化した場合に発生するデッドロックへの対策です。今回のPPSSPPにおけるHardcore Modeとセーブステートの問題とは別件です。
修正はv1.21 milestone入り。正式版公開ではないので注意
今回のPull Request #22236はすでにmasterへマージされ、PPSSPPの「v1.21」milestoneにも登録されています。ただし、現時点で「PPSSPP v1.21が正式リリースされた」という意味ではない点には注意が必要です。
いち早く開発中の変更を試したい場合は、PPSSPP公式サイトでDevelopment Buildsが公開されています。ただし、公式でも開発版は不安定になる可能性があるとしており、使用する場合はゲームのセーブデータをあらかじめバックアップしておくことが推奨されています。
今回の問題は、Hardcore Modeを回避する機能が意図的に用意されていたという話ではありません。ゲーム起動直後の非同期処理とセーブステートのキュー処理によって生じていたものです。実績へHardcore Modeで挑戦しているユーザーにとって、そのルールを確実に適用するための重要な修正といえそうです。















ダンジョンズ&ドラゴンズ ビジュアル大全 半世紀を超えるその歴史とアート









ゲームコンソール2.0