戦闘行動の強制で、敵の思考ルーチンからランダムで1つ選ぶスクリプト、もしくはプラグインコマンド

メルサイア
記事: 127
登録日時: 2016年2月22日(月) 10:35
お住まい: 大阪府
連絡を取る:

戦闘行動の強制で、敵の思考ルーチンからランダムで1つ選ぶスクリプト、もしくはプラグインコマンド

投稿記事by メルサイア » 2017年4月08日(土) 20:03

【問題】
エディタのイベント「戦闘行動の強制」は便利ですが、スキルをたくさん設定したい場合、
一つ一つ分岐をつくらないといけないので、凝った追加行動システムをつくりたい場合、めんどうです。

【質問】
そこで、タイトルのように、通常の敵1回の行動をスクリプトで強制できれば、
数時間にも及ぶエディタの編集作業が短縮化できるのですが、どなたかご存じないでしょうか?
ご存じであれば、味方版(自動戦闘ON時の行動でよい)も教えていただけるとありがたいです。

【補足】
なお、敵や味方の行動パターンは、ターン開始時にすでに決まってしまっている仕様のため、
戦闘行動の強制は、(a)敵が行動可能であり、かつ、(b)行動を再抽選しないと、できなさそうです。
(※20170417更新。行動完了していても、できるようです。トリアコンタンさんより教えてもらいました。感謝!)

ですが、(a)敵が行動可能かどうか調べるスクリプトは、

コード: 全て選択

// 敵インデックス#1が行動可能ならスイッチ1031番をON、OFFなら何らかの行動制約のあるステートにかかっている、というようにします。デフォルトはtrue
$gameSwitches.setValue(1031, true);
// 敵インデックス#1が行動可能かは、以下でとれます。
if($gameTroop != null && $gameTroop.aliveMembers()!= null && $gameTroop.members().length >= 1){
  // 敵インデックス#1に、行動制約のあるステートが一つでも付与されていればtrueだよ。
  var _isRestricted = $gameTroop.members()[0].restriction();
  // 行動可能かを取りたいから、「!」で反転してるよ
  $gameSwitches.setValue(1031, !_isRestricted);
}


で、(b)敵の行動を再抽選するスクリプトは、

コード: 全て選択

// ターン開始時に決まってしまっている敵の行動やターゲットを、再抽選します。
// ただし、isWaiting()で行動終了した敵を除外しないと、もう一度行動できる様になります。
// ですので、敵のスキル使用後に呼び出すと、永続的に行動してしまうので、注意してください。
if($gameTroop != null && $gameTroop.members() != null){
  $gameTroop.members().forEach(function(enemy){
    if (enemy.isWaiting()){
      enemy.makeActions()
    }
  });
}


で知っているので、これらを実行した後に、そのスクリプトを実行すれば、
エラーなくできるのではないかと考えています。
(考えてみれば、これだけエラーになりやすいものはスクリプトより、プラグインコマンド化するほうがいいのかも…)

編集:コードタグは、<code>~</code>ではなく、[こーど]~[/こーど](こーどはcode)だったのですね。修正しました。
最後に編集したユーザー メルサイア on 2017年4月14日(金) 05:36 [ 編集 1 回目 ]

アバター
トリアコンタン
記事: 2311
登録日時: 2015年11月10日(火) 21:13
お住まい: きのこ王国
連絡を取る:

Re: 戦闘行動の強制で、敵の思考ルーチンからランダムで1つ選ぶスクリプト、もしくはプラグインコマンド

投稿記事by トリアコンタン » 2017年4月13日(木) 23:33

こんばんは!
敵の行動の中からランダムでひとつ選択して、そのスキルを戦闘行動の強制にて実行するスクリプトです。
例ではこのスクリプト内で行動の決定を行っているので、再抽選は不要となります。
戦闘行動の強制がスキルIDを指定する形式なので、このようになっています。

コード: 全て選択

var enemyIndex = 1;
var enemy = $gameTroop.members()[enemyIndex - 1];
var actionList = enemy.enemy().actions.filter(function(a) {
   return enemy.isActionValid(a);
});
var skillId = actionList[Math.randomInt(actionList.length)].skillId;
this._params = [0, enemyIndex, skillId, -1];
this.command339();
プラグイン関連のトラブルが発生した際の切り分けと報告の方法です。
http://qiita.com/triacontane/items/2e227e5b5ce9503a2c30

[Blog] : http://triacontane.blogspot.jp/
[Twitter]: https://twitter.com/triacontane/
[GitHub] : https://github.com/triacontane/
メルサイア
記事: 127
登録日時: 2016年2月22日(月) 10:35
お住まい: 大阪府
連絡を取る:

Re: 戦闘行動の強制で、敵の思考ルーチンからランダムで1つ選ぶスクリプト、もしくはプラグインコマンド

投稿記事by メルサイア » 2017年4月14日(金) 06:03

トリアコンタンさん、ありがとうございます!!
ものすごく簡潔なスクリプト、とても助かります!

そうなのですね。行動が終了していても、actionListが変わっていないのなら、再抽選要らなさそうですね。
勉強になります。

もしactionListが0なら、skillIdには-1か0?が入ると考えたらいいでしょうか。
例外処理 if(skillId >= 1)が必要かどうか、念のため思考ルーチンが空の敵でやってみて、ご報告しますね。

これでトリアコンタンさんの反撃拡張プラグインと組み合わせて、ガードインパクト(攻撃弾く→再行動)が実装できるッ……!
メルサイア
記事: 127
登録日時: 2016年2月22日(月) 10:35
お住まい: 大阪府
連絡を取る:

Re: 戦闘行動の強制で、敵の思考ルーチンからランダムで1つ選ぶスクリプト、もしくはプラグインコマンド

投稿記事by メルサイア » 2017年4月14日(金) 07:35

>トリアコンタンさん
動作確認をして、スクリプトの一部がエラーになっていたので、修正しました。
・マップ中や、敵グループイベントなどで呼び出すと、正常に動作することを確認しています。
・敵の思考ルーチンがゼロ(actionList[***]がundefined)の時は、スキップされることを確認済みです。

コード: 全て選択

// 敵#1がラストターゲット(-2)にランダムで戦闘行動を強制します。敵が何回行動可能でも、通常の行動は終了してしますので注意してください。トリアコンタンさんに感謝。
var enemyIndex = 1;
var enemy = $gameTroop.members()[enemyIndex - 1];
if(enemy != null){
  var actionList = enemy.enemy().actions.filter(function(a) {
   return enemy.isActionValid(a);
  });
  if(actionList[Math.randomInt(actionList.length)] != null && actionList[Math.randomInt(actionList.length)].skillId != null){
    this._params = [0, enemyIndex-1, actionList[Math.randomInt(actionList.length)].skillId, -2]; // 第一引数は(0:敵、1:味方)、第二引数は~(#1は0、#2は1なので注意)、第三引数はターゲット(ラストターゲット-2、ランダム-1、#1が0、#2が1、…)
    this.command339();
  }
}

戦闘行動の強制(command339)のパラメータで、第二引数が0~なので、
enemyIndexに-1しないと、敵#2が行動するようになっていたようです……ややこしい(>_<)。
よくあることですので、お気になさらず。。。

なお、以下も変更を加えました。
・スキルを使った相手に続けて連続で攻撃したかったので、第三引数は-2(ラストターゲット)に変更しました。
・マップ中に呼び出すと、var enemyがundefinedだとenemy.enemy()でエラーになるので、例外処理を加えました。
・actionList[Math.randomInt(actionList.length)]がundefinedになることもあるみたいなので、ちょっと面倒ですが、.skillIdと合わせて、例外処理を加えました。

もっとスマートな書き方があれば、教えていただけないでしょうか。
よろしくお願いいたします。


■反撃スキルにつける時の不具合
このスクリプト単体では動作しますが、CounterExtend.jsと併用した場合、動きませんでした。
具体的には、
・反撃用ステートにスキル193を反撃技に設定し、
 スキル193の使用効果に「コモンイベント」でこのスクリプトを呼び出すと、内容がまるごとスキップされる……。
・敵グループイベント内に直接「コモンイベント」でこのスクリプトを呼び出すと、正常に動作する。

原因は不明ですが、コモンイベント最初に「文章の表示」を入れても無反応だったので、
何かカウンタースキル特有の制約があるのかもしれません。カウンタースキル後の連続行動は今のところ無理……残念です><。
添付ファイル
8bb16c098d5a46cee96f3d6d449a1876.png
47e452bd97664527669e5a3f47d87ff2.png

“MV:質問” へ戻る