【解決】コンフィグに新しい項目を+したい

東 蒼汰

ユーザー
●やりたい事:
 コンフィグで数値を変えると、読み込むWindow画像が変るシステムを作ってみたい。
 その前段階として、コンフィグ画面で変数を変更出来る項目を作る。

●やってみた事:
 rmmz_windowsで以下の部分を変更してみました。

Window_Options.prototype.addVolumeOptions = function() {
this.addCommand(TextManager.bgmVolume, "bgmVolume");
this.addCommand(TextManager.bgsVolume, "bgsVolume");
this.addCommand(TextManager.meVolume, "meVolume");
this.addCommand(TextManager.seVolume, "seVolume");
this.addCommand("画像の変更", "changegraphic");
};

Window_Options.prototype.drawItem = function(index) {
const title = this.commandName(index);

if (title === "画像の変更") {
  let status = $gameVariables.value(1);
const rect = this.itemLineRect(index);

const statusWidth = this.statusWidth();
const titleWidth = rect.width - statusWidth;
this.resetTextColor();
this.changePaintOpacity(this.isCommandEnabled(index));
this.drawText(title, rect.x, rect.y, titleWidth, "left");
this.drawText(status, rect.x + titleWidth, rect.y, statusWidth, "right");

if (Input.isTriggered('right')) {

  $gameVariables.setValue(1, $gameVariables.value(1) + 1);

}
if (Input.isTriggered('left')) {


  $gameVariables.setValue(1, $gameVariables.value(1) + 1);

}



} else {


const status = this.statusText(index);
const rect = this.itemLineRect(index);
const statusWidth = this.statusWidth();
const titleWidth = rect.width - statusWidth;
this.resetTextColor();
this.changePaintOpacity(this.isCommandEnabled(index));
this.drawText(title, rect.x, rect.y, titleWidth, "left");
this.drawText(status, rect.x + titleWidth, rect.y, statusWidth, "right");

}

};


●結果としてできた事・できなかった事:
 コンフィグウインドウに項目は+されました。
 左右を押せば変数も上昇します。
 ただし内容がtrue or falseのままの所為か左右順番に押さないと変数が+1ずつ上昇しません。

●必要な情報:
 項目の内容をtrue or falseから変更する方法。
 右キーを押せば+1、左キーを押せば-1に変更出来る方法。
 
前回に比べてより具体的に書かれていて良いですね。
できれば前回のスレッドを打ち捨てたままにせず、解決までの道のりを後人が辿れるようにリンクを貼るなどしていただけたほうが良いと思います。

コンフィグ画面で変数を変更出来る項目を作る。
これだけであれば、CustomizeConfigItem.jsを利用すれば実現できますが、もうお試しになっているでしょうか。

もし既存のプラグインで目的を達成できない場合、何が足りないのかをもう少し詳しく書いていただけると、解決に近づきやすいです。

rmmz_windowsで以下の部分を変更してみました。
rmmz_XXXX.jsを直接編集するのではなく、同じ内容が書かれたjsファイルをプラグインとして読み込むようにしたほうが、管理しやすいと思います。

ただし内容がtrue or falseのままの所為か左右順番に押さないと変数が+1ずつ上昇しません。
drawItem関数の責務はオプション項目と値の描画であり、値の操作は別の関数が担っています。
描画の際にしか実行されない関数なので、ここでキー入力を監視しても意味がありません。
cursorRight, cursorLeftの処理を理解して変更することになります。

参考用に、オプション項目を追加するプラグインのサンプルを書きました。
どうしてもコードを書いて解決したい場合にはこれやCustomizeConfigItem.jsを参考にすると良いと思います。

サンプルでは左右キーの操作や変数の操作を行っていません。
特に変数の操作については、オプションがタイトル画面からも開けるため、しっかり仕様を考えて書かないと容易にバグります。
変数は、個々のセーブデータに含まれます。
セーブデータごとに異なる設定値を使いたいのか、その他のオプション項目同様に全てのセーブデータで共通の値を使いたいのか、はっきりさせておく必要があります。

なお、ここまではあくまで自分で書くなら、という前提での説明です。
あえて自分で書いて勉強したいとかでなければ、CustomizeConfigItem.jsを使うだけで済む話です。
 
前回に比べてより具体的に書かれていて良いですね。
できれば前回のスレッドを打ち捨てたままにせず、解決までの道のりを後人が辿れるようにリンクを貼るなどしていただけたほうが良いと思います。


これだけであれば、CustomizeConfigItem.jsを利用すれば実現できますが、もうお試しになっているでしょうか。

もし既存のプラグインで目的を達成できない場合、何が足りないのかをもう少し詳しく書いていただけると、解決に近づきやすいです。


rmmz_XXXX.jsを直接編集するのではなく、同じ内容が書かれたjsファイルをプラグインとして読み込むようにしたほうが、管理しやすいと思います。


drawItem関数の責務はオプション項目と値の描画であり、値の操作は別の関数が担っています。
描画の際にしか実行されない関数なので、ここでキー入力を監視しても意味がありません。
cursorRight, cursorLeftの処理を理解して変更することになります。

参考用に、オプション項目を追加するプラグインのサンプルを書きました。
どうしてもコードを書いて解決したい場合にはこれやCustomizeConfigItem.jsを参考にすると良いと思います。

サンプルでは左右キーの操作や変数の操作を行っていません。
特に変数の操作については、オプションがタイトル画面からも開けるため、しっかり仕様を考えて書かないと容易にバグります。
変数は、個々のセーブデータに含まれます。
セーブデータごとに異なる設定値を使いたいのか、その他のオプション項目同様に全てのセーブデータで共通の値を使いたいのか、はっきりさせておく必要があります。

なお、ここまではあくまで自分で書くなら、という前提での説明です。
あえて自分で書いて勉強したいとかでなければ、CustomizeConfigItem.jsを使うだけで済む話です。

DarkPlasmaさんに教えて頂いたコードを元に(DarkPlasmaさんのコードには問題は有りません)、自分で同じコードを書いてみたのですが……​

何故かwindowOptions.Symbolsameで returnの内容が合っているにも関わらず、IF構文で分岐しない様なのです。​


return CGNTS.call(this, index); の上に AudioManager.playSe({name: "Absorb1", volume: 100, pitch: 100});書いたら音が鳴りましたし。
すみませんが
DarkPlasmaさん以外でも、このスレッドを見た方にお尋ねします。
このコードの間違っている点は何処なのでしょうか?
前回に比べてより具体的に書かれていて良いですね。
できれば前回のスレッドを打ち捨てたままにせず、解決までの道のりを後人が辿れるようにリンクを貼るなどしていただけたほうが良いと思います。


これだけであれば、CustomizeConfigItem.jsを利用すれば実現できますが、もうお試しになっているでしょうか。

もし既存のプラグインで目的を達成できない場合、何が足りないのかをもう少し詳しく書いていただけると、解決に近づきやすいです。


rmmz_XXXX.jsを直接編集するのではなく、同じ内容が書かれたjsファイルをプラグインとして読み込むようにしたほうが、管理しやすいと思います。


drawItem関数の責務はオプション項目と値の描画であり、値の操作は別の関数が担っています。
描画の際にしか実行されない関数なので、ここでキー入力を監視しても意味がありません。
cursorRight, cursorLeftの処理を理解して変更することになります。

参考用に、オプション項目を追加するプラグインのサンプルを書きました。
どうしてもコードを書いて解決したい場合にはこれやCustomizeConfigItem.jsを参考にすると良いと思います。

サンプルでは左右キーの操作や変数の操作を行っていません。
特に変数の操作については、オプションがタイトル画面からも開けるため、しっかり仕様を考えて書かないと容易にバグります。
変数は、個々のセーブデータに含まれます。
セーブデータごとに異なる設定値を使いたいのか、その他のオプション項目同様に全てのセーブデータで共通の値を使いたいのか、はっきりさせておく必要があります。

なお、ここまではあくまで自分で書くなら、という前提での説明です。
あえて自分で書いて勉強したいとかでなければ、CustomizeConfigItem.jsを使うだけで済む話です。




const CGI = "CGIS"; //定数宣言項目の種類 チェンジグラフィックアイテム = "チェンジグラフィックアイテムシンボル"//

ConfigManager.changegraphic = 0; //項目値の初期化

function CGIplus(sceneOptions) {
//定義 チェンジグラフィックアイテムを足す(シーン名) {

const OWCI = sceneOptions.maxCommands;
//定数宣言 オプションウインドウコマンドアイテム = 元データ//

sceneOptions.maxCommands = function () {
//元データ = 定義() {//

return OWCI.call(this) + 1;

//答え OWCI(sceneOptions.maxCommands)の内容変更 + 1//

}

};

CGIplus(Scene_Options.prototype);
//チェンジグラフィックアイテムを足すは()内のシーン設定を受け取る//

function WCGIplus(windowOptions) {
//定義 ウインドウチェンジグラフィックアイテムを足す(シーン名) {

const CGNIM = windowOptions.makeCommandList;
//チェンジグラフィック新アイテム生成 = 元データ//

windowOptions.makeCommandList = function () {
//元データ = 定義() {//

CGNIM.call(this);
//CGNIM(windowOptions.makeCommandList)の呼び出し//

 this.addChangeGraphicOption();
//this.addChangeGraphicOption(アイテム内容)の呼び出し//

};

windowOptions.addChangeGraphicOption = function () {
//アイテム内容 = 定義 () {//

this.addCommand("画像の変更", CGI);
//アイテム内容(名前, シンボル)//

};

const CGNTS = windowOptions.statusText;
//定数宣言 チェンジグラフィック普通テキストステータス = 元データ//

windowOptions.statusText = function (index) {
//元データ = 定義 (処理位置) {//

const symbol = this.commandSymbol(index);
//定数宣言 シンボル文字列 = 元データ(処理位置)//

if (this.Symbolsame(Symbol)) {
//もしも項目の種類とシンボルが同じだった場合//

return this.numberStatusText(this.getConfigValue(symbol));
//答え 新しいテキストに変更(シンボル)//

}

return CGNTS.call(this, index);
//答え それ以外は普通のテキスト表示//

};

windowOptions.Symbolsame = function (symbol) {
//ウインドウオプションでシンボルと同じ = 定義 (シンボル) {//

return symbol === CGI;
//答え シンボル文字と項目の種類が一緒//

};

windowOptions.numberStatusText = function (value) {
//ウインドウオプションの新しい文字ステータス = 定義 (数値) {//

return `${value}`;
//答え グローバル変数X(後で変更)//

};

windowOptions.maxValue = function (symbol) {
//ウインドウオプションの最大値 = 定義 (数値) {//

return 3;
//答え 3 必要に応じてsymbolで分岐//

};

windowOptions.addValue = function (symbol, amount) {
this.changeValue(
symbol,
(this.getConfigValue(symbol) + amount + this.maxValue() + 1) % (this.maxValue(symbol) + 1)
);
};

const _processOk = windowOptions.processOk;
windowOptions.processOk = function () {
const symbol = this.currentSymbol();
if (this.Symbolsame(symbol)) {
this.addValue(symbol, 1);
} else {
_processOk.call(this);
}

};
}

WCGIplus(Window_Options.prototype);
 
ぱっと見では
if (this.Symbolsame(Symbol)) {
//もしも項目の種類とシンボルが同じだった場合//
ここのif文の中の this.Symbolsame(Symbol) で、Symbol と頭が大文字なのが原因のように思います。
さすがにこの量、しかも整形されていないコードを読む気は起こりませんし、IF文と言われてもどこのIF文?って感じだったのですが、偶然目に付いたので分かりました。

それはともかく、DarkPlasmaさんの
これだけであれば、CustomizeConfigItem.jsを利用すれば実現できますが、もうお試しになっているでしょうか。
もし既存のプラグインで目的を達成できない場合、何が足りないのかをもう少し詳しく書いていただけると、解決に近づきやすいです。
には返答された方がよろしいかと思います。
 

pandaさんの書かれた通りthis.Symbolsame()の引数が間違っていました。​

それを修正しても新たな項目の値がundefinedを表示している為、再度原因を皆様に御尋ね致します。
それとpandaさんがおっしゃていた
DarkPlasmaからの
これだけであれば、CustomizeConfigItem.jsを利用すれば実現できますが、もうお試しになっているでしょうか。
もし既存のプラグインで目的を達成できない場合、何が足りないのかをもう少し詳しく書いていただけると、解決に近づきやすいです。
に付きましては、プラグインの勉強をしようと思いたち自分でコードを書いているので、他人のプラグインでオプション項目を増やしても意味が有りません。
ディスカッションの種類をプラグイン制作のノウハウを交換したり、アドバイスを受ける為にプラグイン制作・技術にしているのもその為です

話を戻しますが新しい項目にundefinedの値が出てしまっている為、元のDarkPlasmaさんのコード(左/赤)とそれを勉強の為書き写した私のコード(右/青)を書き込みます。
もしこれを見てundefinedの原因が分かる方がいらっしゃいましたら、その原因を御教え下さい。



const changeGraphicSymbol = "changegraphic";           const CGI = "CGIS";

ConfigManager.changegraphic = 0;                
ConfigManager.changegraphic = 0;

function Scene_Options_ChangeGraphicMixIn(sceneOptions) {     
function CGIplus(sceneOptions) {

const _maxCommands = sceneOptions.maxCommands;        
const OWCI = sceneOptions.maxCommands;

sceneOptions.maxCommands = function () {             
sceneOptions.maxCommands = function () {

return _maxCommands.call(this) + 1;                
return OWCI.call(this) + 1;

};

}

Scene_Options_ChangeGraphicMixIn(Scene_Options.prototype);    
CGIplus(Scene_Options.prototype);

function Window_Options_ChangeGraphicMixIn(windowOptions) {   
function WCGIplus(windowOptions) {

const _makeCommandList = windowOptions.makeCommandList;    
const CGNIM = windowOptions.makeCommandList;

windowOptions.makeCommandList = function () {          
windowOptions.makeCommandList = function () {

_makeCommandList.call(this);                   
CGNIM.call(this);

this.addChangeGraphicOption();                  
this.addChangeGraphicOption();

};

windowOptions.addChangeGraphicOption = function () {       
windowOptions.addChangeGraphicOption = function () {

this.addCommand("画像の変更", changeGraphicSymbol);       
this.addCommand("画像の変更", CGI);

};

const _statusText = windowOptions.statusText;            
const CGNTS = windowOptions.statusText;

windowOptions.statusText = function (index) {            
windowOptions.statusText = function (index) {

const symbol = this.commandSymbol(index);             
const symbol = this.commandSymbol(index);

if (this.isChangeGraphicSymbol(symbol)) {              
if (this.Symbolsame(symbol)) {

return this.numberStatusText(this.getConfigValue(symbol));       
return this.numberStatusText(this.getConfigValue(symbol));

}

return _statusText.call(this, index);                  
return CGNTS.call(this, index);

};

windowOptions.isChangeGraphicSymbol = function (symbol) {     
windowOptions.Symbolsame = function (symbol) {

return symbol === changeGraphicSymbol;              
return symbol === CGI;

};

windowOptions.numberStatusText = function (value) {         
windowOptions.numberStatusText = function (value) {

return `${value}`;                         
return `${value}`;

};

}

Window_Options_ChangeGraphicMixIn(Window_Options.prototype);  
WCGIplus(Window_Options.prototype);

})();
 
プラグインの勉強をしようと思いたち自分でコードを書いているので、他人のプラグインでオプション項目を増やしても意味が有りません。

そうであれば、そう言っていただけないと回答者としては無視されたように感じてしまいます。
次からは気をつけるようにしてくださいね。

それから、東さんはもう少しもらった回答を落ち着いて読んでみたほうが良いでしょう。

整形されていないコードを読む気は起こりません

これはとても重要な回答です。あなたの提示したコードは整形されていないので読む気が起こらない、という話をしています。
さて、以前にもあなたへの回答で書いた通り、この掲示板にはコードをわかりやすく整形して表示するためのタグが存在します。

書き込みフォーム上部の三点メニューから開けるサブメニューで、一番右にあるボタンから挿入できます。
言語ごとのシンタックスハイライトを効かせられるので、コードの可視性が飛躍的に向上します。

コードの差分を見てほしいなら、gistなりgithubなりでわかりやすく表示すると良いでしょう。
掲示板に、左右に並べたコードをベタッと貼り付けられても、読む気にはなれません。

この様子だと、普段コードを書かれているエディタが気になります。
間違ってもメモ帳やサクラエディタを使わないようにしてください。
初心者が使うのであれば特に、デフォルトでシンタックスハイライトの効くVSCodeがオススメです。
 
そうであれば、そう言っていただけないと回答者としては無視されたように感じてしまいます。
次からは気をつけるようにしてくださいね。

それから、東さんはもう少しもらった回答を落ち着いて読んでみたほうが良いでしょう。



これはとても重要な回答です。あなたの提示したコードは整形されていないので読む気が起こらない、という話をしています。
さて、以前にもあなたへの回答で書いた通り、この掲示板にはコードをわかりやすく整形して表示するためのタグが存在します。

書き込みフォーム上部の三点メニューから開けるサブメニューで、一番右にあるボタンから挿入できます。
言語ごとのシンタックスハイライトを効かせられるので、コードの可視性が飛躍的に向上します。

コードの差分を見てほしいなら、gistなりgithubなりでわかりやすく表示すると良いでしょう。
掲示板に、左右に並べたコードをベタッと貼り付けられても、読む気にはなれません。

この様子だと、普段コードを書かれているエディタが気になります。
間違ってもメモ帳やサクラエディタを使わないようにしてください。
初心者が使うのであれば特に、デフォルトでシンタックスハイライトの効くVSCodeがオススメです。

こちらの返答に対し、少し思った事が有りますので少し質問に質問を返させて頂きます。
ディスカッションの内容とは離れたものに成りますが、私のスレッドの返答者DarkPlasmaさんからの返信の為お許し下さい。

プラグインの勉強をしようと思いたち自分でコードを書いているので、他人のプラグインでオプション項目を増やしても意味が有りません。

そうであれば、そう言っていただけないと回答者としては無視されたように感じてしまいます。
次からは気をつけるようにしてくださいね。

この返信に付きましは、このディスカッションはプラグインの制作・技術に対して回答を頂く所です。
質問に答えて頂いて大変有難く思いますが、代用のプラグイン使えばと書かれても回答に困りますし、DarkPlasmaさんがどんな気持ちで書いているのか分からない以上、『このディスカッションはプラグインの制作・技術に対して回答を求める所ですよ』とは返信は出きませんでした。

次にpandaさんもそうですが、整形に付いて。
こういう言い方は如何かと思いましたが、形を整えろと言うのであればどの様に形を整えれば良いか説明するか例を出して頂いた方が良いのではと私は思います。
DarkPlasmaさんの返信で何が言いたいのかは理解出来ましたが……

最後にエディタに付いてですか、私はメモ帳に書いています。
こう言っては何ですが、スクリプトいじる人が皆そう言うモノを知っている訳では有りません。
まぁ私の場合Xで教えてもらってはいたのですが、メモ帳で書いていてここまでバカにされるとは思いませんでした。

この投稿の後、更なるオプションのコードを使い再度何が悪いのか聞いてみようと思います。
 
コンフィグに新たな項目を増やし、その項目で入力した数値でウインドウ画像を変更するプラグインを作ってみたい。
そのプロトタイプのコードをDarkPlasmaさんに書いて貰ったので、練習の為自分で同じコード(関数名は別)を書いてプラグインを作ってみた所、新たな項目の値がundefinedを表示してしまいました。
もしこれを見てundefinedの原因が分かる方がいらっしゃいましたら、その原因を御教え下さい。


DarkPlasmaさんのコード
JavaScript:
 const changeGraphicSymbol = "changegraphic";
 ConfigManager.changegraphic = 0;

 function Scene_Options_ChangeGraphicMixIn(sceneOptions) {
 const _maxCommands = sceneOptions.maxCommands;
 sceneOptions.maxCommands = function () {
 return _maxCommands.call(this) + 1;
 };
 }

 Scene_Options_ChangeGraphicMixIn(Scene_Options.prototype);

 function Window_Options_ChangeGraphicMixIn(windowOptions) {
 const _makeCommandList = windowOptions.makeCommandList;
 windowOptions.makeCommandList = function () {
 _makeCommandList.call(this);
 this.addChangeGraphicOption();
 };

 windowOptions.addChangeGraphicOption = function () {
 this.addCommand("画像の変更", changeGraphicSymbol);
 };

 const _statusText = windowOptions.statusText;

 windowOptions.statusText = function (index) {
 const symbol = this.commandSymbol(index);
 if (this.isChangeGraphicSymbol(symbol)) {
 return this.numberStatusText(this.getConfigValue(symbol));
 }
 return _statusText.call(this, index);
 };
 windowOptions.isChangeGraphicSymbol = function (symbol) {
 return symbol === changeGraphicSymbol;
 };
 windowOptions.numberStatusText = function (value) {
 return `${value}`;
 };
 windowOptions.maxValue = function (symbol) {
 return 3;
 };
 windowOptions.addValue = function (symbol, amount) {
 this.changeValue(
 symbol,
 (this.getConfigValue(symbol) + amount + this.maxValue() + 1) % (this.maxValue(symbol) + 1)
 );
 };

 const _processOk = windowOptions.processOk;
 windowOptions.processOk = function () {
 const symbol = this.currentSymbol();
 if (this.isChangeGraphicSymbol(symbol)) {
 this.addValue(symbol, 1);
 } else {
 processOk.call(this);
 }
 };

 }

 Window_Options_ChangeGraphicMixIn(Window_Options.prototype);

 })();


私が書いたもの
JavaScript:
 const CGI = "CGIS";
 ConfigManager.changegraphic = 0;

 function CGIplus(sceneOptions) {
 const OWCI = sceneOptions.maxCommands;
 sceneOptions.maxCommands = function () {
 return OWCI.call(this) + 1;
 }
 };

 CGIplus(Scene_Options.prototype);

 function WCGIplus(windowOptions) {
 const CGNIM = windowOptions.makeCommandList;
 windowOptions.makeCommandList = function () {
 CGNIM.call(this);
 this.addChangeGraphicOption();
 };

 windowOptions.addChangeGraphicOption = function () {
 this.addCommand("画像の変更", CGI);
 };

 const CGNTS = windowOptions.statusText;
 windowOptions.statusText = function (index) {
 const symbol = this.commandSymbol(index);
 if (this.Symbolsame(symbol)) {
 return this.numberStatusText(this.getConfigValue(symbol));
 }
 return CGNTS.call(this, index);
 };
 windowOptions.Symbolsame = function (symbol) {
 return symbol === CGI;
 };
 windowOptions.numberStatusText = function (value) {
 return `${value}`;
 };
 windowOptions.maxValue = function (symbol) {
 return 3;
 };
 windowOptions.addValue = function (symbol, amount) {
 this.changeValue(
 symbol,
 (this.getConfigValue(symbol) + amount + this.maxValue() + 1) % (this.maxValue(symbol) + 1)
 );
 };

 const _processOk = windowOptions.processOk;
 windowOptions.processOk = function () {
 const symbol = this.currentSymbol();
 if (this.Symbolsame(symbol)) {
 this.addValue(symbol, 1);
 } else {
 _processOk.call(this);
 }
 };

 }

 WCGIplus(Window_Options.prototype);
 
})();
 
なお、ここまではあくまで自分で書くなら、という前提での説明です。
あえて自分で書いて勉強したいとかでなければ、CustomizeConfigItem.jsを使うだけで済む話です。
と最初におっしゃってくださっているのですから、「あえて自分で書いて勉強したかった」と一言添えておけばよかったのではないでしょうか。
既存のプラグインがあることを知らずに自分で書こうとして質問をして、「既に同じようなプラグインがありますよ」と返答をもらって解決するケースも多いので、そのあたりを明確にしておくと、やり取りもスムーズになるかと思います。

次にpandaさんもそうですが、整形に付いて。
こういう言い方は如何かと思いましたが、形を整えろと言うのであればどの様に形を整えれば良いか説明するか例を出して頂いた方が良いのではと私は思います。
DarkPlasmaさんの返信で何が言いたいのかは理解出来ましたが……
コードの整形については、上でDarkPlasmaさんも指摘されている通り、コード整形のタグの存在はつい2週間ほど前に既にコメントがあったはずです。
そのため、今回は具体的に「こうしてください」とまで言わなくても、気付いていただけることを期待していました。
(参照)

もう一点コード整形に関して補足すると、
{ }で囲まれたブロックは半角スペース2つでインデントを入れると読みやすくなります。
元のDarkPlasmaさんのGitHubのコード(19~24行目)も、以下のようになっています。
JavaScript:
function Scene_Options_ChangeGraphicMixIn(sceneOptions) {
  const _maxCommands = sceneOptions.maxCommands;
  sceneOptions.maxCommands = function () {
    return _maxCommands.call(this) + 1;
  };
}

また、基本的に1つの関数は独立しているので、1行空行を入れると「どこまでが一続きなのか」が分かりやすくなります。
元のDarkPlasmaさんのGitHubのコード(48~54行目)も、以下のように空行が入っています。
JavaScript:
windowOptions.isChangeGraphicSymbol = function (symbol) {
  return symbol === changeGraphicSymbol;
};

windowOptions.numberStatusText = function (value) {
  return `${value}`;
};

その上で今回 undefined になる原因としては、最初の部分が
JavaScript:
const CGI = "changegraphic";
ではないでしょうか。
元のDarkPlasmaさんのコードも、
JavaScript:
const changeGraphicSymbol = "changegraphic";
ConfigManager.changegraphic = 0;
となっていて、オプションのシンボルとConfigManagerのプロパティ名を一致させています。
 
質問に答えて頂いて大変有難く思いますが、代用のプラグイン使えばと書かれても回答に困ります
DarkPlasmaさんがどんな気持ちで書いているのか分からない
なるほど、私の回答が質問の意図と食い違っていて、どう答えれば良いのかわからなかったのですね。

得られた回答の意図がわからなかった場合にも、それを無視しないようにしてください。
わからないなら「わからないので意図を教えてほしい」とか「***の理由で、欲しい回答と違う」などと、自らの意思を伝えるようにしてください。
回答してくれた内容に対して黙ったままでは、あなたは親切心を無視する無礼者になってしまいます。
(たとえ東さんにそういう意図がなかったとしても、そう捉えられてしまいます)
これは、人とのコミュニケーションにおいて、東さんにとって明確に不利になってしまう要素です。
たとえば、このスレッドを読んだ他の誰かが、将来東さんの別の質問を見た時、「こいつは回答を無視するから答えないでおこう」と思ってしまいかねません。

このディスカッションはプラグインの制作・技術に対して回答を頂く所です

もちろん、存じております。
私の回答が、このカテゴリにそぐわない内容なのではないか、という混乱があったようですので、詳しく説明します。

すでに使えるプラグインがある場合、あえて自分で書くためには理由(達成したい目的)が必要になります。

すでに使えるプラグインがないか探すこと
見つけたプラグインを吟味し、採用に足るものか検討すること
すでにあるプラグインを使わず、あえて自分で書かなければならない理由を言語化すること

これら全てが制作・技術のカテゴリに含まれるべきだと、私は考えています。

何か既存のプラグインを採用できない事情があるとすれば、それを考慮した書き方をしなければなりませんし、
そうではなく単に車輪を再発明して勉強したいというのであれば、それこそ既存のプラグインをよく読むことが一番の近道になります。

今回の達成したい目的は、このスレッドの最初の書き込みではこう説明されていました。

コンフィグで数値を変えると、読み込むWindow画像が変るシステムを作ってみたい。
その前段階として、コンフィグ画面で変数を変更出来る項目を作る。

これだけであれば、新しくプラグインを作る必要はないのではないか、というのは自然な発想です。
そして、それ以外の手段を最初から放棄している理由は回答者の立場からはうかがい知ることができませんでした。
得られた回答が質問の意図と食い違っている場合、回答者に対して達成したい目的がしっかり伝わっていない可能性があります。

最後にエディタに付いてですか、私はメモ帳に書いています。
こう言っては何ですが、スクリプトいじる人が皆そう言うモノを知っている訳では有りません。
まぁ私の場合Xで教えてもらってはいたのですが、メモ帳で書いていてここまでバカにされるとは思いませんでした。

大変失礼しました。
バカにする意図はなく、もしそうであれば速やかに可視性の良いエディタに乗り換えてください、という意図でした。
始めたばかりであれば知らないのは当たり前です。

それはそれとして、メモ帳でコードを書き続けるのは苦行です。
速やかにVSCodeなどに乗り換えることを推奨します。
 
コンフィグに新たな項目を増やし、その項目で入力した数値でウインドウ画像を変更するプラグインを作ってみたい。
そのプロトタイプのコードをDarkPlasmaさんに書いて貰ったので、練習の為自分で同じコード(関数名は別)を書いてプラグインを作ってみた所、新たな項目の値がundefinedを表示してしまいました。
もしこれを見てundefinedの原因が分かる方がいらっしゃいましたら、その原因を御教え下さい。

良いですね。コードが飛躍的に読みやすくなりました。
pandaさんの仰る通り、インデントを入れるともっと読みやすくなりますが、これはVSCodeを使って書く場合、ショートカットキーを押せばすぐにできます。
Windowsの場合は Shift + Alt + F キーです。

コードについてはpandaさんが回答してくださっていますが、私からも補足させてください。

まず、元のコードの良くないところですが、changeGraphicSymbolの値とConfigManagerに足す設定値のキーが一致しているのにバラバラに定義されています。
最初からConfigManager[changeGraphicSymbol]などと書いておけば、このような混乱はなかったかもしれません。

オプションの設定値にはそれぞれシンボル名が割り当てられています。
常時ダッシュ設定であればalwaysDash、BGM音量であればbgmVolumeです。

rmmz_windows.jsのWindow_Optionsに関するコードを読んでみてください。
Window_Options.prototype.getConfigValueがシンボル名に対応する設定値を返しています。
rmmz_managers.jsでは、それぞれの設定が定義されています。

JavaScript:
ConfigManager.alwaysDash = false;
ConfigManager.commandRemember = false;
ConfigManager.touchUI = true;

(ボリューム関連設定については長いので省略)

JavaScript:
ConfigManager.changegraphic = 0;

このコードは、先ほどのコード同様に初期値を設定しています。
Window_Optionsクラスで使用しているシンボル名が"changegraphic"である元コードでは正常に動いていますが、"CGIS"に変えてしまったコードでは値がundefinedに見えます。
値として参照しているものがConfigManager.changegraphicではなく、ConfigManager.CGISになってしまっているためです。
ConfigManager.changegraphicには初期値として0が設定されてますが、ConfigManager.CGISは何も設定されていないので、undefinedになっているというわけです。
 
Back
トップ