ページ 11

【プラグイン制作にご助言ください】使用効果にコモンイベントが含まれているアイテム・スキルを繰り返し使えるプラグイン

Posted: 2024年7月30日(火) 15:15
by ムノクラ
▼やりたい事
1.アイテム・スキルの実行内容にコモンイベントが含まれている場合、使用完了時に元の選択画面(アイテム等を選んだカーソル位置)へ戻したい。
2.コモンイベントに文章の表示等が含まれている場合、マップ画面で実行した後に元の選択画面(アイテム等を選んだカーソル位置)へ戻したい。

▼出来ていること
1.は一応できています。
無し蛙氏のコードを参考にさせていただきました。

無し蛙氏のコードをベースに汎用性と、コモンイベントにスクリプトを入力するのを省くのを目標としています。
viewtopic.php?t=10938

▼出来ていないこと
2.コモンイベントに文章の表示等が含まれている場合、マップ画面で実行した後に元の選択画面(アイテム等を選んだカーソル位置)へ戻したい。
※コモンイベントの最後にスクリプト
this.setWaitMode('message');
を入れれば実現できるはずですが、これをプラグイン内に組み込みたいです。
例:◆レベルの増減:パーティ全体, + 1 (レベルアップを表示)


MZ版ですが、1.を満たしたプラグインはあるのですが、Xにて質問したところ、設計アプローチが異なるので、メッセージ関連は実行されないとの回答を得ました。
https://github.com/nuun888/MZ/blob/mast ... wCommon.js


数日間こねくり回したのですが、どうしても解決できず、助言をいただきたくお願いいたします。
動作確認する環境を作るのもお手間と考え、サンプルを添付します。
新規プロジェクトに上書きください。

コメントアウトが多く読みにくいかも知れませんが、何を試みたのか経緯を残しておこうとの考えからです。
ご容赦ください。

Re: 【プラグイン制作にご助言ください】使用効果にコモンイベントが含まれているアイテム・スキルを繰り返し使えるプラグイン

Posted: 2024年7月30日(火) 22:05
by Plasma Dark
MNKR_RepeatItemAfterCommon.js は、 Scene_ItemBase.prototype.checkCommonEvent で処理を完結させようとしていますが、このアプローチは成功しなさそうです。
何らか戻り先の情報を保持しておき、コモンイベントの実行終了を検知して、対象シーンに遷移しカーソルを動かすというのが正攻法ではないかと思われます。
マップ上のイベント制御なので、 Game_Map.prototype.update の末尾に、戻り先が保持されているかどうか、イベントの実行が完了しているかどうかを判定して戻り先に戻る処理を書くというのが最もシンプルな実装になりそうです。


さて、 NUUN_ContinuationItemWindowCommon.js で文章の表示が実行されないのは、アイテムシーンにメッセージウィンドウがないからです。
アイテムシーンを抜けるとそこでメッセージが表示されます。

アイテムシーンにメッセージウィンドウを追加できればアイテムシーン上でメッセージの表示を行うことができます。
MZ向けにはアイテムシーンにメッセージウィンドウを追加できるプラグインがあります。

MV向けにも似たプラグインを書かなかったかと確認してみたら、メニューシーンに追加するものはありました。

このあたりを参考にアイテムシーンにメッセージウィンドウを追加すれば、わざわざマップに戻ってからアイテムシーンを開き直す必要はない気がします。

ただ、文章の表示に限らずマップシーン以外では制限されるイベントコマンドがありそうです。
そういったものまで含めて全て対応しようとすると、一度マップに戻るアプローチにも旨味はあるのかもしれません。
(が、そこまでカバーしたいものなのかどうかは考えてみてください)

Re: 【プラグイン制作にご助言ください】使用効果にコモンイベントが含まれているアイテム・スキルを繰り返し使えるプラグイン

Posted: 2024年7月31日(水) 12:21
by ムノクラ
Plasma Dark さんが書きました:MNKR_RepeatItemAfterCommon.js は、 Scene_ItemBase.prototype.checkCommonEvent で処理を完結させようとしていますが、このアプローチは成功しなさそうです。
何らか戻り先の情報を保持しておき、コモンイベントの実行終了を検知して、対象シーンに遷移しカーソルを動かすというのが正攻法ではないかと思われます。
マップ上のイベント制御なので、 Game_Map.prototype.update の末尾に、戻り先が保持されているかどうか、イベントの実行が完了しているかどうかを判定して戻り先に戻る処理を書くというのが最もシンプルな実装になりそうです。


さて、 NUUN_ContinuationItemWindowCommon.js で文章の表示が実行されないのは、アイテムシーンにメッセージウィンドウがないからです。
アイテムシーンを抜けるとそこでメッセージが表示されます。

アイテムシーンにメッセージウィンドウを追加できればアイテムシーン上でメッセージの表示を行うことができます。
MZ向けにはアイテムシーンにメッセージウィンドウを追加できるプラグインがあります。

MV向けにも似たプラグインを書かなかったかと確認してみたら、メニューシーンに追加するものはありました。

このあたりを参考にアイテムシーンにメッセージウィンドウを追加すれば、わざわざマップに戻ってからアイテムシーンを開き直す必要はない気がします。

ただ、文章の表示に限らずマップシーン以外では制限されるイベントコマンドがありそうです。
そういったものまで含めて全て対応しようとすると、一度マップに戻るアプローチにも旨味はあるのかもしれません。
(が、そこまでカバーしたいものなのかどうかは考えてみてください)
ご返信いただき、ありがとうございます。
ご指摘の通り、 Scene_ItemBase.prototype.checkCommonEvent で処理を完結させるのは無理があったようです。
メニューから抜けられないバグを抱えていた事に気づいていませんでした。

ご指摘の通り、 Game_Map.prototype.update の末尾に、戻り先に戻る処理を書く事でバグが解消されました。

希望としては、イベントコマンドを全て使えるようにしたいので、マップで実行してから戻る流れを作りたく考えています。

Scene_ItemBase.prototype.checkCommonEvent に関する記述を削除し、Game_Map.prototype.update を下記に変更したのですが、メッセージ関係が反応しないまま各シーンに戻ってしまいます。

コード: 全て選択

    const _Game_Map_update = Game_Map.prototype.update;
    Game_Map.prototype.update = function (sceneActive) {
        _Game_Map_update.call(this, sceneActive);

        this._interpreter.setWaitMode("message");
        this.updateInterpreter();

        if (repeatItem) {
            if (symbolArray[0] === 'i') {
                SceneManager.goto(Scene_Item);
            }
            if (symbolArray[0] === 's') {
                SceneManager.goto(Scene_Skill);
            }
            repeatItem = false;
        }
    };
メニューを閉じると溜まっていたメッセージが表示されるようです。
Game_Map.prototype.updateEvents も試したりしたのですが、思うように動きませんでした。

追加のご助言をいただければ幸いです。

Re: 【プラグイン制作にご助言ください】使用効果にコモンイベントが含まれているアイテム・スキルを繰り返し使えるプラグイン

Posted: 2024年7月31日(水) 23:50
by Plasma Dark
イベントコマンドを全て使えるようにしたい
流石に考慮すべきパターンが多すぎて現実的ではないように思います。
実際に対応したいイベントコマンドが何であるか、想定するターゲットはある程度定めておくことを推奨します。
そうでなければ、それこそアイテムシーンにメッセージウィンドウを足すだけで済むことになりかねませんし。

それはそれとして、 Game_Map.prototype.update をフックして足す処理は、条件を満たした際にアイテム・スキルシーンに戻るもののみで構いません。
インタプリタの更新は元々の処理の中でやっていますし、ウェイトモードの設定を毎フレームやるのはかなり謎の処理です。

そして、条件が緩すぎて一瞬で元のシーンに戻ってしまいます。
戻り先が保持されているかつ、イベントの実行が完了している、が正しそうです。

コード: 全て選択

if (sceneActive && !this.isEventRunning() && repeatItem) {
  // 戻り処理
}
こんな感じにすると、とりあえずイベント実行後に戻ってくれそうです。

余談ですが、レベルアップイベントコマンドの処理に、レベルアップメッセージの表示は含まれません。
レベルアップした際にレベルアップメッセージをメッセージキューに積むというツクールの仕様があって、その結果としてイベントコマンド実行の直後にメッセージが表示されています。
なので、動作確認に用いるにはレベルアップのイベントコマンド単独で設定したコモンイベントだと混乱を招きます。
文章の表示イベントコマンドを使うほうが混乱は少なそうです。