【解決済】敵にステート付与したときに、自動でスキルも発動させる方法

返信する
こむぎ
記事: 4
登録日時: 2023年1月14日(土) 14:20

【解決済】敵にステート付与したときに、自動でスキルも発動させる方法

投稿記事 by こむぎ »

味方1が敵に特定のステートを付与したときに、味方1がスキルを自動発動することってできますか?
コモンイベントに、

◇条件分岐 : スクリプト : $gameTroop.members()[敵キャラID].isStateAffected(ステートID)
 ◇戦闘行動の強制 : 味方1, スキル1 , ラストターゲット
 ◇
: 分岐終了


こちらのスクリプトを入力して、
上記のように分岐させてみたのですが、スキル1が発動してくれません。

仮に上記のスクリプトでスキルが発動できたとして、
[敵キャラID]を[現在戦闘中の敵]とか、[ラストターゲット]に設定することはできますか?
最後に編集したユーザー こむぎ [ 2023年1月15日(日) 00:44 ], 累計 1 回
名無し蛙
記事: 352
登録日時: 2015年11月23日(月) 02:46

Re: 敵にステート付与したときに、自動でスキルも発動させる方法

投稿記事 by 名無し蛙 »

$gameTroopは現在戦闘中の情報を管理するオブジェクトで
$gameTroop.members()は戦闘参加エネミー配列を取得するメソッドです。
[]で指定するとしたらIDではなくインデックスですね。
これにラストターゲットを組み合わせると、一行で表現するには長くなりますけど

コード: 全て選択

$gameTroop.members()[$gameActors.actor(アクターID)._lastTargetIndex].isStateAffected(ステートID)
で判定出来ると思います。
こむぎ
記事: 4
登録日時: 2023年1月14日(土) 14:20

Re: 敵にステート付与したときに、自動でスキルも発動させる方法

投稿記事 by こむぎ »

ご返信ありがとうございます!
コードまで示してくださってとてもありがたいです…!

例として、アクターID1がステートID11のステートを付与した時に、
スキルID3が発動されるコモンイベントは以下の形でよろしいのでしょうか?

◇条件分岐 : スクリプト :$gameTroop.members()[$gameActors.actor(1)._lastTargetIndex].isStateAffected(11)
 ◇戦闘行動の強制 : アクターID1, スキルID3 , ラストターゲット
 ◇
: 分岐終了


アクターID1の攻撃により、ステートID11を付与してみたのですが、スキルID3が発動してくれませんでした…
何か見落としがあるのでしょうか…コモンイベントのトリガーはなしに設定しています。
名無し蛙
記事: 352
登録日時: 2015年11月23日(月) 02:46

Re: 敵にステート付与したときに、自動でスキルも発動させる方法

投稿記事 by 名無し蛙 »

あれっマジですか。こちらで確認した範囲では動作しました。
文法は特に問題無さそうに見えます。
戦闘中、敵に攻撃を加え特定のステートに掛かった場合更に特定のスキルで追撃する、という仕様ですよね。

それではアプローチを変えてみましょうか。
以下のコードを新規のテキストファイルに張り付けてファイル名の拡張子を.jsにし
プラグインフォルダに入れて適用してみてください。

コード: 全て選択

/*:
 * @plugindesc スキルを連鎖発動させる。
 * @param actorId
 * @text 条件対象のアクターID
 * @default 1
 * @type actor
 *
 * @param stateId
 * @text トリガーになるステートID
 * @default 11
 * @type state
 *
 * @param skillId
 * @text 発動するスキルID
 * @default 3
 * @type skill
 *
 */

(() => {
    'use strict'
    const pluginName                = decodeURIComponent(document.currentScript.src).match(/^.*\/js\/plugins\/(.+)\.js$/)[1];
    const parameters                = PluginManager.parameters(pluginName);
    const actorId                   = Number(parameters['actorId'] || "1");
    const stateId                   = Number(parameters['stateId'] || "11");
    const skillId                   = Number(parameters['skillId'] || "3");

    const _Game_Action_itemEffectAddState = Game_Action.prototype.itemEffectAddState;
    Game_Action.prototype.itemEffectAddState = function(target, effect) {
        _Game_Action_itemEffectAddState.apply(this, arguments);
        if (
            this.subject().isActor() && this.subject().actorId() === actorId &&
            target.isEnemy() && target.isStateAffected(stateId)
        ) {
            this.subject().forceAction(skillId, target.index());

        }
    };
})();
コード内容は「ステート付与」の判定が終了した直後に
スキル使用者がアクター、かつアクターIDが指定のものと一致、
かつ対象がエネミー、かつ対象が指定のステートに掛かっていた場合、
同じターゲットを相手に指定のスキル使用を割り込ませる、というものです。
つまり使用効果「コモンイベント」を削除して代わりにプラグイン側で実行しよう、という事です。
こむぎ
記事: 4
登録日時: 2023年1月14日(土) 14:20

Re: 敵にステート付与したときに、自動でスキルも発動させる方法

投稿記事 by こむぎ »

すごいです!!!!ステート付与したらスキルが発動しました!!!!
ありがとうございます!一日中あれでもないこれでもないってしてたのでめちゃすごく助かりました!! :D
とても恐縮なのですが、こちらのスクリプト、トリガーになるステートIDと発動するスキルIDを増やしたいのですけど、
そういったことは可能でしょうか…?
例えば、[トリガーになるステートID11]を発動すれば[発動するスキルID]は[3]で、
[トリガーになるステートID15]を発動すれば[発動するスキルID]は[5]みたいな…
名無し蛙
記事: 352
登録日時: 2015年11月23日(月) 02:46

Re: 敵にステート付与したときに、自動でスキルも発動させる方法

投稿記事 by 名無し蛙 »

ステートIDとスキルIDをセットにして分離させんですか?
簡単な改修を施すならこんな感じですかね
無いとは思うんですけど特徴「行動回数追加」で複数回行動可能な状態の時に
初撃で追加行動が発動した場合、二回目以降の行動は消去される点は注意してください。
もう少し丁寧な処理を書けば回避出来るんでしょうけど
「戦闘行動の強制」の内部処理を流用している為に発生する仕様です。
あとは二つ以上の条件を同時に満たした場合は最初のものが適用されると思います。

コード: 全て選択

/*:
 * @plugindesc スキルを連鎖発動させる。
 *
 * @param actorId
 * @text 条件対象のアクターID
 * @default 1
 * @type actor
 *
 * @param patterns
 * @text パターン配列
 * @type struct<Pattern>[]
 *
 */
 /*~struct~Pattern:
  *
  * @param stateId
  * @text トリガーになるステートID
  * @default 1
  * @type state
  *
  * @param skillId
  * @text 発動するスキルID
  * @default 1
  * @type skill
  */

(() => {
    'use strict'
    const pluginName    = decodeURIComponent(document.currentScript.src).match(/^.*\/js\/plugins\/(.+)\.js$/)[1];
    const parameters    = PluginManager.parameters(pluginName);
    const actorId       = Number(parameters['actorId'] || "1");
    const patterns      = JSON.parse(parameters.patterns).map(pattern => JSON.parse(pattern));

    const _Game_Action_itemEffectAddState = Game_Action.prototype.itemEffectAddState;
    Game_Action.prototype.itemEffectAddState = function(target, effect) {
        _Game_Action_itemEffectAddState.apply(this, arguments);
        if ( this.subject().isActor() && this.subject().actorId() === actorId && target.isEnemy() ) {
            const hit = patterns.find( pattern => target.isStateAffected(Number(pattern.stateId)));
            if (hit) {
                this.subject().forceAction(Number(hit.skillId), target.index());
            }
        }
    };
})();
追記で。少し整形しました
こむぎ
記事: 4
登録日時: 2023年1月14日(土) 14:20

Re: 敵にステート付与したときに、自動でスキルも発動させる方法

投稿記事 by こむぎ »

ありがとうございます!!!複数のステートが別々のスキルに移行してくれました!!
プラグインに入力するだけで理想的な動きになるスクリプトを作っていただけるなんて…!゚(゚`ω´ ゚)゚
1人じゃ絶対解決できなかったので感謝しかありません…!
複数回行動をするときは残りの行動が削除される仕様、了解しました!
これで今夜ぐっすり眠れます・・・ありがとうございました…!zzz( ˘ω˘ )
返信する

“MV:質問”に戻る