敵の行動を自在に制御する 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 | このブログの読者になる | 更新情報をチェックする

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

 この記事は[MZ版]バトルイベント拡張プラグインの解説です。
 実施には該当のプラグインが必要となります。

初めに


 ツクールMZの敵の行動パターンははっきりいって貧弱です。

  • ターンごとに行動回数を変えられない。
  • また1回目の行動で攻撃力アップ、2回目で攻撃といった制御もできない。
  • 回復魔法は対象が完全ランダム。HPの減った相手を狙ってくれない。
  • 蘇生魔法は死亡者がいなくとも空振りする。
    条件にステートもあるが、対象は自分のみ。
    つまり仲間が戦闘不能の時という条件は指定できない。
  • また、ステートの条件は「かかっている時」限定である。
    「自分がステートでない時に使用」というように重ねがけを避けるのが困難。
  • スイッチが条件にあるがONの場合だけ。OFFがなく融通が利かない。
  • 変数が条件にない。
  • 生存数が条件にない。
  • 行動後のスイッチ操作がない。2000にはあったので、なぜか劣化。
  • そもそも、パーティLV以外の味方側の情報を一切参照できない。

 ……などなど、多すぎて書ききれません。

 ※なお、列挙した問題の一部は敵行動ルーチンの改善プラグインによっても解決できます。簡単なので超オススメ!

 イベントコマンドで敵を制御することによって、そういった諸々の問題を一挙に解決します。
 また、その際には当然ながら全てのイベントコマンドが使い放題です。文章の表示もピクチャーもアニメーションもスクリプトも自由自在に挟めます。

 若干手間がかかることもあって、主にボス敵の行動を想定しています。……が、もちろん雑魚でも使えます。
 手間がかかるといっても、敵の行動パターン画面で複雑な制御を行うよりは遥かに楽です。

設定方法


 まず、戦闘中にバトルイベント(コモンイベント)を呼び出す方法からです。

各戦闘システム共通の方法

 デフォルトのターン制でも、当サイトにあるCTB(およびCTTB)でも使える方法です。また、MZのタイムプログレスバトルでも有効です。

  • コモンイベントを呼び出すスキルを作成します。
  • メモ欄に<NoStartAction>と記述すると、スキルの開始演出を省略できます。
  • 範囲はなしに設定してください。でないと余計なメッセージが表示されます。
  • 敵の行動パターンにこのスキルを設定してください。

20200112_common.JPG

20200112_common_enemy.JPG

 敵がこのスキルを実行したタイミングでコモンイベントが呼び出されます。

 そのままコモンイベントに処理を記述してもよいですし、スイッチを起動して敵グループのバトルイベントを呼び出すのも自由です。例えば、ボスの行動制御などはその敵グループ内に書いたほうが、管理しやすいかもしれません。

 ※敵グループのバトルイベントを使う場合、スパンはモーメントにしてください。
  どこかでスイッチをオフにしないとオンのままなので注意!


 なお、敵ごとに呼び出し用のスキルやコモンイベントを必ずしも増やす必要はありません。

  • コモンイベント内で、敵IDを使って分岐させる。
  • スイッチで敵グループを呼び出し、別々の処理を記述する。

 といった方法でも対応できます。やりやすい方法でどうぞ。
 以下はコモンイベント内で分岐させた例です。


条件分岐:スクリプト:a._enemyId == 2

 というように、敵IDを取得して分岐させています。
 スクリプトを使うので、ちょっと戸惑うかもしれませんが、コピペで数字だけ変えればOKです。
 また『=』ではなく『==』であることに注意です。

 aというのはスキルの計算式(例:a.atk * 4 - b.def * 2)でも使っているものと全く同じです。スキルの使用者(MZでは行動主体という)の情報が色々と詰まっています。

 ※本来、バトルイベント上では参照できませんが、このプラグインの機能で無理やり参照できるようにしています。プラグインパラメータの『aで行動主体を参照』というのがそれです。
 ※『a._enemyId』の他にも『a.enemyId()』でも同じ値を参照できます。ただし『a.enemyId()』はaがアクターだとエラーになるので注意です。


CTB専用

 当サイトにあるCTB用プラグインを導入している場合、コモンイベントを使用しない方法も可能です。

 条件を毎ターン(スパン=ターン、ターン=0+1*X)にしたバトルイベントのページを作成します。
 その先頭で敵IDなどを条件にして、目当ての行動主体の時だけ処理を行うようにします。
 CTBではターン=1行動なので、こういう使い方もできるというわけですね。


条件分岐:スクリプト:a._enemyId != 8

 にある『!=』というのは『==』の反対であり『≠』と同じ意味です。JavaScriptにおいて、『!』は否定を意味します。
 ※ここはアクターも通るため、a.enemyId()だとエラーになるので注意です。

 後は上と同じです。

 既に準備段階で結構長くなってしまいましたが、基本はコピペするだけなので大して時間はかかりません。
 それでは実際に、次の記事から敵の行動制御を記述していきましょう。

 >敵の行動を自在に制御する A実践編

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

王道冒険ファンタジー『雲海のオデッセイ』完結!!

2020年09月20日

 王道冒険ファンタジー『雲海のオデッセイ』完結(2020/09/19)しました。
 予定通り約170万字。合計441話の大作になりました。

 小説という初めての経験でしたが、無事に満足の行く作品に仕上げられたと思います。

 キャラクター性を重視した作風なんかは、作者的にかなり思い切ったなあという感じです。今時の小説でそれをやらないほうがレアですが。今までゲーム作家としては無口主人公ばかりを書いていたもので……。

 主人公とヒロインのやり取りの多さなんか、過去の作品には絶対になかったことですね。特に色々と濃いヒロインが書けたと思います。今後の作品にも活かしていきたいところです。

 というわけで、本気で自分なりに王道冒険ファンタジーを書いたので、興味がおありの方はどうぞ。全部読むと50時間とか普通にかかります。ガチです。でも、ダラダラ戦闘を引っ張るとかそういうことはしていません。

 https://ncode.syosetu.com/n0109fq/

 ちなみに、自分はタブレットのアプリを使って電子書籍っぽく読んでいます。最近は紙の本をあまり読まなくなりました。物理的に場所を取らなくてありがたいことです。

今後の活動について


 なろう内の活動報告とやや重複しますが、こちらにも今後の活動予定を書こうと思います。

 さて、めでたく10月から僕はニートになります。
 しかもただのニートではなく永久ニートです。
 英語で言えばエターナルニートです。

 今後、基本的には会社勤めを辞めて、自分の趣味と創作に専念する予定です。
 これはガチです。止めても無駄です。

 ※小遣い稼ぎや人恋しさでちょっと働くことはあるかもしれませんが、細かいことは気にしないでください。

 創作一本で食っていく――のは多分難しいので、普通に働いて、普通に節約して、普通に貯金して、普通に投資して得た蓄えと利益で生きていく予定です。
 面白みはないけれど、たぶんそれが一番確実だと思います。少なくとも、飛び抜けた才能と努力と運がない限りは。


 というわけで、次は王道雲海RPGを作成する予定です。

 雲海のオデッセイの続編とかではなく、あくまで世界設定が類似しているだけの別作品になります。
 そのほうが新規のユーザにも入ってもらいやすいし、作者としても制作の自由度も上がるのではないかと。

 市販だとワイルドアームズやメタルマックスといった作品が、シリーズで世界設定を共有している例ですね。『荒野の世界』『文明崩壊後の世界』という設定を共有してはいても、世界自体は作品毎に別物――とまあ、そんな感じです。

 ツールはたぶんツクールMZになります。
 既に色々とプラグインを作成していますが、全てはこの準備と言っても過言ではありません。

 ツクール2000時代とは機能が桁違いなので、どのように世界やシステムを表現するか楽しみでなりません。

 でも、基本的には2000時代と同じ解像度のドット絵を使用するつもりです。町人、敵、マップチップ、効果音などはミスティックスターを流用しながら追加していきます。
 そのほうが差別化もできるし、現実的に描くのも楽ですからね。
 いくつになろうとも、SFC万歳です。

 制作期間は当然年単位になる予定です。でも、ミスティックスターよりは短くしたい。かつてよりもあらゆる条件はよくなったので、理論上はかなり期間を縮められるはず。
 というか、そうあって欲しい。じゃないと、僕の寿命が尽きてしまいそうです。

 特にDynamicAnimation&Motionプラグインは、かつて苦労した戦闘アニメの実装を劇的に強化&楽にしてくれる逸品です。
 これだけでスキルの実装は、半分ぐらいの時間まで短縮できるんじゃないかと予想しています。


 こんな感じでアニメーションもモーションも自由自在です。

 フリーにするか販売にするかは未定です。でも、今後はニートなので収入源は欲しいと思っています。
 
 それでは、今後ともよろしくお願いします!

 ※……決意表明っぽいことを書きましたが、せっかくのニートです。しばらく積ゲーと積本の消化を優先することをお許しください。
posted by 砂川赳 at 09:38 | 小説 | このブログの読者になる | 更新情報をチェックする