【ウディタ講座】クリア時の変数リセット&フラグ持ち越し

ウディタで周回プレイ用の変数リセットをするために

ゲーム作者にはさまざまな夢があります。

自作のフリゲを遊んでほしい。せっかく遊んでもらったなら、クリアしてエンディグまでたどりついてほしい。クリアしたなら、二週目に入ってほしい……!

そこで必要なのが、クリアしたデータで、またゲームの最初へ戻るつまり「リセット」です。

そのためにはすべての変数をリセットする必要がありますが、ちょっとばかり、コレが骨です(もちろんレベルとかアイテムとか、引き継ぐ情報は手を付けません)

キャラクターのステータスなどは可変データベースの情報ですから、「初期化」にチェックを入れたら一発です。

■可変DB書込:[タイプ 主人公ステータス(0) を初期化]

 

コモンイベントでいろいろやっている場合は、コモンイベントそのものもリセットした方がいいかもしれません。

「自分以外のすべてのコモンの変数をリセットするコモン」が欲しいですね。

■変数操作+: CSelf12[自分のID] = このコモンイベントID(コモンでなければ-1)
■変数操作: CSelf10[操作中コモンNo] = 0 + 0
■回数付きループ [ 500 ]回
|■条件分岐(変数): 【1】 CSelf10[操作中コモンNo] が CSelf12[自分のID] と同じ
|-◇分岐: 【1】 [ CSelf10[操作中コモンNo] が CSelf12[自分のID] と同じ ]の場合↓
| |■変数操作: CSelf10[操作中コモンNo] += 1 + 0
| |■
|◇分岐終了◇
|■変数操作: CSelf11[操作中コモンセルフNo] = CSelf10[操作中コモンNo] * 100
|■変数操作: CSelf11[操作中コモンセルフNo] += 15000000 + 0
|■回数付きループ [ 5 ]回
| |■変数操作: V[CSelf11[操作中コモンセルフNo]] = 0 + 0
| |■変数操作: CSelf11[操作中コモンセルフNo] += 1 + 0
| |■
|◇ループここまで◇◇
|■回数付きループ [ 5 ]回
| |■文字列操作:V[CSelf11[操作中コモンセルフNo]] = “”
| |■変数操作: CSelf11[操作中コモンセルフNo] += 1 + 0
| |■
|◇ループここまで◇◇
|■回数付きループ [ 90 ]回
| |■変数操作: V[CSelf11[操作中コモンセルフNo]] = 0 + 0
| |■変数操作: CSelf11[操作中コモンセルフNo] += 1 + 0
| |■
|◇ループここまで◇◇
|■変数操作: CSelf10[操作中コモンNo] += 1 + 0
|■
◇ループここまで◇◇

変数呼び出し値を使い倒しています。

ちなみに回数ループの500回は仮の値です。

存在するコモンの個数に合わせてください。ウディタの基本システムだと200ちょっとですね。

マップイベントの初期化がしたい

道をふさぐボスや宝箱などは、たいていマップイベントごとのセルフ変数を使っているはず。

マップイベントのセルフ変数は、コモンイベントからでは操作できないので「イベントコマンドを5行ぐらい書いてリセット」とは行かない雰囲気です。

すべてのマップになにかしらの処理を置くにしても、大きめのRPGならマップ数は50や100を超えるかもしれませんし、手作業ではとてもやっていられません。

ラクにどうにかできないか考えてみました。

■DB読込(システム): CSelf10[登録Map数] = システムDB[タイプマップ設定(0)のデータ数] ■変数操作: CSelf11[移動先MapID] = -1 + 0
■回数付きループ [ CSelf10[登録Map数] ]回
|▼ 登録分の全マップへ順繰り移動
|■変数操作: CSelf11[移動先MapID] += 1 + 0
|■場所移動:主人公 ▲マップIDXX<CSelf11[移動先MapID]> X:0 Y:0 [トランジションなし] |▼ 現在マップのMapEv99までのself変数0-9を0に
|■変数操作: CSelf12[処理EvNo] = 0 + 0
|■回数付きループ [ 100 ]回
| |■動作指定:キャラ[CSelf12[処理EvNo]] / 変数設定このEvのセルフ変数0=0 / 変数設定このEvのセルフ変数1=0 / (中略。1~9に0を代入) / 変数設定このEvのセルフ変数9=0
| |■変数操作: CSelf12[処理EvNo] += 1 + 0
| |■
|◇ループここまで◇◇
|■
◇ループここまで◇◇

作ったマップはシステムデータベースに登録されますから、あるだけ順番に移動していきます。移動したマップで、変数を使った「キャラの動作指定」を行い、セルフ変数0~9に0を代入。これを回数ループで100回繰り返します。

100で無くても構いません。

1マップに置くイベント数以上の数ならば、いいのです。1マップにあるイベント数は絶対に20以下なら、このループの回数も20でOK。

こうして全マップを渡り歩く前に、通常変数で「リセット中」のフラグを立てると、より安全。

マップによって自動イベントや並列イベントがあるはずなので、そうした処理がこの「リセット中フラグ」がON(1)の時は動かないしてください。

1つのマップには10秒も居ないはずなので、高速でギュンギュンとマップが切り替わる点もご注意。事前に画面は真っ暗にしておきましょう。

クリアするとタイトル画面が変化するようにしたい

逆にクリアすることで新たにフラグが立つ仕掛けが、たとえば二週目からタイトル画面が変わる演出です。
最近の商業ゲームだと『NieR:Automata(ニーア オートマタ)』なんかで印象的に使われていますね。うまく使うと、クリア後にこそ語りまくりたくなる余韻を残すスゴ技に。

でもタイトル画面は「まだセーブデータをなにも読み込んでいない状態」なので、簡単そうに見えてウディタではひと手間必要です。

手っ取り早い方法だと、クリア証明の専用セーブデータを作ることで実現できます。

 

ウディタのデフォルト機能では、セーブすると「saveフォルダ」の中にSaveData01.savなんて名前でデータが保存されます。

セーブ/ロード機能のアレンジはちょっと難易度が高いのですが、特殊な名前のセーブデータを作るだけなら難しいことはありません。

■文字列操作:CSelf5 = “Save/clear”
■データのセーブ: CSelf5

こうするとclear.savというデータが作られます(好きな名前でOKです)。

 

ここからさらに、タイトル画面のイベントに、少し処理を付け足しましょう(赤字部分)。

■ウェイト:1 フレーム
▼ タイトル画像の表示 【ここで呼び出す画像がタイトル画像になります】
▼ デフォルトでは「SystemGraphic」フォルダの「TitleGraphic.png」がタイトル画面
■ピクチャ表示:1 [左上]ファイル「SystemFile/TitleGraphic.png」 X:0 Y:0 / 0(0)フレーム / パターン 1 / 透 255 / 通常 / 角 0 / 拡 100% / カラー R[100] G[100] B[100] ■文字列操作:S0[[サンプル]一時文字列] =<→のフォルダのファイルリスト取得> “Save/”
■条件分岐(文字): 【1】 S0[[サンプル]一時文字列]が “clear” を含む
-◇分岐: 【1】 [ S0[[サンプル]一時文字列] “clear” を含む ]の場合↓
|▼ ここで「ピクチャ表示:1」で、クリア後用のタイトル画像を読み込みなおす
|■
◇分岐終了◇

これで「saveフォルダの中にあるファイルの名前のリスト」が文字列変数に入ってきます。
文字列変数の条件分岐で、名前リストの中に「clear.sav」が含まれているとき、タイトル画面の背景画像をクリア後のものに変更すれば目的達成です。

さらなるステップアップ

自分でセーブデータを作る要領で、ロードもできます。
さらに、ここを使うことで「今のセーブデータのまま、他のセーブデータの好きな変数をチェックする」ことができます。

ノベルゲームのイベント回想などはセーブデータに関係なく、一度見たシーンが記憶されますよね。
こういうのは、普段のセーブ先とは違う、特殊なセーブデータに変数が記憶されているわけです。

上記の方法で回想データ専用のセーブデータを使って随時やり取りすると良いでしょう(タイトル画面の変更も、本当はこうやって変数をチェックして行う方が正確です)。