回想の実装を考える

概要

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

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

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

実装案

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

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

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

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

RPGツクールMVカテゴリの記事
リリース時のチェック項目
環境依存系のエラー調査など
アイコンセットの画像が大きすぎると黒い四角が表示される
ゲームループの話
マップのリフレッシュの話
最近制作した細かいプラグイン
ツクールのピクチャ番号の扱いについて
容量の大きい音声ファイルをロードするとクラッシュする
テストのレポートを作るプラグイン
フィルタをかけると画面全体が拡大されてしまう
並列実行中のコモンを最初から実行するプラグイン
メニューとマップのスクリーンショットについて
イベントのテストでエラーになるプラグインのケース
ロードした結果が異なる場合がある
プラグインの使用状況を出すプラグイン
装備を記憶、ロードするプラグイン
ピクチャの色あいを変えるプラグイン
ピクチャの色相を変えるプラグイン
デバッグ画面にショートカットキーを追加するプラグイン
BGSを保存・再開するプラグイン
敵キャラにデフォルトのステートを付与するプラグイン
ゲーム画面外演出を考える
ニコニコっぽいテキストを表示するプラグイン
一括入力がしやすいテキストエディタプラグインの紹介
ウィンドウをたくさん出すプラグイン
マスクを使ってゲージを作る
複雑な計算式はプラグインで記述する
シーンからマップに場所移動
シーンに引数を渡す
ウィンドウに画像を表示する
スプレッドシートからjsonにしてツクールに取り込む
ランダムにアイテムを取得するプラグイン(MV版)
全てのアイテムを取得するプラグイン
TweenプラグインのTorigoya_Tween.jsが便利
独自のデータをセーブする
loadBitmapを使うときはsmoothに注意する