昨年12/27に、私のRPGツクールMV製ゲーム「催眠勇者~転生したボクと甘夢の振り子~」をDLsiteにてリリースさせていただきました。
「催眠勇者~転生したボクと甘夢の振り子~」DLリンク
需要はないでしょうが、備忘録的な意味を込めて、修正内容について詳細を書き殴りたいと思います。無駄に長いので、「どうやって直したんだろう」に本当に興味がある人以外はとてもつまらない内容かと思います。また、ネタバレにはならないように書いていますが、内情を知るとなんとなく萎えちゃうタイプの方は気をつけてお読みください。
≪Ver.1.0.1≫
・回想モードにてシーンが正常に解放されない不具合を修正
読んで字の通りです。原因はHシーン用のコモンイベント内でスイッチをオンにし忘れていたことです。初歩的ですね。
言い訳をすると、今回回想モードには RecollectionMode.js(長くなるので作者名略)を使用しているのですが、このプラグインにはシーンやCGの解放フラグとしてプラグイン内で指定したスイッチを、あるセーブデータでオンになった(その後セーブした)タイミングでセーブデータをまたいでオンにする機能が備わっているのですが、このおかげでゲーム開発初期にテスト的にオンにしたこのスイッチ群のオン状態がリリース直前まで生きてしまっており、リリース前のテストプレイ時に「スイッチをオンにする処理が入っていない」ことに気づけなかったのですね。判明したときは本当に、冷や汗が出ました。
≪Ver.1.0.2≫
・ある条件を満たすと開放される「ニューゲーム+」機能を実装
数人から希望があったのことと、簡単そうなこと、ゲームの難易度緩和に役立ちそうなこと、あとは後学のためにやってみたかったので付けてみました。結果として、思ったより簡単じゃない(というか、最初からそのつもりで初期化やED処理を組んでないと後からつけるのは少し骨が折れる)ということがわかりました。
これはいわゆる「強くてニューゲーム」で、簡単に言うと任意のクリア後のデータなどを参照して、そこから一部を除くスイッチ・セルフスイッチ・変数などをすべてリセットして、キャラのレベルや所持品などはそのままで2周目をプレイできる機能です。
まず、ニューゲーム+実装に当たってメインで使用したプラグインが AnotherNewGame.js です。が、これ自体は「ニューゲーム」の隣に「アナザーニューゲーム」(名前は任意)項目を追加して、これを選んだ際にニューゲームとはまた別のマップ・座標からゲームを開始させ、また任意のスイッチを1つオンにさせるというだけのものでしたので、具体的な処理は自分で組む必要があります。
実装に当たっての課題はいくつかあって、まずは【モード解放のタイミング】です。これは2つ考えられて、一つは①「ED後」、もう一つは②「起動時(タイトル表示前)」でした。①にしようかと最初考えたのですが、難易度緩和の意味を持たせるのであればEDを待たずに開放させたいなと思い、②にしました。スマブラの「起動回数○○回達成!」と同じようなタイミングですね。なおタイトル画面の前なので、結局はED後にもこの開放処理が挟まることになります。
このため、まずは「タイトル画面表示前に処理を挟む」必要があったので、BootOpeningDemo.js を導入してタイトル画面の前に「解放条件がそろっていたらモードを開放する」という処理を挟みました。
そこで2つ目の課題は、【タイトル画面前の時点でスイッチの状態を取得する】になりました。通常、スイッチの情報がセーブデータから取得されるのは当然タイトル画面の後なので、なんとかする必要があります。そこで UTA_CommonSave.js を導入し、解放条件として利用したいスイッチを「セーブデータによらない共有スイッチ」としました。そしてこのプラグインではプラグインコマンド CommonSave load でゲームのどのタイミングでも共有スイッチの情報を取得することができましたので、このコマンドでタイトル画面前に解放条件を達成しているかどうかの判定を行っています。
3つ目の課題は【EDを迎えた際のプレイ情報をどう記録するか】でした。今回のゲームではED後はセーブを挟まずそのままタイトル画面へ戻す仕様になっていたため、例えばEDまで1時間ぐらいセーブなしでプレイされた場合、その1時間内でオンになったスイッチはタイトルに戻った時点で無に帰すことになります。その1時間の間にもし解放条件を達成されていた場合、条件を満たしていたのにモードが解放されないことになりますし、プレイヤーにも「解放されないということはもっと何かをしないとだめなのだろう」という誤った認識を持たれることにつながるのでこれは避けねばなりませんでした。そこで使用したのが RecollectionMode_save_switch_patch.js でした。このプラグインは RecollectionMode.js と同じ作者によるもので、いわゆる「ゲームオーバーになることで解放されるHシーンを実現したい」という需要に対する追加パッチ的なものです(通常、ゲームオーバーになればスイッチの状態はセーブデータまで巻き戻ってしまうため)。このプラグインは、プラグインコマンド RecoModeExt save を実行することで、現在のスイッチ情報だけを最後にセーブ(ロード)したセーブデータに上書きできるというものです。私はこの機能で、ED後のスイッチ状態を最後のデータにセーブさせてからタイトルに戻すことが可能になりました。
そして最後の課題が【どうやってプレイ時間、セーブ回数、歩数などの内部カウントデータをリセットするか】でした。これらは通常のコマンドやスクリプトではリセットが利かないデータなのですが、プレイ時間やセーブ回数はセーブ画面に出てしまうのでこれもリセットしておきたい項目でした。これには IRPP_MV_InitGameSystem.js を利用しました。このプラグインを導入し、プラグインコマンド IRPP_InitGameSystem を実行することで、「時間、歩数、セーブ回数、戦闘回数、勝利回数、逃走回数」をリセット可能です。なお余談ですが、スイッチや変数はツクールのイベントコマンドで普通にリセットが可能ですが、セルフスイッチのリセットにはスクリプトから「$gameSelfSwitches.clear();」を実行する必要があります。
これらのリセット処理を AnotherNewGame.js の機能で飛んだ先に自動実行のイベントでも用意して仕込んでおけば、基本的には実装完了です。
なお、条件については秘密です(そんなに達成しづらいものではないですし、知っていればEDを迎えなくても開放可能です)。
・仲間をパーティから外せる「追放」機能を実装(「ニューゲーム+」モード時)
これはニューゲーム+を実装したときに、「このゲームを何周もしたい人なら、好きなキャラとの二人旅とかもしたいんじゃないだろうか」と思って付けた機能です。何故そう思ったかと言えば、私が幼少のころDQ3でやっていたからです。
「追放」は通常のゲーム内メニューに追加しました。この辺りは YEP_MainMenuManager.js で簡単に追加できますし、「追放」を使用可能にする条件も設定できるので、先述の AnotherNewGame.js がオンにした「ニューゲーム+で開始したよ」スイッチを条件に設定しました。なお、「追放」機能では「誰を追放しますか?」の選択肢として現在のパーティメンバーを列挙して選ばせる形式をとっていますが、こういう選択肢を作る場合 ChoiceActors.js が便利です。
・回想モードにEDシーン、キャラクター立ち絵を追加しました。
まあ、読んで字のごとくです。キャラクターの立ち絵を見返したいなーって方は、EDまで頑張ってみてください。
・ゲームクリア時にHシーン開放状況の情報を自動的にセーブするよう修正しました。
これもそのままです。前述の RecollectionMode_save_switch_patch.js を導入した際に、ついでに実装しました。
・「並び替え」を「隊列」に、「オプション」を「設定」に用語変更しました。
これにはこれという意味はありません。単に文字数が多いとメニュー画面上で見栄えが悪い気がしたのと、「隊列」の方が「敵からの狙われ率に影響するんだぞ」、ということが伝わりやすいかと思い、変えました。
・ステータス画面に隠しステータスを可視化するゲージを追加しました。
これも要望があったので付けた機能です。どんな隠しステータスなのかは伏せますが、表示がされるようになりました。私の知る限り他のゲームのこの手の数値はプレイヤーには隠されていた記憶があったので隠しましたが、確かにちゃっちゃと進めたい同人ゲームなんかには不向きだったかもしれませんね。何のゲージなのかを伏せたのは、私のわがままです。
・いくつかのバグを修正しました。
戦闘用スキル、戦闘用アイテムが移動中に使用できてしまったり、あとはもっと細かいバグがいくつか見つかっていたのでこっそり直しました。
Ver.1.0.2現在では以上になります。
なお、私のゲームについて「この機能どうやって実装したんですか?」みたいな質問がもしあればコメントいただければできる限り回答したいと思います。ないでしょうけど。
それでは。