code:
/*:
 * @plugindesc Plugin used to set basic parameters.
 * @author RM CoreScript team
 *
 * @help This plugin does not provide plugin commands.
 *
* @param cacheLimit
 * @desc For setting the upper limit of image memory cache. (MPix)
 * @default 10
 *
 * @param screenWidth
* @desc For setting the screen width.
 * @default 816
 *
 * @param screenHeight
 * @desc For setting the screen height.
 * @default 624
 *
 * @param changeWindowWidthTo
 * @desc If set, change window width to this value
 *
 * @param changeWindowHeightTo
 * @desc If set, change window height to this value
 *
 * @param renderingMode
 * @desc Rendering mode (canvas/webgl/auto)
 * @default auto
 *
 * @param alwaysDash
 * @desc To set initial value as to whether the player always dashes. (on/off)
 * @default off
 */

/*:ja
 * @plugindesc 基本的なパラメーターを設定するプラグインです。
 * @author RM CoreScript team
 *
 * @help このプラグインにはプラグインコマンドはありません。
 *
 * @param cacheLimit
 * @desc 画像のメモリへのキャッシュの上限値 (MPix)
 * @default 10
 *
 * @param screenWidth
 * @desc 画面サイズの幅
 * @default 816
 *
 * @param screenHeight
 * @desc 画面サイズの高さ
 * @default 624
 *
 * @param changeWindowWidthTo
 * @desc 値が設定された場合、ウインドウの幅を指定した値に変更
 *
 * @param changeWindowHeightTo
 * @desc 値が設定された場合、ウインドウの高さを指定した値に変更
 *
 * @param renderingMode
 * @desc レンダリングモード (canvas/webgl/auto)
 * @default auto
 *
 * @param alwaysDash
 * @desc プレイヤーが常時ダッシュするかどうかの初期値 (on/off)
 * @default off
 */

(function () {
    function toNumber(str, def) {
        return isNaN(str) ? def : +(str || def);
    }

    var parameters = PluginManager.parameters('Community_Basic');
    var cacheLimit = toNumber(parameters['cacheLimit'], 10);
    var screenWidth = toNumber(parameters['screenWidth'], 816);
    var screenHeight = toNumber(parameters['screenHeight'], 624);
    var renderingMode = parameters['renderingMode'].toLowerCase();
    var alwaysDash = parameters['alwaysDash'].toLowerCase() === 'on';
    var windowWidthTo = toNumber(parameters['changeWindowWidthTo'], 0);
    var windowHeightTo = toNumber(parameters['changeWindowHeightTo'], 0);

    var windowWidth;
    var windowHeight;

    if (windowWidthTo) {
        windowWidth = windowWidthTo;
    } else if (screenWidth !== SceneManager._screenWidth) {
        windowWidth = screenWidth;
    }

    if (windowHeightTo) {
        windowHeight = windowHeightTo;
    } else if (screenHeight !== SceneManager._screenHeight) {
        windowHeight = screenHeight;
    }

    ImageCache.limit = cacheLimit * 1000 * 1000;
    SceneManager._screenWidth = screenWidth;
    SceneManager._screenHeight = screenHeight;
    SceneManager._boxWidth = screenWidth;
    SceneManager._boxHeight = screenHeight;

    SceneManager.preferableRendererType = function () {
        if (Utils.isOptionValid('canvas')) {
            return 'canvas';
        } else if (Utils.isOptionValid('webgl')) {
            return 'webgl';
        } else if (renderingMode === 'canvas') {
            return 'canvas';
        } else if (renderingMode === 'webgl') {
            return 'webgl';
        } else {
            return 'auto';
        }
    };

    var _ConfigManager_applyData = ConfigManager.applyData;
    ConfigManager.applyData = function (config) {
        _ConfigManager_applyData.apply(this, arguments);
        if (config['alwaysDash'] === undefined) {
            this.alwaysDash = alwaysDash;
        }
    };

    var _SceneManager_initNwjs = SceneManager.initNwjs;
    SceneManager.initNwjs = function () {
        _SceneManager_initNwjs.apply(this, arguments);

        if (Utils.isNwjs() && windowWidth && windowHeight) {
            var dw = windowWidth - window.innerWidth;
            var dh = windowHeight - window.innerHeight;
            window.moveBy(-dw / 2, -dh / 2);
            window.resizeBy(dw, dh);
        }
    };
})();


code:
//=============================================================================
// CompressionNumberByHundred.js
// Copyright (c) 2022- 村人Ａ
//=============================================================================

/*:ja
 * @plugindesc １０進数・１００進数コンバータプラグインです。
 * @author 村人Ａ
 *
 * @help
 * ＊このプラグインは冬空様専用に作られたプラグインです。
 * ＊その他の方の無断の使用を禁止します。
 *
 * _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
 *
 * バージョン情報
 *
 * 22/06/04 バージョン1.3　ギリシャ文字の位置の修正、最大文字数の際の動作の修正
 * 22/06/03 バージョン1.2　パスワード入力画面を追加
 * 22/05/08 バージョン1.1　百進数にする10進数の最大桁数を指定
 * 22/05/07 バージョン1.0　試作品リリース
 *
 * _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
 *
 * ========================================
 * 以下ヘルプ
 * ========================================
 *
 * 22/06/03 追記
 *
 * モデルのパスワード出力関係を実装しました。
 *
 * モデルに使用している変数を100進数に変換し、テキストファイルに出力する場合
 *
 * プラグインコマンド
 *
 * パスワードをテキストファイルに出力 変数１ 変数２ 変数３…
 *
 * と記述してください。
 * 変数はモデルに使用している変数のIDをそれぞれ半角数字で指定してください。
 *
 * 例えば変数181,182,183,184をモデルの変数に使用している場合
 *
 * パスワードをテキストファイルに出力 181 182 183 184
 *
 * と記述します。
 *
 * また、モデルのパスワードを打ち込む画面へ移動する場合
 *
 * プラグインコマンド
 *
 * 百進数パス入力画面へ スイッチ番号 変数１ 変数２ 変数３…
 *
 * と記述します。
 * 変数は打ち込んだパスワードを十進数に変換し、指定の桁数ごとに代入する変数IDとなります。
 * スイッチはパスワードが入力されればON、キャンセルされればOFFとなります。
 *
 * パスワード打ち込み画面の右下には「PASTE」ボタンがあります。
 * このボタンを押下すると別ウィンドウが出てきてペーストすることができます。
 * そのウィンドウでOKを押下すると画面にその文字が打ち込まれます。
 * 指定文字以外の文字を打ち込むとエラーが表示されます。
 *
 *
 * ===================================
 *
 *
 * 指定した変数をまとめてから百進数に変換し、指定した変数に代入します。
 * プラグインコマンドにて以下のように指定します。
 *
 * 百進数変換 代入する変数ID 変換する変数のID1 変換する変数のID2 変換する変数のID3…
 *
 * 例）ID4,5,6,7の変数を百進数に変換した文字列を代入するIDを3とする場合
 *
 * 百進数変換 3 4 5 6 7
 *
 * となります。
 * 変換する変数は任意の数指定できます。
 * 十進数に変換する際に同じ数だけ変数を指定する必要があることにご留意ください。
 *
 * 百進数にした変数を十進数に変換するプラグインコマンドは以下のようになります。
 *
 * 十進数変換 変換する変数ID 代入する変数のID1 代入する変数のID2 代入する変数のID3…
 *
 * 例）変数4つ分の百進数が入っている変数3を変数4,5,6,7にそれぞれ代入する
 *
 * 十進数変換 3 4 5 6 7
 *
 * 変数にはjavascriptが取り扱える最大の桁数である１５桁以下にしてください。
 *
 *
 *
 *
 * @param digit
 * @text 桁数
 * @desc 百進数に変換する十進数の最大桁数を指定します。
 * @default 2
 * @type Number
 *
 * @param passDigit
 * @text パスワード文字数
 * @desc 百進数パスワードの文字数を指定します。
 * @default 2
 * @type Number
 *
 * @param passChars
 * @text パスワード文字
 * @desc 百進数パスワードの文字種を指定します。
 * @default １２３４５６７８９ＡＢＣＤＥＦＧＨＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺａｂｃｄｅｆｇｈｉｊｌｋｍｎｐｑｒｓｔｕｖｗｘｙｚαβ₣δεζηθ∂λμ∏ξπ∑ςσ∞═φΩψ☆★●◎◇◆□■△▲▽▼∞＋−÷＝＃＆
 * @type String
 *
 * @param fontFace
 * @text パスワード入力画面フォント
 * @desc fonts/フォルダに配置した拡張子込みのファイル名または、フォント名(font-family名)を指定します。
 * @default GameFont
 * @type String
 *
 * @param okBtnStyle
 * @text OKボタン設定
 * @default {"text":"ok","textColor":"0","textBackground":"","textBorderColor":"","textBorderSize":"","image":"","imageX":"","imageY":""}
 * @type struct<BtnStyle>
 * @desc OKボタンの表示を変更します。画像が指定されていれば文字より画像が優先されます。
 *
 * @param pasteBtnStyle
 * @text ペーストボタン設定
 * @default {"text":"paste","textColor":"0","textBackground":"","textBorderColor":"","textBorderSize":"","image":"","imageX":"","imageY":""}
 * @type struct<BtnStyle>
 * @desc pasteボタンの表示を変更します。画像が指定されていれば文字より画像が優先されます。
 *
 * @param cancelBtnStyle
 * @text キャンセルボタン設定
 * @default {"text":"cancel","textColor":"0","textBackground":"","textBorderColor":"","textBorderSize":"","image":"","imageX":"","imageY":""}
 * @type struct<BtnStyle>
 * @desc キャンセルボタンの表示を変更します。画像が指定されていれば文字より画像が優先されます。
 */

/*~struct~BtnStyle:
 * @param text
 * @text ボタン文字列
 * @type string
 * @desc ボタンの文字列を指定します。
 *
 * @param textColor
 * @text ボタン文字色
 * @type number
 * @desc ボタン文字列の色を指定します。ツクールの色番号もしくは、テキストタブからHTMLカラーコードを指定できます。
 *
 * @param textBackground
 * @text 文字ボタン背景色
 * @type number
 * @desc ツクールの色番号もしくは、テキストタブからHTMLカラーコードを指定できます。空にすると透過します。
 *
 * @param textBorderColor
 * @text 文字ボタン枠色
 * @type number
 * @desc ツクールの色番号もしくは、テキストタブからHTMLカラーコードを指定できます。空にすると透過します。
 *
 * @param textBorderSize
 * @text 文字ボタン枠の太さ
 * @type number
 * @min 0
 * @max 3
 * @desc 文字ボタンの枠線の太さを指定します。0または空で枠線なしとなります。
 *
 * @param image
 * @text ボタン画像
 * @type file
 * @dir img/
 * @desc ボタン画像を指定します。
 *
 * @param imageX
 * @text ボタン画像X座標
 * @type number
 * @min 0
 * @desc 画面左上を原点としてボタン左上のX座標を指定します。
 *
 * @param imageY
 * @text ボタン画像Y座標
 * @type number
 * @min 0
 * @desc 画面左上を原点としてボタン左上のY座標を指定します。
 */

{
	'use strict'

	const param = PluginManager.parameters('CompressionNumberByHundred');
	const digit = Number(param.digit);
	const passDigit = Number(param.passDigit);

	const hundredCodes = param.passChars || "１２３４５６７８９ＡＢＣＤＥＦＧＨＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺａｂｃｄｅｆｇｈｉｊｌｋｍｎｐｑｒｓｔｕｖｗｘｙｚαβ₣δεζηθ∂λμ∏ξπ∑ςσ∞═φΩψ☆★●◎◇◆□■△▲▽▼∞＋−÷＝＃＆";
	const hundredCodesArray = hundredCodes.split("");

	const hundredToTen = (args, val) => {
		const hArr = Array.from(val);
		let resStr = String();
		for (const s of hArr) {
			resStr += String(hundredCodes.indexOf(s)).padZero(2);
		}
		const reg = new RegExp('.{' + digit + '}', 'g');
		const sepStr = resStr.match(reg);
		if (sepStr.length != args.length) { throw new Error("指定した代入する変数の数が合っていません。") }
		for (let i = 0, n = sepStr.length; i < n; i++) {
			$gameVariables.setValue(Number(args[i]), Number(sepStr[i]))
		}
	}

	const tenToHundred = (args) => {
		let joinStr = String();
		for (const id of args) {
			if (String($gameVariables.value(id)).length > 15) { throw new Error("javascriptでは15桁より多い桁は扱えません") }
			if (String($gameVariables.value(id)).length > digit) { throw new Error("変数" + id + "の桁数が" + digit + "桁より多くなっています") }
			joinStr += String($gameVariables.value(id)).padZero(digit)
		}
		const reg = new RegExp('.{' + digit + '}', 'g');
		const sepStr = joinStr.match(reg);
		let resultStr = String();
		for (const s of sepStr) {
			resultStr += hundredCodes.charAt(Number(s))
		}
		return resultStr;
	}

	const _alias_Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
	Game_Interpreter.prototype.pluginCommand = function (command, args) {
		_alias_Game_Interpreter_pluginCommand.call(this, command, args);
		if (command === '百進数パス入力画面へ') {
			if (isNaN(Number(args[0]))) { throw new Error("プラグインコマンド「百進数パス入力画面へ」の引数が半角数字を入力してください。") }
			$gameTemp.tenNumberResultSwitchNumber = Number(args[0]);
			$gameTemp.tenNumberPasswordValId = args.slice(1).map(str => Number(str))
			SceneManager.push(Scene_InputHundredNumberPassword)
		}

		if (command === 'パスワードをテキストファイルに出力') {
			const fs = require('fs');
			const path = require('path');
			const base = path.dirname(process.mainModule.filename);
			const filePath = path.join(base, '');
			fs.writeFileSync(filePath + "\\modelPass.txt", tenToHundred(args));
			window.alert("ゲーム実行ファイルがあるフォルダにパスワードテキストファイル「modelPass.txt」を出力しました。");
		}

		if (command === '百進数変換') {
			const subId = Number(args.shift());
			$gameVariables.setValue(subId, tenToHundred(args))
		}

		if (command === '十進数変換') {
			const refId = Number(args.shift());
			hundredToTen(args, $gameVariables.value(refId))
		}
	}

	//-----------------------------------------------------------------------------
	// Scene_InputHundredNumberPassword
	//

	function Scene_InputHundredNumberPassword() {
		this.initialize.apply(this, arguments);
	}

	Scene_InputHundredNumberPassword.prototype = Object.create(Scene_Name.prototype);
	Scene_InputHundredNumberPassword.prototype.constructor = Scene_InputHundredNumberPassword;

	Scene_InputHundredNumberPassword.prototype.initialize = function () {
		Scene_MenuBase.prototype.initialize.call(this);
	};

	Scene_InputHundredNumberPassword.prototype.prepare = function () {
	};

	Scene_InputHundredNumberPassword.prototype.createEditWindow = function () {
		this._editWindow = new Window_InputHundredNumberEdit(this._actor, this._maxLength);
		this.addWindow(this._editWindow);
	};

	Scene_InputHundredNumberPassword.prototype.createInputWindow = function () {
		this._inputWindow = new Window_InputHundredNumber(this._editWindow);
		this._inputWindow.setHandler('ok', this.onInputOk.bind(this));
		this._inputWindow.setHandler('cancel', this.onInputCancel.bind(this));
		this.addWindow(this._inputWindow);
	};

	Scene_InputHundredNumberPassword.prototype.onInputOk = function () {
		$gameSwitches.setValue($gameTemp.tenNumberResultSwitchNumber, 1);
		hundredToTen($gameTemp.tenNumberPasswordValId, this._editWindow._name)
		SceneManager.pop();
	}

	Scene_InputHundredNumberPassword.prototype.onInputCancel = function () {
		$gameSwitches.setValue($gameTemp.tenNumberResultSwitchNumber, 0);
		SceneManager.pop();
	}

	//-----------------------------------------------------------------------------
	// Window_InputHundredNumberEdit
	//

	function Window_InputHundredNumberEdit() {
		this.initialize.apply(this, arguments);
	}

	Window_InputHundredNumberEdit.prototype = Object.create(Window_NameEdit.prototype);
	Window_InputHundredNumberEdit.prototype.constructor = Window_InputHundredNumberEdit;

	Window_InputHundredNumberEdit.prototype.initialize = function () {
		var width = this.windowWidth();
		var height = this.windowHeight();
		var x = (Graphics.boxWidth - width) / 2;
		var y = (Graphics.boxHeight - (height + this.fittingHeight(9) + 8)) / 2;
		Window_Base.prototype.initialize.call(this, x, y, width, height);
		this._maxLength = passDigit;
		this._index = 0;
		this._name = "";
		this._defaultName = "";
		this.deactivate();
		this.refresh();
	}

	Window_InputHundredNumberEdit.prototype.windowWidth = function () {
		return 720;
	};

	Window_InputHundredNumberEdit.prototype.maxCols = function () {
		return Math.floor(this.contentsWidth() / this.charWidth());
	}

	Window_InputHundredNumberEdit.prototype.itemRect = function (index) {
		const iniY = (this.contentsHeight() - this.lineHeight() * Math.ceil(this._maxLength / this.maxCols())) / 2;
		return {
			x: (index % this.maxCols()) * this.charWidth(),
			y: iniY + Math.floor(index / this.maxCols()) * this.lineHeight(),
			width: this.charWidth(),
			height: this.lineHeight()
		};
	};

	Window_InputHundredNumberEdit.prototype.drawChar = function (index) {
		var rect = this.itemRect(index);
		this.resetTextColor();
		this.drawText(this._name[index] || '', rect.x, rect.y, this.charWidth(), "center");
	};

	Window_InputHundredNumberEdit.prototype.paste = function () {
		user = window.prompt("パスワードをペーストしてください", "");
		if (user) {
			const splitStr = user.split("");
			if (splitStr.some(str => hundredCodesArray.indexOf(str) < 0)) {
				window.alert("パスワードで使用される文字を入力して下さい。");
				return
			}
			this._name = user;
			this._index = this._name.length;
			this.refresh();
		}
	}

	Window_InputHundredNumberEdit.prototype.refresh = function () {
		this.contents.clear();
		for (var i = 0; i < this._maxLength; i++) {
			this.drawUnderline(i);
		}
		for (var j = 0; j < this._name.length; j++) {
			this.drawChar(j);
		}
		var rect = this.itemRect(this._index);
		this.setCursorRect(rect.x, rect.y, rect.width, rect.height);
	};

	//-----------------------------------------------------------------------------
	// Window_InputHundredNumber - BtnStyle
	//

	function Button_StringStyle() {
		this.initialize.apply(this, arguments);
	}

	Button_StringStyle.prototype.initialize = function (btnStyle) {
		this.text = btnStyle.text;
		this.textColor = btnStyle.textColor;
		this.background = btnStyle.textBackground;
		this.borderColor = btnStyle.textBorderColor;
		this.borderSize = Number(btnStyle.textBorderSize);
		this.colorCached = false;
	}

	Button_StringStyle.prototype.initializeColor = function (windowInputHundredNumber) {
		if (this.colorCached) {
			return;
		}
		if (!isNaN(this.textColor)) {
			this.textColor = windowInputHundredNumber.textColor(this.textColor);
		}
		if (typeof this.borderColor === "string" && this.borderColor.length > 0 && !isNaN(this.borderColor)) {
			this.borderColor = windowInputHundredNumber.textColor(this.borderColor || 0);
		}
		if (typeof this.background === "string" && this.background.length > 0 && !isNaN(this.background)) {
			this.background = windowInputHundredNumber.textColor(this.background || 0);
		}
		this.colorCached = true;
	}

	Button_StringStyle.prototype.itemRect = function (windowInputHundredNumber, index) {
		let maxCols = windowInputHundredNumber.maxCols();
		let lineHeight = windowInputHundredNumber.lineHeight();
		return {
			x: index % maxCols * 42 + Math.floor(index % maxCols / 5) * 24,
			y: Math.floor(index / maxCols) * lineHeight,
			width: 42,
			height: lineHeight
		};
	}

	Button_StringStyle.prototype.drawItem = function (windowInputHundredNumber, index, tableKey) {
		const rect = this.itemRect(windowInputHundredNumber, index);
		rect.x += 3;
		rect.width -= 6;
		this.initializeColor(windowInputHundredNumber);
		windowInputHundredNumber.changeTextColor(this.textColor);
		if (this.borderSize && this.borderColor) {
			windowInputHundredNumber.contents.fillRect(rect.x, rect.y, rect.width + this.borderSize, rect.height + this.borderSize, this.borderColor);
			if (this.background) {
				windowInputHundredNumber.contents.fillRect(rect.x + this.borderSize, rect.y + this.borderSize, rect.width - this.borderSize, rect.height - this.borderSize, this.background);
			} else {
				windowInputHundredNumber.contents.clearRect(rect.x + this.borderSize, rect.y + this.borderSize, rect.width - this.borderSize, rect.height - this.borderSize);
			}
		} else if (this.background) {
			windowInputHundredNumber.contents.fillRect(rect.x, rect.y, rect.width, rect.height, this.background);
		}
		windowInputHundredNumber.drawText(this.text || tableKey, rect.x, rect.y, rect.width, 'center');
	}

	function Button_ImageStyle() {
		this.initialize.apply(this, arguments);
	}

	Button_ImageStyle.prototype.initialize = function (btnStyle) {
		this.image = btnStyle.image;
		this.x = btnStyle.imageX;
		this.y = btnStyle.imageY;
		this.imageLoaded = false;
		this.bitmap = null;
	}

	Button_ImageStyle.prototype.initializeImage = function () {
		if (!this.imageLoaded) {
			const path = this.image.split("/", 2);
			this.bitmap = ImageManager.loadBitmap("img/" + path[0] + "/", path[1], null, true);
			this.imageLoaded = true;
		}
	}

	Button_ImageStyle.prototype.itemRect = function (windowInputHundredNumber, index) {
		this.initializeImage();
		return {
			x: this.x - windowInputHundredNumber.x,
			y: this.y - windowInputHundredNumber.y,
			width: this.bitmap.width,
			height: this.bitmap.height
		};
	}

	Button_ImageStyle.prototype.drawItem = function (windowInputHundredNumber, index) {
		const rect = this.itemRect(windowInputHundredNumber, index);
		this.bitmap.addLoadListener(() => {
			windowInputHundredNumber.contents.bltImage(this.bitmap, 0, 0, this.bitmap.width, this.bitmap.height, rect.x, rect.y, rect.width, rect.height);
		});
	}

	function createBtnStyle(paramStruct) {
		if (!paramStruct) {
			return normalButton;
		}
		const btnStyle = JSON.parse(paramStruct);
		if (btnStyle.image && btnStyle.image.includes("/")) {
			return new Button_ImageStyle(btnStyle);
		}
		return new Button_StringStyle(btnStyle);
	}

	const normalButton = new Button_StringStyle({ textColor: 0 })
	const okButtonStyle = createBtnStyle(param.okBtnStyle)
	const pasteBtnStyle = createBtnStyle(param.pasteBtnStyle)
	const cancelBtnStyle = createBtnStyle(param.cancelBtnStyle)

	function getBtnStyle(index, maxItems) {
		if (index < maxItems - 3) {
			return normalButton;
		}
		if (index === maxItems - 3) {
			return cancelBtnStyle;
		}
		if (index === maxItems - 2) {
			return pasteBtnStyle;
		}
		if (index === maxItems - 1) {
			return okButtonStyle;
		}
		return normalButton;
	}

	//-----------------------------------------------------------------------------
	// Window_InputHundredNumber
	//

	function Window_InputHundredNumber() {
		this.initialize.apply(this, arguments);
	}

	Window_InputHundredNumber.prototype = Object.create(Window_NameInput.prototype);
	Window_InputHundredNumber.prototype.constructor = Window_InputHundredNumber;

	Window_InputHundredNumber.prototype.initialize = function (editWindow) {
		const width = 720;
		const height = this.windowHeight();
		const x = (Graphics.width - width) / 2;
		const y = editWindow.y + editWindow.height + 8;
		Window_Selectable.prototype.initialize.call(this, x, y, width, height);
		this._editWindow = editWindow;
		this._index = 0;
		this._page = 0;
		this.refresh();
		this.updateCursor();
		this.activate();
	}

	Window_InputHundredNumber.prototype.table = function () {
		let keys = hundredCodesArray.concat();
		keys.push("cancel")
		keys.push("paste")
		keys.push("ok")
		return keys;
	};

	Window_InputHundredNumber.prototype.maxCols = function () {
		return 15;
	};

	Window_InputHundredNumber.prototype.maxItems = function () {
		return hundredCodes.length + 3;
	};

	Window_InputHundredNumber.prototype.character = function () {
		return this._index < this.maxItems() ? this.table()[this._index] : '';
	};

	Window_InputHundredNumber.prototype.isPageChange = function () {
		return false;
	};

	Window_InputHundredNumber.prototype.isCancel = function () {
		return this._index === this.maxItems() - 3;
	};

	Window_InputHundredNumber.prototype.isPaste = function () {
		return this._index === this.maxItems() - 2;
	};

	Window_InputHundredNumber.prototype.isOk = function () {
		return this._index === this.maxItems() - 1;
	};

	Window_InputHundredNumber.prototype.processOk = function () {
		if (this.isPaste()) {
			this.onPasteOk();
		} else if (this.isOk()) {
			this.onNameOk();
		} else if (this.isCancel()) {
			this.processBack();
		} else if (this.character()) {
			this.onNameAdd();
		}
	};

	Window_InputHundredNumber.prototype.onPasteOk = function () {
		this._editWindow.paste();
		SoundManager.playOk();
	};

	Window_InputHundredNumber.prototype.onNameOk = function () {
		if (this._editWindow.name().length == passDigit) {
			SoundManager.playOk();
			this.callOkHandler();
		} else {
			SoundManager.playBuzzer();
		}
	};

	Window_InputHundredNumber.prototype.onNameAdd = function () {
		if (this._editWindow.add(this.character())) {
			SoundManager.playOk();
		} else {
			SoundManager.playBuzzer();
		}
	};

	Window_InputHundredNumber.prototype.itemRect = function (index) {
		return getBtnStyle(index, this.maxItems()).itemRect(this, index);
	};

	Window_InputHundredNumber.prototype.refresh = function () {
		var table = this.table();
		this.contents.clear();
		this.resetTextColor();
		const maxItems = this.maxItems();
		for (var i = 0; i < maxItems; i++) {
			getBtnStyle(i, maxItems).drawItem(this, i, table[i]);
		}
	};

	Window_InputHundredNumber.prototype.cursorRight = function (wrap) {
		if (this._index > this.maxItems() - 2) { return }
		this._index++;
	};

	Window_InputHundredNumber.prototype.cursorLeft = function (wrap) {
		if (this._index == 0) { return }
		this._index--;
	};

	Window_InputHundredNumber.prototype.cursorDown = function (wrap) {
		const newIndex = (this._index + 15) % this.maxItems();
		if (this._index > newIndex) { return; }
		this._index = newIndex;
	};

	Window_InputHundredNumber.prototype.cursorUp = function (wrap) {
		const newIndex = (this._index - 15) % this.maxItems();
		if (this._index < newIndex || newIndex < 0) { return; }
		this._index = newIndex;
	};

	Window_InputHundredNumber.prototype.processJump = function () {
	}

	Window_InputHundredNumber.prototype.isCancelEnabled = function () {
		return true;
	};

	Window_InputHundredNumber.prototype.processBack = function () {
		SoundManager.playCancel();
		if (this._editWindow.back()) {
			return;
		}
		this.callHandler('cancel');
	}

	function fontLoad() {
		if (!param.fontFace || param.fontFace === "GameFont") {
			return;
		}
		if (param.fontFace.match("\\.[a-zA-Z]+$")) {
			Graphics.loadFont("CNBFont", "./fonts/" + param.fontFace);
			Window_InputHundredNumberEdit.prototype.standardFontFace =
				Window_InputHundredNumber.prototype.standardFontFace = function () {
					return "CNBFont";
				}
			return;
		}

		document.fonts.load("10px " + param.fontFace).then(() => {
			Window_InputHundredNumberEdit.prototype.standardFontFace =
				Window_InputHundredNumber.prototype.standardFontFace = function () {
					return param.fontFace;
				}
		});
	}

	fontLoad();
}

repo_name: dazed/translations

license: unknown


code:
//=============================================================================
// ConfusionExtend.js
// ----------------------------------------------------------------------------
// Copyright (c) 2015-2016 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.1.0 2016/11/12 裏切り機能と味方対象スキルの対象を反転させる機能を追加
// 1.0.0 2016/08/13 初版
// ----------------------------------------------------------------------------
// [Blog]   : http://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================

/*:
 * @plugindesc Confusion Extend Plugin
 * @author triacontane
 *
 * @help 混乱系（行動制約のプルダウンの選択値が「1」～「3」）ステートの
 * 指定内容を拡張し、通常攻撃ではなくスキル（複数指定可能）を指定したり
 * さらにそれらのスキルがすべて使用できない場合に使用する予備スキルも
 * 指定できます。
 *
 * 誰をターゲットにするかは、ステートの行動制約の種類と使用スキルの効果範囲
 * およびメモ欄で設定した値によって決まります。
 *
 * ・スキルの効果範囲が「使用者」の場合
 * 行動制約の種類とは無関係に、対象は必ず「使用者」になります。
 *
 * ・行動制約が「敵を攻撃」の場合
 * 対象は「敵単体」(メモ欄指定対象もしくはランダム)か「敵全体」になります。
 *
 * ・行動制約が「誰かを攻撃」の場合
 * 対象は「敵単体」(メモ欄指定対象もしくはランダム)か「敵全体」もしくは
 * 「味方単体」(メモ欄指定対象もしくはランダム)か「味方全体」になります。
 *
 * ・行動制約が「味方を攻撃」の場合
 * 対象は「味方単体」(メモ欄指定対象もしくはランダム)か「味方全体」になります。
 *
 * 1. ステートのデータベースで行動制作のプルダウンを指定してください。
 * ・敵を攻撃
 * ・誰かを攻撃
 * ・味方を攻撃
 *
 * 2. ステートのメモ欄を以下の通り指定してください。
 * <CEスキル1:3>    # 通常攻撃の代わりにID[3..5]のスキルが使用されます。
 * <CEスキル2:4>    # 4番目以降も同様に指定可能です。
 * <CEスキル3:5>    #
 * <CE予備スキル:6> # 指定されたスキルがMP不足等の理由ですべて
 *                    使用できない場合、ID[6]のスキルが使用されます。
 * <CEターゲット:0> # 単体スキルの対象を[0]番目のキャラクターに指定します。
 *                    メモ欄の指定がない場合はランダムで決定されます。
 *
 * ・追加機能
 * 裏切り機能を有効にすると対象のステートが有効になっているバトラーが
 * 敵や混乱スキルの攻撃対象から外れ、さらにそのバトラー以外が戦闘不能になると
 * 全滅扱いになります。
 *
 * 特徴を有するデータベースのメモ欄に、以下の通り記述してください。
 * <CE裏切り>    # 対象バトラーが一時的に味方から外れます。
 * <CEBetrayal>  # 同上
 *
 * This plugin is released under the MIT License.
 */
/*:ja
 * @plugindesc 混乱ステート拡張プラグイン
 * @author トリアコンタン
 *
 * @param 味方対象スキルの対象
 * @desc ONにすると行動制約が「味方を攻撃」の場合に味方対象のスキルを使用すると、敵を対象にします。
 * @default OFF
 *
 * @help 混乱系（行動制約のプルダウンの選択値が「1」～「3」）ステートの
 * 指定内容を拡張し、通常攻撃ではなくスキル（複数指定可能）を指定したり
 * さらにそれらのスキルがすべて使用できない場合に使用する予備スキルも
 * 指定できます。
 *
 * 誰をターゲットにするかは、ステートの行動制約の種類と使用スキルの効果範囲
 * およびメモ欄で設定した値によって決まります。
 *
 * ・スキルの効果範囲が「使用者」の場合
 * 行動制約の種類とは無関係に、対象は必ず「使用者」になります。
 *
 * ・行動制約が「敵を攻撃」の場合
 * 対象は「敵単体」(メモ欄指定対象もしくはランダム)か「敵全体」になります。
 *
 * ・行動制約が「誰かを攻撃」の場合
 * 対象は「敵単体」(メモ欄指定対象もしくはランダム)か「敵全体」もしくは
 * 「味方単体」(メモ欄指定対象もしくはランダム)か「味方全体」になります。
 *
 * ・行動制約が「味方を攻撃」の場合
 * 対象は「味方単体」(メモ欄指定対象もしくはランダム)か「味方全体」になります。
 *
 * 1. ステートのデータベースで行動制作のプルダウンを指定してください。
 * ・敵を攻撃
 * ・誰かを攻撃
 * ・味方を攻撃
 *
 * 2. ステートのメモ欄を以下の通り指定してください。
 * <CEスキル1:3>    # 通常攻撃の代わりにID[3..5]のスキルが使用されます。
 * <CEスキル2:4>    # 4番目以降も同様に指定可能です。
 * <CEスキル3:5>    #
 * <CE予備スキル:6> # 指定されたスキルがMP不足等の理由ですべて
 *                    使用できない場合、ID[6]のスキルが使用されます。
 * <CEターゲット:0> # 単体スキルの対象を[0]番目のキャラクターに指定します。
 *                    メモ欄の指定がない場合はランダムで決定されます。
 *
 * ・追加機能
 * 裏切り機能を有効にすると対象のステートが有効になっているバトラーが
 * 敵や混乱スキルの攻撃対象から外れ、さらにそのバトラー以外が戦闘不能になると
 * 全滅扱いになります。
 *
 * 特徴を有するデータベースのメモ欄に、以下の通り記述してください。
 * <CE裏切り>    # 対象バトラーが一時的に味方から外れます。
 * <CEBetrayal>  # 同上
 *
 * このプラグインにはプラグインコマンドはありません。
 *
 * 利用規約：
 *  作者に無断で改変、再配布が可能で、利用形態（商用、18禁利用等）
 *  についても制限はありません。
 *  このプラグインはもうあなたのものです。
 */

(function () {
    'use strict';
    var pluginName = 'ConfusionExtend';
    var metaTagPrefix = 'CE';

    var getParamOther = function (paramNames) {
        if (!Array.isArray(paramNames)) paramNames = [paramNames];
        for (var i = 0; i < paramNames.length; i++) {
            var name = PluginManager.parameters(pluginName)[paramNames[i]];
            if (name) return name;
        }
        return null;
    };

    var getParamBoolean = function (paramNames) {
        var value = getParamOther(paramNames);
        return (value || '').toUpperCase() === 'ON';
    };

    var getArgNumber = function (arg, min, max) {
        if (arguments.length < 2) min = -Infinity;
        if (arguments.length < 3) max = Infinity;
        return (parseInt(convertEscapeCharacters(arg), 10) || 0).clamp(min, max);
    };

    var getMetaValue = function (object, name) {
        var metaTagName = metaTagPrefix + (name ? name : '');
        return object.meta.hasOwnProperty(metaTagName) ? object.meta[metaTagName] : undefined;
    };

    var getMetaValues = function (object, names) {
        if (!Array.isArray(names)) return getMetaValue(object, names);
        for (var i = 0, n = names.length; i < n; i++) {
            var value = getMetaValue(object, names[i]);
            if (value !== undefined) return value;
        }
        return undefined;
    };

    var convertEscapeCharacters = function (text) {
        if (text == null) text = '';
        var windowLayer = SceneManager._scene._windowLayer;
        return windowLayer ? windowLayer.children[0].convertEscapeCharacters(text) : text;
    };

    //=============================================================================
    // パラメータの取得と整形
    //=============================================================================
    var paramTargetFriendSkill = getParamBoolean(['TargetFriendSkill', '味方対象スキルの対象']);

    //=============================================================================
    // Game_BattlerBase
    //  行動制約が有効なステートデータを取得します。
    //=============================================================================
    Game_BattlerBase.prototype.getRestrictStates = function () {
        var restriction = this.restriction();
        if (restriction === 0 || restriction >= 4) return [];
        return this.states().filter(function (state) {
            return state.restriction === restriction;
        });
    };

    Game_BattlerBase.prototype.getRestrictState = function () {
        return this.getRestrictStates().sort(this.compareOrderStatePriority.bind(this))[0];
    };

    Game_BattlerBase.prototype.compareOrderStatePriority = function (stateA, stateB) {
        return stateA.priority - stateB.priority;
    };

    Game_BattlerBase.prototype.isBetrayer = function () {
        return this.traitObjects().some(function (traitObject) {
            return getMetaValues(traitObject, ['裏切り', 'Betrayal']);
        });
    };

    //=============================================================================
    // Game_Unit
    //  裏切り機能を追加します。
    //=============================================================================
    var _Game_Unit_aliveMembers = Game_Unit.prototype.aliveMembers;
    Game_Unit.prototype.aliveMembers = function () {
        var members = _Game_Unit_aliveMembers.apply(this, arguments);
        return members.filter(function (member) {
            return !member.isBetrayer();
        });
    };

    //=============================================================================
    // Game_Action
    //  混乱時のスキルを別途設定します。
    //=============================================================================
    var _Game_Action_setConfusion = Game_Action.prototype.setConfusion;
    Game_Action.prototype.setConfusion = function () {
        _Game_Action_setConfusion.apply(this, arguments);
        var skillIds = this.getConfusionSkills();
        if (!skillIds) return;
        skillIds = skillIds.filter(function (skillId) {
            return this.subject().canUse($dataSkills[skillId]);
        }.bind(this));
        if (skillIds.length > 0) {
            this.setConfusionSkill(skillIds);
        } else {
            this.setConfusionSpareSkill();
        }
    };

    Game_Action.prototype.getConfusionSkills = function () {
        var state = this.getRestrictState();
        if (!state) return null;
        var skillIds = [], i = 1;
        while (i) {
            var value = getMetaValues(state, ['スキル' + i, 'Skill' + i]);
            if (value) {
                skillIds.push(getArgNumber(value, 1));
                i++;
            } else {
                i = (i > 10 ? null : i + 1);
            }
        }
        return skillIds;
    };

    Game_Action.prototype.getRestrictState = function () {
        return this.subject().getRestrictState();
    };

    Game_Action.prototype.isExistConfusionSkill = function () {
        var skillIds = this.getConfusionSkills();
        return skillIds && skillIds.length > 0;
    };

    Game_Action.prototype.setConfusionSkill = function (skillIds) {
        var skillId = skillIds[Math.randomInt(skillIds.length)];
        this.setSkill(skillId);
    };

    Game_Action.prototype.setConfusionSpareSkill = function () {
        var state = this.getRestrictState();
        var value = getMetaValues(state, ['予備スキル', 'SpareSkill']);
        if (value) {
            var skillId = getArgNumber(value, 1);
            if (this.subject().canUse($dataSkills[skillId])) {
                this.setSkill(skillId);
            }
        }
    };

    var _Game_Action_repeatTargets = Game_Action.prototype.repeatTargets;
    Game_Action.prototype.repeatTargets = function (targets) {
        if (Array.isArray(targets[0])) arguments[0] = targets[0];
        return _Game_Action_repeatTargets.apply(this, arguments);
    };

    var _Game_Action_confusionTarget = Game_Action.prototype.confusionTarget;
    Game_Action.prototype.confusionTarget = function () {
        var target = _Game_Action_confusionTarget.apply(this, arguments);
        if (this.isExistConfusionSkill()) {
            target = this.confusionSkillTarget();
        }
        return target;
    };

    Game_Action.prototype.confusionSkillTarget = function () {
        var state = this.getRestrictState();
        var value = getMetaValues(state, ['ターゲット', 'Target']);
        if (value) {
            this._targetIndex = getArgNumber(value, 0);
        }
        if (this.isForUser()) {
            return this.subject();
        }
        return this.isConfusionSkillTargetForFriend() ? this.targetsForFriends() : this.targetsForOpponents();
    };

    Game_Action.prototype.isConfusionSkillTargetForFriend = function () {
        switch (this.subject().confusionLevel()) {
            case 1:
                return this.isConfusionSkillTargetReverse();
            case 2:
                return Math.randomInt(2) === 0;
            case 3:
                return !this.isConfusionSkillTargetReverse();
        }
        return false;
    };

    Game_Action.prototype.isConfusionSkillTargetReverse = function () {
        return paramTargetFriendSkill && this.isForFriend();
    };
})();


code:
//=============================================================================
// CustomizeConfigDefault.js
// ----------------------------------------------------------------------------
// (C)2015 Triacontane
// This plugin is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.1.1 2020/09/13 Mano_InputConfig.jsと併用したとき、Option項目を消していると表示不整合が発生する競合を修正
// 1.1.0 2016/08/01 項目自体を非表示にする機能を追加しました。
// 1.0.3 2016/06/22 多言語対応
// 1.0.2 2016/01/17 競合対策
// 1.0.1 2015/11/01 既存コードの再定義方法を修正（内容に変化なし）
// 1.0.0 2015/11/01 初版
// ----------------------------------------------------------------------------
// [Blog]   : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================

/*:
 * @plugindesc Setting default value for Options
 * @author triacontane
 *
 * @param AlwaysDash
 * @desc Always dash(ON/OFF)
 * @default OFF
 *
 * @param CommandRemember
 * @desc Command remember(ON/OFF)
 * @default OFF
 *
 * @param BgmVolume
 * @desc BGM Volume(0-100)
 * @default 100
 *
 * @param BgsVolume
 * @desc BGS Volume(0-100)
 * @default 100
 *
 * @param MeVolume
 * @desc ME Volume(0-100)
 * @default 100
 *
 * @param SeVolume
 * @desc SE Volume(0-100)
 * @default 100
 *
 * @param EraseAlwaysDash
 * @desc Erase AlwaysDash Option(ON/OFF)
 * @default OFF
 *
 * @param EraseCommandRemember
 * @desc Erase CommandRemember Option(ON/OFF)
 * @default OFF
 *
 * @param EraseBgmVolume
 * @desc Erase BgmVolume Option(ON/OFF)
 * @default OFF
 *
 * @param EraseBgsVolume
 * @desc Erase BgsVolume Option(ON/OFF)
 * @default OFF
 *
 * @param EraseMeVolume
 * @desc Erase MeVolume Option(ON/OFF)
 * @default OFF
 *
 * @param EraseSeVolume
 * @desc Erase SeVolume Option(ON/OFF)
 * @default OFF
 *
 * @help Setting default value for Options.
 *
 * This plugin is released under the MIT License.
 */
/*:ja
 * @plugindesc オプションデフォルト値設定プラグイン
 * @author トリアコンタン
 *
 * @param 常時ダッシュ
 * @desc 常にダッシュする。（Shiftキーを押している場合のみ歩行）(ON/OFF)
 * @default OFF
 *
 * @param コマンド記憶
 * @desc 選択したコマンドを記憶する。(ON/OFF)
 * @default OFF
 *
 * @param BGM音量
 * @desc BGMの音量。0-100
 * @default 100
 *
 * @param BGS音量
 * @desc BGSの音量。0-100
 * @default 100
 *
 * @param ME音量
 * @desc MEの音量。0-100
 * @default 100
 *
 * @param SE音量
 * @desc SEの音量。0-100
 * @default 100
 *
 * @param 常時ダッシュ消去
 * @desc 常時ダッシュの項目を非表示にする。(ON/OFF)
 * @default OFF
 *
 * @param コマンド記憶消去
 * @desc コマンド記憶の項目を非表示にする。(ON/OFF)
 * @default OFF
 *
 * @param BGM音量消去
 * @desc BGM音量の項目を非表示にする。(ON/OFF)
 * @default OFF
 *
 * @param BGS音量消去
 * @desc BGS音量の項目を非表示にする。(ON/OFF)
 * @default OFF
 *
 * @param ME音量消去
 * @desc ME音量の項目を非表示にする。(ON/OFF)
 * @default OFF
 *
 * @param SE音量消去
 * @desc SE音量の項目を非表示にする。(ON/OFF)
 * @default OFF
 *
 * @help オプション画面で設定可能な項目のデフォルト値を指定した値に変更します。
 * 例えば、初回から常時ダッシュをONにしておけば
 * プレイヤーが設定を変更する手間を省くことができます。
 * この処理はconfig.rpgsaveが未作成の場合にのみ実行されます。
 *
 * また、項目そのものを消去することもできます。
 * 例えば、戦闘がないゲームでは「コマンド記憶」等は不要なので消去できます。
 *
 * このプラグインにはプラグインコマンドはありません。
 *
 * 利用規約：
 *  作者に無断で改変、再配布が可能で、利用形態（商用、18禁利用等）
 *  についても制限はありません。
 *  このプラグインはもうあなたのものです。
 */
(function () {
    'use strict';
    var pluginName = 'CustomizeConfigDefault';

    var getParamNumber = function (paramNames, min, max) {
        var value = getParamOther(paramNames);
        if (arguments.length < 2) min = -Infinity;
        if (arguments.length < 3) max = Infinity;
        return (parseInt(value, 10) || 0).clamp(min, max);
    };

    var getParamBoolean = function (paramNames) {
        var value = getParamOther(paramNames);
        return (value || '').toUpperCase() === 'ON';
    };

    var getParamOther = function (paramNames) {
        if (!Array.isArray(paramNames)) paramNames = [paramNames];
        for (var i = 0; i < paramNames.length; i++) {
            var name = PluginManager.parameters(pluginName)[paramNames[i]];
            if (name) return name;
        }
        return null;
    };

    //=============================================================================
    // パラメータの取得と整形
    //=============================================================================
    var paramAlwaysDash = getParamBoolean(['AlwaysDash', '常時ダッシュ']);
    var paramCommandRemember = getParamBoolean(['CommandRemember', 'コマンド記憶']);
    var paramBgmVolume = getParamNumber(['BgmVolume', 'BGM音量'], 0, 100);
    var paramBgsVolume = getParamNumber(['BgsVolume', 'BGS音量'], 0, 100);
    var paramMeVolume = getParamNumber(['MeVolume', 'ME音量'], 0, 100);
    var paramSeVolume = getParamNumber(['SeVolume', 'SE音量'], 0, 100);
    var paramEraseAlwaysDash = getParamBoolean(['EraseAlwaysDash', '常時ダッシュ消去']);
    var paramEraseCommandRemember = getParamBoolean(['EraseCommandRemember', 'コマンド記憶消去']);
    var paramEraseBgmVolume = getParamBoolean(['EraseBgmVolume', 'BGM音量消去']);
    var paramEraseBgsVolume = getParamBoolean(['EraseBgsVolume', 'BGS音量消去']);
    var paramEraseMeVolume = getParamBoolean(['EraseMeVolume', 'ME音量消去']);
    var paramEraseSeVolume = getParamBoolean(['EraseSeVolume', 'SE音量消去']);

    //=============================================================================
    // ConfigManager
    //  それぞれの項目に初期値を与えます。
    //=============================================================================
    var _ConfigManagerApplyData = ConfigManager.applyData;
    ConfigManager.applyData = function (config) {
        _ConfigManagerApplyData.apply(this, arguments);
        if (config.alwaysDash == null) this.alwaysDash = paramAlwaysDash;
        if (config.commandRemember == null) this.commandRemember = paramCommandRemember;
        if (config.bgmVolume == null) this.bgmVolume = paramBgmVolume;
        if (config.bgsVolume == null) this.bgsVolume = paramBgsVolume;
        if (config.meVolume == null) this.meVolume = paramMeVolume;
        if (config.seVolume == null) this.seVolume = paramSeVolume;
    };

    //=============================================================================
    // Window_Options
    //  パラメータを空白にした項目を除去します。
    //=============================================================================
    var _Window_Options_makeCommandList = Window_Options.prototype.makeCommandList;
    Window_Options.prototype.makeCommandList = function () {
        _Window_Options_makeCommandList.apply(this, arguments);
        if (paramEraseAlwaysDash) this.eraseOption('alwaysDash');
        if (paramEraseCommandRemember) this.eraseOption('commandRemember');
        if (paramEraseBgmVolume) this.eraseOption('bgmVolume');
        if (paramEraseBgsVolume) this.eraseOption('bgsVolume');
        if (paramEraseMeVolume) this.eraseOption('meVolume');
        if (paramEraseSeVolume) this.eraseOption('seVolume');
    };

    Window_Options.prototype.eraseOption = function (symbol) {
        for (var i = 0; i < this._list.length; i++) {
            if (this._list[i].symbol === symbol) {
                this._list.splice(i, 1);
                // for Mano_InputConfig.js
                this.adjustIndexManoInputConfig(i);
                break;
            }
        }
    };

    Window_Options.prototype.adjustIndexManoInputConfig = function (index) {
        if (this._gamepadOptionIndex > index) {
            this._gamepadOptionIndex -= 1;
        }
        if (this._keyboardConfigIndex > index) {
            this._keyboardConfigIndex -= 1;
        }
    };
})();


code:
//=============================================================================
// CustomizeConfigItem.js
// ----------------------------------------------------------------------------
// Copyright (c) 2015 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 2.1.0 2017/12/15 追加項目のデフォルト項目を含めた並び順を自由に設定できる機能を追加
//                  項目名称を日本語化
// 2.0.1 2017/10/15 2.0.0の修正によりスイッチ項目を有効にしたときにゲーム開始するとエラーになる問題を修正
// 2.0.0 2017/09/10 ツクールの型指定機能に対応し、各オプション項目を任意の数だけ追加できる機能を追加
// 1.2.3 2017/06/08 1.2.2の修正により起動できなくなっていた問題を修正
// 1.2.2 2017/05/27 競合の可能性のある記述（Objectクラスへのプロパティ追加）をリファクタリング
// 1.2.1 2016/12/08 1.2.0の機能追加以降、デフォルト項目で決定ボタンを押すとエラーになっていた現象を修正
// 1.2.0 2016/12/02 各項目で決定ボタンを押したときに実行されるスクリプトを設定できる機能を追加
// 1.1.1 2016/08/14 スイッチ項目、音量項目の初期値が無効になっていた問題を修正
// 1.1.0 2016/04/29 項目をクリックしたときに項目値が循環するよう修正
// 1.0.0 2016/01/17 初版
// ----------------------------------------------------------------------------
// [Blog]   : http://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================

/*:
 * @plugindesc オプション任意項目作成プラグイン
 * @author トリアコンタン
 *
 * @param 数値項目
 * @desc 追加する数値項目のオプション項目情報です。
 * @default
 * @type struct<NumberData>[]
 *
 * @param 文字項目
 * @desc 追加する文字項目のオプション項目情報です。
 * @default
 * @type struct<StringData>[]
 *
 * @param スイッチ項目
 * @desc 追加するスイッチ項目のオプション項目情報です。
 * @default
 * @type struct<BooleanData>[]
 *
 * @param 音量項目
 * @desc 追加する音量項目のオプション項目情報です。
 * @default
 * @type struct<VolumeData>[]
 *
 * @help オプション画面に任意の項目を追加します。
 * 項目の種類は、以下の四種類があります。
 * 不要な項目は値を空に設定してください。
 *
 * ・スイッチ項目：
 * ON/OFFを選択する項目です。指定した番号のスイッチと値が同期されます。
 * オプションから値を設定すれば、それがスイッチに反映され、
 * スイッチを変更すれば、オプションの値に反映されます。
 * さらに、値はセーブデータ間で共有されます。
 * 隠しフラグを設定すると、オプション画面に表示されなくなります。
 * ゲームを進めないと出現しない項目などに利用できます。
 * 隠しフラグはプラグインコマンドから解除できます。
 *
 * スクリプトは上級者向け項目です。対象にカーソルを合わせて決定ボタンを
 * 押下すると指定したJavaScriptを実行できます。
 * 主に専用の設定画面などの遷移に使用します。
 *
 * ・数値項目：
 * 数値を選択する項目です。指定した番号の変数と値が同期されます。
 * スイッチ項目で指定した内容に加えて、
 * 最小値と最大値および一回の入力で変化する値を指定します。
 *
 * ・音量項目：
 * 音量を選択する項目です。BGMボリュームなどと同じ仕様で
 * キャラクターごとのボイス音量等に使ってください。
 *
 * ・文字項目：
 * 文字を選択する項目です。指定した文字の配列から項目を選択します。
 * 選択した文字のインデックス(開始位置は0)が変数に設定されます。
 * 初期値に設定する値もインデックスです。
 *
 * プラグインコマンド詳細
 *  イベントコマンド「プラグインコマンド」から実行。
 *  （パラメータの間は半角スペースで区切る）
 *
 *  CC_UNLOCK or
 *  オプション任意項目の隠し解除 [項目名]
 *  　指定した項目の隠しフラグを解除します。
 *  使用例：CC_UNLOCK 数値項目1
 *
 * 利用規約：
 *  作者に無断で改変、再配布が可能で、利用形態（商用、18禁利用等）
 *  についても制限はありません。
 *  このプラグインはもうあなたのものです。
 */

/*~struct~NumberData:
 * @param Name
 * @text 項目名称
 * @desc 項目の名称です。
 * @default 数値項目1
 *
 * @param DefaultValue
 * @text 初期値
 * @desc 項目の初期値です。
 * @default 0
 * @type number
 *
 * @param VariableID
 * @text 変数番号
 * @desc 項目の設定内容が格納される変数番号です。
 * @default 0
 * @type variable
 *
 * @param HiddenFlag
 * @text 隠しフラグ
 * @desc 項目がデフォルトで隠されるようになります。プラグインコマンドの実行で表示されます。
 * @default false
 * @type boolean
 *
 * @param Script
 * @text スクリプト
 * @desc 項目を決定したときに実行されるスクリプトです。
 * @default
 *
 * @param NumberMin
 * @text 最小値
 * @desc 項目の最小値です。
 * @default 0
 * @type number
 *
 * @param NumberMax
 * @text 最大値
 * @desc 項目の最大値です。
 * @default 100
 * @type number
 *
 * @param NumberStep
 * @text 変化値
 * @desc 項目を操作したときの数値の変化量です。
 * @default 20
 * @type number
 *
 * @param AddPosition
 * @text 追加位置
 * @desc 項目を追加する位置です。指定した項目の上に追加されます。
 * @default
 * @type select
 * @option 末尾に追加
 * @value
 * @option 常時ダッシュ
 * @value alwaysDash
 * @option コマンド記憶
 * @value commandRemember
 * @option BGM 音量
 * @value bgmVolume
 * @option BGS 音量
 * @value bgsVolume
 * @option ME 音量
 * @value meVolume
 * @option SE 音量
 * @value seVolume
 */
/*~struct~BooleanData:
 * @param Name
 * @text 項目名称
 * @desc 項目の名称です。
 * @default スイッチ項目1
 *
 * @param DefaultValue
 * @text 初期値
 * @desc 項目の初期値です。
 * @default false
 * @type boolean
 *
 * @param SwitchID
 * @text スイッチ番号
 * @desc 項目の設定内容が格納されるスイッチ番号です。
 * @default 0
 * @type switch
 *
 * @param HiddenFlag
 * @text 隠しフラグ
 * @desc 項目がデフォルトで隠されるようになります。プラグインコマンドの実行で表示されます。
 * @default false
 * @type boolean
 *
 * @param Script
 * @text スクリプト
 * @desc 項目を決定したときに実行されるスクリプトです。
 * @default
 *
 * @param AddPosition
 * @text 追加位置
 * @desc 項目を追加する位置です。指定した項目の上に追加されます。
 * @default
 * @type select
 * @option 末尾に追加
 * @value
 * @option 常時ダッシュ
 * @value alwaysDash
 * @option コマンド記憶
 * @value commandRemember
 * @option BGM 音量
 * @value bgmVolume
 * @option BGS 音量
 * @value bgsVolume
 * @option ME 音量
 * @value meVolume
 * @option SE 音量
 * @value seVolume
 */
/*~struct~StringData:
 * @param Name
 * @text 項目名称
 * @desc 項目の名称です。
 * @default 文字列項目1
 *
 * @param DefaultValue
 * @text 初期値
 * @desc 項目の初期値です。インデックスの数値を指定します。
 * @default 0
 * @type number
 *
 * @param VariableID
 * @text 変数番号
 * @desc 項目の設定内容が格納される変数番号です。
 * @default 0
 * @type variable
 *
 * @param HiddenFlag
 * @text 隠しフラグ
 * @desc 項目がデフォルトで隠されるようになります。プラグインコマンドの実行で表示されます。
 * @default false
 * @type boolean
 *
 * @param Script
 * @text スクリプト
 * @desc 項目を決定したときに実行されるスクリプトです。
 * @default
 *
 * @param StringItems
 * @text 内容の配列
 * @desc 項目の設定内容の配列です。
 * @default
 * @type string[]
 *
 * @param AddPosition
 * @text 追加位置
 * @desc 項目を追加する位置です。指定した項目の上に追加されます。
 * @default
 * @type select
 * @option 末尾に追加
 * @value
 * @option 常時ダッシュ
 * @value alwaysDash
 * @option コマンド記憶
 * @value commandRemember
 * @option BGM 音量
 * @value bgmVolume
 * @option BGS 音量
 * @value bgsVolume
 * @option ME 音量
 * @value meVolume
 * @option SE 音量
 * @value seVolume
 */
/*~struct~VolumeData:
 * @param Name
 * @text 項目名称
 * @desc 項目の名称です。
 * @default 音量項目1
 *
 * @param DefaultValue
 * @text 初期値
 * @desc 項目の初期値です。
 * @default 0
 * @type number
 *
 * @param VariableID
 * @text 変数番号
 * @desc 項目の設定内容が格納される変数番号です。
 * @default 0
 * @type variable
 *
 * @param HiddenFlag
 * @text 隠しフラグ
 * @desc 項目がデフォルトで隠されるようになります。プラグインコマンドの実行で表示されます。
 * @default false
 * @type boolean
 *
 * @param Script
 * @text スクリプト
 * @desc 項目を決定したときに実行されるスクリプトです。
 * @default
 *
 * @param AddPosition
 * @text 追加位置
 * @desc 項目を追加する位置です。指定した項目の上に追加されます。
 * @default
 * @type select
 * @option 末尾に追加
 * @value
 * @option 常時ダッシュ
 * @value alwaysDash
 * @option コマンド記憶
 * @value commandRemember
 * @option BGM 音量
 * @value bgmVolume
 * @option BGS 音量
 * @value bgsVolume
 * @option ME 音量
 * @value meVolume
 * @option SE 音量
 * @value seVolume
 */

(function () {
    'use strict';
    var pluginName = 'CustomizeConfigItem';

    var getParamString = function (paramNames) {
        var value = getParamOther(paramNames);
        return value == null ? '' : value;
    };

    var getParamOther = function (paramNames) {
        if (!Array.isArray(paramNames)) paramNames = [paramNames];
        for (var i = 0; i < paramNames.length; i++) {
            var name = PluginManager.parameters(pluginName)[paramNames[i]];
            if (name) return name;
        }
        return null;
    };

    var getParamArrayJson = function (paramNames, defaultValue) {
        var value = getParamString(paramNames) || null;
        try {
            value = JSON.parse(value);
            if (value === null) {
                value = defaultValue;
            } else {
                value = value.map(function (valueData) {
                    return JSON.parse(valueData);
                });
            }
        } catch (e) {
            alert(`!!!Plugin param is wrong.!!!\nPlugin:${pluginName}.js\nName:[${paramNames}]\nValue:${value}`);
            value = defaultValue;
        }
        return value;
    };

    var getCommandName = function (command) {
        return (command || '').toUpperCase();
    };

    var getArgNumber = function (arg, min, max) {
        if (arguments.length < 2) min = -Infinity;
        if (arguments.length < 3) max = Infinity;
        return (parseInt(arg) || 0).clamp(min, max);
    };

    var getArgBoolean = function (arg) {
        return (arg || '').toUpperCase() === 'TRUE';
    };

    var getArgJson = function (arg, defaultValue) {
        try {
            arg = JSON.parse(arg || null);
            if (arg === null) {
                arg = defaultValue;
            }
        } catch (e) {
            alert(`!!!Plugin param is wrong.!!!\nPlugin:${pluginName}.js\nValue:${arg}`);
            arg = defaultValue;
        }
        return arg;
    };

    var iterate = function (that, handler) {
        Object.keys(that).forEach(function (key, index) {
            handler.call(that, key, that[key], index);
        });
    };

    //=============================================================================
    // パラメータの取得と整形
    //=============================================================================
    var param = {};
    param.numberOptions = getParamArrayJson(['NumberOptions', '数値項目'], []);
    param.stringOptions = getParamArrayJson(['StringOptions', '文字項目'], []);
    param.switchOptions = getParamArrayJson(['SwitchOptions', 'スイッチ項目'], []);
    param.volumeOptions = getParamArrayJson(['VolumeOptions', '音量項目'], []);

    var localOptionWindowIndex = 0;

    //=============================================================================
    // Game_Interpreter
    //  プラグインコマンドを追加定義します。
    //=============================================================================
    var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function (command, args) {
        _Game_Interpreter_pluginCommand.call(this, command, args);
        this.pluginCommandCustomizeConfigItem(command, args);
    };

    Game_Interpreter.prototype.pluginCommandCustomizeConfigItem = function (command, args) {
        switch (getCommandName(command)) {
            case 'CC_UNLOCK':
            case 'オプション任意項目の隠し解除':
                ConfigManager.customParamUnlock(args[0]);
                break;
        }
    };

    //=============================================================================
    // ConfigManager
    //  追加項目の設定値や初期値を管理します。
    //=============================================================================
    ConfigManager.customParams = null;
    ConfigManager.hiddenInfo = {};
    ConfigManager._symbolNumber = 'Number';
    ConfigManager._symbolBoolean = 'Boolean';
    ConfigManager._symbolString = 'String';
    ConfigManager._symbolVolume = 'Volume';

    ConfigManager.getCustomParams = function () {
        if (this.customParams) {
            return this.customParams;
        }
        this.customParams = {};
        param.numberOptions.forEach(function (optionItem, index) {
            this.makeNumberOption(optionItem, index);
        }, this);
        param.stringOptions.forEach(function (optionItem, index) {
            this.makeStringOption(optionItem, index);
        }, this);
        param.switchOptions.forEach(function (optionItem, index) {
            this.makeSwitchOption(optionItem, index);
        }, this);
        param.volumeOptions.forEach(function (optionItem, index) {
            this.makeVolumeOption(optionItem, index);
        }, this);
        return this.customParams;
    };

    ConfigManager.makeNumberOption = function (optionItem, index) {
        var data = this.makeCommonOption(optionItem, index, this._symbolNumber);
        data.min = getArgNumber(optionItem.NumberMin);
        data.max = getArgNumber(optionItem.NumberMax);
        data.offset = getArgNumber(optionItem.NumberStep);
        this.pushOptionData(data);
    };

    ConfigManager.makeStringOption = function (optionItem, index) {
        var data = this.makeCommonOption(optionItem, index, this._symbolString);
        data.values = getArgJson(optionItem.StringItems, ['no item']);
        data.min = 0;
        data.max = data.values.length - 1;
        this.pushOptionData(data);
    };

    ConfigManager.makeSwitchOption = function (optionItem, index) {
        var data = this.makeCommonOption(optionItem, index, this._symbolBoolean);
        data.initValue = getArgBoolean(optionItem.DefaultValue);
        data.variable = getArgNumber(optionItem.SwitchID);
        this.pushOptionData(data);
    };

    ConfigManager.makeVolumeOption = function (optionItem, index) {
        var data = this.makeCommonOption(optionItem, index, this._symbolVolume);
        this.pushOptionData(data);
    };

    ConfigManager.makeCommonOption = function (optionItem, index, type) {
        var data = {};
        data.symbol = `${type}${index + 1}`;
        data.name = optionItem.Name;
        data.hidden = getArgBoolean(optionItem.HiddenFlag);
        data.script = optionItem.Script;
        data.initValue = getArgNumber(optionItem.DefaultValue);
        data.variable = getArgNumber(optionItem.VariableID, 0);
        data.addPotion = optionItem.AddPosition;
        return data;
    };

    ConfigManager.pushOptionData = function (data) {
        this.customParams[data.symbol] = data;
    };

    var _ConfigManager_makeData = ConfigManager.makeData;
    ConfigManager.makeData = function () {
        var config = _ConfigManager_makeData.apply(this, arguments);
        config.hiddenInfo = {};
        iterate(this.getCustomParams(), function (symbol) {
            config[symbol] = this[symbol];
            config.hiddenInfo[symbol] = this.hiddenInfo[symbol];
        }.bind(this));
        return config;
    };

    var _ConfigManager_applyData = ConfigManager.applyData;
    ConfigManager.applyData = function (config) {
        _ConfigManager_applyData.apply(this, arguments);
        iterate(this.getCustomParams(), function (symbol, item) {
            if (symbol.contains(this._symbolBoolean)) {
                this[symbol] = this.readFlagCustom(config, symbol, item);
            } else if (symbol.contains(this._symbolVolume)) {
                this[symbol] = this.readVolumeCustom(config, symbol, item);
            } else {
                this[symbol] = this.readOther(config, symbol, item);
            }
            this.hiddenInfo[symbol] = (config.hiddenInfo ? config.hiddenInfo[symbol] : item.hidden);
        }.bind(this));
    };

    ConfigManager.customParamUnlock = function (name) {
        iterate(this.getCustomParams(), function (symbol, item) {
            if (item.name === name) this.hiddenInfo[symbol] = false;
        }.bind(this));
        this.save();
    };

    ConfigManager.readOther = function (config, name, item) {
        var value = config[name];
        if (value !== undefined) {
            return Number(value).clamp(item.min, item.max);
        } else {
            return item.initValue;
        }
    };

    ConfigManager.readFlagCustom = function (config, name, item) {
        if (config[name] !== undefined) {
            return this.readFlag(config, name);
        } else {
            return item.initValue;
        }
    };

    ConfigManager.readVolumeCustom = function (config, name, item) {
        if (config[name] !== undefined) {
            return this.readVolume(config, name);
        } else {
            return item.initValue;
        }
    };

    ConfigManager.exportCustomParams = function () {
        if (!$gameVariables || !$gameSwitches) return;
        iterate(this.getCustomParams(), function (symbol, item) {
            if (item.variable > 0) {
                if (symbol.contains(this._symbolBoolean)) {
                    $gameSwitches.setValue(item.variable, !!this[symbol]);
                } else {
                    $gameVariables.setValue(item.variable, this[symbol]);
                }
            }
        }.bind(this));
    };

    ConfigManager.importCustomParams = function () {
        if (!$gameVariables || !$gameSwitches) return;
        iterate(this.getCustomParams(), function (symbol, item) {
            if (item.variable > 0) {
                if (symbol.contains(this._symbolBoolean)) {
                    this[symbol] = $gameSwitches.value(item.variable);
                } else if (symbol.contains(this._symbolVolume)) {
                    this[symbol] = $gameVariables.value(item.variable).clamp(0, 100);
                } else {
                    this[symbol] = $gameVariables.value(item.variable).clamp(item.min, item.max);
                }
            }
        }.bind(this));
    };

    var _ConfigManager_save = ConfigManager.save;
    ConfigManager.save = function () {
        _ConfigManager_save.apply(this, arguments);
        this.exportCustomParams();
    };

    //=============================================================================
    // Game_Map
    //  リフレッシュ時にオプション値を同期します。
    //=============================================================================
    var _Game_Map_refresh = Game_Map.prototype.refresh;
    Game_Map.prototype.refresh = function () {
        _Game_Map_refresh.apply(this, arguments);
        ConfigManager.importCustomParams();
    };

    //=============================================================================
    // DataManager
    //  セーブ時とロード時にオプション値を同期します。
    //=============================================================================
    var _DataManager_setupNewGame = DataManager.setupNewGame;
    DataManager.setupNewGame = function () {
        _DataManager_setupNewGame.apply(this, arguments);
        ConfigManager.exportCustomParams();
    };

    var _DataManager_loadGameWithoutRescue = DataManager.loadGameWithoutRescue;
    DataManager.loadGameWithoutRescue = function (savefileId) {
        var result = _DataManager_loadGameWithoutRescue.apply(this, arguments);
        ConfigManager.exportCustomParams();
        return result;
    };

    //=============================================================================
    // Window_Options
    //  追加項目を描画します。
    //=============================================================================
    var _Window_Options_initialize = Window_Options.prototype.initialize;
    Window_Options.prototype.initialize = function () {
        this._customParams = ConfigManager.getCustomParams();
        _Window_Options_initialize.apply(this, arguments);
        this.select(localOptionWindowIndex);
        localOptionWindowIndex = 0;
    };

    var _Window_Options_makeCommandList = Window_Options.prototype.makeCommandList;
    Window_Options.prototype.makeCommandList = function () {
        _Window_Options_makeCommandList.apply(this, arguments);
        this.addCustomOptions();
    };

    Window_Options.prototype.addCustomOptions = function () {
        iterate(this._customParams, function (key, item) {
            if (!ConfigManager.hiddenInfo[key]) {
                this.addCommand(item.name, key);
                if (item.addPotion) {
                    this.shiftCustomOptions(item.addPotion);
                }
            }
        }.bind(this));
    };

    Window_Options.prototype.shiftCustomOptions = function (addPotion) {
        var targetCommand = this._list.filter(function (command) {
            return command.symbol === addPotion;
        })[0];
        if (!targetCommand) {
            return;
        }
        var targetIndex = this._list.indexOf(targetCommand);
        var newCommand = this._list.pop();
        this._list.splice(targetIndex, 0, newCommand);
    };

    var _Window_Options_statusText = Window_Options.prototype.statusText;
    Window_Options.prototype.statusText = function (index) {
        var result = _Window_Options_statusText.apply(this, arguments);
        var symbol = this.commandSymbol(index);
        var value = this.getConfigValue(symbol);
        if (this.isNumberSymbol(symbol)) {
            result = this.numberStatusText(value);
        } else if (this.isStringSymbol(symbol)) {
            result = this.stringStatusText(value, symbol);
        }
        return result;
    };

    Window_Options.prototype.isNumberSymbol = function (symbol) {
        return symbol.contains(ConfigManager._symbolNumber);
    };

    Window_Options.prototype.isStringSymbol = function (symbol) {
        return symbol.contains(ConfigManager._symbolString);
    };

    Window_Options.prototype.isCustomSymbol = function (symbol) {
        return !!this._customParams[symbol];
    };

    Window_Options.prototype.numberStatusText = function (value) {
        return value;
    };

    Window_Options.prototype.stringStatusText = function (value, symbol) {
        return this._customParams[symbol].values[value];
    };

    var _Window_Options_processOk = Window_Options.prototype.processOk;
    Window_Options.prototype.processOk = function () {
        if (!this._shiftValue(1, true)) _Window_Options_processOk.apply(this, arguments);
        this.execScript();
    };

    var _Window_Options_cursorRight = Window_Options.prototype.cursorRight;
    Window_Options.prototype.cursorRight = function (wrap) {
        if (!this._shiftValue(1, false)) _Window_Options_cursorRight.apply(this, arguments);
    };

    var _Window_Options_cursorLeft = Window_Options.prototype.cursorLeft;
    Window_Options.prototype.cursorLeft = function (wrap) {
        if (!this._shiftValue(-1, false)) _Window_Options_cursorLeft.apply(this, arguments);
    };

    Window_Options.prototype._shiftValue = function (sign, loopFlg) {
        var symbol = this.commandSymbol(this.index());
        var value = this.getConfigValue(symbol);
        if (this.isNumberSymbol(symbol)) {
            value += this.numberOffset(symbol) * sign;
            this.changeValue(symbol, this._clampValue(value, symbol, loopFlg));
            return true;
        }
        if (this.isStringSymbol(symbol)) {
            value += sign;
            this.changeValue(symbol, this._clampValue(value, symbol, loopFlg));
            return true;
        }
        return false;
    };

    Window_Options.prototype.execScript = function () {
        var symbol = this.commandSymbol(this.index());
        if (!this.isCustomSymbol(symbol)) return;
        var script = this._customParams[symbol].script;
        if (script) eval(script);
        localOptionWindowIndex = this.index();
    };

    Window_Options.prototype._clampValue = function (value, symbol, loopFlg) {
        var maxValue = this._customParams[symbol].max;
        var minValue = this._customParams[symbol].min;
        if (loopFlg) {
            if (value > maxValue) value = minValue;
            if (value < minValue) value = maxValue;
        }
        return value.clamp(this._customParams[symbol].min, this._customParams[symbol].max);
    };

    Window_Options.prototype.numberOffset = function (symbol) {
        var value = this._customParams[symbol].offset;
        if (Input.isPressed('shift')) value *= 10;
        return value;
    };

    Window_Options.prototype.windowHeight = function () {
        return this.fittingHeight(Math.min(this.numVisibleRows(), 14));
    };
})();


code:
//=============================================================================
// CustomizeErrorScreen.js
// ----------------------------------------------------------------------------
// (C)2016 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.3.0 2020/11/29 パラメータの型指定機能に対応
// 1.2.1 2020/11/29 非同期処理でエラーイベントを捕捉したときスタックトレースの表示が正しく行えない問題を修正
// 1.2.0 2016/11/10 連絡先のリンクを開く際に、既定のブラウザで開くよう変更
// 1.1.1 2016/07/13 表記方法を少しだけ変更
// 1.1.0 2016/07/13 ローカル実行時、エラー情報のパスを出力しないよう修正
// 1.0.1 2016/06/25 エラー発生時のリンク先を別画面で開くよう修正
// 1.0.0 2016/05/14 初版
// ----------------------------------------------------------------------------
// [Blog]   : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================

/*:
 * @plugindesc Customize Error Screen
 * @author triacontane
 *
 * @param MainMessage
 * @desc
 * @default !!Error!!
 *
 * @param HyperLink
 * @desc
 * @default
 *
 * @param OutputDetail
 * @desc
 * @default ON
 *
 * @help Visualize detail information for Error Screen.
 *
 * This plugin is released under the MIT License.
 */
/*:ja
 * @plugindesc エラー画面表示改善プラグイン
 * @author トリアコンタン
 *
 * @param MainMessage
 * @text メインメッセージ
 * @desc エラー画面に共通で表示されるメッセージ
 * @default 以下のエラーが発生しました。
 *
 * @param HyperLink
 * @text リンク先URL
 * @desc エラー画面に表示するリンク先URL
 * @default
 *
 * @param OutputDetail
 * @text 詳細情報出力
 * @desc エラー情報の詳細(スタックトレース)を出力します。
 * @default true
 * @type boolean
 *
 * @help エラー画面の表示を改善します。固定メッセージと連絡先のハイパーリンクを
 * 指定できるほか、エラーの詳細情報（スタックトレース）も表示されるようになります。
 * またURL用にエンコードされて表示される全角文字列をもとの文字列に
 * デコードして表示します。
 *
 * このプラグインにはプラグインコマンドはありません。
 *
 * 利用規約：
 *  作者に無断で改変、再配布が可能で、利用形態（商用、18禁利用等）
 *  についても制限はありません。
 *  このプラグインはもうあなたのものです。
 */

(function () {
    'use strict';

    var createPluginParameter = function (pluginName) {
        var paramReplacer = function (key, value) {
            if (value === 'null') {
                return value;
            }
            if (value[0] === '"' && value[value.length - 1] === '"') {
                return value;
            }
            try {
                return JSON.parse(value);
            } catch (e) {
                return value;
            }
        };
        var parameter = JSON.parse(JSON.stringify(PluginManager.parameters(pluginName), paramReplacer));
        PluginManager.setParameters(pluginName, parameter);
        return parameter;
    };

    var param = createPluginParameter('CustomizeErrorScreen');

    //=============================================================================
    // SceneManager
    //  エラー情報の出力処理を追加します。
    //=============================================================================
    var _SceneManager_onError = SceneManager.onError;
    SceneManager.onError = function (e) {
        _SceneManager_onError.apply(this, arguments);
        try {
            Graphics.printErrorDetail(e.error, decodeURIComponent(e.filename));
        } catch (e2) {
        }
    };

    var _SceneManager_catchException = SceneManager.catchException;
    SceneManager.catchException = function (e) {
        _SceneManager_catchException.apply(this, arguments);
        Graphics.printErrorDetail(e);
    };

    //=============================================================================
    // Graphics
    //  エラー情報を出力します。
    //=============================================================================
    var _Graphics__makeErrorHtml = Graphics._makeErrorHtml;
    Graphics._makeErrorHtml = function (name, message) {
        arguments[1] = decodeURIComponent(message);
        return _Graphics__makeErrorHtml.apply(this, arguments);
    };

    Graphics.printErrorDetail = function (e) {
        this.hideFps();
        this._setErrorPrinterStyle();
        if (this._errorPrinter) {
            this._makeMainMessage();
            if (param.HyperLink) this._makeHyperLink();
            if (param.OutputDetail) {
                var stack = String(e.stack) || '';
                if (Utils.isNwjs()) {
                    stack = stack.replace(/file:.*js\//g, '');
                    stack = stack.replace(/ at /g, '
');
                }
                this._makeStackTrace(stack);
            }
        }
    };

    Graphics._makeMainMessage = function () {
        var mainMessage = document.createElement('div');
        var style = mainMessage.style;
        style.color = 'white';
        style.textAlign = 'left';
        style.fontSize = '18px';
        mainMessage.innerHTML = '
' + param.MainMessage;
        this._errorPrinter.appendChild(mainMessage);
    };

    Graphics._makeHyperLink = function () {
        var hyperLink = document.createElement('a');
        var style = hyperLink.style;
        style.color = 'blue';
        style.textAlign = 'left';
        style.fontSize = '20px';
        style['text-decoration'] = 'underline';
        style.cursor = 'pointer';
        hyperLink.addEventListener('click', this._openUrl.bind(this, param.HyperLink));
        hyperLink.innerHTML = param.HyperLink;
        this._errorPrinter.appendChild(hyperLink);
    };

    Graphics._openUrl = function (url) {
        if (!Utils.isNwjs()) {
            window.open(url);
            return;
        }
        var exec = require('child_process').exec;
        switch (process.platform) {
            case 'win32':
                exec('rundll32.exe url.dll,FileProtocolHandler "' + url + '"');
                break;
            default:
                exec('open "' + url + '"');
                break;
        }
    };

    Graphics._makeStackTrace = function (stack) {
        var stackTrace = document.createElement('div');
        var style = stackTrace.style;
        style.color = 'white';
        style.textAlign = 'left';
        style.fontSize = '18px';
        style.userSelect = 'text';
        style.webkitUserSelect = 'text';
        style.msUserSelect = 'text';
        style.mozUserSelect = 'text';
        stackTrace.innerHTML = '

' + stack + '
';
        this._errorPrinter.appendChild(stackTrace);
    };

    Graphics._setErrorPrinterStyle = function () {
        this._errorPrinter.width = this._width * 0.9;
        this._errorPrinter.height = this._height * 0.9;
        var style = this._errorPrinter.style;
        style.textAlign = 'center';
        style.textShadow = '1px 1px 3px #000';
        style.fontSize = '22px';
        style.zIndex = 99;
        this._centerElement(this._errorPrinter);
    };
})();