【ウディタ】自作の戦闘システムを作る

Twitterのほうで進捗報告をしている通り、11月に入ってから自作のRPGシステムを作り始めました。自作システムというとやることが山ほどあるのですが、まず手始めに一番重要かつ大変な戦闘システムを作ることにしました。今回はその自作戦闘システムの主な仕様と大まかな処理の流れを紹介します。

自作戦闘システムの仕様

はじめに、今回制作した戦闘システムの仕様は次の通りです。

  • ターン制のサイドビュー戦闘
  • プレイヤーは(手動の場合)スキルかアイテムを使うことができる
  • キャラクターは速度値の大きい順に行動する
  • 隊列の概念があり、前列のキャラほどスキルの対象になりやすい。前列の敵が戦闘不能になると後列のキャラが前列に移動する
  • 敵AIはユーティリティベースAI
  • 味方は手動入力かAIかを選択できる。味方AIはシーケンス制御

今回はまだ2回目の自作戦闘制作ということで、完全に手探り状態になるのは難しいと判断し「隊列」と「敵AI」以外は基本システムを参考にした仕様にしました(※ただし作ってみたら構造は全く違うものになりました)。結果として何となく基本システムに似た雰囲気になってしまいましたが、隊列など真新しい部分もあるためきちんと差別化できていると思います。

ちなみに自分でシステムを作る場合は「どういうシステムにしたいのか?」を明確にしておくのは重要です。機能を後から追加するのもいいですが、拡張性のある作り方をしないと面倒になるばかりなので最初に固めた仕様に忠実に作るのが良いかと思います。

戦闘の処理の流れ

次にこの戦闘システムの処理の流れを書いておきます。

  1. 戦闘開始処理
    • 戦闘DB初期化
    • 各キャラのステータスを戦闘DBにコピー
    • キャラの描画座標算出・ピクチャ描画処理
  2. 1ターンの処理実行
    • ターン開始時の処理
    • 敵AI実行
      • 使用スキル決定
      • スキル対象決定
    • 味方行動選択・味方AI実行
      • 使用スキル決定
      • スキル対象決定
    • 行動順計算
    • 各キャラのスキル実行
      • スキル実行可能チェック
      • エフェクト描画
      • ダメージ・回復計算
      • 状態付与・消去
      • 勝敗判定
    • ターン終了処理
  3. 戦闘終了処理
    • 戦利品等獲得
    • ピクチャ消去

ターン制の戦闘なので大筋は基本システムと似たような処理の流れになっていることでしょう。戦闘システムのイメージがわかない方は「準備→1ターンの処理の繰り返し→片付け」という流れになっていることを理解していただければ良いかと思います。

戦闘の心臓部の設計

さて、戦闘の処理と一口にいってもかなりの数(80個くらい)のコモンからなるわけですが、そのなかでも特に重要なのが「誰がどの対象に対して、どのスキルを使うか?」と「そのスキルを使ったらどうなるのか?」ということの処理です(上の箇条書きの太字部分)。まずこれらの処理の流れを上手くつなぐために、今回は次のような設計を考えました。

  1. 何らかの方法(AI、手動選択)で可変DBの「スキル対象の一覧(=ターゲットリスト)」と「使用するスキル」に対象一覧とスキルを登録する。
  2. 登録されたターゲットに対し、1人ずつ登録されたスキルを発動する。

予めターゲットをリストアップしておけば複数の対象でも簡単にスキルを実行できるだろうという考え方ですね(おそらく基本システムでも似たようなことをやっていると思います)。そして次はこの流れに必要な個々の処理を考えていく必要があります。詳細は下記の通りです。

対象選択の処理

はじめに敵・味方のいずれもスキルの対象を選択できるようにする必要があるので、真っ先にこの処理を作ることにしました。ここで考えなければいけないことは「キャラの選択範囲」です。例えば、今回の戦闘システムなら

  • 敵グループか味方グループか?
  • グループ内の誰を選ぶか。誰でも1人(★)、前列1人(★)、前列全員、グループ全員のいずれか。

という選び方があります。ここで厄介なのが★印をつけた「1人だけを選ぶ」ときで、味方の行動を手動選択する場合に表示する選択カーソルの処理などがかなり面倒でした。また、「前列1人だけを選ぶ」ときはちゃんと前列のキャラが指定されるのかをチェックしたりする必要もあります。とにかく選択処理では意図していたのと違うキャラが選択されてしまっては困るので、その辺のチェック機能作りが大変だと思います。

敵AI

次は敵AIの処理についてです。前述の通り敵AIは「ユーティリティベースAI」という方式を採用し、状況に応じて最適と思われるスキルを選択するようにしました。このAIの処理の流れは大まかにいうと

  1. スキルの評価値を算出
  2. 対象の評価値を算出
  3. 最も評価値の高いスキルと対象を選択

となっています。評価値というのは一定のルールによってつけた点数のことです。例えば「普通の攻撃スキルA」と「不利な状態αを付与する攻撃スキルB」があるとき、

  • 両者の評価値の初期値は100
  • 相手に状態αがなければスキルBの評価値+100
  • 相手に状態αがあればスキルBの評価値-100

というようなルールを設定しておいてこれに基づいた採点を行うというわけです。基本システムでは1つ1つの敵に対して「条件」「対象」「スキル」を設定しなければならなかったのですが、こうしてユーティリティベースAIを導入することで敵に必要なスキルを設定するだけであとはシステムが自動で判断してくれるようになります。比較的簡単に作れるAIですが、その割に強力なので非常におすすめです。

味方AI

今回味方AIでは基本システムと同じような「シーケンス制御」を採用しました。ここで方式をあえて基本システムと同じにしたのは、プレイヤーが自分でAIを考えるときに楽しめるようにするためです(敵AIは自動化のためにより高度になっている)。ただしメタルメサイアのときと同じではつまらないので、使えるコマンドを改良してAIを組みやすくしました。

味方の行動選択の処理

味方の行動選択の処理では、そのキャラが自動行動するなら味方AIを実行し、そうでないなら手動でのスキル・対象選択を行います。そしてこの「手動の場合」というのがなかなか厄介で、キャンセルしたときは選択を巻き戻さないといけないのでその辺の処理をしっかり考える必要があります。また、AIで行動するキャラや行動不能なキャラの場合はそのキャラをスキップする必要があるなど色々面倒です。ここの処理は「ちゃんと動いて当たり前」のような感じですが作るとなると地味に大変なので、根気よく作る必要があるかと思います。

スキル実行

さて、最後はスキル実行処理です。ここであるキャラがスキルを実行する前にスキル対象だったキャラが戦闘不能になる場合があるため、必要なら最初にAIを再実行するか、手動で対象を選んだ場合はどの対象に変更するかを自動的に決める処理を行います。そしてスキルを発動できるかをチェックして、発動できるならスキル対象に対してエフェクトを表示してダメージ計算を行います。ここまでできればほとんど完成と言っても良いくらいでしょう。

…というわけで、以上が私が今回チャレンジした戦闘システムの仕様とプログラムの流れです。残念ながら具体的な作り方を説明するとなるとめちゃくちゃ長くなってしまうのと、画像や文章では説明が難しいということもあるので割愛しますが、大まかな流れはお分かりいただけたのではないでしょうか?戦闘システムを自作するのは非常に勉強になるので、脱初心者を目指す方はチャレンジしてみると良いかと思います。