【解決済み】複数の変数を比較し最大値を指定変数に代入するプラグイン

ninjaman
記事: 14
登録日時: 2023年6月14日(水) 23:07

【解決済み】複数の変数を比較し最大値を指定変数に代入するプラグイン

投稿記事by ninjaman » 2023年7月22日(土) 22:46

指定した4つの変数の値を比較し最大値を別に指定した変数に代入するプラグインコマンドを作ろうとしているのですがうまくいきません。
例えば、以下のような4つの変数があったとして最大値である7を変数v[5]に代入したいです。
変数v[1]=4
変数v[2]=3
変数v[3]=6
変数v[4]=7
→変数v[5]に7を代入したい

下記のようなコードを作ってみたのですが「Cannot read property 'value' of null」とエラーが表示されゲームを起動することができません。初歩的な質問かもしれませんが回答いただけると助かります。
――――――――――――――――
/*:
* @target MZ
*
* @command maxvari
* @text 変数の最大値を指定変数に代入
* @desc 変数の最大値を代入
*
* @arg v0
* @text 代入される変数のID
* @desc 代入される変数のIDを指定してください。
* @type variable
* @default 1

* @arg v1
* @text 比較対象の変数1
* @desc 比較対象の変数1を指定してください。
* @type variable
* @default 1

* @arg v2
* @text 比較対象の変数2
* @desc 比較対象の変数2を指定してください。
* @type variable
* @default 1

* @arg v3
* @text 比較対象の変数3
* @desc 比較対象の変数3を指定してください。
* @type variable
* @default 1

* @arg v4
* @text 比較対象の変数4
* @desc 比較対象の変数4を指定してください。
* @type variable
* @default 1
*/

(() => {
"use strict";
let max = Math.max[$gameVariables.value(v1),$gameVariables.value(v2),$gameVariables.value(v3),$gameVariables.value(v4)];
$gameVariables.setValue(v0, max);
})();
―――――――――――――――――
最後に編集したユーザー ninjaman on 2023年7月24日(月) 20:25 [ 編集 1 回目 ]

アバター
Plasma Dark
記事: 720
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 複数の変数を比較し最大値を指定変数に代入するプラグイン

投稿記事by Plasma Dark » 2023年7月22日(土) 22:55

公式ドキュメントにプラグインコマンドの書き方が載っていますので、参考になるかと思います。
https://tkool.jp/mz/plugin/make/koushiki.html

あとは、 Math.max が関数である、というところさえわかってしまえば書けるかと。
https://developer.mozilla.org/ja/docs/W ... s/Math/max
アバター
剣崎 宗二
記事: 707
登録日時: 2016年11月12日(土) 20:36
連絡を取る:

Re: 複数の変数を比較し最大値を指定変数に代入するプラグイン

投稿記事by 剣崎 宗二 » 2023年7月23日(日) 12:42

少しだけ補足として。

エラー自体は「まだ$gameVariablesが初期化されていない時に読み取ろうとしている」事による物です。
このコードをそのまま見れば、ゲームが起動した直後、タイトル画面すら表示されていない時に実行されることになります。
なのでPlasma Darkさんの掲載してくださったリンクを見て、「どのタイミングでこれが実行されるべきで」それを達成する為に「どこに書けばよいのか」を念頭に置くと直るかも知れません。
----
-出先に居る場合回答が未テスト状態である事が多い為、テストは重々にお願いいたします。
-基本自分や友人の問題解決は自分で1からプラグインを書いているので、「こういうプラグインはありますか」に対しては助けになれません。ご了承ください。
ninjaman
記事: 14
登録日時: 2023年6月14日(水) 23:07

Re: 複数の変数を比較し最大値を指定変数に代入するプラグイン

投稿記事by ninjaman » 2023年7月23日(日) 21:18

返信ありがとうございます。
マニュアルは目を通していたのですが当方知識がなく初心者なもので自分の理解力ではあのコードが限界でした。より平易な説明をされていた他サイトを参考に以下のようにコードを訂正したところ何とかエラーは発生しなくなったのですが思ったような結果がでません。
――――――――――――――――――――――――
/*:
* @target MZ
*
* @command maxvari
* @text 変数の最大値を指定変数に代入
* @desc 変数の最大値を代入
*
* @arg v0
* @text 代入される変数のID
* @desc 代入される変数のIDを指定してください。
* @type variable
* @default 1

* @arg v1
* @text 比較対象の変数1
* @desc 比較対象の変数1を指定してください。
* @type variable
* @default 1

* @arg v2
* @text 比較対象の変数2
* @desc 比較対象の変数2を指定してください。
* @type variable
* @default 1

* @arg v3
* @text 比較対象の変数3
* @desc 比較対象の変数3を指定してください。
* @type variable
* @default 1

* @arg v4
* @text 比較対象の変数4
* @desc 比較対象の変数4を指定してください。
* @type variable
* @default 1
*/

(() => {
const pluginName = "Maxv";
let max = "";
$gameVariables = new Game_Variables();

PluginManager.registerCommand(pluginName, "maxvari", args => {
max = Math.max[$gameVariables.value(arg.v1),$gameVariables.value(arg.v2),$gameVariables.value(arg.v3),$gameVariables.value(arg.v4)];
$gameVariables.setValue(args.v0, max);

console.log($gameVariables.value(1));//←デバッグ用
console.log(args); //←デバッグ用
});
})();
――――――――――――――――――――――――
上記のプラグインコマンドが実行されるイベントを設定したキャラに話しかけるのですが、思うような変数の代入が行われませんでした。そもそも何度イベントキャラに話しかけてもコンソール画面に「console.log(args)」の結果など何も表示されないのでプラグインコマンドの実行すらできてないかもしれません。

公式サイトのマニュアルだけでは理解ができず手詰まりなため、具体的にどの部分に問題があるのか回答いただけるとありがたいです。よろしくお願いします。
アバター
剣崎 宗二
記事: 707
登録日時: 2016年11月12日(土) 20:36
連絡を取る:

Re: 複数の変数を比較し最大値を指定変数に代入するプラグイン

投稿記事by 剣崎 宗二 » 2023年7月23日(日) 21:56

確認すべきは以下です。

1. 正しいイベントが実行されている事
→プラグインコマンドの実行後辺りに「文章の表示」を入れてちゃんと実行されているのが「そのイベント」である事を確認してください。

2. 正しいプラグインコマンドが実行されている事
→該当のイベントのスクショを貼ってください。プラグイン名/コマンド名が間違っているとそれは実行されませんので。

3. エラー出てませんか?
→コンソール画面で赤い文字でエラーが出てませんか?
そもそも文法エラーがあるとプラグイン自体が「ロードされていない」事になります。

…ちなみに私から見るとMath.maxの使い方が疑わしいです。
他のコードを検索してMath.maxの使用法を見てみてください。
----
-出先に居る場合回答が未テスト状態である事が多い為、テストは重々にお願いいたします。
-基本自分や友人の問題解決は自分で1からプラグインを書いているので、「こういうプラグインはありますか」に対しては助けになれません。ご了承ください。
アバター
Plasma Dark
記事: 720
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 複数の変数を比較し最大値を指定変数に代入するプラグイン

投稿記事by Plasma Dark » 2023年7月23日(日) 22:15

本掲示板にはコードを貼り付けるためのタグが用意されています。
書き込みフォーム上部の Code ボタンで挿入できるので、活用してみてください。

何とかエラーは発生しなくなったのですが


プラグインのファイル名は Maxv.js になっているでしょうか。

PluginManager.registerCommand 関数は、第1引数にプラグインのファイル名を受け取ります。
ここが間違っている場合、プラグインコマンドは呼び出されず、何も起きません。

他に、ひとまず動かすために必要な誤りの認識は以下の通りです。
- Math.max の使い方が誤っていること
- arg が未定義であること

Math.max は関数
関数呼び出しに用いるのは [] ではなく () です。
MDNに Math.max の使い方の例が載っています。参考にしてみてください。
https://developer.mozilla.org/ja/docs/W ... s/Math/max

arg が未定義
argsをargとtypoしてしまっているため、プラグイン名を直して正しく呼び出せたとしても、argが未定義であるという旨のエラーが表示されます。
アバター
しぐれん
記事: 975
登録日時: 2017年3月28日(火) 22:22
連絡を取る:

Re: 複数の変数を比較し最大値を指定変数に代入するプラグイン

投稿記事by しぐれん » 2023年7月24日(月) 01:00

viewtopic.php?f=114&t=9936&p=37132
過去に作成済みです。
現在、プラグイン依頼はお休み中です。
ninjaman
記事: 14
登録日時: 2023年6月14日(水) 23:07

Re: 複数の変数を比較し最大値を指定変数に代入するプラグイン

投稿記事by ninjaman » 2023年7月24日(月) 20:25

返信ありがとうございます。おかげさまで意図した動作をするプラグインコマンドを作成することができました。
好感度システムのようなものを実装したくて好感度(変数)が一番高いキャラの判定に利用しようと思って作成しました。
しぐれん様、プラグインの情報ありがとうございます。私の検索の仕方が悪く当該プラグインを見つけることができませんでした。(スクリプトで同様のことをしようとする記事内容は見かけたのですが、再利用性やスクリプト誤入力防止の観点からプラグインコマンドで実装したい思いがあり今回プラグインの作成に至りました。先にプラグインを見つけられてら良かったと思う一方で、見つからなかったことで勉強になったという思いがあります…)

“MZ:質問” へ戻る