[解決済]戦闘計算式でプラグインコマンドを実行できるかどうか?

souma
記事: 33
登録日時: 2019年1月07日(月) 00:37

[解決済]戦闘計算式でプラグインコマンドを実行できるかどうか?

投稿記事by souma » 2021年2月15日(月) 01:43

お世話になります。

表題の通り、戦闘計算式でプラグインコマンドが実行できるようになっているのかどうか?
を知りたく思い投稿させて頂きました。

スクリプトでプラグインコマンドを実行する(this.pluginCommand)のは問題無いのですが、
これを計算式で実行しても反応してくれません。
他に方法があるのか、それともそんな方法は無いのか?
あるとしたらどうすれば良いのか?
ご教授して頂けると助かります。

なお、こちらではyep製の「Damage Core」を使用しており、
1行に纏めずとも計算式を設定できるようにしています。
(Damage Coreを採用していない時にも実行はできませんでした)

宜しくお願い致します。
最後に編集したユーザー souma on 2021年2月16日(火) 12:30 [ 編集 1 回目 ]

アバター
WTR
記事: 559
登録日時: 2015年12月22日(火) 19:14

Re: 戦闘計算式でプラグインコマンドを実行できるかどうか?

投稿記事by WTR » 2021年2月15日(月) 18:55

使用効果からコモンイベントを呼ぶほうが素直ではないかと思いますが
this を Game_Interpreter.prototype に置き換えたら出来ると思います。
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 戦闘計算式でプラグインコマンドを実行できるかどうか?

投稿記事by Plasma Dark » 2021年2月15日(月) 21:39

this を Game_Interpreter.prototype に置き換えたら出来ると思います。


Game_Interpreterのインスタンスに依存するプラグインコマンドは正常に動かないので、あんまりオススメできないですね。
計算式でプラグインコマンド実行は何かを実現するための手段であって、必須要件ではないように思えます。

実現したい内容を実装から切り離して書いたほうが、解決しやすいと思います。
アバター
WTR
記事: 559
登録日時: 2015年12月22日(火) 19:14

Re: 戦闘計算式でプラグインコマンドを実行できるかどうか?

投稿記事by WTR » 2021年2月15日(月) 22:43

Game_Interpreterのインスタンスに依存するプラグインコマンドは正常に動かないので、あんまりオススメできないですね。


やっぱりそういうものですか。実のところなんとなくそんな気はしていましたが…
ちなみに正常に動かないとは具体的にはどういうコトなんでしょうか。
動く場合も、動かない場合もある?
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 戦闘計算式でプラグインコマンドを実行できるかどうか?

投稿記事by Plasma Dark » 2021年2月16日(火) 03:16

ちなみに正常に動かないとは具体的にはどういうコトなんでしょうか。


ごく簡単な、正常に動かないプラグインの例を出します。

コード: 全て選択

(function () {
  'use strict';

  const _Game_Interpreter_clear = Game_Interpreter.prototype.clear;
  Game_Interpreter.prototype.clear = function () {
    _Game_Interpreter_clear.call(this);
    this._pluginVariable = 'some variable';
  };

  const _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
  Game_Interpreter.prototype.pluginCommand = function (command, args) {
    if (command === 'displayPluginVariable') {
      console.log(this._pluginVariable);
    }
    _Game_Interpreter_pluginCommand.call(this, command, args);
  };
})();


Game_Interpreter のインスタンスが _pluginVariable という状態を持っており、 displayPluginVariable でその値をコンソールに表示する、というだけのプラグインです。

まず、 displayPluginVariable プラグインコマンドを普通にイベントコマンドから呼び出した場合、 some variable が表示されます。
なぜかというと、そのイベントを動作させるための Game_Interpreter インスタンスを生成した時に initialize メソッドが呼ばれており、 _pluginVariable の値が some variable になっているからです。

では、 Game_Interpreter.prototype.pluginCommand('displayPluginVariable'); とスクリプトで呼び出した場合にどうなるかというと、コンソールには undefined が出力されます。

イベントコマンドから呼び出した場合と、上記スクリプトで呼び出した場合とで、 pluginCommand メソッドの中から参照する this が何者であるかが異なります。
前者は Game_Interpreter.prototype を継承したオブジェクト(new Game_Interpreter で生成した、 Game_Interpreter クラスのインスタンス)で、後者は Game_Interpreter.prototype オブジェクトそのものです。
souma
記事: 33
登録日時: 2019年1月07日(月) 00:37

Re: 戦闘計算式でプラグインコマンドを実行できるかどうか?

投稿記事by souma » 2021年2月16日(火) 12:28

WTR様、Plasma Dark様、ご回答、誠に有難う御座います。
返信が遅れて申し訳ありませんでした。

やはり難しいようですね…。
自分のやりたい事としては、「メニュー画面でアイテムやスキルを使用する際、
極力コモンイベントを経由するのを省きたい」というものでして…。

ツクール標準の機能によらない効果を持たせる場合、コモンイベントを使って、というのが
一般的だと思いますが、その場合メニューが自動で閉じてしまい、連続での使用に向かない、
という短所があります。
自分の場合、メニュー画面に立ち絵を表示させたりメニュー開く前と後にプラグインで
コモンイベントを実行させたりしている都合上、メニューの開閉に掛かる時間が
デフォルトのそれよりも僅かですが長くなってしまうので、尚の事でして…。

計算式で完結させてしまえば、メニューが閉じたりもしなくなるので色んなアイテム処理を
計算式に移行させていたのですが、プラグインコマンドを利用するもので躓いていた状態です。
コモンイベントを経由してもメニューが閉じなくなるプラグインを試してみましたが、
競合するようで採用はできず。

取り合えず、WTR様に教わった方法で機能するものはそちらを採用して、
無理なものはアイテム使用では無くイベントとして実行するなりしたいと思います。

お二方とも、貴重なご助言、有難う御座いました!
アバター
WTR
記事: 559
登録日時: 2015年12月22日(火) 19:14

Re: [解決済]戦闘計算式でプラグインコマンドを実行できるかどうか?

投稿記事by WTR » 2021年2月16日(火) 17:10

前者は Game_Interpreter.prototype を継承したオブジェクト(new Game_Interpreter で生成した、 Game_Interpreter クラスのインスタンス)で、後者は Game_Interpreter.prototype オブジェクトそのものです。

Plasma Darkさん

なるほど。たしかに。
詳細解説ありがとうございます。
ということは例えば戦闘中であれば Game_Troop なんかが作っている Game_Interpreter のインスタンスを経由したら直接的には問題なくなる? …などと考えてしまいましたが
トリッキーなのには変わりないのでよくないんでしょうかね。

soumaさん

えらく中途半端な情報を出してしまったようですみません。
出来るか出来ないかでいえば出来るような気がするのですがやはりあまり筋が良くないのかな…とは感じます。
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: [解決済]戦闘計算式でプラグインコマンドを実行できるかどうか?

投稿記事by Plasma Dark » 2021年2月17日(水) 03:52

戦闘中であれば Game_Troop なんかが作っている Game_Interpreter のインスタンスを経由したら直接的には問題なくなる?


戦闘中に限って言えば、Game_Interpreter インスタンスの状態に依存したプラグインコマンドも動くようにはなります。
が、戦闘中に限った話で、メニュー画面で使おうとすると、どのインスタンスを使うべきか考えなければならず、バグの元になります。
(マップの持つインスタンス、イベントの持つインスタンス、コモンイベントの持つインスタンス、どれがベターかは状況を見て判断しなければなりません)

それができるだけの技術があるのであれば、プラグインコマンドを介さずに望みのスキルの効果を実現するようなプラグインを書いてしまったほうが早いし安全だと思います。
アバター
WTR
記事: 559
登録日時: 2015年12月22日(火) 19:14

Re: [解決済]戦闘計算式でプラグインコマンドを実行できるかどうか?

投稿記事by WTR » 2021年2月17日(水) 12:07

タイトルが戦闘計算式だったからか戦闘中の話だと思いこんで読み飛ばしてしまってたんですが
本来やりたいことはメニューの処理なんですね。

解決済ということになってしまっていますが
ストレートな解決策をもうちょっと探してみてもいいように思います。

競合で使えなかったというプラグインをどうにかできないのかとか
コモンイベントの実行内容の最後にメニューに自動で戻る処理を埋め込んでも解決するかもしれない
いま試すことができないのでただの思い付きですが…

あと計算式から実行できたとしても
処理によっては結局ダメなケースがある気がしてきました。
たとえばメッセージを表示するプラグインコマンドがあったとすると(イベントでやりゃいいことなのでないかもしれませんが
プラグインコマンド自体は処理できてもマップに戻らないとメッセージは表示されないと思います。
これも試してないので予想ですが…

やはり一旦マップに戻る仕様には妥当な理由があるように思われるので
マップに戻らないで済ませる方法より、マップから自動で復帰する方法を考えるのが妥当ではないかという気がしてきました。
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
souma
記事: 33
登録日時: 2019年1月07日(月) 00:37

Re: [解決済]戦闘計算式でプラグインコマンドを実行できるかどうか?

投稿記事by souma » 2021年2月17日(水) 21:42

WTR 様、ご助言、有難う御座います。

マップから自動で復帰する方法として、terunon様のRestoreMenuAfterCommon.js
https://tm.lucky-duet.com/viewtopic.php?t=1203
を使用させて頂いた事があるのですが、前述した通り、
他のプラグインの都合でメニューの開閉に(デフォ状態より)時間が掛かってしまう状態なので、
1回きりの使用なら兎も角、プレイヤーに常用させるべきものにしてはやや不便かな、との
結論に辿り着いた次第です。(デフォのメニュー開閉速度なら上記プラグインで問題ないのですが)

プラグインでメッセージの表示が強制される場合は、確かに使えないでしょうが、
今の所はそうしたプラグインを使用してはいないので問題ありません。
とは言え、スキル(アイテム)の効果をメッセージとしては表示する、というのは
重要だと考えていますので、kido様のTicker.js
(リンクが途切れてる? ようなのでurl表記省略)
を使用させて頂いて、一文ポップアップとして表示しています。
メニューを開いた状態でポップアップメッセージが表示できるので、凄まじく便利です。
こちらが無かったら多分この方法を取ってなかったと思います。

教わったGame_Interpreter.prototype.pluginCommandを試してみて、
二つのプラグインで動作しました。
まだ検証とかはしてませんし、まだ試してないものもありますが…。

トリアコンタン様のSceneGlossary.js
https://triacontane.blogspot.com/2016/04/blog-post_20.html
他の件でメニューの項目が多くなり過ぎているため、これ以上追加したくなく
アイテムでの使用として使っていた。
計算式での使用にする事で、メニューの開閉が発生しなくなりました。

yana様のSceneFormation.js
https://w.atwiki.jp/pokotan/pages/3.html
戦闘参加可能人数をプレイヤーに設定できるようにする為に用意したスキル。

自分としては、できる事が増えたので感謝以外にありません!

“MV:質問” へ戻る