code:
//=============================================================================
// GachaBook.js
//
// (c)2016 KADOKAWA CORPORATION./YOJI OJIMA
//=============================================================================

/*:
 * @plugindesc Displays detailed statuses of "gacha" items.
 * @author Takeya Kimura
 *
 * @param Unknown Data
 * @desc The index name for an unknown item.
 * @default ??????
 *
 * @param Price Text
 * @desc The text for "Price".
 * @default Price
 *
 * @param Equip Text
 * @desc The text for "Equip".
 * @default Equip
 *
 * @param Type Text
 * @desc The text for "Type".
 * @default Type
 *
 * @param Rank Text
 * @desc The text for "Rank".
 * @default Rank
 *
 * @param Simple Display
 * @desc The switch to display the name and description only.
 * @default 0
 *
 * @help
 *
 * Plugin Command:
 *   GachaBook open            # Open the gacha book screen
 *   GachaBook add weapon 3    # Add weapon #3 to the gacha book
 *   GachaBook add armor 4     # Add armor #4 to the gacha book
 *   GachaBook remove armor 5  # Remove armor #5 from the gacha book
 *   GachaBook remove item 6   # Remove item #6 from the gacha book
 *   GachaBook clear           # Clear the item book
 */

/*:ja
 * @plugindesc ガチャアイテム一覧を表示します。
 * @author Takeya Kimura
 *
 * @param Unknown Data
 * @desc 未確認のガチャアイテムの名前です。
 * @default ??????
 *
 * @param Price Text
 * @desc 「価格」の文字列です。
 * @default Price
 *
 * @param Equip Text
 * @desc 「装備」の文字列です。
 * @default Equip
 *
 * @param Type Text
 * @desc 「タイプ」の文字列です。
 * @default Type
 *
 * @param Rank Text
 * @desc 「ランク」の文字列です。
 * @default Rank
 *
 * @param Simple Display
 * @desc 1と入力すると詳細表示が名前と説明だけになります。[0: 通常表示 1: シンプル表示]
 * @default 0
 *
 * @help
 *
 * Plugin Command:
 *   GachaBook open            # ガチャブックを開きます
 *   GachaBook add weapon 3    # 武器３番をガチャブックに追加
 *   GachaBook add armor 4     # 防具4番をガチャブックに追加
 *   GachaBook remove armor 5  # 防具5番をガチャブックから削除
 *   GachaBook remove item 6   # アイテム6番をガチャブックから削除
 *   GachaBook clear           # ガチャブックをクリアする
 */

(function () {

    var parameters = PluginManager.parameters('GachaBook');
    var unknownData = String(parameters['Unknown Data'] || '??????');
    var priceText = String(parameters['Price Text'] || 'Price');
    var equipText = String(parameters['Equip Text'] || 'Equip');
    var typeText = String(parameters['Type Text'] || 'Type');
    var rankText = String(parameters['Rank Text'] || 'Rank');
    var simpleDisplay = !!Number(parameters['Simple Display'] || 0);

    var _Game_Interpreter_pluginCommand =
        Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function (command, args) {
        _Game_Interpreter_pluginCommand.call(this, command, args);
        if (command === 'GachaBook') {
            switch (args[0]) {
                case 'open':
                    SceneManager.push(Scene_GachaBook);
                    break;
                case 'add':
                    $gameSystem.addToGachaBook(args[1], Number(args[2]));
                    break;
                case 'remove':
                    $gameSystem.removeFromGachaBook(args[1], Number(args[2]));
                    break;
                case 'complete':
                    $gameSystem.completeGachaBook();
                    break;
                case 'clear':
                    $gameSystem.clearGachaBook();
                    break;
            }
        }
    };

    Game_System.prototype.addToGachaBook = function (type, dataId) {
        if (!this._GachaBookFlags) {
            this.clearGachaBook();
        }
        var typeIndex = this.gachaBookTypeToIndex(type);
        if (typeIndex >= 0) {
            this._GachaBookFlags[typeIndex][dataId] = true;
        }
    };

    Game_System.prototype.removeFromGachaBook = function (type, dataId) {
        if (this._GachaBookFlags) {
            var typeIndex = this.gachaBookTypeToIndex(type);
            if (typeIndex >= 0) {
                this._GachaBookFlags[typeIndex][dataId] = false;
            }
        }
    };

    Game_System.prototype.gachaBookTypeToIndex = function (type) {
        switch (type) {
            case 'item':
                return 0;
            case 'weapon':
                return 1;
            case 'armor':
                return 2;
            default:
                return -1;
        }
    };

    Game_System.prototype.completeGachaBook = function () {
        var i;
        this.clearGachaBook();
        for (i = 1; i < $dataItems.length; i++) {
            this._GachaBookFlags[0][i] = true;
        }
        for (i = 1; i < $dataWeapons.length; i++) {
            this._GachaBookFlags[1][i] = true;
        }
        for (i = 1; i < $dataArmors.length; i++) {
            this._GachaBookFlags[2][i] = true;
        }
    };

    Game_System.prototype.clearGachaBook = function () {
        this._GachaBookFlags = [[], [], []];
    };

    Game_System.prototype.isInGachaBook = function (item) {
        if (this._GachaBookFlags && item) {
            var typeIndex = -1;
            if (DataManager.isItem(item)) {
                typeIndex = 0;
            } else if (DataManager.isWeapon(item)) {
                typeIndex = 1;
            } else if (DataManager.isArmor(item)) {
                typeIndex = 2;
            }
            if (typeIndex >= 0) {
                return !!this._GachaBookFlags[typeIndex][item.id];
            } else {
                return false;
            }
        } else {
            return false;
        }
    };

    var _Game_Party_gainItem = Game_Party.prototype.gainItem;
    Game_Party.prototype.gainItem = function (item, amount, includeEquip) {
        _Game_Party_gainItem.call(this, item, amount, includeEquip);
        if (item && amount > 0) {
            var type;
            if (DataManager.isItem(item)) {
                type = 'item';
            } else if (DataManager.isWeapon(item)) {
                type = 'weapon';
            } else if (DataManager.isArmor(item)) {
                type = 'armor';
            }
            $gameSystem.addToGachaBook(type, item.id);
        }
    };

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

    Scene_GachaBook.prototype = Object.create(Scene_MenuBase.prototype);
    Scene_GachaBook.prototype.constructor = Scene_GachaBook;

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

    Scene_GachaBook.prototype.create = function () {
        Scene_MenuBase.prototype.create.call(this);
        this._indexWindow = new Window_GachaBookIndex(0, 0);
        this._indexWindow.setHandler('cancel', this.popScene.bind(this));
        var wy = this._indexWindow.height;
        var ww = Graphics.boxWidth;
        var wh = Graphics.boxHeight - wy;
        this._statusWindow = new Window_GachaBookStatus(0, wy, ww, wh);
        this.addWindow(this._indexWindow);
        this.addWindow(this._statusWindow);
        this._indexWindow.setStatusWindow(this._statusWindow);
    };

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

    Window_GachaBookIndex.prototype = Object.create(Window_Selectable.prototype);
    Window_GachaBookIndex.prototype.constructor = Window_GachaBookIndex;

    Window_GachaBookIndex.lastTopRow = 0;
    Window_GachaBookIndex.lastIndex = 0;

    Window_GachaBookIndex.prototype.initialize = function (x, y) {
        var width = Graphics.boxWidth;
        var height = this.fittingHeight(6);
        Window_Selectable.prototype.initialize.call(this, x, y, width, height);
        this.refresh();
        this.setTopRow(Window_GachaBookIndex.lastTopRow);
        this.select(Window_GachaBookIndex.lastIndex);
        this.activate();
    };

    Window_GachaBookIndex.prototype.maxCols = function () {
        return 3;
    };

    Window_GachaBookIndex.prototype.maxItems = function () {
        return this._list ? this._list.length : 0;
    };

    Window_GachaBookIndex.prototype.setStatusWindow = function (statusWindow) {
        this._statusWindow = statusWindow;
        this.updateStatus();
    };

    Window_GachaBookIndex.prototype.update = function () {
        Window_Selectable.prototype.update.call(this);
        this.updateStatus();
    };

    Window_GachaBookIndex.prototype.updateStatus = function () {
        if (this._statusWindow) {
            var item = this._list[this.index()];
            this._statusWindow.setItem(item);
        }
    };

    Window_GachaBookIndex.prototype.refresh = function () {
        var i, item;
        this._list = [];
        for (i = 1; i < $dataItems.length; i++) {
            item = $dataItems[i];
            //if (item.name && item.itypeId === 1 && $gameSystem.isInGacha(item)) { //itypeIdはみない
            if (item.name && $gameSystem.isInGacha(item)) { //itypeIdはみない
                this._list.push(item);
            }
        }
        for (i = 1; i < $dataWeapons.length; i++) {
            item = $dataWeapons[i];
            if (item.name && $gameSystem.isInGacha(item)) {
                this._list.push(item);
            }
        }
        for (i = 1; i < $dataArmors.length; i++) {
            item = $dataArmors[i];
            if (item.name && $gameSystem.isInGacha(item)) {
                this._list.push(item);
            }
        }
        this.createContents();
        this.drawAllItems();
    };

    Window_GachaBookIndex.prototype.drawItem = function (index) {
        var item = this._list[index];
        var rect = this.itemRect(index);
        var width = rect.width - this.textPadding();
        if ($gameSystem.isInGachaBook(item)) {
            this.drawItemName(item, rect.x, rect.y, width);
        } else {
            var iw = Window_Base._iconWidth + 4;
            this.drawText(unknownData, rect.x + iw, rect.y, width - iw);
        }
    };

    Window_GachaBookIndex.prototype.processCancel = function () {
        Window_Selectable.prototype.processCancel.call(this);
        Window_GachaBookIndex.lastTopRow = this.topRow();
        Window_GachaBookIndex.lastIndex = this.index();
    };

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

    Window_GachaBookStatus.prototype = Object.create(Window_Base.prototype);
    Window_GachaBookStatus.prototype.constructor = Window_GachaBookStatus;

    Window_GachaBookStatus.prototype.initialize = function (x, y, width, height) {
        Window_Base.prototype.initialize.call(this, x, y, width, height);
        this._itemSprite = new Sprite();
        this._itemSprite.anchor.x = 0.5;
        this._itemSprite.anchor.y = 0.5;
        this._itemSprite.x = width / 2 - 20;
        this._itemSprite.y = height / 2;
        this.addChildToBack(this._itemSprite);
        this.refresh();
    };

    Window_GachaBookStatus.prototype.setItem = function (item) {
        if (this._item !== item) {
            this._item = item;
            this.refresh();
        }
    };

    Window_GachaBookStatus.prototype.update = function () {
        Window_Base.prototype.update.call(this);
        if (this._itemSprite.bitmap) {
            var bitmapHeight = this._itemSprite.bitmap.height;
            var contentsHeight = this.contents.height;
            var scale = 1;
            if (bitmapHeight > contentsHeight) {
                scale = contentsHeight / bitmapHeight;
            }
            this._itemSprite.scale.x = scale;
            this._itemSprite.scale.y = scale;
        }
    };

    Window_GachaBookStatus.prototype.refresh = function () {
        var item = this._item;
        var x = 0;
        var y = 0;
        var lineHeight = this.lineHeight();

        this.contents.clear();

        if (!item || !$gameSystem.isInGachaBook(item)) {
            this._itemSprite.bitmap = null;
            return;
        }

        var bitmap;
        if (!!item.meta.gachaImage) {
            bitmap = ImageManager.loadBitmap("img/gacha/", item.meta.gachaImage);
            bitmap.smooth = true;
        }
        this._itemSprite.bitmap = bitmap;

        var iconBoxWidth = Window_Base._iconWidth + 4;
        this.drawItemName(item, x, y);
        this.drawItemNumber(item, x + this.textWidth(item.name) + iconBoxWidth, y);

        x = this.textPadding();
        y = lineHeight + this.textPadding();

        if (!simpleDisplay) {
            var rank = "-";
            if (item.meta.gachaRank) rank = item.meta.gachaRank;
            this.changeTextColor(this.systemColor());
            this.drawText(rankText, x, y, 120);
            this.resetTextColor();
            this.drawText(rank, x + 120, y, 120, 'right');
            y += lineHeight;

            var price = item.price > 0 ? item.price : '-';
            this.changeTextColor(this.systemColor());
            this.drawText(priceText, x, y, 120);
            this.resetTextColor();
            this.drawText(price, x + 120, y, 120, 'right');
            y += lineHeight;

            if (DataManager.isWeapon(item) || DataManager.isArmor(item)) {
                var etype = $dataSystem.equipTypes[item.etypeId];
                this.changeTextColor(this.systemColor());
                this.drawText(equipText, x, y, 120);
                this.resetTextColor();
                this.drawText(etype, x + 120, y, 120, 'right');
                y += lineHeight;

                var type;
                if (DataManager.isWeapon(item)) {
                    type = $dataSystem.weaponTypes[item.wtypeId];
                } else {
                    type = $dataSystem.armorTypes[item.atypeId];
                }
                this.changeTextColor(this.systemColor());
                this.drawText(typeText, x, y, 120);
                this.resetTextColor();
                this.drawText(type, x + 120, y, 120, 'right');

                //x = this.textPadding() + 300;
                //y = lineHeight + this.textPadding();
                var rewardsWidth = 220;
                x = this.contents.width - rewardsWidth;
                y = lineHeight + this.textPadding();
                for (var i = 2; i < 8; i++) {
                    this.changeTextColor(this.systemColor());
                    this.drawText(TextManager.param(i), x, y, 160);
                    this.resetTextColor();
                    this.drawText(item.params[i], x + 160, y, 60, 'right');
                    y += lineHeight;
                }
            }
        }

        x = 0;
        y = this.textPadding() * 2 + lineHeight * 7;
        this.drawTextEx(item.description, x, y);
    };

    Window_GachaBookStatus.prototype.numberWidth = function () {
        return this.textWidth('000');
    };

    Window_GachaBookStatus.prototype.drawItemNumber = function (item, x, y) {
        this.drawText(':', x, y);
        this.drawText($gameParty.numItems(item), x + this.textWidth('00'), y);
    };

})();


code:
//=============================================================================
// Yanfly Engine Plugins - Gamepad Config
// GamepadConfig.js
// Version: 1.00
//=============================================================================

var Imported = Imported || {};
Imported.GamepadConfig = true;

var Yanfly = Yanfly || {};
Yanfly.GamepadConfig = Yanfly.GamepadConfig || {};

//=============================================================================
/*:
* @plugindesc v1.00 Allows players to adjust their button configuration
* for gamepads.
* @author Yanfly Engine Plugins
*
* @param Command Name
* @desc This is the option name that appears in the main menu.
* @default Gamepad Config
*
* @param Button Name
* @desc This is how a button name will appear in the config menu.
* @default Button %1
*
* @param OK Button
* @desc This is the command name for the OK button.
* @default OK / Talk
*
* @param OK Help
* @desc This is the help description for the OK button.
* @default Used to accept menu actions and talk to people.
*
* @param Cancel Button
* @desc Cancel Button
* @desc This is the command name for the Cancel button.
* @default Cancel
*
* @param Cancel Help
* @desc This is the help description for the Cancel button.
* @default Used to cancel menu actions.
*
* @param Shift Button
* @desc This is the command name for the Shift button.
* @default Dash
*
* @param Shift Help
* @desc This is the help description for the Shift button.
* @default Hold this button to dash on the field.
*
* @param Menu Button
* @desc This is the command name for the Menu button.
* @default Menu
*
* @param Menu Help
* @desc This is the help description for the Menu button.
* @default Access the Main Menu from the field.
*
* @param PageUp Button
* @desc This is the command name for the Page Up button.
* @default Page Up
*
* @param PageUp Help
* @desc This is the help description for the Page Up button.
* @default Use it to quickly scroll up menus.
*
* @param PageDown Button
* @desc This is the command name for the Page Down button.
* @default Page Down
*
* @param PageDown Help
* @desc This is the help description for the Page Down button.
* @default Use it to quickly scroll down menus.
*
* @param Reset Default
* @desc This is the command name to reset the config to default.
* @default Reset to Default
*
* @param Reset Help
* @desc This is the help description for the Reset button.
* @default Returns your controller to default settings.
*
* @param Finish Config
* @desc This is the command name for the finish button.
* @default Finish Configuration
*
* @param Finish Help
* @desc This is the help description for the Finish button.
* @default Are you done configuring your gamepad?
*
* @help
* Adds a "Gamepad Config" option to the Options Menu if a gamepad is detected.
* Players can then adjust the button configuration to their liking and it will
* be loaded automatically each time they play the game. Keep in mind that if
* at any point where a Gamepad is not detected inside of the Option or Gamepad
* Config menu, the game will automatically eject the player out the prevent
* the player from being locked inside.
*/

/*:ja
* @plugindesc ゲームパッド向けにボタンコンフィグを行なうプラグインです。
* @author Yanfly Engine Plugins
*
* @param Command Name
* @desc メインメニューに表示されるオプション名を変更できます
* @default Gamepad Config
*
* @param Button Name
* @desc コンフィグメニューでのボタン名の表示方法を変更できます
* @default Button %1
*
* @param OK Button
* @desc OKボタンに対するコマンド名を変更できます
* @default OK / Talk
*
* @param OK Help
* @desc OKボタンに対するヘルプを設定できます
* @default メニューの決定/人に話しかける際に使うボタンです
*
* @param Cancel Button
* @desc キャンセルボタン
* @desc キャンセルボタンに対するコマンド名を変更できます
* @default Cancel
*
* @param Cancel Help
* @desc キャンセルボタンに対するヘルプを設定できます
* @default メニューアクションをキャンセルする際に使うボタンです
*
* @param Shift Button
* @desc シフトボタンに対するコマンド名を変更できます
* @default ダッシュ
*
* @param Shift Help
* @desc シフトボタンに対するヘルプを設定できます
* @default 長押しするとフィールド上をダッシュできます
*
* @param Menu Button
* @desc メニューボタンに対するコマンド名を変更できます
* @default Menu
*
* @param Menu Help
* @desc メニューボタンに対するヘルプを設定できます
* @default フィールドからメインメニューにアクセスします
*
* @param PageUp Button
* @desc ページアップボタンに対するコマンド名を変更できます
* @default Page Up
*
* @param PageUp Help
* @desc ページアップボタンに対するヘルプを設定できます
* @default メニューを素早くスクロールアップできます
*
* @param PageDown Button
* @desc ページダウンボタンに対するコマンド名を変更できます
* @default Page Down
*
* @param PageDown Help
* @desc ページダウンボタンに対するヘルプを設定できます
* @default メニューを素早くスクロールダウンできます
*
* @param Reset Default
* @desc コンフィグをリセットする際のコマンド名を変更できます
* @default Reset to Default
*
* @param Reset Help
* @desc リセットボタンに対するヘルプを設定できます
* @default コントローラコンフィグをデフォルトに戻します
*
* @param Finish Config
* @desc コンフィグを完了する際のコマンド名を変更できます
* @default Finish Configuration
*
* @param Finish Help
* @desc 完了ボタンに対するヘルプを設定できます
* @default ゲームパッドのコンフィグを完了しますか？
*
* @help
* ゲームパッドが使用される場合、
* "Gamepad Config"をオプションメニューに追加してください。
* プレイヤーは好みのコンフィグ設定を行うことができ、
* その設定は毎回プレイ時に自動的にロードされます。
*
* ゲームパッドがオプションやゲームパッドコンフィグから検出されなくなると、
* ゲームは自動的にプレイヤーを排出し、ゲーム内に閉じ込められることを防ぎます。
*
*/

//=============================================================================

//=============================================================================
// Parameter Variables
//=============================================================================

Yanfly.Parameters = PluginManager.parameters('GamepadConfig');
Yanfly.Param = Yanfly.Param || {};

Yanfly.Param.GamepadConfigName = String(Yanfly.Parameters['Command Name']);
Yanfly.Param.GamepadConfigButton = String(Yanfly.Parameters['Button Name']);
Yanfly.Param.GamepadConfigOkTx = String(Yanfly.Parameters['OK Button']);
Yanfly.Param.GamepadConfigOkHelp = String(Yanfly.Parameters['OK Help']);
Yanfly.Param.GamepadConfigCancelTx = String(Yanfly.Parameters['Cancel Button']);
Yanfly.Param.GamepadConfigCancelHelp = String(Yanfly.Parameters['Cancel Help']);
Yanfly.Param.GamepadConfigShiftTx = String(Yanfly.Parameters['Shift Button']);
Yanfly.Param.GamepadConfigShiftHelp = String(Yanfly.Parameters['Shift Help']);
Yanfly.Param.GamepadConfigMenuTx = String(Yanfly.Parameters['Menu Button']);
Yanfly.Param.GamepadConfigMenuHelp = String(Yanfly.Parameters['Menu Help']);
Yanfly.Param.GamepadConfigPgUpTx = String(Yanfly.Parameters['PageUp Button']);
Yanfly.Param.GamepadConfigPgUpHelp = String(Yanfly.Parameters['PageUp Help']);
Yanfly.Param.GamepadConfigPgDnTx = String(Yanfly.Parameters['PageDown Button']);
Yanfly.Param.GamepadConfigPgDnHelp = String(Yanfly.Parameters['PageDown Help']);
Yanfly.Param.GamepadConfigResetTx = String(Yanfly.Parameters['Reset Default']);
Yanfly.Param.GamepadConfigResetHelp = String(Yanfly.Parameters['Reset Help']);
Yanfly.Param.GamepadConfigFinishTx = String(Yanfly.Parameters['Finish Config']);
Yanfly.Param.GamepadConfigFinishHelp = String(Yanfly.Parameters['Finish Help']);

//=============================================================================
// Input
//=============================================================================

Input.getPressedGamepadButton = function () {
	if (Yanfly.Param.GamepadTimer > 0) {
		Yanfly.Param.GamepadTimer -= 1;
		return -1;
	}
	if (navigator.getGamepads) {
		var gamepads = navigator.getGamepads();
		if (gamepads) {
			for (var i = 0; i < gamepads.length; i++) {
				var gamepad = gamepads[i];
				if (gamepad && gamepad.connected) {
					return this.gamepadButtonId(gamepad);
				}
			}
		}
	}
	return -1;
};

Input.gamepadButtonId = function (gamepad) {
	var buttons = gamepad.buttons;
	for (var i = 0; i < buttons.length; i++) {
		if (buttons[i].pressed) return i;
	}
	return -1;
};

Input.getGamepadButton = function (type) {
	for (var i = 0; i < 12; ++i) {
		if (Input.gamepadMapper[i] === type) return i;
	}
	return null;
};

Input.isControllerConnected = function () {
	if (navigator.getGamepads) {
		var gamepads = navigator.getGamepads();
		if (gamepads) {
			for (var i = 0; i < gamepads.length; i++) {
				var gamepad = gamepads[i];
				if (gamepad && gamepad.connected) return true;
			}
		}
	}
	return false;
};

//=============================================================================
// ConfigManager
//=============================================================================

ConfigManager.gamepadInput = {
	0: 'ok',
	1: 'cancel',
	2: 'shift',
	3: 'menu',
	4: 'pageup',
	5: 'pagedown',
	12: 'up',
	13: 'down',
	14: 'left',
	15: 'right',
};

Yanfly.GamepadConfig.ConfigManager_makeData = ConfigManager.makeData;
ConfigManager.makeData = function () {
	var config = Yanfly.GamepadConfig.ConfigManager_makeData.call(this);
	config.gamepadInput = this.gamepadInput;
	return config;
};

Yanfly.GamepadConfig.ConfigManager_applyData = ConfigManager.applyData;
ConfigManager.applyData = function (config) {
	Yanfly.GamepadConfig.ConfigManager_applyData.call(this, config);
	this.gamepadInput = this.readGamepadConfig(config, 'gamepadInput');
	this.applyGamepadConfig();
};

ConfigManager.applyGamepadConfig = function () {
	Input.gamepadMapper = this.gamepadInput;
	Input.update();
	Input.clear();
};

ConfigManager.readGamepadConfig = function (config, name) {
	var value = config[name];
	if (value !== undefined) {
		return value;
	} else {
		return {
			0: 'ok',
			1: 'cancel',
			2: 'shift',
			3: 'menu',
			4: 'pageup',
			5: 'pagedown',
			12: 'up',
			13: 'down',
			14: 'left',
			15: 'right',
		};
	}
};

//=============================================================================
// Window_MenuCommand
//=============================================================================

Yanfly.GamepadConfig.Window_Options_addGeneralOptions =
	Window_Options.prototype.addGeneralOptions;
Window_Options.prototype.addGeneralOptions = function () {
	Yanfly.GamepadConfig.Window_Options_addGeneralOptions.call(this);
	this.addGameConfigCommand();
};

Window_Options.prototype.addGameConfigCommand = function () {
	if (Input.isControllerConnected()) {
		this.addCommand(Yanfly.Param.GamepadConfigName, 'gamepadConfig', true);
		this._addedController = true;
	}
};

Yanfly.GamepadConfig.Window_Options_update =
	Window_Options.prototype.update;
Window_Options.prototype.update = function () {
	Yanfly.GamepadConfig.Window_Options_update.call(this);
	if (this._addedController && !Input.isControllerConnected()) {
		this.refresh();
		this.height = this.windowHeight();
		this.updatePlacement();
	}
};

Yanfly.GamepadConfig.Window_Options_drawItem =
	Window_Options.prototype.drawItem;
Window_Options.prototype.drawItem = function (index) {
	if (this.commandSymbol(index) === 'gamepadConfig') {
		var rect = this.itemRectForText(index);
		var text = this.commandName(index);
		this.resetTextColor();
		this.changePaintOpacity(this.isCommandEnabled(index));
		this.drawText(text, rect.x, rect.y, rect.width, 'left');
	} else {
		Yanfly.GamepadConfig.Window_Options_drawItem.call(this, index);
	}
};

Yanfly.GamepadConfig.Window_Options_processOk =
	Window_Options.prototype.processOk;
Window_Options.prototype.processOk = function () {
	if (this.commandSymbol(this.index()) === 'gamepadConfig') {
		Window_Command.prototype.processOk.call(this);
	} else {
		Yanfly.GamepadConfig.Window_Options_processOk.call(this);
	}
};

//=============================================================================
// Window_GamepadConfig
//=============================================================================

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

Window_GamepadConfig.prototype = Object.create(Window_Command.prototype);
Window_GamepadConfig.prototype.constructor = Window_GamepadConfig;

Window_GamepadConfig.prototype.initialize = function (helpWindow) {
	var wy = helpWindow.height;
	Window_Command.prototype.initialize.call(this, 0, wy);
	this.setHelpWindow(helpWindow);
	this.height = Graphics.boxHeight - wy;
	this.refresh();
	this.activate();
	this.select(0);
};

Window_GamepadConfig.prototype.windowWidth = function () {
	return Graphics.boxWidth;
};

Window_GamepadConfig.prototype.makeCommandList = function (index) {
	for (var i = 0; i < 6; ++i) {
		var text = this.getButtonTypeText(i);
		this.addCommand(text, 'button', true);
	}
	this.addCommand('', 'filler', true);
	this.addCommand(this.getButtonTypeText(7), 'reset', true);
	this.addCommand(this.getButtonTypeText(8), 'finish', true);
};

Window_GamepadConfig.prototype.drawItem = function (index) {
	if (index > 5) {
		Window_Command.prototype.drawItem.call(this, index);
	} else {
		var rect = this.itemRectForText(index);
		var align = this.itemTextAlign();
		var ww = rect.width / 2;
		this.resetTextColor();
		this.changePaintOpacity(this.isCommandEnabled(index));
		this.drawText(this.commandName(index), rect.x, rect.y, ww, align);
		var text = this.getButtonConfig(index);
		this.drawText(text, rect.x + ww, rect.y, ww, align);
	}
};

Window_GamepadConfig.prototype.getButtonTypeText = function (index) {
	if (index === 0) return Yanfly.Param.GamepadConfigOkTx;
	if (index === 1) return Yanfly.Param.GamepadConfigCancelTx;
	if (index === 2) return Yanfly.Param.GamepadConfigShiftTx;
	if (index === 3) return Yanfly.Param.GamepadConfigMenuTx;
	if (index === 4) return Yanfly.Param.GamepadConfigPgUpTx;
	if (index === 5) return Yanfly.Param.GamepadConfigPgDnTx;
	if (index === 7) return Yanfly.Param.GamepadConfigResetTx;
	if (index === 8) return Yanfly.Param.GamepadConfigFinishTx;
	return '';
};

Window_GamepadConfig.prototype.getButtonConfig = function (index) {
	if (index > 5) return '';
	var key = this.getButtonKey(index);
	var button = Input.getGamepadButton(key);
	return Yanfly.Param.GamepadConfigButton.format(button);
};

Window_GamepadConfig.prototype.getButtonKey = function (index) {
	if (index === 0) return 'ok';
	if (index === 1) return 'cancel';
	if (index === 2) return 'shift';
	if (index === 3) return 'menu';
	if (index === 4) return 'pageup';
	if (index === 5) return 'pagedown';
};

Window_GamepadConfig.prototype.itemTextAlign = function () {
	return 'center';
};

Window_GamepadConfig.prototype.clearButtonConfig = function (index) {
	var rect = this.itemRectForText(index);
	rect.x += rect.width / 2;
	rect.width /= 2;
	this.contents.clearRect(rect.x, rect.y, rect.width, rect.height);
};

Window_GamepadConfig.prototype.updateHelp = function () {
	if (!this._helpWindow) return;
	switch (this.index()) {
		case 0:
			this._helpWindow.setText(Yanfly.Param.GamepadConfigOkHelp);
			break;
		case 1:
			this._helpWindow.setText(Yanfly.Param.GamepadConfigCancelHelp);
			break;
		case 2:
			this._helpWindow.setText(Yanfly.Param.GamepadConfigShiftHelp);
			break;
		case 3:
			this._helpWindow.setText(Yanfly.Param.GamepadConfigMenuHelp);
			break;
		case 4:
			this._helpWindow.setText(Yanfly.Param.GamepadConfigPgUpHelp);
			break;
		case 5:
			this._helpWindow.setText(Yanfly.Param.GamepadConfigPgDnHelp);
			break;
		case 7:
			this._helpWindow.setText(Yanfly.Param.GamepadConfigResetHelp);
			break;
		case 8:
			this._helpWindow.setText(Yanfly.Param.GamepadConfigFinishHelp);
			break;
		default:
			this._helpWindow.clear();
			break;
	}
};

//=============================================================================
// Scene_Options
//=============================================================================

Yanfly.GamepadConfig.Scene_Options_createOptionsWindow =
	Scene_Options.prototype.createOptionsWindow;
Scene_Options.prototype.createOptionsWindow = function () {
	Yanfly.GamepadConfig.Scene_Options_createOptionsWindow.call(this);
	this._optionsWindow.setHandler('gamepadConfig',
		this.commandGamepadConfig.bind(this));
};

Scene_Options.prototype.commandGamepadConfig = function () {
	SceneManager.push(Scene_GamepadConfig);
};

//=============================================================================
// Scene_GamepadConfig
//=============================================================================

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

Scene_GamepadConfig.prototype = Object.create(Scene_MenuBase.prototype);
Scene_GamepadConfig.prototype.constructor = Scene_GamepadConfig;

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

Scene_GamepadConfig.prototype.create = function () {
	Scene_MenuBase.prototype.create.call(this);
	this.createHelpWindow();
	this.createGamepadConfigWindow();
};

Scene_GamepadConfig.prototype.terminate = function () {
	Scene_MenuBase.prototype.terminate.call(this);
	ConfigManager.save();
};

Scene_GamepadConfig.prototype.update = function () {
	Scene_MenuBase.prototype.update.call(this);
	this.updateAttachedController();
	this.updateButtonConfig();
	this.updateAfterConfig();
};

Scene_GamepadConfig.prototype.updateAttachedController = function () {
	if (Input.isControllerConnected()) return;
	this.popScene();
};

Scene_GamepadConfig.prototype.createGamepadConfigWindow = function () {
	this._configWindow = new Window_GamepadConfig(this._helpWindow);
	this._configWindow.setHandler('button', this.commandButton.bind(this));
	this._configWindow.setHandler('reset', this.commandReset.bind(this));
	this._configWindow.setHandler('finish', this.popScene.bind(this));
	this.addWindow(this._configWindow);
};

Scene_GamepadConfig.prototype.commandButton = function () {
	var index = this._configWindow.index();
	this._configWindow.clearButtonConfig(index);
	this._configEnabled = true;
	Yanfly.Param.GamepadTimer = 12;
};

Scene_GamepadConfig.prototype.commandReset = function () {
	ConfigManager.gamepadInput = {
		0: 'ok',
		1: 'cancel',
		2: 'shift',
		3: 'menu',
		4: 'pageup',
		5: 'pagedown',
		12: 'up',
		13: 'down',
		14: 'left',
		15: 'right',
	};
	ConfigManager.applyGamepadConfig();
	this.refreshWindows();
};

Scene_GamepadConfig.prototype.refreshWindows = function () {
	this._configWindow.refresh();
	this._configWindow.activate();
	ConfigManager.save();
};

Scene_GamepadConfig.prototype.updateButtonConfig = function () {
	if (!this._configEnabled) return;
	var buttonId = Input.getPressedGamepadButton();
	if (buttonId > 11) return;
	if (buttonId >= 0) this.applyButtonConfig(buttonId);
};

Scene_GamepadConfig.prototype.applyButtonConfig = function (buttonId) {
	this._configEnabled = false;
	var index = this._configWindow.index();
	var newConfig = this._configWindow.getButtonKey(index);
	var formerConfig = Input.gamepadMapper[buttonId];
	var formerButton = Input.getGamepadButton(newConfig);
	ConfigManager.gamepadInput[buttonId] = newConfig;
	ConfigManager.gamepadInput[formerButton] = formerConfig;
	ConfigManager.applyGamepadConfig();
	this._configTimer = 12;
};

Scene_GamepadConfig.prototype.updateAfterConfig = function () {
	if (!this._configTimer) return;
	if (--this._configTimer > 0) return;
	SoundManager.playEquip();
	this.refreshWindows();
};

//=============================================================================
// End of File
//=============================================================================

repo_name: dazed/translations

license: unknown


code:
//
//  入手インフォメーション ver1.15
//
// ------------------------------------------------------
// Copyright (c) 2016 Yana
// Released under the MIT license
// http://opensource.org/licenses/mit-license.php
// ------------------------------------------------------
//
// author Yana
//

var Imported = Imported || {};
Imported['GetInformation'] = 1.15;

if (!Imported.CommonPopupCore) {
    console.error('CommonPopupCoreを導入してください。')
}
/*:
 * @plugindesc ver1.15/アイテムの入手などにスライドアニメするインフォメーションを追加するプラグインです。
 * @author Yana
 *
 * @param Info Disable Switch Id
 * @desc 入手インフォメーションを無効化するためのスイッチのIDです。
 * このスイッチがONの時、インフォメーションが無効化されます。
 * @default 10
 *
 * @param Use Battle Info
 * @desc 入手インフォメーションを戦闘中に使用するかの設定です。
 * true/falseで設定してください。
 * @default true
 *
 * @param Use Rewards Info
 * @desc 戦利品を入手インフォメーションで表示するかの設定です。
 * true/falseで設定してください。
 * @default true
 *
 * @param Info Pattern
 * @desc 入手インフォメーションの動作パターンです。
 * Normal:普通 GrowUp:にょき Stretch:うにょーん
 * @default GrowUp
 *
 * @param Info Font Size
 * @desc 入手インフォメーションの文字サイズです。
 * @default 20
 *
 * @param Info Count
 * @desc 入手インフォメーションの表示時間です。
 * @default 120
 *
 * @param Info Delay
 * @desc 入手インフォメーションのディレイです。
 * 連続で設定された時、この数値の表示ディレイがかかります。
 * @default 20
 *
 * @param Info MoveWait
 * @desc 入手インフォメーションが完全に表示された状態の時間です。
 * @default 100
 *
 * @param Info MoveFade
 * @desc 入手インフォメーションのフェードの時間です。
 * @default 10
 *
 * @param Info Position
 * @desc 入手インフォメーションの表示位置です。
 * Upを指定すると、画面上部になります。
 * @default
 *
 * @param Info Slide Action
 * @desc 入手インフォメーションのスライド方向です。
 * Downを指定すると、上から下になります。
 * @default
 *
 * @param Info Sup X
 * @desc 入手インフォメーションの表示位置補正X座標です。
 * @default 0
 *
 * @param Info Sup Y
 * @desc 入手インフォメーションの表示位置補正Y座標です。
 * @default 0
 *
 * @param Info Width
 * @desc 入手インフォメーションの横幅です。
 * @default 816
 *
 * @param Gold Icon Index
 * @desc 所持金のアイコンとして使用するアイコンのインデックスです。
 * @default 314
 *
 * @param Actor Icon Start Index
 * @desc アクターのアイコンとして使用するアイコンの最初のインデックスです。
 * @default 320
 *
 * @param Reward Popup Delay
 * @desc 戦利品表示時に表示開始までにかけるディレイの数値です。
 * @default 0
 *
 * @param Battle Show List
 * @desc 戦闘中に表示するインフォメーションのリストです。item,gold,
 * exp,skill,params,level,abp,classLevelで指定してください。
 * @default item,gold,exp,skill,params,level,abp,classLevel
 *
 * @param Get Gold Text
 * @desc 所持金の増加で表示されるテキストです。。
 * _icon:上記で設定したアイコンインデックス _num:金額
 * @default 「\I[_icon]_num\C[14]\G\C[0]」 を\C[24]手に入れた！
 *
 * @param Lost Gold Text
 * @desc 所持金の減少で表示されるテキストです。
 * _icon:上記で設定したアイコンインデックス _num:金額
 * @default 「\I[_icon]_num\C[14]\G\C[0]」 を\C[2]失った・・・
 *
 * @param Get Item Text
 * @desc アイテムの増加で表示されるテキストです。
 * _icon:アイコン _name:名前　_desc1:解説1行目 _desc2:解説2行目
 * @default 「\I[_icon]_name」 を\C[24]手に入れた！\n\C[6]_desc1
 *
 * @param Lost Item Text
 * @desc アイテムの減少で表示されるテキストです。
 * _icon:アイコン _name:名前　_desc1:解説1行目 _desc2:解説2行目
 * @default 「\I[_icon]_name」 を\C[2]失った・・・\n\C[6]_desc1
 *
 * @param Get Item Text Num
 * @desc アイテム増加。2個以上。_icon:アイコン
 * _name:名前　_num:個数 _desc1:解説1行目 _desc2:解説2行目
 * @default 「\I[_icon]_name」 を\C[14]_num個\C[24]手に入れた！\n\C[6]_desc1
 *
 * @param Lost Item Text Num
 * @desc アイテム減少。2個以上。_icon:アイコン
 * _name:名前　_num:個数 _desc1:解説1行目 _desc2:解説2行目
 * @default 「\I[_icon]_name」を\C[14]_num個\C[2]失った・・・\n\C[6]_desc1
 *
 * @param Get Skill Text
 * @desc スキルの習得で表示されるテキストです。_actor:アクター名
 * _icon:アイコン _name:名前　_desc1:解説1行目 _desc2:解説2行目
 * @default _actorは「\I[_icon]_name」 を\C[24]覚えた！\n\C[6]_desc1
 *
 * @param Lost Skill Text
 * @desc スキルの忘却で表示されるテキストです。_actor:アクター名
 * _icon:アイコン _name:名前　_desc1:解説1行目 _desc2:解説2行目
 * @default _actorは「\I[_icon]_name」を \C[2]忘れてしまった・・・\n\C[6]_desc1
 *
 * @param Exp Up Text
 * @desc 経験値の増加で表示されるテキストです。
 * _actor:アクター名  _name:経験値の名前 _num:経験値
 * @default _actorは\C[14]_numポイント\C[0]の\C[4]_name\C[0]を\C[24]得た！
 *
 * @param Exp Down Text
 * @desc 経験値の減少で表示されるテキストです。
 * _actor:アクター名  _name:経験値の名前　_num:経験値
 * @default _actorは\C[14]_numポイント\C[0]の\C[4]_name\C[0]を\C[2]失った・・・
 *
 * @param Lv Up Text
 * @desc レベルの増加で表示されるテキストです。
 * _actor:アクター名  _name:レベルの名前 _num:上がったレベル
 * @default _actorは\C[4]_name\C[0]が\C[14]_numポイント\C[24]上がった！
 *
 * @param Lv Down Text
 * @desc レベルの減少で表示されるテキストです。
 * _actor:アクター名  _name:レベルの名前　_num:下がったレベル
 * @default _actorは\C[4]_name\C[0]が\C[14]_numポイント\C[2]下がった・・・
 *
 * @param Param Up Text
 * @desc 能力値の増加で表示されるテキストです。
 * _actor:アクター名  _name:能力値の名前 _num:上がったレベル
 * @default _actorは\C[4]_name\C[0]が\C[14]_numポイント\C[24]上がった！
 *
 * @param Param Down Text
 * @desc 能力値の減少で表示されるテキストです。
 * _actor:アクター名  _name:能力値の名前　_num:下がったレベル
 * @default _actorは\C[4]_name\C[0]が\C[14]_numポイント\C[2]下がった・・・
 *
 * @param Abp Up Text
 * @desc クラス経験値の増加で表示されるテキストです。
 * _actor:アクター名  _name:経験値の名前 _num:経験値
 * @default _actorは\C[14]_numポイント\C[0]の\C[4]_name\C[0]を\C[24]得た！
 *
 * @param Abp Down Text
 * @desc クラス経験値の減少で表示されるテキストです。
 * _actor:アクター名  _name:経験値の名前　_num:経験値
 * @default _actorは\C[14]_numポイント\C[0]の\C[4]_name\C[0]を\C[2]失った・・・
 *
 * @param Class Lv Up Text
 * @desc クラスレベルの増加で表示されるテキストです。 _class:クラス名
 * _actor:アクター名  _name:レベルの名前 _num:上がったレベル
 * @default _actorは\C[4]_classの_name\C[0]が\C[14]_numポイント\C[24]上がった！
 *
 * @param Class Lv Down Text
 * @desc クラスレベルの減少で表示されるテキストです。 _class:クラス名
 * _actor:アクター名  _name:レベルの名前　_num:下がったレベル
 * @default _actorは\C[4]_classの_name\C[0]が\C[14]_numポイント\C[2]下がった・・・
 *
 * @param Formation Lv Up Text
 * @desc 陣形レベルの増加で表示されるテキストです。
 * _name:陣形の名前　_num:上がったレベル
 * @default \C[4]_nameの熟練度\C[0]が\C[14]_numポイント\C[24]上がった！
 *
 * @param Formation Lv Max Text
 * @desc 陣形をマスターした時に表示されるテキストです。
 * _name:陣形の名前
 * @default \C[4]_name\C[0]を\C[14]マスターした！
 *
 * @help------------------------------------------------------
 * プラグインコマンド
 * ------------------------------------------------------
 * ShowInfo 表示したいテキスト
 * インフォ表示 表示したいテキスト
 *
 * ※スペースは必ず半角で入力してください。
 * ------------------------------------------------------
 * このプラグインには「汎用ポップアップベース」のプラグインが必要です。
 * 汎用ポップアップベースより下に配置してください。
 * また、それぞれの表示テキストに何も記載しない場合、そのインフォメーションを無効化できます。
 * ------------------------------------------------------
 * 使い方
 * ------------------------------------------------------
 * 導入するだけで動作します。
 * 詳細な設定は、プラグインパラメータを参照してください。
 *
 * 170524
 * それぞれのテキストの最初に追加することで、ポップアップ発生時にSEを追加する専用制御文字を追加しました。
 * _SE[名前[,音量,ピッチ,位相]]
 * ※音量、ピッチ、位相は省略可能です。省略した場合、音量=90,ピッチ=100，位相=0として扱われます。
 * 例：レベルアップのポップアップ時にSkill3のSEを鳴らす。
 * _SE[Skill3]_actorは\C[4]_name\C[0]が\C[14]_numポイント\C[24]上がった！
 * ------------------------------------------------------
 * 利用規約
 * ------------------------------------------------------
 * 当プラグインはMITライセンスで公開されています。
 * 使用に制限はありません。商用、アダルト、いずれにも使用できます。
 * 二次配布も制限はしませんが、サポートは行いません。
 * 著作表示は任意です。行わなくても利用できます。
 * 要するに、特に規約はありません。
 * バグ報告や使用方法等のお問合せはネ実ツクールスレ、または、Twitterにお願いします。
 * https://twitter.com/yanatsuki_
 * 素材利用は自己責任でお願いします。
 * ------------------------------------------------------
 * 更新履歴:
 * ver1.15:170525
 * 戦闘中にメッセージウィンドウが下以外の場合、ポップアップの位置がずれるバグを修正しました。
 * ポップアップ時にSEを再生する制御文字を追加しました。
 * 動作パターンをGrowUpに指定して、表示位置を上にした場合の動作を修正しました。
 * ver1.14:170216
 * アクター名の変換が正常に動作していなかったバグを修正しました。
 * ver1.131:170104
 * 特定の状況でエラーが発生することのあるバグを修正しました。
 * ver1.13:
 * 戦闘中のポップアップ位置を調整しました。
 * 戦闘終了時の戦利品表示にディレイをかける設定を追加しました。
 * 陣形レベルが上がった時にポップアップを表示する機能を追加しました。
 * ver1.12:
 * 利用規約をMITライセンスに変更しました。
 * 一度も仲間になっていないアクターに対してポップアップを表示すると、無限ループに陥るバグを修正しました。
 * ver1.11:
 * 動作パターンの設定を追加しました。
 * プラグインパラメータを追加しました。
 * ver1.10:
 * 処理内容を少し変更しました。
 * ヘルプを追加・修正しました。
 * 任意のテキストを表示するプラグインコマンドを追加しました。
 * ver1.09:
 * スキルを忘れさせた際のポップアップが表示されないバグを修正しました。
 * レベルアップ時やクラスレベルアップ時のスキル習得の表示位置を調整しました。
 * ver1.08:
 * 戦闘中の表示をexpとabpを無効化すると、経験値やABPが入らないバグを修正しました。
 * ver1.07:
 * インフォメーションを無効化する機能が正常に機能していなかったバグを修正しました。
 * 戦闘時に表示するインフォメーションを設定するBattle Show Listの設定項目を追加しました。
 * ver1.06:
 * 戦闘中のポップアップの位置が正常でなかったバグを修正しました。
 * var1.05:
 * 表示位置を補正するためのプラグインパラメータを追加しました。
 * 上から下へ動作する設定を追加しました。
 * var1.04:
 * 任意のテキストを渡せるように修正しました。
 * ver1.03:
 * ABPとクラスレベルのポップアップ処理を追加しました。
 * ver1.02:
 * レベルアップ処理でポップアップ表示が逆になっていたバグを修正しました。
 * ver1.01:
 * valueが0の状態でもポップアップしていたバグを修正しました。
 * YEP_CoreEngineとの競合回避処理を追加しました。
 * ver1.00:
 * 公開
 */

(function () {
    var parameters = PluginManager.parameters('GetInformation');
    var infoDisableSwitchId = Number(parameters['Info Disable Switch Id'] || 10);
    var getGoldText = String(parameters['Get Gold Text']);
    var lostGoldText = String(parameters['Lost Gold Text']);
    var getInfoText = String(parameters['Get Item Text']);
    var lostInfoText = String(parameters['Lost Item Text']);
    var getInfoTextNum = String(parameters['Get Item Text Num']);
    var lostInfoTextNum = String(parameters['Lost Item Text Num']);
    var getInfoSkillText = String(parameters['Get Skill Text']);
    var lostInfoSkillText = String(parameters['Lost Skill Text']);
    var ExpUpText = String(parameters['Exp Up Text']);
    var ExpDownText = String(parameters['Exp Down Text']);
    var lvUpText = String(parameters['Lv Up Text']);
    var lvDownText = String(parameters['Lv Down Text']);
    var ParamUpText = String(parameters['Param Up Text']);
    var ParamDownText = String(parameters['Param Down Text']);
    var infoFontSize = Number(parameters['Info Font Size'] || 20);
    var infoCount = Number(parameters['Info Count'] || 120);
    var infoDelay = Number(parameters['Info Delay'] || 20);
    var infoMoveWait = Number(parameters['Info MoveWait'] || 100);
    var infoMoveFade = Number(parameters['Info MoveFade'] || 20);
    var goldIconIndex = Number(parameters['Gold Icon Index'] || 314);
    var actorIconStartIndex = Number(parameters['Actor Icon Start Index']);
    var useBattleInfo = String(parameters['Use Battle Info'] || 'true') === 'true';
    var useRewardsInfo = String(parameters['Use Rewards Info'] || 'true') === 'true';
    var infoSlideCount = 60;
    var infoPosition = String(parameters['Info Position'] || '');
    var infoSlideAction = String(parameters['Info Slide Action'] || '');
    var infoSupX = Number(parameters['Info Sup X'] || 0);
    var infoSupY = Number(parameters['Info Sup Y'] || 0);
    var infoPattern = parameters['Info Pattern'] || 'Normal';
    var infoWidth = parameters['Info Width'] || 816;
    var rewardPopupDelay = Number(parameters['Reward Popup Delay']);

    var abpUpText = String(parameters['Abp Up Text']);
    var abpDownText = String(parameters['Abp Down Text']);
    var clvUpText = String(parameters['Class Lv Up Text']);
    var clvDownText = String(parameters['Class Lv Down Text']);

    var fLvUpText = String(parameters['Formation Lv Up Text']);
    var fLvMaxText = String(parameters['Formation Lv Max Text']);

    var battleShowList = String(parameters['Battle Show List']).split(',');

    var _gInfo_GInterpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function (command, args) {
        _gInfo_GInterpreter_pluginCommand.call(this, command, args);
        if (command === 'ShowInfo' || command === 'インフォ表示') {
            CommonPopupManager.showInfo({}, args[0], null);
        }
    };

    CommonPopupManager.popEnable = function () {
        var useBattle = $gameParty.inBattle() ? useBattleInfo : true;
        return !$gameSwitches.value(infoDisableSwitchId) && useBattle;
    };

    // Change Gold
    var _gInfo_GInterpreter_command125 = Game_Interpreter.prototype.command125;
    Game_Interpreter.prototype.command125 = function () {
        CommonPopupManager._popEnable = CommonPopupManager.popEnable();
        var result = _gInfo_GInterpreter_command125.call(this);
        CommonPopupManager._popEnable = false;
        return result;
    };
    // Change Item
    var _gInfo_GInterpreter_command126 = Game_Interpreter.prototype.command126;
    Game_Interpreter.prototype.command126 = function () {
        CommonPopupManager._popEnable = CommonPopupManager.popEnable();
        var result = _gInfo_GInterpreter_command126.call(this);
        CommonPopupManager._popEnable = false;
        return result;
    };
    // Change Weapon
    var _gInfo_GInterpreter_command127 = Game_Interpreter.prototype.command127;
    Game_Interpreter.prototype.command127 = function () {
        CommonPopupManager._popEnable = CommonPopupManager.popEnable();
        var result = _gInfo_GInterpreter_command127.call(this);
        CommonPopupManager._popEnable = false;
        return result;
    };
    // Change Armor
    var _gInfo_GInterpreter_command128 = Game_Interpreter.prototype.command128;
    Game_Interpreter.prototype.command128 = function () {
        CommonPopupManager._popEnable = CommonPopupManager.popEnable();
        var result = _gInfo_GInterpreter_command128.call(this);
        CommonPopupManager._popEnable = false;
        return result;
    };
    // Change EXP
    var _gInfo_GInterpreter_command315 = Game_Interpreter.prototype.command315;
    Game_Interpreter.prototype.command315 = function () {
        CommonPopupManager._popEnable = CommonPopupManager.popEnable();
        var result = _gInfo_GInterpreter_command315.call(this);
        CommonPopupManager._popEnable = false;
        return result;
    };
    // Change Level
    var _gInfo_GInterpreter_command316 = Game_Interpreter.prototype.command316;
    Game_Interpreter.prototype.command316 = function () {
        CommonPopupManager._popEnable = CommonPopupManager.popEnable();
        var result = _gInfo_GInterpreter_command316.call(this);
        CommonPopupManager._popEnable = false;
        return result;
    };
    // Change Parameter
    var _gInfo_GInterpreter_command317 = Game_Interpreter.prototype.command317;
    Game_Interpreter.prototype.command317 = function () {
        CommonPopupManager._popEnable = CommonPopupManager.popEnable();
        var result = _gInfo_GInterpreter_command317.call(this);
        CommonPopupManager._popEnable = false;
        return result;
    };
    // Change Skill
    var _gInfo_GInterpreter_command318 = Game_Interpreter.prototype.command318;
    Game_Interpreter.prototype.command318 = function () {
        CommonPopupManager._popEnable = CommonPopupManager.popEnable();
        var result = _gInfo_GInterpreter_command318.call(this);
        CommonPopupManager._popEnable = false;
        return result;
    };

    Game_Actor.prototype.addParam = function (paramId, value) {
        Game_BattlerBase.prototype.addParam.call(this, paramId, value);
        if (CommonPopupManager._popEnable) {
            if ($gameParty.inBattle() && !battleShowList.contains('params')) { return }
            CommonPopupManager.showInfo({
                'name': TextManager.param(paramId),
                'value': value > 0
            }, value, 'param', this.actorId());
        }
    };
    var _gInfo_GParty_gainGold = Game_Party.prototype.gainGold;
    Game_Party.prototype.gainGold = function (amount) {
        _gInfo_GParty_gainGold.call(this, amount);
        if (CommonPopupManager._popEnable) {
            if ($gameParty.inBattle() && !battleShowList.contains('gold')) { return }
            var hash = {
                'name': '',
                'iconIndex': goldIconIndex,
                'description': '',
                'value': Math.abs(amount)
            };
            CommonPopupManager.showInfo(hash, amount, 'gold');
        }
    };
    var _gInfo_GParty_gainItem = Game_Party.prototype.gainItem;
    Game_Party.prototype.gainItem = function (item, amount, includeEquip) {
        var result = _gInfo_GParty_gainItem.call(this, item, amount, includeEquip);
        if (CommonPopupManager._popEnable) {
            if (this.inBattle() && !battleShowList.contains('item')) { return }
            CommonPopupManager.showInfo(item, amount, 'item');
        }
        if (Imported.YEP_CoreEngine) return result;
    };

    var _gInfo_GActor_learnSkill = Game_Actor.prototype.learnSkill;
    Game_Actor.prototype.learnSkill = function (skillId) {
        var isLearn = this.isLearnedSkill(skillId);
        _gInfo_GActor_learnSkill.call(this, skillId);
        if (CommonPopupManager._popEnable && !isLearn) {
            if ($gameParty.inBattle() && !battleShowList.contains('skill')) { return }
            CommonPopupManager.showInfo($dataSkills[skillId], 1, 'skill', this.actorId());
        }
    };
    var _gInfo_GActor_forgetSkill = Game_Actor.prototype.forgetSkill;
    Game_Actor.prototype.forgetSkill = function (skillId) {
        var isLearn = this.isLearnedSkill(skillId);
        _gInfo_GActor_forgetSkill.call(this, skillId);
        if (CommonPopupManager._popEnable && isLearn) {
            if ($gameParty.inBattle() && !battleShowList.contains('skill')) { return }
            CommonPopupManager.showInfo($dataSkills[skillId], 2, 'skill', this.actorId());
        }
    };
    var _gInfo_GActor_changeExp = Game_Actor.prototype.changeExp;
    Game_Actor.prototype.changeExp = function (exp, show) {
        var tExp = exp - this.currentExp();
        var plevel = this.level;
        var pSkills = this._skills.clone();
        if (CommonPopupManager._popEnable) {
            if (!$gameParty.inBattle() || battleShowList.contains('exp')) {
                CommonPopupManager.showInfo({
                    'name': TextManager.exp,
                    'value': tExp > 0
                }, tExp, 'exp', this.actorId());
            }
        }
        var tempEnable = CommonPopupManager._popEnable;
        CommonPopupManager._popEnable = false;
        _gInfo_GActor_changeExp.call(this, exp, show);
        CommonPopupManager._popEnable = tempEnable;
        if ((this.level - plevel) !== 0) {
            var upLevel = this.level - plevel;
            if (CommonPopupManager._popEnable) {
                if ($gameParty.inBattle() && !battleShowList.contains('level')) { return }
                CommonPopupManager.showInfo({
                    'name': TextManager.level,
                    'value': upLevel > 0
                }, upLevel, 'level', this.actorId());
            }
        }
        if (CommonPopupManager._popEnable) {
            this._skills.forEach(function (skillId) {
                if (!pSkills.contains(skillId)) {
                    CommonPopupManager.showInfo($dataSkills[skillId], 1, 'skill', this.actorId());
                }
            }.bind(this));
        }
    };

    var _gInfo_GActor_changeLevel = Game_Actor.prototype.changeLevel;
    Game_Actor.prototype.changeLevel = function (level, show) {
        var upLevel = level - this.level;
        var tempEnable = CommonPopupManager._popEnable;
        var pSkills = this._skills.clone();
        CommonPopupManager._popEnable = false;
        _gInfo_GActor_changeLevel.call(this, level, show);
        CommonPopupManager._popEnable = tempEnable;
        if (CommonPopupManager._popEnable) {
            if ($gameParty.inBattle() && !battleShowList.contains('level')) { return }
            CommonPopupManager.showInfo({
                'name': TextManager.level,
                'value': upLevel > 0
            }, upLevel, 'level', this.actorId());

            this._skills.forEach(function (skillId) {
                if (!pSkills.contains(skillId)) {
                    CommonPopupManager.showInfo($dataSkills[skillId], 1, 'skill', this.actorId());
                }
            }.bind(this));
        }
    };

    if (Imported['VXandAceHybridClass']) {

        // Change Class Level
        var _gInfo_GInterpreter_changeClassLevel = Game_Interpreter.prototype.changeClassLevel;
        Game_Interpreter.prototype.changeClassLevel = function (actorId, level, show) {
            CommonPopupManager._popEnable = CommonPopupManager.popEnable();
            _gInfo_GInterpreter_changeClassLevel.call(this, actorId, level, show);
            CommonPopupManager._popEnable = false;
        };

        // Change Abp
        var _gInfo_GInterpreter_changeAbp = Game_Interpreter.prototype.changeAbp;
        Game_Interpreter.prototype.changeAbp = function (actorId, abp, show) {
            CommonPopupManager._popEnable = CommonPopupManager.popEnable();
            var result = _gInfo_GInterpreter_changeAbp.call(this, actorId, abp, show);
            CommonPopupManager._popEnable = false;
            return result;
        };

        var _gInfo_GActor_changeAbp = Game_Actor.prototype.changeAbp;
        Game_Actor.prototype.changeAbp = function (abp, show) {
            var tAbp = abp - this.currentAbp();
            var plevel = this.currentClassLevel();
            var pSkills = this._skills.clone();
            if (CommonPopupManager._popEnable) {
                if (!$gameParty.inBattle() || battleShowList.contains('abp')) {
                    CommonPopupManager.showInfo({
                        'name': TextManager.abp,
                        'value': tAbp > 0
                    }, tAbp, 'abp', this.actorId());
                }
            }

            var tempEnable = CommonPopupManager._popEnable;
            CommonPopupManager._popEnable = false;

            _gInfo_GActor_changeAbp.call(this, abp, show);

            CommonPopupManager._popEnable = tempEnable;

            if ((this.currentClassLevel() - plevel) !== 0) {
                var upLevel = this.currentClassLevel() - plevel;
                if (CommonPopupManager._popEnable) {
                    if ($gameParty.inBattle() && !battleShowList.contains('classLevel')) { return }
                    CommonPopupManager.showInfo({
                        'name': TextManager.classLevel,
                        'value': upLevel > 0
                    }, upLevel, 'classLevel', this.actorId(), this.currentClass().name);
                }
            }
            if (CommonPopupManager._popEnable) {
                this._skills.forEach(function (skillId) {
                    if (!pSkills.contains(skillId)) {
                        CommonPopupManager.showInfo($dataSkills[skillId], 1, 'skill', this.actorId());
                    }
                }.bind(this));
            }
        };

        var _gInfo_GActor_changeClassLevel = Game_Actor.prototype.changeClassLevel;
        Game_Actor.prototype.changeClassLevel = function (level, show) {
            var upLevel = level - this.currentClassLevel();
            var tempEnable = CommonPopupManager._popEnable;
            var pSkills = this._skills.clone();
            CommonPopupManager._popEnable = false;
            _gInfo_GActor_changeClassLevel.call(this, level, show);
            CommonPopupManager._popEnable = tempEnable;
            if (CommonPopupManager._popEnable) {
                if ($gameParty.inBattle() && !battleShowList.contains('classLevel')) { return }
                CommonPopupManager.showInfo({
                    'name': TextManager.classLevel,
                    'value': upLevel > 0
                }, upLevel, 'classLevel', this.actorId(), this.currentClass().name);

                this._skills.forEach(function (skillId) {
                    if (!pSkills.contains(skillId)) {
                        CommonPopupManager.showInfo($dataSkills[skillId], 1, 'skill', this.actorId());
                    }
                }.bind(this));
            }
        };
    }

    var __BManager_displayRewards = BattleManager.displayRewards;
    BattleManager.displayRewards = function () {
        __BManager_displayRewards.call(this);
        if (Imported['BattleFormation']) {
            $gameTemp._popupDelay = rewardPopupDelay;
            var upLevel = this._upBfLevel;
            var item = $gameParty.battleFormation();
            if (CommonPopupManager.popEnable() && item) {
                if ($gameParty.inBattle() && !battleShowList.contains('formationLevel')) return;
                if ($gameParty.isMaxBfLevel(item.id)) {
                    CommonPopupManager.showInfo({
                        'name': item.name,
                        'iconIndex': item.iconIndex,
                        'value': 'max'
                    }, upLevel, 'formationLevel', null, null);
                } else {
                    CommonPopupManager.showInfo({
                        'name': item.name,
                        'iconIndex': item.iconIndex,
                        'value': upLevel > 0
                    }, upLevel, 'formationLevel', null, null);
                }
            }
            $gameTemp._popupDelay = 0;
        }
    };

    CommonPopupManager.showInfo = function (object, value, type, actor, c) {
        var text1 = null;
        if (value === 0) { return }
        var se = { name: '', volume: 90, pitch: 100, pan: 0 };
        switch (type) {
            case 'gold':
                text1 = getGoldText;
                if (value < 0) {
                    text1 = lostGoldText
                }
                break;
            case 'item':
                text1 = getInfoText;
                if (value > 1) {
                    text1 = getInfoTextNum
                } else if (value === -1) {
                    text1 = lostInfoText
                } else if (value < -1) {
                    text1 = lostInfoTextNum
                }
                break;
            case 'exp':
                text1 = object.value ? ExpUpText : ExpDownText;
                break;
            case 'level':
                text1 = object.value ? lvUpText : lvDownText;
                break;
            case 'abp':
                text1 = object.value ? abpUpText : abpDownText;
                break;
            case 'classLevel':
                text1 = object.value ? clvUpText : clvDownText;
                break;
            case 'param':
                text1 = object.value ? ParamUpText : ParamDownText;
                break;
            case 'skill':
                text1 = value === 1 ? getInfoSkillText : lostInfoSkillText;
                break;
            case 'formationLevel':
                text1 = object.value === 'max' ? fLvMaxText : fLvUpText;
                break;
            default:
                text1 = value;
        }
        if (text1 === '') return;
        if (text1 === 'null') return;
        text1 = text1.replace(/^_se\[(.+?)\]/i, function () {
            var tx = arguments[1].split(',');
            se.name = tx[0];
            if (tx[1]) se.volume = parseInt(tx[1], 10);
            if (tx[2]) se.pitch = parseInt(tx[2], 10);
            if (tx[3]) se.pan = parseInt(tx[3], 10);
            return '';
        }.bind(this));
        var descs = object.description ? object.description.split(/\n/) : [];
        if (actor) {
            actor = $gameActors.actor(actor);
            text1 = text1.replace(/_actor/g, actor.name());
            text1 = text1.replace(/_aicon/g, actor.actorId() + actorIconStartIndex - 1);
        }
        if (c) { text1 = text1.replace(/_class/g, c) }
        text1 = text1.replace(/_name/g, object.name);
        text1 = text1.replace(/_icon/g, object.iconIndex);
        text1 = text1.replace(/_num/g, Math.abs(value));
        text1 = descs[0] ? text1.replace(/_desc1/g, descs[0]) : text1.replace(/_desc1/g, '');
        text1 = descs[1] ? text1.replace(/_desc2/g, descs[1]) : text1.replace(/_desc2/g, '');
        var texts = text1.split(/\n|\\n/);
        for (var i = 0; i < texts.length; i++) {
            var text = texts[i].replace(/\\C\[\d+\]/g, '');
            if (text === '') { delete texts[i] }
        }
        texts = texts.compact();
        var oneHeight = (infoFontSize + 8)
        var height = oneHeight * texts.length;
        var bitmap = new Bitmap(Graphics.boxWidth, height);
        bitmap.fillRect(0, 0, infoWidth / 2, bitmap.height, 'rgba(0,0,0,0.5)');
        bitmap.gradientFillRect(infoWidth / 2, 0, infoWidth / 2, bitmap.height, 'rgba(0,0,0,0.5)', 'rgba(0,0,0,0)');
        this.window().contents = bitmap;
        this.window().drawTextEx('\\FS[' + infoFontSize + ']', 0, 0);
        for (var i = 0; i < texts.length; i++) {
            var text = '\\FS[' + infoFontSize + ']' + texts[i]
            this.window().drawTextEx(text, 8, i * oneHeight);
        }
        var arg = this.setPopup([]);
        arg.bitmap = bitmap;
        arg.se = se;
        if (infoPattern === 'GrowUp') {
            arg.x = 0 + infoSupX;//Graphics.boxWidth * -1 + infoSupX;
            arg.y = Graphics.boxHeight;// - height;
            arg.moveX = 0;//Graphics.boxWidth;
            arg.anchorX = 0;
            arg.anchorY = 1.0;
            arg.pattern = -2;
            if (infoSlideAction === 'Down') arg.anchorY = 0;
        } else if (infoPattern === 'Stretch') {
            arg.x = 0 + infoSupX;
            arg.y = Graphics.boxHeight - height;
            arg.moveX = 0;
            arg.anchorX = 0;
            arg.anchorY = 0;
            arg.pattern = -1;
        } else {
            arg.x = Graphics.boxWidth * -1 + infoSupX;
            arg.y = Graphics.boxHeight - height;
            arg.moveX = Graphics.boxWidth;
            arg.anchorX = 0;
            arg.anchorY = 0;
        }
        if (infoPosition === 'Up') {
            arg.y = 0;
            if (infoPattern === 'GrowUp' && infoSlideAction !== 'Down') arg.y = height;
        }
        arg.y += infoSupY;
        if ($gameParty.inBattle() && (SceneManager._scene._messageWindow && SceneManager._scene._messageWindow.active)) {
            if (SceneManager._scene._messageWindow._positionType === 2) {
                var my = SceneManager._scene._messageWindow.y;
                arg.y = Math.min(arg.y, my - height + height * arg.anchorY);
            }
        }
        if ((SceneManager._scene._statusWindow && SceneManager._scene._statusWindow.isOpen())) {
            var sy = SceneManager._scene._statusWindow.y;
            arg.y = Math.min(arg.y, sy - height + height * arg.anchorY);
        }
        arg.moveY = 0;
        arg.count = infoCount;
        arg.fixed = false;
        arg.extend = [infoMoveFade, infoMoveWait];
        arg.slideCount = infoSlideCount;
        arg.delay = 0;
        arg.slideAction = infoSlideAction;
        if (!CommonPopupManager._tempCommonSprites) CommonPopupManager._tempCommonSprites = [];
        var array = CommonPopupManager._tempCommonSprites.compact();
        var ld = CommonPopupManager._lastIndex;
        if (ld !== undefined && ld >= 0 && array[ld]) {
            array.sort(function (a, b) { return a.delay > b.delay ? -1 : 1 });
            arg.delay = array[0].delay + infoDelay;
        }
        if ($gameTemp._popupDelay && arg.delay === 0) arg.delay += $gameTemp._popupDelay;
        CommonPopupManager._lastIndex = this._tempCommonSprites.setNullPos(arg);
    };

    var _gInfo_BManager_gainRewards = BattleManager.gainRewards;
    BattleManager.gainRewards = function () {
        CommonPopupManager._popEnable = CommonPopupManager.popEnable() && useRewardsInfo;
        $gameTemp._popupDelay = rewardPopupDelay;
        _gInfo_BManager_gainRewards.call(this);
        CommonPopupManager._popEnable = false;
        $gameTemp._popupDelay = 0;
    };
})();


code:
/*:ja
 * @plugindesc 放置していると画面がフリーズするのを修正
 * @author kido
 *
 * @help
 * このコアスクリプトの修正を取り込みます
 * https://github.com/rpgtkoolmv/corescript/pull/191
 *
 */

(function () {

  var _render = Graphics.render;
  Graphics.render = function (stage) {
    if (this._skipCount < 0) {
      this._skipCount = 0;
    }
    _render.call(this, stage);
  };
})();


code:
/*:ja
 * @target MZ MV
 * @title Custom Page Conditions
 * @author Hime --> HimeWorks (http://himeworks.com)
 * @version 1.6
 * @date Aug 20, 2020
 * @filename HIME_CustomPageConditions.js
 * @url https://raw.githubusercontent.com/munokura/HIME-MV-plugins-jp/master/HIME_CustomPageConditions.js
 * @plugindesc v1.6 イベントページの出現条件をイベント処理でカスタムできます
 *
 * @command activate_page
 * @desc ページを起動します
 *
 * @help
 * 翻訳:ムノクラ
 * https://fungamemake.com/
 * https://twitter.com/munokura/
 *
 * 元プラグイン:
 * http://himeworks.com/2015/10/custom-page-conditions-mv/
 *
 * == 説明 ==
 *
 * イベントはページの集合体です。
 * どのページが有効であるかによって、イベントの表示や動作は異なります。
 * どのページが有効であるかを判断するために、一連のページ条件が使用されます。
 * 全てのページ条件が満たされていれば、そのページを有効にすることができます。
 *
 * RPGツクールMVではデフォルトで5種類のページ条件が用意されています。
 *
 * - スイッチがONになっている
 * - 変数が一定値以上
 * - セルフスイッチがON
 * - パーティがアイテムを持っている
 * - アクターはパーティに参加している
 *
 * しかし、別の条件を設定したい場合、
 * この5つの条件だけを使用してそれを達成する方法を見つける必要があります。
 * スイッチをオンにしたり、変数を変更したりするために、
 * 並列処理を使って条件が満たされているかを確認する必要があるかもしれません。
 *
 * このプラグインを使うと、
 * 回避策を考えなくても、簡単に独自のページ条件を定義することができます。
 * 特定の武器や防具を持っているか、
 * 特定の組み合わせのアクターがパーティにいるかを確認したい場合、
 * イベントで直接指定することができます。
 *
 * カスタムページ条件を利用することで、
 * 生産性が向上し、プロジェクトの管理がしやすくなります。
 *
 *
 * == 使用法 ==
 *
 * イベントでカスタムページ条件を作成するには、次の注釈を作成します。
 *
 *   <page condition>
 *
 * 次に、ページの条件として使用したいイベントコマンドを追加します。
 *
 * ページを有効にするには、プラグインコマンドを実行する必要があります。
 *
 *   activate_page
 *
 * 最後に注釈でページの条件を終わらせます。
 *
 *   </page condition>
 *
 * ページ条件は通常のイベント処理の一環としては実行されません。
 *
 *
 * 例:所持金が100以上の時にページを有効化
 *
 * イベントページの実行内容に下記を入れてください。
 *
 * ◆注釈：<page condition>
 * ◆条件分岐：所持金 ≥ 100
 *   ◆プラグインコマンド：activate_page
 *   ◆
 * ：分岐終了
 * ◆注釈：</page condition>
 *
 *
 *   - カスタム敵グループページの条件 --
 *
 * カスタムページの条件を敵グループにも使用することができます。
 * バトルイベントでも上記と同じ手順で、動作します。
 *
 * バトルイベントにはデフォルトのページ条件のいずれかを満たす必要があることに
 * 注意してください。
 * いつでも実行させたい場合は、常にONになっているスイッチを予約し、
 * それを敵グループのページ条件として使用します。
 *
 * == 利用規約 ==
 *
 * - クレジットを表示する非営利プロジェクトでの使用は無料
 * - 商用利用の場合、私に連絡してください
 *
 * == Change Log ==
 *
 * 1.6 - Aug 20, 2020
 *   * support for MZ
 * 1.5 - Apr 7, 2016
 *   * Fixed bug where removing conditions from troop editor caused the
 *     event to always run
 * 1.4 - Feb 12, 2016
 *   * Fixed issue where page conditions executed before map is set up
 * 1.3 - Dec 14, 2015
 *   * Fixed issue with self-switches
 * 1.2 - Dec 5, 2015
 *   * Added support for custom troop page conditions
 * 1.1 - Dec 5, 2015
 *   * Changed event condition processing to use an entire event list
 * 1.0 - Oct 24, 2015
 *   * Initial release
 */

/*:
@title Custom Page Conditions
@author Hime --> HimeWorks (http://himeworks.com)
@version 1.6
@date Aug 20, 2020
@filename HIME_CustomPageConditions.js
@url http://himeworks.com/2015/10/custom-page-conditions-mv/
@plugindesc v1.6 - Create your own page conditions for your events using regular eventing!
@help
== Description ==

Events are a collection of pages. Depending on which page is active,
the event will appear and behave differently. To determine which page is
active, a set of page conditions are used. If all page conditions are met,
then that page can be activated.

By default, RPG Maker provides 5 different page conditions:

- Switch is ON
- Variable is at least a certain value
- self-switch is ON
- Party has an item
- Actor is in party

But if you wanted to have a different condition, you would need to find a
way to accomplish that using only these 5 conditions. This may involve using
parallel processes to check whether conditions are met, in order to turn
on a switch or change a variable.

This plugin provides you with an easy way to define your own page
conditions without having to come up with workarounds. If you want to
check whether you have a certain weapon or armor, or whether a given
combination of actors is in the party, you can directly specify this
in your event.

By using custom page conditions, it improves productivity and makes it
easier to manage your project.

== Terms of Use ==

- Free for use in non-commercial projects with credits
- Contact me for commercial use

== Change Log ==

1.6 - Aug 20, 2020
  * support for MZ
1.5 - Apr 7, 2016
  * Fixed bug where removing conditions from troop editor caused the
    event to always run
1.4 - Feb 12, 2016
  * Fixed issue where page conditions executed before map is set up
1.3 - Dec 14, 2015
  * Fixed issue with self-switches
1.2 - Dec 5, 2015
  * Added support for custom troop page conditions
1.1 - Dec 5, 2015
  * Changed event condition processing to use an entire event list
1.0 - Oct 24, 2015
  * Initial release

== Usage ==

To create a custom page condition, in your event, start by creating a
comment that reads

  <page condition>

Then add any event commands that you would like to use as your page
condition.

In order to activate the page, you must use the plugin command

  activate_page

Finally, end your  page condition with a comment.

  </page condition>

The page condition will not be executed as part of the regular event
processing.

  - Custom Troop Page Conditions --

You can use custom page conditions for troops as well!
The instructions are the same as for a regular event: add the start comment,
write your logic, and then add an end comment.

However, note that troop events require one of the default page conditions to
be met. If you want it to run at anytime, reserve a switch that will always
be ON and then use that as the troop page condition.
-------------------------------------------------------------------------------
@command activate_page
@desc activates the page!
-------------------------------------------------------------------------------
 */
var TH = TH || {};
TH.CustomPageConditions = TH.CustomPageConditions || {};

function PageManager() {
    throw new Error('This is a static class');
};

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

(function ($) {

    // get the last part of script URL
    var scriptName = document.currentScript.src.split("/").pop();
    var lastDot = scriptName.lastIndexOf(".")

    Game_PageInterpreter.prototype = Object.create(Game_Interpreter.prototype);
    Game_PageInterpreter.prototype.constructor = Game_PageInterpreter;

    Game_PageInterpreter.prototype.clear = function () {
        Game_Interpreter.prototype.clear.call(this);
        this._conditionsMet = false;
    };

    Game_PageInterpreter.prototype.execute = function () {
        while (this.isRunning()) {
            this.executeCommand();
        }
    }

    Game_PageInterpreter.prototype.pluginCommand = function (command, args) {
        if (command.toLowerCase() === "activate_page") {
            this._conditionsMet = true;
        }
    };

    /* For MZ. */
    if (Game_Interpreter.prototype.command357) {
        var TH_GamePageInterpreter_command357 = Game_Interpreter.prototype.command357
        Game_Interpreter.prototype.command357 = function (params) {
            if (params[1].toLowerCase() === "activate_page") {
                this._conditionsMet = true;
            }
            return TH_GamePageInterpreter_command357.call(this, params);
        };
    }

    /***************************************************************************/

    PageManager.initialize = function () {
        this._interpreter = new Game_PageInterpreter();
    };

    PageManager.conditionsMet = function (list, eventId, event) {
        this._interpreter.setup(list, eventId, event);
        this._interpreter.execute();
        return this._interpreter._conditionsMet;
    };

    /***************************************************************************/

    var TH_DataManager_loadDatabase = DataManager.loadDatabase;
    DataManager.loadDatabase = function () {
        TH_DataManager_loadDatabase.call(this);
        PageManager.initialize();
    };

    /***************************************************************************/

    /*
     * Go through event commands looking for page conditions
     */
    $.loadCustomPageCondition = function (page) {
        page.customPageCondition = [];
        page.list = JsonEx.makeDeepCopy(page.list);
        var cmd, nextCmd;
        for (var i = 0, len = page.list.length; i < len; i++) {
            cmd = page.list[i];
            if (cmd.code === 108 && cmd.parameters[0].indexOf("<page condition>") > -1) {
                for (var j = i + 1; j < len; j++) {
                    cmd = page.list[j];
                    if (cmd.code === 108 && cmd.parameters[0].indexOf("</page condition>") > -1) {
                        page.list.splice(i, j - 1);
                        return;
                    }
                    page.customPageCondition.push(cmd)
                }
            }
        }
    };

    /***************************************************************************/

    var TH_GameMap_setupEvents = Game_Map.prototype.setupEvents;
    Game_Map.prototype.setupEvents = function () {
        TH_GameMap_setupEvents.call(this);
        this.refresh();
    };

    /***************************************************************************/

    var TH_CustomPageConditions_Game_Event_meetsConditions = Game_Event.prototype.meetsConditions;
    Game_Event.prototype.meetsConditions = function (page) {
        var res = TH_CustomPageConditions_Game_Event_meetsConditions.call(this, page);
        if (!res) {
            return false;
        }
        return this.meetsCustomConditions(page);
    };

    /*
     * Determines whether all custom page conditions have been met.
     */
    Game_Event.prototype.meetsCustomConditions = function (page) {
        if (page.customPageCondition === undefined) {
            $.loadCustomPageCondition(page);
        }
        if (page.customPageCondition.length > 0) {
            return $gameMap.event(this._eventId) && PageManager.conditionsMet(page.customPageCondition, this._eventId)
        }
        return true;
    };

    /***************************************************************************/

    var TH_GameTroop_meetsConditions = Game_Troop.prototype.meetsConditions;
    Game_Troop.prototype.meetsConditions = function (page) {
        var res = TH_GameTroop_meetsConditions.call(this, page);
        var c = page.conditions;
        // It's false, and there were valid conditions
        if (!res && (c.turnEnding || c.turnValid || c.enemyValid ||
            c.actorValid || c.switchValid)) {
            return false;
        }
        return res && this.customPageConditionsMet(page);
    };

    Game_Troop.prototype.customPageConditionsMet = function (page) {
        if (page.customPageCondition === undefined) {
            $.loadCustomPageCondition(page);
        }
        if (page.customPageCondition.length > 0) {
            return PageManager.conditionsMet(page.customPageCondition, 0);
        }
        return true;
    };

    /***************************************************************************/

    /*
     * Update methods to refresh the map
     */
    var TH_CustomPageConditions_GameParty_gainGold = Game_Party.prototype.gainGold;
    Game_Party.prototype.gainGold = function (amount) {
        TH_CustomPageConditions_GameParty_gainGold.call(this, amount)
        $gameMap.requestRefresh();
    };

    var TH_CustomPageConditions_GameActor_setName = Game_Actor.prototype.setName;
    Game_Actor.prototype.setName = function (name) {
        TH_CustomPageConditions_GameActor_setName.call(this, name)
        $gameMap.requestRefresh();
    };

    var TH_CustomPageConditions_GameActor_changeClass = Game_Actor.prototype.changeClass;
    Game_Actor.prototype.changeClass = function (classId, keepExp) {
        TH_CustomPageConditions_GameActor_changeClass.call(this, classId, keepExp);
        $gameMap.requestRefresh();
    };

    var TH_CustomPageConditions_GameActor_learnSkill = Game_Actor.prototype.learnSkill;
    Game_Actor.prototype.learnSkill = function (skillId) {
        TH_CustomPageConditions_GameActor_learnSkill.call(this, skillId);
        $gameMap.requestRefresh();
    };

    var TH_CustomPageConditions_GameBattler_refresh = Game_Battler.prototype.refresh;
    Game_Battler.prototype.refresh = function () {
        TH_CustomPageConditions_GameBattler_refresh.call(this);
        $gameMap.requestRefresh();
    };
})(TH.CustomPageConditions);


code:
//=============================================================================
// HorzMenuadv.js
//=============================================================================

/*:ja
 * @plugindesc ver1.03 ホリゾンタルなメニューコマンド構成
 * @author まっつＵＰ
 *
 * @param back
 * @desc Backgroundのピクチャ名です。
 * @default
 *
 * @param loadtext
 * @desc コマンド「ロード」のコマンド名です。
 * @default ロード
 *
 * @param opacity
 * @desc メニューコマンドウインドウの不透明度です。
 * @default 255
 *
 * @param xposi
 * @desc メニューコマンドウインドウのx座標です。
 * @default 0
 *
 * @param yposi
 * @desc メニューコマンドウインドウのy座標です。
 * 0未満の時はプラグイン側で画面下部の辺りにyを調整します。
 * @default -1
 *
 * @help
 *
 * RPGで笑顔を・・・
 *
 * このヘルプとパラメータの説明をよくお読みになってからお使いください。
 *
 * backのパラメータにはピクチャのファイル名を入れてください。
 * このとき''などで囲む必要はありません。
 * そのピクチャが表示されますが、デフォルトのBackgroundは表示されません。
 *
 * コマンド「ロード」はイベントテスト中またはセーブデータがないときは選択不能になります。
 *
 * なお、メニューコマンド「並び替え」の挙動については全く切っておりますので
 * このプラグインを使う時はメニューコマンド「並び替え」を使わない方がいいでしょう。
 *
 * ver1.01 個人コマンド等の挙動を改善しました。
 * ver1.02 メニューコマンド「ゲームエンド」のエラー落ち回避のための記述を入れました。
 * ver1.03 メニューコマンドウインドウに関するパラメータを追加。
 * また、項目数が少ないときはメニューコマンドウインドウの幅を調整するようにしました。
 *
 * このプラグインを利用する場合は
 * readmeなどに「まっつＵＰ」の名を入れてください。
 * また、素材のみの販売はダメです。
 * 上記以外の規約等はございません。
 * もちろんツクールMVで使用する前提です。
 * 何か不具合ありましたら気軽にどうぞ。
 *
 * 免責事項：
 * このプラグインを利用したことによるいかなる損害も制作者は一切の責任を負いません。
 *
 */

(function () {

  var parameters = PluginManager.parameters('HorzMenuadv');
  var HMback = String(parameters['back'] || '');
  var HMloadtext = String(parameters['loadtext'] || 'ロード');
  var HMopacity = Number(parameters['opacity'] || 255);
  var HMxposi = Number(parameters['xposi'] || 0);
  var HMyposi = Number(parameters['yposi'] || -1);

  //Scene_MenuBase
  Scene_MenuBase.prototype.createBackground = function () {
    this._HMSprite1 = new Sprite(ImageManager.loadPicture(HMback));
    this.addChild(this._HMSprite1);
  };

  //Scene_Menu
  Scene_Menu.prototype.create = function () {
    Scene_MenuBase.prototype.create.call(this);
    this.createCommandWindow();
    this.createStatusWindow();
  };

  var _Scene_Menu_createCommandWindow = Scene_Menu.prototype.createCommandWindow;
  Scene_Menu.prototype.createCommandWindow = function () {
    _Scene_Menu_createCommandWindow.call(this);
    this._commandWindow.setHandler('load', this.commandLoad.bind(this));
  };

  var _Scene_Menu_createStatusWindow = Scene_Menu.prototype.createStatusWindow;
  Scene_Menu.prototype.createStatusWindow = function () {
    _Scene_Menu_createStatusWindow.call(this);
    this._statusWindow.hide();
  };

  Scene_Menu.prototype.commandPersonal = function () {
    this._statusWindow.setFormationMode(false);
    this._statusWindow.selectLast();
    this._statusWindow.activate();
    this.onPersonalOk(); //直接選択処理を行う。
  };

  Scene_Menu.prototype.commandLoad = function () { //新規
    SceneManager.push(Scene_Load);
  };

  //Scene_GameEnd
  Scene_GameEnd.prototype.createBackground = function () {
    Scene_MenuBase.prototype.createBackground.call(this);
  };

  //Window_MenuCommand（メニューコマンド位置の改変などをしたい場合はここを弄ってください。）
  var _Window_MenuCommand_initialize = Window_MenuCommand.prototype.initialize;
  Window_MenuCommand.prototype.initialize = function (x, y) {
    x = HMxposi;
    if (HMyposi >= 0) {
      y = HMyposi;
    } else {
      y = Graphics.boxHeight - this.fittingHeight(this.numVisibleRows());
    }
    _Window_MenuCommand_initialize.call(this, x, y);
    this.opacity = HMopacity;
  };

  Window_MenuCommand.prototype.windowWidth = function () {
    var widthA = this.standardFontSize() * 5;
    var realwidth = this.maxCols() * widthA;
    return Math.min(Graphics.boxWidth, realwidth);
  };

  Window_MenuCommand.prototype.maxCols = function () { //新規プロパティ
    return this.maxItems();
  };

  Window_MenuCommand.prototype.numVisibleRows = function () {
    return 1;
  };

  Window_MenuCommand.prototype.itemTextAlign = function () { //新規プロパティ
    return 'center';
  };

  var _Window_MenuCommand_addSaveCommand = Window_MenuCommand.prototype.addSaveCommand;
  Window_MenuCommand.prototype.addSaveCommand = function () {
    _Window_MenuCommand_addSaveCommand.call(this);
    var enabled = this.isLoadEnabled();
    this.addCommand(HMloadtext, 'load', enabled);
  };

  Window_MenuCommand.prototype.isLoadEnabled = function () { //新規
    if (DataManager.isEventTest()) return false;
    return DataManager.isAnySavefileExists();
  };

})();


code:
//=============================================================================
// HzRandomChoice.js
//=============================================================================

/*:ja
 * @plugindesc 選択肢の順番をランダムにします。また、タイマーが0になった際に強制的に最後の選択肢を選択させます。
 * @author hiz
 *
 *  @help
 * ■ランダムな選択肢の順番
 * 　順番をランダムにしたい選択肢の「一番最後の選択文」に、以下のように記述します。
 *
 *  <random>
 *
 *  ■タイマー0で最後の選択肢に強制分岐
 *  　タイマーが0になった際に強制分岐したい選択肢の「一番最後の選択文」に、以下のように記述します。
 *  　選択肢の実行前にタイマーを起動しておいてください。
 *
 *  <timer>
 *
 * *このプラグインには、プラグインコマンドはありません。

 */
/*:en
 * @plugindesc Shuffle choices order.
 * @author hiz
 *
 *  @help
 *  * Shuffled choices
 *  Put the forrowing on the end of option.
 *
 *  <random>
 *
 *  * Force choice the end of option when the timer is expired.
 *  Put the forrowing on the end of option.
 *  Please start the timer before show choices.
 *
 *  <timer>
 *
 *  * This plugin has no plugin command.
 */

(function () {
    // 配列のシャッフル
    function shuffle(array) {
        var n = array.length, t, i;
        while (n) {
            i = Math.floor(Math.random() * n--);
            t = array[n];
            array[n] = array[i];
            array[i] = t;
        }

        return array;
    }

    var _Window_ChoiceList_start = Window_ChoiceList.prototype.start;
    Window_ChoiceList.prototype.start = function () {
        // <random>:シャッフル
        this._shuffledIndexes = null;
        if (/<random>/.test($gameMessage._choices[$gameMessage._choices.length - 1])) {
            var lastChoice = $gameMessage._choices.pop();
            var choiceNum = $gameMessage._choices.length;
            // 選択肢のインデックスのシャッフル
            this._shuffledIndexes = new Array(choiceNum);
            for (var i = 0; i < choiceNum; i++) {
                this._shuffledIndexes[i] = i;
            }
            shuffle(this._shuffledIndexes);
            // 選択肢のシャッフル
            var shuffledChoices = new Array(choiceNum);
            for (var i = 0; i < choiceNum; i++) {
                shuffledChoices[i] = $gameMessage._choices[this._shuffledIndexes[i]];
            }
            $gameMessage._choices = shuffledChoices;
            $gameMessage._choices.push(lastChoice);
        }
        // <timer>:タイマーが0になった際に強制的に最後の選択肢に分岐
        this._timer_idx = -1;
        if (/<timer>/.test($gameMessage._choices[$gameMessage._choices.length - 1])) {
            this._timer_idx = $gameMessage._choices.length - 1;
        }

        // 一番最後の選択文を削除
        if (/<.*>/.test($gameMessage._choices[$gameMessage._choices.length - 1])) {
            $gameMessage._choices.pop();
        }

        _Window_ChoiceList_start.call(this);
    };

    var _Window_ChoiceList_update = Window_ChoiceList.prototype.update;
    Window_ChoiceList.prototype.update = function () {
        if (this.isOpen() && this._timer_idx >= 0) {
            if ($gameTimer.isWorking() && $gameTimer._frames === 0) {
                // タイマーが0になった際、強制的に一番最後の選択肢を選択。
                this._index = this._timer_idx;
                this._timer_idx = -1;
                this.updateInputData();
                this.deactivate();
                this.callOkHandler();
                return;
            }
        }
        _Window_ChoiceList_update.call(this);
    };

    Window_ChoiceList.prototype.callOkHandler = function () {
        $gameMessage.onChoice(this.resultIndex(this.index()));
        this._messageWindow.terminateMessage();
        this.close();
    };

    Window_ChoiceList.prototype.callCancelHandler = function () {
        $gameMessage.onChoice(this.resultIndex($gameMessage.choiceCancelType()));
        this._messageWindow.terminateMessage();
        this.close();
    };

    // シャッフル後のインデックスに変換
    Window_ChoiceList.prototype.resultIndex = function (idx) {
        if (this._shuffledIndexes === null) return idx;
        if (this._shuffledIndexes.length <= idx) return idx;
        return this._shuffledIndexes[idx];
    };

})();


code:
//=============================================================================
// ItemBook.js
//=============================================================================

/*:
 * @plugindesc Displays detailed statuses of items.
 * @author Yoji Ojima
 *
 * @param Unknown Data
 * @desc The index name for an unknown item.
 * @default ??????
 *
 * @param Price Text
 * @desc The text for "Price".
 * @default Price
 *
 * @param Equip Text
 * @desc The text for "Equip".
 * @default Equip
 *
 * @param Type Text
 * @desc The text for "Type".
 * @default Type
 *
 * @help
 *
 * Plugin Command:
 *   ItemBook open            # Open the item book screen
 *   ItemBook add weapon 3    # Add weapon #3 to the item book
 *   ItemBook add armor 4     # Add armor #4 to the item book
 *   ItemBook remove armor 5  # Remove armor #5 from the item book
 *   ItemBook remove item 6   # Remove item #6 from the item book
 *   ItemBook complete        # Complete the item book
 *   ItemBook clear           # Clear the item book
 *
 * Item (Weapon, Armor) Note:
 *   <book:no>                # This item does not appear in the item book
 */

/*:ja
 * @plugindesc アイテム図鑑です。アイテムの詳細なステータスを表示します。
 * @author Yoji Ojima
 *
 * @param Unknown Data
 * @desc 未確認のアイテムの索引名です。
 * @default ？？？？？？
 *
 * @param Price Text
 * @desc 「価格」の文字列です。
 * @default 価格
 *
 * @param Equip Text
 * @desc 「装備」の文字列です。
 * @default 装備
 *
 * @param Type Text
 * @desc 「タイプ」の文字列です。
 * @default タイプ
 *
 * @help
 *
 * プラグインコマンド:
 *   ItemBook open            # 図鑑画面を開く
 *   ItemBook add weapon 3    # 武器３番を図鑑に追加
 *   ItemBook add armor 4     # 防具４番を図鑑に追加
 *   ItemBook remove armor 5  # 防具５番を図鑑から削除
 *   ItemBook remove item 6   # アイテム６番を図鑑から削除
 *   ItemBook complete        # 図鑑を完成させる
 *   ItemBook clear           # 図鑑をクリアする
 *
 * アイテム（武器、防具）のメモ:
 *   <book:no>                # 図鑑に載せない場合
 */

(function () {

    var parameters = PluginManager.parameters('ItemBook');
    var unknownData = String(parameters['Unknown Data'] || '??????');
    var priceText = String(parameters['Price Text'] || 'Price');
    var equipText = String(parameters['Equip Text'] || 'Equip');
    var typeText = String(parameters['Type Text'] || 'Type');

    var _Game_Interpreter_pluginCommand =
        Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function (command, args) {
        _Game_Interpreter_pluginCommand.call(this, command, args);
        if (command === 'ItemBook') {
            switch (args[0]) {
                case 'open':
                    SceneManager.push(Scene_ItemBook);
                    break;
                case 'add':
                    $gameSystem.addToItemBook(args[1], Number(args[2]));
                    break;
                case 'remove':
                    $gameSystem.removeFromItemBook(args[1], Number(args[2]));
                    break;
                case 'complete':
                    $gameSystem.completeItemBook();
                    break;
                case 'clear':
                    $gameSystem.clearItemBook();
                    break;
            }
        }
    };

    Game_System.prototype.addToItemBook = function (type, dataId) {
        if (!this._ItemBookFlags) {
            this.clearItemBook();
        }
        var typeIndex = this.itemBookTypeToIndex(type);
        if (typeIndex >= 0) {
            this._ItemBookFlags[typeIndex][dataId] = true;
        }
    };

    Game_System.prototype.removeFromItemBook = function (type, dataId) {
        if (this._ItemBookFlags) {
            var typeIndex = this.itemBookTypeToIndex(type);
            if (typeIndex >= 0) {
                this._ItemBookFlags[typeIndex][dataId] = false;
            }
        }
    };

    Game_System.prototype.itemBookTypeToIndex = function (type) {
        switch (type) {
            case 'item':
                return 0;
            case 'weapon':
                return 1;
            case 'armor':
                return 2;
            default:
                return -1;
        }
    };

    Game_System.prototype.completeItemBook = function () {
        var i;
        this.clearItemBook();
        for (i = 1; i < $dataItems.length; i++) {
            this._ItemBookFlags[0][i] = true;
        }
        for (i = 1; i < $dataWeapons.length; i++) {
            this._ItemBookFlags[1][i] = true;
        }
        for (i = 1; i < $dataArmors.length; i++) {
            this._ItemBookFlags[2][i] = true;
        }
    };

    Game_System.prototype.clearItemBook = function () {
        this._ItemBookFlags = [[], [], []];
    };

    Game_System.prototype.isInItemBook = function (item) {
        if (this._ItemBookFlags && item) {
            var typeIndex = -1;
            if (DataManager.isItem(item)) {
                typeIndex = 0;
            } else if (DataManager.isWeapon(item)) {
                typeIndex = 1;
            } else if (DataManager.isArmor(item)) {
                typeIndex = 2;
            }
            if (typeIndex >= 0) {
                return !!this._ItemBookFlags[typeIndex][item.id];
            } else {
                return false;
            }
        } else {
            return false;
        }
    };

    var _Game_Party_gainItem = Game_Party.prototype.gainItem;
    Game_Party.prototype.gainItem = function (item, amount, includeEquip) {
        _Game_Party_gainItem.call(this, item, amount, includeEquip);
        if (item && amount > 0) {
            var type;
            if (DataManager.isItem(item)) {
                type = 'item';
            } else if (DataManager.isWeapon(item)) {
                type = 'weapon';
            } else if (DataManager.isArmor(item)) {
                type = 'armor';
            }
            $gameSystem.addToItemBook(type, item.id);
        }
    };

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

    Scene_ItemBook.prototype = Object.create(Scene_MenuBase.prototype);
    Scene_ItemBook.prototype.constructor = Scene_ItemBook;

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

    Scene_ItemBook.prototype.create = function () {
        Scene_MenuBase.prototype.create.call(this);
        this._indexWindow = new Window_ItemBookIndex(0, 0);
        this._indexWindow.setHandler('cancel', this.popScene.bind(this));
        var wy = this._indexWindow.height;
        var ww = Graphics.boxWidth;
        var wh = Graphics.boxHeight - wy;
        this._statusWindow = new Window_ItemBookStatus(0, wy, ww, wh);
        this.addWindow(this._indexWindow);
        this.addWindow(this._statusWindow);
        this._indexWindow.setStatusWindow(this._statusWindow);
    };

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

    Window_ItemBookIndex.prototype = Object.create(Window_Selectable.prototype);
    Window_ItemBookIndex.prototype.constructor = Window_ItemBookIndex;

    Window_ItemBookIndex.lastTopRow = 0;
    Window_ItemBookIndex.lastIndex = 0;

    Window_ItemBookIndex.prototype.initialize = function (x, y) {
        var width = Graphics.boxWidth;
        var height = this.fittingHeight(6);
        Window_Selectable.prototype.initialize.call(this, x, y, width, height);
        this.refresh();
        this.setTopRow(Window_ItemBookIndex.lastTopRow);
        this.select(Window_ItemBookIndex.lastIndex);
        this.activate();
    };

    Window_ItemBookIndex.prototype.maxCols = function () {
        return 3;
    };

    Window_ItemBookIndex.prototype.maxItems = function () {
        return this._list ? this._list.length : 0;
    };

    Window_ItemBookIndex.prototype.setStatusWindow = function (statusWindow) {
        this._statusWindow = statusWindow;
        this.updateStatus();
    };

    Window_ItemBookIndex.prototype.update = function () {
        Window_Selectable.prototype.update.call(this);
        this.updateStatus();
    };

    Window_ItemBookIndex.prototype.updateStatus = function () {
        if (this._statusWindow) {
            var item = this._list[this.index()];
            this._statusWindow.setItem(item);
        }
    };

    Window_ItemBookIndex.prototype.refresh = function () {
        var i, item;
        this._list = [];
        for (i = 1; i < $dataItems.length; i++) {
            item = $dataItems[i];
            if (item.name && item.itypeId === 1 && item.meta.book !== 'no') {
                this._list.push(item);
            }
        }
        for (i = 1; i < $dataWeapons.length; i++) {
            item = $dataWeapons[i];
            if (item.name && item.meta.book !== 'no') {
                this._list.push(item);
            }
        }
        for (i = 1; i < $dataArmors.length; i++) {
            item = $dataArmors[i];
            if (item.name && item.meta.book !== 'no') {
                this._list.push(item);
            }
        }
        this.createContents();
        this.drawAllItems();
    };

    Window_ItemBookIndex.prototype.drawItem = function (index) {
        var item = this._list[index];
        var rect = this.itemRect(index);
        var width = rect.width - this.textPadding();
        if ($gameSystem.isInItemBook(item)) {
            this.drawItemName(item, rect.x, rect.y, width);
        } else {
            var iw = Window_Base._iconWidth + 4;
            this.drawText(unknownData, rect.x + iw, rect.y, width - iw);
        }
    };

    Window_ItemBookIndex.prototype.processCancel = function () {
        Window_Selectable.prototype.processCancel.call(this);
        Window_ItemBookIndex.lastTopRow = this.topRow();
        Window_ItemBookIndex.lastIndex = this.index();
    };

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

    Window_ItemBookStatus.prototype = Object.create(Window_Base.prototype);
    Window_ItemBookStatus.prototype.constructor = Window_ItemBookStatus;

    Window_ItemBookStatus.prototype.initialize = function (x, y, width, height) {
        Window_Base.prototype.initialize.call(this, x, y, width, height);
    };

    Window_ItemBookStatus.prototype.setItem = function (item) {
        if (this._item !== item) {
            this._item = item;
            this.refresh();
        }
    };

    Window_ItemBookStatus.prototype.refresh = function () {
        var item = this._item;
        var x = 0;
        var y = 0;
        var lineHeight = this.lineHeight();

        this.contents.clear();

        if (!item || !$gameSystem.isInItemBook(item)) {
            return;
        }

        this.drawItemName(item, x, y);

        x = this.textPadding();
        y = lineHeight + this.textPadding();

        var price = item.price > 0 ? item.price : '-';
        this.changeTextColor(this.systemColor());
        this.drawText(priceText, x, y, 120);
        this.resetTextColor();
        this.drawText(price, x + 120, y, 120, 'right');
        y += lineHeight;

        if (DataManager.isWeapon(item) || DataManager.isArmor(item)) {
            var etype = $dataSystem.equipTypes[item.etypeId];
            this.changeTextColor(this.systemColor());
            this.drawText(equipText, x, y, 120);
            this.resetTextColor();
            this.drawText(etype, x + 120, y, 120, 'right');
            y += lineHeight;

            var type;
            if (DataManager.isWeapon(item)) {
                type = $dataSystem.weaponTypes[item.wtypeId];
            } else {
                type = $dataSystem.armorTypes[item.atypeId];
            }
            this.changeTextColor(this.systemColor());
            this.drawText(typeText, x, y, 120);
            this.resetTextColor();
            this.drawText(type, x + 120, y, 120, 'right');

            x = this.textPadding() + 300;
            y = lineHeight + this.textPadding();
            for (var i = 2; i < 8; i++) {
                this.changeTextColor(this.systemColor());
                this.drawText(TextManager.param(i), x, y, 160);
                this.resetTextColor();
                this.drawText(item.params[i], x + 160, y, 60, 'right');
                y += lineHeight;
            }
        }

        x = 0;
        y = this.textPadding() * 2 + lineHeight * 7;
        this.drawTextEx(item.description, x, y);
    };

})();