2021年12月29日水曜日

【ウディタ】イルシェラート(仮称)の制作記録(3)戦闘・移動AIの詳細

 以前、「詳細は省く」なんて言ってましたが、制作が長期化しそう(たぶん来年公開も無理だろう)と思うので、自分が忘れないよう記録を残しておこうと思います。
今もだいぶ忘れているけど……。
アクションRPGをシステム自作でやろうという人の参考にもなれば。

ざっくりですが、概要は以下の記事を参照。話の流れでこの記事と一部内容重複はします。

戦闘・移動AIは、以下の流れで処理されます。
1.『特殊行動』判定
2.『技能使用/予約技能使用』判定
3.『移動』判定

『特殊行動』判定

これは、以下6項目10条件のうち1条件を指定して設定できる、いわゆる『固定行動』を実行するか判定する処理です。
①自身の残りHPが一定%以下/以上
②自身の残りSPが一定%以下/以上
③行動回数がn回目
④敵との間合いが一定以下/以上
⑤味方との間合いが一定以下/以上
⑥特定の状態が付与された
この特殊行動は、1つのAIに4つまで設定可能で、以下4つのどれかを実行します。
①AIを切り替える
 1つのキャラに1つのAIではなく、複数のキャラが1つのAIを使用できるようにしたことで実装できた機能です。いわゆる『HP減ったから本気出す』やつを実装するための機能。
 道中の雑魚敵は近距離型、遠距離型といったふうにざっくり作っておき、細かい部分の差別化はスキルやステータス等で調整するというふうに設定していますし、逆にボスは1体で4つ以上使う場合もあります。
②指定技能発動
 特定のタイミングだけ撃つ強力な技の設定用です。
③技能セット切替
 NPCに4スキル/1セットを5セット設定可能で、そのスキルセットを任意のものに変更する機能です。
 『ケルリート』までは、使用技能を1つずつ任意のものに変更するしかなかったですが、設定がめんどうくさかったので、実装しました。
④マップEv起動
 疑似マップイベントIDを指定し、そのイベントを実行する機能。増援はこの機能を使用して実行します。

これら特殊行動は、1度使用すると使用できなくなりますが、仕様上AI切替え後は使用可能になります。
AI切替えを含むAIの設定方針は、あえて名前をつけるなら「一方通行」「循環」の2パターンあります。
「一方通行」は、AI①からAI②に切り替え後、AI②からAI①には戻りません。一般的なコマンドタイプのRPGでも同じだと思います。
「循環」は、AI①からAI②に切り替え後、AI②からAI①に戻ることができます。例えば、HP50%以下の条件を満たしAI②に移行し、その後自然回復等によりAI①へ戻る条件(たとえばHP55%以上)を満たしたらAI①へ移行する……といったふるまいをします。『ケルリート』でいえば、エハルト地下墓地の魔物のすみかボスがこのタイプのAIで動いています。

『技能使用/予約技能使用』判定

読んで字のごとくですね。『レイユウサイ』『ケルリート』と同じ確率ベースですが、状況に応じて確率を可変させられるようにしました。
①~⑤の順番で判定処理をします。

①【確率】技能使用キャンセル判定
 端的に言えば手加減させる処理です。
②技能使用間合い内の敵味方が存在するか確認
 範囲内にいない場合は空振りになるので使わないようにしています。
 (空振り分の負荷を低減させたい目的もある)
③【確率】回復技使用判定
④【確率】補助技使用判定
⑤攻撃技使用判定

③、④について、新規に導入した概念は「重視度」。回復技使用率は自身の残HP%で使用率に上昇補正をかけることができます(低ければ低いほど補正量も増える)し、補助技(強化)使用率は補助技で付与できる状態が自身にかかっていない場合に使用率上昇補正がかかるようになっています。
また、ある特定の種類(攻撃、補助、回復)の技が複数、同一スキルセットに登録されていた場合は、間合い、かかっている状態等を考慮して使い分けるようになっています。例えば、近接攻撃技と遠距離攻撃技の2つを同一スキルセットに登録していた場合、敵が近接攻撃技の当たる範囲内にいれば近接攻撃技を選択しますし、そうでないなら遠距離攻撃技を選択します。

『予約技能使用』は、スキル発動前にジャンプといったアクションを挟む等、すぐにスキルを発動しないとき、時間がきたら後回しにされたスキルを100%の確率で発動するだけの処理です。

『移動』判定

名前の通りの処理です。
半マス単位からドット単位(処理の関係で2ピクセル単位ですが)移動に移行した関係で、戦闘システムは大きくは変わらないのに処理方法から検討し直し、コモンは書き直しとなった処理です。結局条件分岐のゴリ押しがベースになってしまいましたが……。

①【確率】移動キャンセル判定
 技能使用判定同様、手加減用の処理です。
②ターゲット確認
 移動先を決めるための基準となる相手をDBから取得してくる処理です。
 ターゲット選定条件は、任意の範囲内に行動キャラの敵属性がいる場合は敵を参照、いない場合は味方を参照します。そのうち任意の残HP%以下のキャラを参照する設定をしていれば判定し、任意の残HP%以下のキャラがいればそのキャラを、いなければ最寄りのキャラをターゲットとします。
③(回避フラグONなら)障害物回避
 障害物回避先の座標が登録されていれば、そこへの移動を実行します。
 ハマり防止のために、移動が完了していない場合でも、一定時間経過したら指定座標をリセットします。
④移動タイプ判定
 ターゲットに対しての間合いに応じて、接近/直角移動/離れるのいずれかを実行します。
⑤通行可不可判定
 ④実行時、移動方向に地形障害物またはキャラクターがいるか判定します。
 いなければ、そのまま④を実行します。
 いるならば、障害物回避先座標を設定し、次回以降で移動を実行します。