回想の実装を考える

概要

ゲーム中のあるシーンだけをもう一度見られるようにする機能として「回想」があります。
ゲームのタイトルから見られる回想もありますが、今回取り上げるのはゲームプレイ中からの回想シーンです。
回想は現在進行中の状態から全く別のシーンを再生しないといけないのですが、回想前後で状態が変わってはいけません。
例えば、以下のような注意があります。

  1. アイテムやお金が増えたり減ったりしてはいけない
  2. スイッチや変数の状態が変わってはいけない
  3. ピクチャの状態が変わってはいけない
  4. パーティの状態(HP、メンバーなど)が変わってはいけない
  5. プラグインの設定が変わってはいけない

もちろん、回想中に変えた場合は元に戻せばいいのですが、戻し忘れがあったりして、意外とバグが起こるところです。

実装案

上記のような問題に対処するため、回想前にメモリにゲームデータをセーブする方法が考えられます。
回想後にはそのセーブデータをロードすればいいので、回想中にいくらデータをいじっても一発で元に戻せます。

また、回想をいつでもユーザの操作によって終了させることができます。
ユーザ側は途中で回想を終わらせたいときに、会話スキップで最後まで見る必要なく、いつでも終わらせられるので便利です。

この方式は実装実績もあるのですが、問題なく動作しています。
ただ、仮でセーブしたものをロードするので、いろいろ考慮しないといけないところはあります。

唯一問題があったのは、プラグインによってはグローバルな領域に設定値を持つものがあり、回想中でそれを変更するとセーブ・ロードで復元できないものがあったことでした。
(SomeGlobalObject.flag = false みたいな設定値でセーブデータに含まれない特殊なもの)