【解決済み!!】戦闘行動の強制スクリプトで、ターゲットを敵・味方の誰かにしたい!

アバター
ピータンパン
記事: 76
登録日時: 2020年1月15日(水) 22:40

【解決済み!!】戦闘行動の強制スクリプトで、ターゲットを敵・味方の誰かにしたい!

投稿記事by ピータンパン » 2022年3月01日(火) 21:24

お世話サマです!

味方に「誰かを攻撃」ステートをかけた状態で
戦闘行動の強制の、ターゲットを-1(ランダム)に設定しても
敵の中からしか攻撃対象を選んでくれません!

トリアコンタンさんの対象範囲拡張プラグインを入れて、ID50のスキルのメモ欄に、
<SE敵味方>と設定しても駄目でした!

どうも、戦闘行動の強制で指定したターゲットが、何よりも優先されてる?っぽいです!
正の数にすると、0から対象のインデックスになるらしいので
生きてる敵と生きてる仲間の人数を足してバトル参加人数を取得し、
0~バトル参加人数で乱数分岐してみたんですけど
敵と味方一人ずつの場合、0か1のはずなのに
なぜか0のときも1のときも敵しか攻撃してくれないので、
対象のインデックスに自分や味方ってそもそも入ってないんですかね・・・

敵・味方・自分とも攻撃対象に入れるには
一体全体どうしたらいいんでしょうか!?

コード: 全て選択

var min = 0;
var max = ($gameTroop.aliveMembers().length + $gameParty.aliveMembers().length)+1;
var a = Math.floor( Math.random() * (max - min) ) + min ;
let weaponid; (weaponid = $gameActors.actor($gameParty.inBattle() ? BattleManager._subject._actorId : $gameParty.menuActor()._actorId).equips()[0]) ? weaponid.id : 0
    this.iterateBattler(1, $gameParty.inBattle() ? BattleManager._subject._actorId : $gameParty.menuActor()._actorId, function(battler) {
      if (!battler.isDeathStateAffected()) {
        battler.forceAction(weaponid.meta.skill_id, a)
        BattleManager.forceAction (battler)
        this.setWaitMode('action')
      }}.bind(this))


よろしくお願いします!
最後に編集したユーザー ピータンパン on 2022年3月15日(火) 20:41 [ 編集 1 回目 ]

アバター
ムノクラ
記事: 2011
登録日時: 2018年2月23日(金) 11:41
連絡を取る:

Re: 戦闘行動の強制スクリプトで、ターゲットを敵・味方の誰かにしたい!

投稿記事by ムノクラ » 2022年3月13日(日) 20:01

ピータンパン さんが書きました:お世話サマです!

味方に「誰かを攻撃」ステートをかけた状態で
戦闘行動の強制の、ターゲットを-1(ランダム)に設定しても
敵の中からしか攻撃対象を選んでくれません!

トリアコンタンさんの対象範囲拡張プラグインを入れて、ID50のスキルのメモ欄に、
<SE敵味方>と設定しても駄目でした!

どうも、戦闘行動の強制で指定したターゲットが、何よりも優先されてる?っぽいです!
正の数にすると、0から対象のインデックスになるらしいので
生きてる敵と生きてる仲間の人数を足してバトル参加人数を取得し、
0~バトル参加人数で乱数分岐してみたんですけど
敵と味方一人ずつの場合、0か1のはずなのに
なぜか0のときも1のときも敵しか攻撃してくれないので、
対象のインデックスに自分や味方ってそもそも入ってないんですかね・・・

敵・味方・自分とも攻撃対象に入れるには
一体全体どうしたらいいんでしょうか!?

コード: 全て選択

var min = 0;
var max = ($gameTroop.aliveMembers().length + $gameParty.aliveMembers().length)+1;
var a = Math.floor( Math.random() * (max - min) ) + min ;
let weaponid; (weaponid = $gameActors.actor($gameParty.inBattle() ? BattleManager._subject._actorId : $gameParty.menuActor()._actorId).equips()[0]) ? weaponid.id : 0
    this.iterateBattler(1, $gameParty.inBattle() ? BattleManager._subject._actorId : $gameParty.menuActor()._actorId, function(battler) {
      if (!battler.isDeathStateAffected()) {
        battler.forceAction(weaponid.meta.skill_id, a)
        BattleManager.forceAction (battler)
        this.setWaitMode('action')
      }}.bind(this))


よろしくお願いします!


イベントコマンド「戦闘行動の強制」の挙動を調べました。
概ね、ピータンパン氏のご想像通りのようです。

大前提として、ステートによる影響を「戦闘行動の強制」は受けないようです。
そして、コマンド画面の選択肢から予想される通り、行動主体に関わらず、戦闘行動の対象は敵グループ内のインデックスから選ばれているようです。

BattleManager.forceAction をいじれば変えられると思いますが、別手法を提案します。

▼混乱ステート拡張(トリアコンタン様作) - ConfusionExtend.js
https://plugin.fungamemake.com/archives/1157
混乱系(行動制約のプルダウンの選択値が「1」~「3」)ステートの指定内容を拡張

どうしても、「戦闘行動の強制」を使用する理由がおありでしたら、別の方法を考えてみます。
---
JavaScriptの基本を学習せずにツクールのプラグインやスクリプトを使って横着してゲームを作ろうとしている人間です。
そのような者なので、適当な投稿をするかも知れません。
他の方の投稿を信用してください。
アバター
ピータンパン
記事: 76
登録日時: 2020年1月15日(水) 22:40

Re: 戦闘行動の強制スクリプトで、ターゲットを敵・味方の誰かにしたい!

投稿記事by ピータンパン » 2022年3月14日(月) 21:51

おおっ!またしてもムノクラさんっ!
ありがとござます!

そうなんですよ!
トリアコンタンさんの混乱ステート拡張プラグインももちろん考えたんですけど
戦闘行動の強制じゃなきゃ実現できないめんどくさいスキルなのでこんなことにっ

大前提として、ステートによる影響を「戦闘行動の強制」は受けないようです。
そして、コマンド画面の選択肢から予想される通り、行動主体に関わらず、戦闘行動の対象は敵グループ内のインデックスから選ばれているようです。


やっぱりそうなんですか!
戦闘行動の強制ってよく使うのに、なんかすごい孤立した存在なんですねぇぇ
別の方法があるといいんですけど、何かありますかっ!?
アバター
ムノクラ
記事: 2011
登録日時: 2018年2月23日(金) 11:41
連絡を取る:

Re: 戦闘行動の強制スクリプトで、ターゲットを敵・味方の誰かにしたい!

投稿記事by ムノクラ » 2022年3月14日(月) 22:02

ピータンパン さんが書きました:おおっ!またしてもムノクラさんっ!
ありがとござます!

そうなんですよ!
トリアコンタンさんの混乱ステート拡張プラグインももちろん考えたんですけど
戦闘行動の強制じゃなきゃ実現できないめんどくさいスキルなのでこんなことにっ

大前提として、ステートによる影響を「戦闘行動の強制」は受けないようです。
そして、コマンド画面の選択肢から予想される通り、行動主体に関わらず、戦闘行動の対象は敵グループ内のインデックスから選ばれているようです。


やっぱりそうなんですか!
戦闘行動の強制ってよく使うのに、なんかすごい孤立した存在なんですねぇぇ
別の方法があるといいんですけど、何かありますかっ!?


この類の質問が難しくなるのは
1.実現したいことの詳細
2.試したことの詳細
3.結果、この手法が可能であれば、実現できるのではないか?と思った

の3.しか出していないので、その思考過程が必ずしも正解とは限らないことです。

隣のトピックでもありましたが、「ダメージ計算式の分散値を式で表したい」という質問から始まっていたら、プラグインを作るしか無いという開始地点になります。
viewtopic.php?f=23&t=12515

しかし、そんな大げさな事をしなくても、計算式の工夫だけで実現できる内容でした。
ここにスムーズに辿り着けたのは、
1.実現したいことの詳細
があったからです。

最初から手法を求めるのではなく、
1.実現したいことの詳細
2.試したことの詳細
3.結果、この手法が可能であれば、実現できるのではないか?と思った
を書くと、全く違う見解が得られることがあります。

これに、サンプルプロジェクトが付けられていると、1.の詳細以外は大雑把でもサンプルを見たら伝わってきます。

また、下記のサンプルで実験しただけで、コードを追えているわけではないのですが、
viewtopic.php?f=23&t=12513
強制行動で、スキルの対象をランダムにした場合、スキル本体の対象が「味方単体」だと、味方からランダムに選択されるようです。
(つまり、コードを追い切ることが出来ていないようです…スキルの対象が敵か味方かで処理が別れているのかも???)

そんなわけで、「実現したい事」を可能な限り箇条書きに書き出す事から始めてみませんか?

参考:回答を得やすい質問の書き方
https://fungamemake.com/archives/8079

※ピータンパン氏の自己紹介は必要ないとは思います。
(過去の投稿から、推察できるため)
---
JavaScriptの基本を学習せずにツクールのプラグインやスクリプトを使って横着してゲームを作ろうとしている人間です。
そのような者なので、適当な投稿をするかも知れません。
他の方の投稿を信用してください。
アバター
ピータンパン
記事: 76
登録日時: 2020年1月15日(水) 22:40

Re: 戦闘行動の強制スクリプトで、ターゲットを敵・味方の誰かにしたい!

投稿記事by ピータンパン » 2022年3月14日(月) 22:30

あ、あぅ‥‥その通りですねぇぇ
めんどくさがって、そういうの端折ってました!
解決したいなら、それくらいしないとですね!
すいませんでした!
アバター
WTR
記事: 559
登録日時: 2015年12月22日(火) 19:14

Re: 戦闘行動の強制スクリプトで、ターゲットを敵・味方の誰かにしたい!

投稿記事by WTR » 2022年3月15日(火) 00:32

情報が整理されていないことについては全く同意ですが…

トリアコンタンさんの対象範囲拡張プラグイン
まで辿り着いたのならそれでできそうだと思っていました

コード: 全て選択

this.iterateBattler(1, 1, function(battler) {
   if (!battler.isDeathStateAffected()) {
      battler.forceAction(9, -1)
      BattleManager.forceAction(battler)
      this.setWaitMode('action')
   }
}.bind(this))

キャプチャ.PNG

↾で敵味方ランダム1体にファイアが発動しました

他にも装備している武器のメモ欄を参照したい…とかがありそうですが
何の説明もなく放り投げられたスクリプトに
果たしてどこから突っ込んでいいのやら…と思ってるうちに忘れてました
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
アバター
ピータンパン
記事: 76
登録日時: 2020年1月15日(水) 22:40

Re: 戦闘行動の強制スクリプトで、ターゲットを敵・味方の誰かにしたい!

投稿記事by ピータンパン » 2022年3月15日(火) 01:07

え?!
なんか私、怒られてます?!

すいません!
一応、自分なりに説明はしてたつもりだったんですけど
何の説明もなく放り投げてたように取られてしまったんですね!
すいませんでした!
アバター
ムノクラ
記事: 2011
登録日時: 2018年2月23日(金) 11:41
連絡を取る:

Re: 戦闘行動の強制スクリプトで、ターゲットを敵・味方の誰かにしたい!

投稿記事by ムノクラ » 2022年3月15日(火) 07:50

別に誰も怒っていないと思いますよ(笑)


強制行動のコアを少し調べました。

今の結論から言うと、問題のスキル使用対象インデックスですが、敵か味方かの指定はここではされていないようです。

ここまでの質問の内容から、要望は下記と想像します。
1.普段は敵に使用するスキル(攻撃?デバフ?)を強制的に味方に使用したい。
(シナリオ演出?)
2.混乱ステートでは、その制御(タイミング?)が上手くできない。

そこで、代替案です。

イベントコマンドの穴(?)として、行動主体が指定スキルを習得していなくともこれが使われます。
これを利用した下記の手法で、イベントコマンドだけで、実現できると思います。

1.この時だけの専用スキルを作成
攻撃スキル:対象:味方単体
2.強制行動で、1.のスキルを指定。
ターゲットは1からパーティの並び順
(対象が戦闘不能の場合、別の対象が自動的に選ばれます)

補足イベント例

コード: 全て選択

◆変数の操作:#0001 = 乱数 0..1
◆条件分岐:#0001 = 0
  ◆戦闘行動の強制:マーシャ, 裏切りファイアⅠ, ランダム
  ◆
:それ以外のとき
  ◆戦闘行動の強制:マーシャ, ファイアⅠ, ランダム
  ◆
:分岐終了


--------

以下は、調査した流れです。
(ムノクラの足りない調査レベルを示すために出します)


イベントコマンドが書かれているのは下記
Game_Interpreter.prototype.command339

これをスクリプトで実行する方法が下記
http://rpgmaker-script-wiki.xyz/battleaction_mv.php


最終的に行われているのは、
Game_Battler.prototype.forceAction
内の
this._actions.push(action);
で、action の内容は下記でした。

イベントコマンド例:行動主体:アクター4/今冬行動:スキル52、対象:インデックス2
Game_Action {_subjectActorId: 4, _subjectEnemyIndex: -1, _forcing: true, _item: Game_Item, _targetIndex: 1}

ここからはコードを追っていない予想ですが、
1.戦闘全体の行動は this._actions (多分、行動リスト)にコマンド内容・敵の行動が蓄積されていき、実行される。
2.実行されるスキルはDBのスキルの対象に従う。

つまり、強制行動でDBに反する対象に変更するのは、かなり無理のある作りになると予想します。
最後に編集したユーザー ムノクラ on 2022年3月15日(火) 10:54 [ 編集 1 回目 ]
---
JavaScriptの基本を学習せずにツクールのプラグインやスクリプトを使って横着してゲームを作ろうとしている人間です。
そのような者なので、適当な投稿をするかも知れません。
他の方の投稿を信用してください。
アバター
WTR
記事: 559
登録日時: 2015年12月22日(火) 19:14

Re: 戦闘行動の強制スクリプトで、ターゲットを敵・味方の誰かにしたい!

投稿記事by WTR » 2022年3月15日(火) 08:03

意地悪な書き方をしてしまったようで…そこはすみません

スクリプトに関して、丸投げに感じたのは
・武器のメモ欄を参照したいらしい記述があるものの本文では触れられていない
・戦闘行動の強制の話のはずなのに、戦闘外の動作について記述されていて意図が掴めない
・上記もあって、このスクリプトをどうしてほしいのかわからない
あたりです

私のスキルのせいかもしれませんが
weaponid の代入とかえらく難解な記述でパッと見では理解できませんでした
weaponid に weaponid.id を代入するの?なんでエラー出ないんだ…とか
一頻り悩んだのち一応納得はしたものの
読めばわかるでしょ、というにはちょっと乱暴じゃない…と感じました

こう言ってはなんですが実際わかって書いてる感じではないですよね
エラーが出るとか以前に、なにをしようとしているのかわかってないように見えるのです

weaponid は結局ただの数字が代入されるので weaponid.meta は取得できません
参照エラーになるので最低限これは修正が必要

あとは…
$gameParty.inBattle() で分岐させてますが
戦闘外でこのスクリプトを実行する想定はないと思うので不要なはず

BattleManager._subject には何が入っているのかよく考える
理解できれば $gameActors.actor() メソッドが不要なこともわかると思います

こんなことわからなくても作れるのが本来のツクールですけど
スクリプトを書くのならわかってないとマズいと思うのですよ
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
アバター
ピータンパン
記事: 76
登録日時: 2020年1月15日(水) 22:40

Re: 戦闘行動の強制スクリプトで、ターゲットを敵・味方の誰かにしたい!

投稿記事by ピータンパン » 2022年3月15日(火) 10:58

こんないい加減な人間に付き合わせてしまってすいません!
ここにいる方達はスゴイ人ばかりなので、確かに「パッと見たらここは関係ないってわかるかな?」って前提で質問してたかもしれません!
スクリプトの流れとかも言われたとおり、よく理解してませんし、
「ま、動けばいっか!」って感じで気楽にやってきました。
でも、人を巻き込むんだったら、そんなことじゃダメですよね!
これからは迷惑をかけないように、ちゃんと伝わるかよく考えてから質問します!

遅くなりましたけど、何がやりたいのか、
mpが尽きるまで無限ループするスキルを作りたくて
そのために、戦闘行動の強制が必要でした!
もう実装は終わってて、あとは無差別に攻撃する処理だけだったんですけど
無理そうだったので、敵を攻撃するたびに行動主体にダメージがいくようにしました。
あれですね、諸刃の剣+無限ループみたいな感じです。
ホントは、みなごろし+無限ループにしたかったんですけど、諦めてました。

weaponidには武器のオブジェクトが入りますよ!(語尾がidってなってるのが紛らわしかったですね!)
だから.metaでちゃんとメモ欄のデータが取れます!
$gameActors.actorを使ってるのは、.equips()で行動主体の装備品の配列を取りたかったからです!
$gameActors.actor以外にもっと簡単な取り方があるのかもしれないですけど、私はこの方法しか思いつかなかったのでこうしてます!
あと武器のメモ欄を見てるのは、パッシブスキルのidを取得しに行ってます!
こんな感じですけど伝わったですか!?

WTRさんに教えてもらった方法を試したんですけど、やっぱり敵しか攻撃しないので
ムノクラさんの案を試してみますね!
お二人とも色々ありがとうございました!

“MV:質問” へ戻る