【解決】アクターが行動不能でも戦闘行動の強制を行いたい

ksk
記事: 108
登録日時: 2020年11月15日(日) 19:05

【解決】アクターが行動不能でも戦闘行動の強制を行いたい

投稿記事by ksk » 2022年6月05日(日) 10:40

いつもお世話になっております。

件名の通りなのですが、アクターが眠りや麻痺といった行動不能の状態異常を受けていても、
戦闘行動の強制によってスキルの使用やコモンイベントの呼び出しを行う方法はないでしょうか。

なお、戦闘行動の強制を呼び出すタイミングはバトルイベントのターン終了時です。
可能であれば行動を行った後も、状態異常が解除されず持続ターン数等継続してくれるのが望ましいです。

何だかバグの温床になりそうな要望だなと思いつつも、
もし解決方法やプラグインをご存知の方がいましたらお力添えいただけますでしょうか。
最後に編集したユーザー ksk on 2022年7月30日(土) 15:07 [ 編集 1 回目 ]

ksk
記事: 108
登録日時: 2020年11月15日(日) 19:05

Re: アクターが行動不能でも戦闘行動の強制を行いたい

投稿記事by ksk » 2022年7月29日(金) 18:51

こちらのトピック、引き続き解決策を模索しているのですが知見をお持ちの方はいらっしゃらないでしょうか?
システム的に実現が難しいよ、と言ったご意見だけでも助かります。
アバター
しぐれん
記事: 973
登録日時: 2017年3月28日(火) 22:22
連絡を取る:

Re: アクターが行動不能でも戦闘行動の強制を行いたい

投稿記事by しぐれん » 2022年7月30日(土) 04:17

かなり厳しいです。
ただ、アクターに戦闘行動を強制して何をさせたいのでしょうか?
別の解決方法があるかもしれません。
現在、プラグイン依頼はお休み中です。
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: アクターが行動不能でも戦闘行動の強制を行いたい

投稿記事by Plasma Dark » 2022年7月30日(土) 04:53

一時的にステートによる行動不能をすべて無視できれば良いのであれば、実現自体はそう難しくないように思えます。

コード: 全て選択

(() => {
  'use strict';

  /**
   * @param {Game_BattlerBase.prototype} gameBattlerBase
   */
  function Game_BattlerBase_IgnoreRestrictionMixIn(gameBattlerBase) {
    const _isRestricted = gameBattlerBase.isRestricted;
    gameBattlerBase.isRestricted = function () {
      return _isRestricted.call(this) || this.isAppeared() && this.states().some(stateId => $dataStates[stateId].meta.ignoreRestriction);
    };
  }

  Game_BattlerBase_IgnoreRestrictionMixIn(Game_BattlerBase.prototype);
})();
名無し蛙
記事: 304
登録日時: 2015年11月23日(月) 02:46

Re: アクターが行動不能でも戦闘行動の強制を行いたい

投稿記事by 名無し蛙 » 2022年7月30日(土) 06:01

ksk さんが書きました:件名の通りなのですが、アクターが眠りや麻痺といった行動不能の状態異常を受けていても、
戦闘行動の強制によってスキルの使用やコモンイベントの呼び出しを行う方法はないでしょうか。

自分も気になって軽く調べたんですけどそもそもデフォルトでこの仕様じゃないですか?
確かにスキルの使用直前に使用可能チェックがあり、
「通常は」行動不能ステートやMPコスト切れ、スキル封印を喰らった時等は不発になります。
しかし「戦闘行動の強制」で呼び出した時は例外で行動不能であってもMP切れであってもスキルは発動します。
MPが足らない時はMPがマイナスになった後にrefresh時に0に矯正されるみたいですね。

ステートの進度カウンターはターンエンド処理の時に一括で進行するので影響無いと思います。
少なくとも自分が白紙のプロジェクトでテストした範囲ではそのように挙動しました。
もしも改めてテストしてもスキルが発動しないのであれば何らかのプラグインと競合しているのでは?

コード: 全て選択

//  rpg_objects.js:1427
Game_Action.prototype.isValid = function() {
    // 戦闘行動の強制フラグがONの場合、またはスキルを使用可能であればtrue
    return (this._forcing && this.item()) || this.subject().canUse(this.item());
};
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: アクターが行動不能でも戦闘行動の強制を行いたい

投稿記事by Plasma Dark » 2022年7月30日(土) 10:18

自分も気になって軽く調べたんですけどそもそもデフォルトでこの仕様じゃないですか?


ところが、ステートによる行動不能(行動制約 = 行動できない)についてはそうではないです。
Game_Battler.prototype.makeActions で Game_Action インスタンスを作る前に、バトラーが行動可能であるかどうかを判定し、行動不能であれば Game_Action インスタンスが作られずに行動がスキップされます。

戦闘行動の強制で無視される発動条件は提示頂いたコードにもあるように Game_BattlerBase.prototype.canUse で判定されるもので、MPの消費やスキル封印が該当します。

麻痺がNumbState.jsで実現されているとなると、先程提示したコードだけでは対応できないですね。
numb_occurをフックして分岐するだけではありますが。
名無し蛙
記事: 304
登録日時: 2015年11月23日(月) 02:46

Re: アクターが行動不能でも戦闘行動の強制を行いたい

投稿記事by 名無し蛙 » 2022年7月30日(土) 12:52

Plasma Dark さんが書きました:ところが、ステートによる行動不能(行動制約 = 行動できない)についてはそうではないです。
Game_Battler.prototype.makeActions で Game_Action インスタンスを作る前に、バトラーが行動可能であるかどうかを判定し、行動不能であれば Game_Action インスタンスが作られずに行動がスキップされます。

確かによく見たらcanUseと行動制約(canMove)は関係無いですね…
しかしGame_Battler.prototype.makeActionsとバトルイベントからの「戦闘行動の強制」は関わってない気がします
Game_Battler.prototype.forceActionを通して直接this._actionsを設定してませんか?

訂正:やっぱりcanUseとcanMoveは関係ありました。
canUse>meetsSkillConditions>meetsUsableItemConditions内でcanMoveを呼び出しています。
行動直前に行動不能ステートに掛かった場合は行動キャンセルされる仕様です。
最後に編集したユーザー 名無し蛙 on 2022年7月30日(土) 14:42 [ 編集 1 回目 ]
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: アクターが行動不能でも戦闘行動の強制を行いたい

投稿記事by Plasma Dark » 2022年7月30日(土) 14:00

Game_Battler.prototype.forceActionを通して直接this._actionsを設定してませんか?


あら、仰る通りでした。makeTargets と makeActions を読み違えておりました。
試して動かないと思ったのも、バトルイベントが「実行しない」になっていたオチという、しょうもない話でした。私の書き込みは忘れてください。

名無し蛙さんの仰る通り、ステートによる行動できない制約下でも、戦闘行動の強制であれば強制的に行動します。
ksk
記事: 108
登録日時: 2020年11月15日(日) 19:05

Re: アクターが行動不能でも戦闘行動の強制を行いたい

投稿記事by ksk » 2022年7月30日(土) 14:19

皆様、色々とご意見いただきありがとうございます。
codeで記入いただいた内容は知識不足で完全に理解できない部分も多いですが、参考になります。
一方で、改めて仕様を確認したところ私の認識に間違いがありました。
しぐれん様がご指摘いただいた【実現したいこと】と合わせて補足・訂正させていただきます。

■実現したい事
そもそもの本質問の意図ですが、スキルを実行し、2ターン後の終了時に敵にダメージを与える
といった時間差攻撃を実現したいと考えたのが発端でした。
(1ターン目に空へ矢を放ち、3ターン目終了時に敵に落ちてくるようなイメージ)

■ゲームでの挙動
新規プロジェクトで改めて確認したところ、名無し蛙様がご指摘して下さった通り、
行動主体が、麻痺や眠りといった【行動できない】ステートにかかっているだけでは行動が阻害されず、
バトルイベントから戦闘行動の強制で指定したスキルは発動しました。
上記、誤った情報を最初にお伝えしてしまい申し訳ございません。

一方で、ステート1に設定されている戦闘不能のステートにかかっている時のみ、
バトルイベントから呼び出した戦闘行動の強制が発動しませんでした。

テストプレイ時、戦闘不能になったアクターが戦闘行動の強制によって行動できなかったため、
全ての【行動できない】ステートを一括りに考えてしまい、
眠りや麻痺でもスキルを実行できないと勘違いしてしまいました。

よって、本トピックの主題としましては、
アクターが戦闘不能でも戦闘行動の強制を行いたい、とするのが正しいでしょうか?
最後に編集したユーザー ksk on 2022年7月30日(土) 14:51 [ 編集 1 回目 ]
名無し蛙
記事: 304
登録日時: 2015年11月23日(月) 02:46

Re: アクターが行動不能でも戦闘行動の強制を行いたい

投稿記事by 名無し蛙 » 2022年7月30日(土) 14:40

戦闘不能時に弾いてる部分はGame_Interpreter.prototype.command339内ですね。
つまり直接、イベントコマンド>スクリプトで指定する分には起動するのではないでしょうか。

コード: 全て選択

// アクターIDの指定
const battler = $gameActors.actor(1);
// スキルIDの指定、対象indexの指定(-2でラストターゲット、-1でランダムターゲット)
battler.forceAction(10, 0);
BattleManager.forceAction(battler);
this.setWaitMode('action');

“MV:質問” へ戻る