敵の行動を自在に制御する A実践編【RPGツクールMZプラグイン】

2020年09月21日

 敵の行動を自在に制御する @導入編から続きます。

 基本から上級まで、使えそうなものを全部載せてみました。
 必要なものを探してコピペなりしてください。

目次


基本編


自分の状態を参照する


対象を変更・限定する


最大・最小値を持つ対象を狙う


条件を満たした時のみ行動する


注意点

まとめ

参考リンク


基本編


スキルを使う

 まずは基本形。普通にスキルを使わせる方法から。

20200112_basic.JPG

 難しいことは何もなく、『戦闘行動の強制』で行動主体とスキルと対象を選択するだけです。
 集中攻撃などの特徴を出したい場合を除き、対象は『ランダム』で構いません。

 また、この例では行動主体を先頭の敵に固定しています。ボス戦など行動主体が確実に分かる場合はこれで十分です。

 しかしながら、いつも行動主体が固定だとは限りません。
 そこで『スキル使用者設定』のプラグインコマンドを呼び出します。
 ※パラメータは初期設定のままにしてください。

 これは『戦闘行動の強制』の行動主体を書き換えてしまう機能です。エディタ上で行動主体に誰を選ぼうが、バトルイベントを実行中のバトラーへと強制変換します。
 あらかじめこれを一行挟んでおくと、全ての行動が終了するまでその状態が保持されます。


 こんな感じになります。
 この方法だとスキル名が見えるので、多少管理が楽ですね。このプラグインコマンドは毎回固定で呼んでしまって問題ないと思います。
 設定をクリアしたい時は『スキル使用者』のパラメータを空にして呼び出せばOKです。

確率でスキルを使う

 次行きましょう。
 これも特に難しくはありません。
 普通に乱数を使って確率分岐させるだけです。

20200112_if.JPG

 この例では適当な一時変数を使って、1〜4の乱数を生成しています。
 一時変数<=2の時は攻撃、3の時はファイア、4の時はスパークって感じですね。

 凝ったスキルを作った際、その処理内で同一の変数を使わないように注意です。それをやると無茶苦茶になります。
 心配なら各分岐内に『イベント処理の中断』を入れるのもよいと思います。

ターンによってスキルを使う

 この辺まではまだデフォルトで可能な機能ですね。
 通常のターン制と当サイトにあるCTB(またはCTTB)およびタイムプログレスでは、ターンの参照方法が変わります。

ターン制の場合

$gameTroop.turnCount()

 にて、敵グループが保有する現在ターンを取得できます。
 これは敵グループのバトルイベントと同じで1ターンから始まります。
 
20200112_turnCount.JPG

 『$gameTroop.turnCount() == 1』は見たまんま1ターン目なので、説明は不要でしょう。
 少し難しいのは『$gameTroop.turnCount() % 2 == 0』という記述です。
 これは2で割った余りが0。つまり偶数ターンを意味しています。
 もちろん『$gameTroop.turnCount() % 2 == 1』は奇数ターンになります。

 ローテーション行動を取らせたい場合は、こういう余りを使った演算が有効です。
 ちなみに、3ターンローテーションを取らせたい場合……
条件分岐:スクリプト:$gameTroop.turnCount() % 3 == 1
条件分岐:スクリプト:$gameTroop.turnCount() % 3 == 2
条件分岐:スクリプト:$gameTroop.turnCount() % 3 == 0

 という順番で回ってきます。
 直感的に0,1,2とやりたくなりますが、ご注意ください。

CTB、CTTB、またはTPBの場合

 個々人がバラバラに動くCTBでは、グループのターンはほとんど意味を持ちません。
a.turnCount()

 というわけで、上記のように行動主体が保有するターンを参照します。
 $gameTroopがaに置き換わっただけですね。


 ※タイムプログレス戦闘でも同じ要領でターンを参照できますが、どうも独特のターン処理をしている模様です。行動しなくとも時間経過でターンが進んでいくようです。

複数回行動

 これはデフォルトでは難しい機能です。
 とはいっても、『戦闘行動の強制』を複数行入力するだけです。デフォルトとは違って、順番を自由に決められます。


 画像の例では、奇数ターンに1回行動の全体攻撃、偶数ターンに2回攻撃するようにしてみました。強力な攻撃をする時だけ1回攻撃にすると、バランスを取りやすくていい感じです。

 一回ずつランダムに行動を決めたい場合は、以下のように書きます。

20200112_loop_action.JPG

 攻撃とファイアのランダム2回行動です。
 ややこしく見えるかもしれませんが、単に行動した回数をカウントしながらループさせているだけです。

自分の状態を参照する


自分のHPが50%以下の時

 困ったことにバトルイベントの通常の条件分岐ではHPを参照できません。
 というわけで、スクリプトを使います。
条件分岐:スクリプト:a.hpRate() <= 0.5

 hpRate()というのが、現在HPの割合です。100%が1.0です。

自分のMPが100以下の時

条件分岐:スクリプト:a.mp <= 100

 というように、あらゆるパラメータを参照できます。
 どんなパラメータがあるかは末尾に参考リンクを置いておきますので、そちらをご確認ください。

一体になると行動が激化する

 以下を条件にして、行動を変更します。
条件分岐:スクリプト:$gameTroop.aliveMembers().length == 1


自分にステートがかかっているか

 行動主体が固定なら普通に条件分岐が使えます。
 以下はそうでない場合も判定できるスクリプトです。
条件分岐:スクリプト:a.isStateAffected(4)

 上はステートID=4(初期では毒)にかかっているかどうかを判定しています。
 例えば、治療魔法を使うかどうかの判定に使えます。
条件分岐:スクリプト:!a.isStateAffected(4)

 かかっていない時を知りたいなら、先頭に『!』をつけて条件を反転します。
 補助ステートの重複防止はこれで。

眠っている時に使用するスキル(CTB限定)

 CTB限定で毎ターン実行されるバトルイベントに書いてください。
 ※コモンイベントから呼び出す方法だと、先に行動異常の判定が行われるため呼び出せません。

 上で紹介済の方法を使用し、眠っている時を判定します。
 さらに『行動判定の無効化』のプラグインコマンドを指定することで、行動異常時も行動を実行できるようになります。パラメータは初期値のままにしてください。
 ※ターン制でも行動実行前にコモンイベントを呼び出すようなプラグインを使えば、同様の技も可能かもしれません。

対象を変更・限定する


特定のアクターを狙う

 『スキル対象設定(絞込)』のプラグインコマンドを呼び出し、以下を指定して実行します。
対象条件:b._actorId == 1 #アクターID

 上記の内容は最初から選択肢にあります。コンボボックス形式のため、選択と入力の両方が可能です。数値の部分を好きなアクターIDに変えてください。
 ※ちなみに#以降は単なる注釈です。

20200921_targetActor.jpg

 その後、戦闘行動の強制を実行すれば、指定したアクターを狙います。対象がいなかったり戦闘不能だった場合は、他の相手を狙います。

 『対象条件』のコンボボックスには、あらかじめよく使いそうな値を候補として設定しています。好きな値に変えて利用してください。

ステートにかかった相手を対象とする

 『スキル対象設定(絞込)』のプラグインコマンドを呼び出し、以下を指定して実行します。
対象条件:b.isStateAffected(10) #ステート

 ステートID=10(初期では睡眠)にかかった相手を対象にします。デフォの睡眠は回避率の減少効果があるので、命中の低い大振り攻撃で狙ってくる敵など嫌らしいかもしれません。

ステートにかかっていない相手を対象とする

対象条件:!b.isStateAffected(10) #ステート

 『!』を頭につけることで反転。眠っていない相手を対象とします。まだ眠っていない相手を一人ずつ眠らせてくる敵なども作れます。

 せっかくなので、もう一段階行きましょう。
対象条件:!b.isStateAffected(10) && !b.isStateResist(10))

 『!b.isStateResist(10)』という条件を追加しました。『&&』は『かつ』の意味です。
 『isStateResist(10)』とはステート無効化を持っているかの判定です。
 !でその反対ということは、「眠っておらず、かつ無効化を持たない相手」を対象とするという意味になります。

 賢い敵を作りたい時はどうぞ。
 ※この制御は敵行動ルーチンの改善プラグインに含まれています。今となっては不要なのですが、参考までに残しておきます。
 http://newrpg.seesaa.net/article/473218336.html


女を優先して狙う

 女ばかりを狙うむっつりモンスターを作ってみましょう。
 といっても、ツクールMZのアクターデータベースには性別欄なんてありません。そこで女性アクターのメモ欄に<lady>と記入します。
対象条件:b.actor().meta.lady

 以上で女性かどうかを判定できるようになります。
 ちなみに対象が敵の場合は『b.enemy().meta.lady』になるので注意です。

 ※別にwomanでもfemaleでも何でもいいですが、参考先のこちらに習ってます。

 ただしこの場合、既に全ての女性キャラが戦闘不能状態だと、男性キャラ(および性別不詳)も狙うようになります。

対象を限定して狙う

 では、女しか狙わない敵を作りたい場合はどうするか?
 そんな時のため『スキル対象設定(絞込)』のプラグインコマンドにはオプション機能があります。
対象条件:b.actor().meta.lady
オプション>条件外なら行動しない:ON

 これで女しか狙わなくなります。条件を満たす相手が一人もいなければ、行動自体をスキップします。

最大・最小値を持つ対象を狙う


最も弱っているアクターを狙う

 これは『スキル対象設定(絞込)』でやるのは難しいです。
 そこで『スキル対象設定(最大最小)』のプラグインコマンドを使います。
比較条件:b1.hpRate() < b2.hpRate() #最もHP%が低い

 これは生存者リストの中から、HP%(hpRate())を繰り返し比較しあって一番小さな対象を得ているわけです。

20200921_target_hprate.jpg

 こんな感じになります。
 今回はHP%でやりましたが、比較する値を変えれば色んな相手を対象にできます。
比較条件:b1.hpRate() > b2.hpRate()

 これは現在HPの一番多いアクターです。多いほうを取るため、不等号を大なりにしています。
比較条件:b1.hp + b1.mp > b2.hp + b2.mp

 HP+MPの合計で比較してみました。複数の要素を合わせた比較も可能です。

最もHPが減っている仲間を選択して回復

 上と全く同じで『スキル対象設定(最大最小)』のプラグインコマンドを使います。
 『比較条件』のパラメータも同じです。
比較条件:b1.hpRate() < b2.hpRate() #最もHP%が低い

 後は範囲が味方のスキルを使えば、勝手に自軍が対象となります。

 ※この制御は敵行動ルーチンの改善プラグインに含まれています。範囲が味方のスキルを対象ランダムにして指定するだけです。
 http://newrpg.seesaa.net/article/473218336.html


条件を満たした時のみ行動する


HPが50%以下の仲間がいる時のみ回復を行う

 HPが減った仲間を狙う方法は分かりました。……が、その前にHPが減った仲間がいる時のみ行動させたい場合はどうすればよいか?

 そこは『対象検索→スイッチに格納』のプラグインコマンドを使います。
対象サイド:friends #自軍
条件:b.hpRate() <= 0.5 #対象のHP割合

 指定の条件が満たされた時のみ、指定のスイッチがオンになります。後はスイッチを条件にして回復行動を実行するだけです。



戦闘不能の仲間がいる時のみ蘇生を行う

 『対象検索→スイッチに格納』に以下の値を指定し、スイッチを条件に蘇生スキルを実行します。
対象サイド:friends #自軍
条件:b.isDead() #戦闘不能
戦闘不能者を含む:ON

 スキルの対象はランダムでも問題ありません。戦闘不能者がいれば、初期状態でも勝手に優先してくれるようです。


注意点


 このプラグインで戦闘行動の強制を使用すると、MPやTP不足の行動は空振りするようになります。何も制御しない場合、通常の敵キャラの行動パターンのように優先度の低い行動に切り替えてはくれません。
 切替が必要な場合は、MPやTPを条件にして制御する必要があります。

まとめ


 敵の行動の制御については以上です。
 これでバトルイベントの強力さが伝わったならば幸いです。
 基本的にあらゆるものを参照できるため、大抵のことができてしまいます。

 ここでは紹介していませんが『戦闘行動の強制』以外のコマンドも使えるため、演出なども自由自在です。
 例えば、音楽を止めるなどの演出と組み合わせて複数回行動をさせれば、時間停止っぽい技も作れてしまいます。

参考リンク


 有志がまとめて下さった各クラスの情報です。どんなパラメータを参照できるかはこちらから確認できます。
 ※MV版のリンクですが大体は有効です。MZ版の情報がそろってくれば、そちらに更新したいと思います。

 Game_Enemy(敵のみの項目)
 Game_Actor(味方のみの項目)
 Game_Battler(敵味方の共通項目)
 Game_BattlerBase(敵味方の基本共通項目)

 Game_BattlerBase(敵味方の基本共通項目)
 Game_Troop(敵集団の共通項目)
 Game_Unit(敵味方集団の共通項目)

 末尾に()を付ける必要があるもの(関数)と()のいらないもの(変数)が混在しているので注意です。間違えると機能しません。

 その他、参考にさせていただいた記事など。
 https://punipunion.hatenablog.com/entry/2018/12/01/154554
 http://rpgmaker-script-wiki.xyz/battleaction_mv.php

 >RPGツクールMZ&MV目次に戻る
posted by 砂川赳 at 20:39 | RPGツクールMZ&MV | このブログの読者になる | 更新情報をチェックする