なかなか機能が揃ってきました。
そろそろ「プレイ開始から1ステージのクリアまで」は作れそうな気がしてきましたね。
SRPGも制圧戦や撤退戦などさまざまな局面がありますが、基本的には敵を倒すゲームです。次の仕組みさえそろえば、もっともシンプルな戦闘は表現できるようになってくるでしょう。
- 「攻撃」でHPが減るようにする(戦闘演出抜き)
- HPがゼロになったユニットはロストする
- 勝利条件「任意の軍の全滅」と「任意の軍のリーダー撃破」を作る
やってみましょう。
「攻撃」でHPが減るようにする(戦闘演出抜き)
CDBの操作
戦闘の演出や実際の計算(力と防御力を比較して云々)、はたまた反撃の有無などは後回しに、攻撃によってHPが減少する仕組みをごく単純に搭載しましょう。
- 攻撃された側がHP減少
- 攻撃した側もHPやや減少(「反撃を受ける」という体裁)
こんな感じに仮置き。
このときの、101から201へ攻撃した結果の理想図がこちら。
これまでに攻撃は「ユニット操作(プレイヤー操作の攻撃)」と「AIの指示リスト実行(COMからの攻撃)」の2カ所に作っていましたので、その2カ所から次のようなコモンを呼び出すようにしましょう。
上の画像で使っている「CDB書込」コモンは過去に代入だけのものをさっと作っていましたが、バージョンアップしています。
こんな感じ。
便利なので「代入か加算か」を入力値でモード切替できるようにして、返り値で書き換えた後のCDBの値もわかるようにしています。
入力値が増えるようなコモン改変を行った場合は、検索で他にもこのコモンを使っている場所がないか探して修正を忘れずに。
HPバーの同期
戦闘演出抜きといっても、さすがにHPバーぐらいはリアルタイムで変動してくれないとなにが起こっているかわかりませんね。
HPバーの表示コモンに「変動」モードを追加してみましょう。
これを、先ほどの仮攻撃コモンのHPのCDB操作の直後に呼び出します。
HPバーの減り具合がわかりやすくなるよう、HP減少値も大きめに修正しています。
「残HP%取得」コモンなども、結果がマイナス値にならないようにしておくと安全ですね(ウディタでマイナス拡大率を指定すると、画像が反転します)。
逐一X,Yを指定するのが面倒なら、バー表示コモンのなかで「x=-1なら、このコモンのなかで再取得」といった分岐をかけるのもよいでしょう。
だいたい終わりましたが、仮攻撃コモンはもう少し手を加えることになります。
HPがゼロになったユニットのロスト
攻撃された側のロスト
前回の説得(寝返り)記事で、CDBからのユニットデータの消去コモンを作りました。
それを使えばよさそうなものですが、SRPGのユニットの戦闘不能(HP0)時にはさまざまな処理が絡んできます。それをフラグにシナリオ(会話イベント)が進んだり、その場に宝箱などが発生したり(TOライク)……そういう場面では、まだまだ戦闘不能者のデータを読み込む機会もあるでしょう。
どうやら「攻撃」処理のなかで、ユニットデータの全消去をかけるのはちょっと早計のようです。
「これだけ無くなっていれば以降のプレイには支障がない」という範囲の消去に留めましょう。マップ上のユニット画像類と、マス記憶CDBの情報です。
攻撃した側のロスト
上にあげた処理では攻撃された側の「最低限の情報の消去」も、攻撃した側では行っていませんでした。
なぜかと言いますと、「攻撃した側」はまだプレイヤー/AIからのユニット操作が完了しきっていないからです。ちょっとでもデータをいじると盛大にバグってきそうですね。
処理のフローが見づらくはなってきますが、行動(攻撃)直後や操作処理の末尾での改めて「今行動したユニットは生存しているか?」といった判定をおいて、そちらでデータの消去を実行するのが無難です。
プレイヤー側「┣■ユニット操作」コモン
AI側「┗指示リストの実行」コモン
双方のコモンにある「勝敗チェック」コモンは、下で説明していきます。
勝利条件を作る
UDBを使ってステージごとの勝利条件を設定する
いまは「勝利条件」だけを扱いますが、敗北条件にも対応できるような組み方をするので「勝敗条件」という言い方をしています。
さて、そのUDBを作るならこんな感じですね。
「軍」はよいとして、「個別」の勝敗条件の方は指定された番号のユニットがロストしたら勝利or敗北……というイメージです。
また、FEライクならば、特に指定が無くても101自軍リーダーのロストでも即ゲームオーバーですね。
CDBの方が随時の書き換えに対応できるため、UDBとおなじ項目をCDBにも用意して、UDBからCDBへコピーし、実際に参照するのはCDB……という流れもアリですね。
ユニットの行動終了時に勝敗判定コモンを挟む
今回は勝利条件のみを扱っていますが、敗北条件が必要な場合はおなじ理屈で分岐を増やしてください。
そして、勝利フラグが立ったら勝利演出のあとコモンをず~っとさかのぼって「★操作受付」コモンの停止まで辿っていきます。
ややこしいので<CDBか通常変数で「勝利フラグ」が立っていたらこの処理は即中断>という分岐を、関係しそうなコモンにとりあえず挟んでおくとよいでしょう(後述)。
他の勝利条件にも対応させる
「制圧」は実行した瞬間に勝利ですね。
「脱出」の場合は何通りかありえますが、リーダーひとりが脱出できれば良いなら「誰か一人でもそのコマンドを実行したら勝利確定」という意味で、「制圧」とほぼ同じ流れです。
要するに「勝敗判定」コモンに今行動したユニットがした行動も送っておけば、「制圧」や「脱出」があれば即勝利と分岐していけるでしょう。
行動のコマンドにどうやって「制圧」を出せばいいのか……などは別の機会で。
ゲームの流れ(フロー)の整備
下準備
まずは話を簡単にするため、「★勝敗チェック」の敗北部分は「画面を真っ暗にしてタイトル画面へ戻す」としておきます。
つまりゲームオーバーになったらタイトルに戻るので、フローがどうこう考えずに済みます。
また、ステージ設定から操作受付へと流れるマップの自動イベントをこんな感じにしていきましょう。
勝利が確定したらフラグを立てて間のさまざまなコモンを終了させることで、このマップイベントに戻って<<クリア>>と表示されるわけですね。
各種処理を中断して操作受付コモンまで遡っていく
さきほど書いたコレをやっていきます。
勝利フラグが立ったら勝利演出のあとコモンをず~っとさかのぼって「★操作受付」コモンの停止まで辿っていきます。
今回はCDBに「多目的メモ」というものを立てていましたので、そこに勝敗フラグを足しています。
というわけで、コモンイベントとしては「プレイヤー/AIのユニット操作」、「┃┣AIターン」、「┣■メニューコマンド:ターン終了」、「★操作受付」あたりに、以下の分岐をかけておけばよいでしょう。
|■条件分岐(変数): 【1】 可変DB(5,0,5)[ユニット操作 勝敗フラグ ] が 0 以外
|-◇分岐: 【1】 [ 可変DB(5,0,5)[ユニット操作 勝敗フラグ ] が 0 以外 ]の場合↓
| |■イベント処理中断
| |■
|◇分岐終了◇
動作確認
経過がわかりやすいよう、敵AIはすべて「ID0:なにもしない」タイプにしたり、「ステージ設定」コモンなどでも仮のテキスト表示などを足したら完成です。