回想の実装を考える
概要
ゲーム中のあるシーンだけをもう一度見られるようにする機能として「回想」があります。
ゲームのタイトルから見られる回想もありますが、今回取り上げるのはゲームプレイ中からの回想シーンです。
回想は現在進行中の状態から全く別のシーンを再生しないといけないのですが、回想前後で状態が変わってはいけません。
例えば、以下のような注意があります。
- アイテムやお金が増えたり減ったりしてはいけない
- スイッチや変数の状態が変わってはいけない
- ピクチャの状態が変わってはいけない
- パーティの状態(HP、メンバーなど)が変わってはいけない
- プラグインの設定が変わってはいけない
もちろん、回想中に変えた場合は元に戻せばいいのですが、戻し忘れがあったりして、意外とバグが起こるところです。
実装案
上記のような問題に対処するため、回想前にメモリにゲームデータをセーブする方法が考えられます。
回想後にはそのセーブデータをロードすればいいので、回想中にいくらデータをいじっても一発で元に戻せます。
また、回想をいつでもユーザの操作によって終了させることができます。
ユーザ側は途中で回想を終わらせたいときに、会話スキップで最後まで見る必要なく、いつでも終わらせられるので便利です。
この方式は実装実績もあるのですが、問題なく動作しています。
ただ、仮でセーブしたものをロードするので、いろいろ考慮しないといけないところはあります。
唯一問題があったのは、プラグインによってはグローバルな領域に設定値を持つものがあり、回想中でそれを変更するとセーブ・ロードで復元できないものがあったことでした。
(SomeGlobalObject.flag = false みたいな設定値でセーブデータに含まれない特殊なもの)