【ウディタ講座】SRPGをつくろう! ターン制を実装する

CDBでユニットのデータ管理が可能になり、その書き換えの一例として「ユニットの行動から待機まで」の操作を通しで行えるようにしました。

いちど待機したユニットは、次のターンが来るまでは動くことができません。

そろそろターンの切り替え処理が必要なようです。最難関のAIづくりをいったん後回しにすると、ターン切り替え処理ではそんなに難しいことはありません。

ユニットのカウント処理

ユニットCDBの仮セッティング

本来はステージ設定時にいっせいにマップ上にユニットをおき、ユニットCDBに各種ステータスを入れていくことになるのでしょう。

まだそこはできていないので、敵ユニットを並列処理にして初期セッティングを仮に済ませていました。ユニットCDBができたので、さらに手を加えましょう。

「出撃フラグが1なら、出撃状態」と決めています。

未行動者(待機状態でないユニット)のカウント

自軍の未出撃ユニットをカウントしないように、「出撃していて(出撃フラグon)、撃破もされていない(HP1以上)、行動フラグが待機状態になっていないユニットを数える」処理だと考えましょう。

■変数操作: CSelf4[結果] = 0 + 0
■DB読込(可変): CSelf10[回数] = 可変DB[タイプCSelf0[対象](-)のデータ数] ■変数操作: CSelf11[データのチェック位置] = -1 + 0
■回数付きループ [ CSelf10[回数] ]回
|■変数操作: CSelf11[データのチェック位置] += 1 + 0
|■DB読込(可変): CSelf12[HP] = 可変DB[ CSelf0[対象] : CSelf11[データのチェック位置] : HP ] (- : – : ? )
|■DB読込(可変): CSelf13[出撃フラグ] = 可変DB[ CSelf0[対象] : CSelf11[データのチェック位置] : 出撃フラグ ] (- : – : ? )
|■DB読込(可変): CSelf14[行動フラグ] = 可変DB[ CSelf0[対象] : CSelf11[データのチェック位置] : 行動フラグ ] (- : – : ? )
|■条件分岐(変数): 【1】 CSelf12[HP] が 1 以上
|-◇分岐: 【1】 [ CSelf12[HP] が 1 以上 ]の場合↓
| |■条件分岐(変数): 【1】 CSelf13[出撃フラグ] が 1 と同じ
| |-◇分岐: 【1】 [ CSelf13[出撃フラグ] が 1 と同じ ]の場合↓
| | |■条件分岐(変数): 【1】 CSelf14[行動フラグ] が 0 と同じ
| | |-◇分岐: 【1】 [ CSelf14[行動フラグ] が 0 と同じ ]の場合↓
| | | |■変数操作: CSelf4[結果] += 1 + 0
| | | |■
| | |◇分岐終了◇
| | |■
| |◇分岐終了◇
| |■
|◇分岐終了◇
|■
◇ループここまで◇◇

モードで指定を入れておけば、勢力別にチェックが可能です(CDBの位置に対応)。

また、「データ数or項目数の取得」を使っておくと、そのデータベースの総数が増えても対応できるので後がラク。

特定状態のユニットカウント処理の重要性

上記のカウント処理は、待機フラグの確認部分を抜けば「出撃している生存ユニットの総数カウント」にもアレンジできますね。これもよく使いそうな処理です。

待機済ユニットを数えたいなら「ユニット総数-未行動者数」なんてやり方もできるはず。

 

こういった応用していけば、下記のいかにもありそうな状況の確認で便利なコモンになるでしょう。

  • 「ターン終了」選択時、自軍に未行動者がいたら警告(未行動者がいます!)
  • 勝利条件「敵全滅」が満たされたかどうかの確認
  • 輸送隊や工作隊、市民といった特殊グループの状態チェック(特定AIのユニットをカウント)

 

「ターン終了」の実処理

SRPGにおける1ターンの流れ

詳しい語釈はわかりませんが、「プレイヤーとAI(COM)の両方が手番を終えて1ターン」というのが感覚的には自然ですね。

とすると、一方の手番をターンと呼ぶのは少々具合が悪いです。手番はターンではなく、フェイズ(フェーズ)と呼んでおく方が間違えないような気がします。

つまりこういうことですね。

「1ターン」=「自軍フェイズ(手番)」+「敵軍フェイズ(手番)」+「友軍フェイズ(手番)」

便宜上、自軍フェイズを終えることを「ターン終了」と呼び続けますが、上記のイメージははっきり持っておくと作りやすいかと思います。

 

メニューコマンドの「ターン終了」で行われること

1ターンの流れのおさらいです。

  1. 新ターン開始時に「全ユニットの待機状態を解除」して、「地形ダメージ&回復処理」
  2. 自軍フェイズ。自軍の全ユニットの行動終了か「ターン終了」まで継続
  3. 敵軍~友軍フェイズ。AIによるユニット操作(存在しない勢力のフェイズはスキップ)
  4. 「1.」へ戻る

プレイヤーが「ターン終了」を決定すると、「3.」からはじまり、「2.」に戻るわけですね。

「自軍の全ユニットの行動終了」時に自動でターン終了を実行したい場合は、コンフィグでその処理(オートターンエンド)のオンオフを設定できるようにしたうえで、「┣■ユニット操作」コモン終了時あたりに判定を足すことになりそうです。

 

では、「ターン終了」コモンのざっくりしたソースです。

ごくふつうに、上記の流れを書き起こしただけですね。「┃┣AIターン」コモンの中身はまだカラです。地形ダメージ&回復については次の記事でやりましょう。

もう少し仕様や、ビジュアル的な見せ方が決まってきたら次のような改修をするとよいかも。

  • フェイズ表示文や選択肢を自作のピクチャ演出で豪華にする
  • 待機状態の解除を全ユニットに適用する(ユニット画像の管理がマップイベント式かピクチャ式かで変わってきます)
  • メモCDBなどにターンやフェイズを記憶して、現在のターン数がわかるようにする

 

AI処理はまだですが、これで「自軍ユニットの行動~待機」から「次ターンに入っての行動権回復」までができました。

 

 

【ウディタ講座】SRPGをつくろう! まとめ

コメントはお気軽にどうぞ!