code:
//=============================================================================
//  Keke_FrontViewPlus - フロントビュープラス
// バージョン: 1.0.0
//=============================================================================
// Copyright (c) 2022 ケケー
// Released under the MIT license
// http://opensource.org/licenses/mit-license.php
//=============================================================================

/*:
 * @target MZ
 * @plugindesc 標準のフロントビュー戦闘の表示を強化
 * @author ケケー
 * @url https://kekeelabo.com
 *
 * @help
 * 【ver.1.0.0】
 * 標準のフロントビュー戦闘で味方側にもアニメーションとダメージポップを表示する
 *
 * ● 利用規約 ●
 * MITライセンスのもと、自由に使ってくれて大丈夫です
 *
 *
 *
 * Animations and damage pops for allies in standard front-view combat
 *
 * ● Terms of Use ●
 * Feel free to use it under the MIT license.
 *
 *
 *
 * @param ダメージポップX
 * @parent ■その他
 * @desc ダメージポップのX軸のずらし幅。5 なら右に 5ピクセル ずらす。初期値 0
 * @default 0
 *
 * @param ダメージポップY
 * @parent ■その他
 * @desc ダメージポップのY軸のずらし幅。5 なら下に 5ピクセル ずらす。初期値 0
 * @default 0
 */

(() => {
    //- プラグイン名
    const pluginName = document.currentScript.src.match(/^.*\/(.*).js$/)[1];

    //- ツクールMVか
    function isMv() {
        return typeof(ColorManager) == "undefined";
    };

    //- ツクールMZか
    function isMz() {
        return typeof(ColorManager) != "undefined";
    };

    //==================================================
    //--  パラメータ受け取り
    //==================================================

    const parameters = PluginManager.parameters(pluginName);

    const keke_damagePopX = Number(parameters["ダメージポップX"]);
    const keke_damagePopY = Number(parameters["ダメージポップY"]);

    //==================================================
    //--  フロントビュープラス
    //==================================================

    //- フロントビュー時もアクタースプライトを作る(コア追加)
    const _Spriteset_Battle_createActors = Spriteset_Battle.prototype.createActors;
    Spriteset_Battle.prototype.createActors = function() {
        _Spriteset_Battle_createActors.apply(this);
        if ($gameSystem.isSideView()) { return; }
        if (this._actorSprites.length) { return; }
        this._actorSprites = [];
        for (let i = 0; i < $gameParty.maxBattleMembers(); i++) {
            const sprite = new Sprite_Actor();
            this._actorSprites.push(sprite);
            this._battleField.addChild(sprite)
            sprite.visible = false;
       }
    };

    //- スプライトアクターの位置更新(コア追加)
    if (isMz()) {
    const _Sprite_Actor_updatePosition = Sprite_Actor.prototype.updatePosition;
    Sprite_Actor.prototype.updatePosition = function() {
        _Sprite_Actor_updatePosition.apply(this);
        // フロントアクター位置の更新
        updateFrontActorPos(this);
    };
    };

    //- フロントアクター位置の更新
    function updateFrontActorPos(sprite) {
        if (!isFrontViewAdapt(sprite)) { return; }
        const statusWindow = SceneManager._scene._statusWindow;
        const i = $gameParty.allMembers().indexOf(sprite._actor);
        const rect = statusWindow.faceRect(i);
        sprite._homeX = statusWindow.x + rect.x + rect.width / 2;
        sprite._homeY = statusWindow.y + rect.y;
        sprite._offsetX = 0;
        sprite._offsetY = 0;
    };

    //- フロントビュー時のアニメ条件(コア追加)
    const _Spriteset_Battle_makeTargetSprites = Spriteset_Battle.prototype.makeTargetSprites;
    Spriteset_Battle.prototype.makeTargetSprites = function(targets) {
        let targetSprites = _Spriteset_Battle_makeTargetSprites.apply(this, arguments);
        targetSprites = targetSprites.filter(sprite => {
            if (sprite._isAsFaceKe) { return true; }
            if (!sprite._battler) { return false; }
            if ($gameSystem.isSideView()) { return true; }
            if (sprite._enemy) { return true; }
           return isFrontViewAdapt(sprite);
        });
        return targetSprites;
    };

    //- フロントビューでもダメージポップ有効に
    const _Sprite_Battler_updateDamagePopup = Sprite_Battler.prototype.updateDamagePopup;
    Sprite_Battler.prototype.updateDamagePopup = function() {
        if (this._battler.isDamagePopupRequested()) {
            if (isFrontViewAdapt(this)) {
                this.createDamageSprite();
            }
        }
        _Sprite_Battler_updateDamagePopup.apply(this);
    };

    //- ダメージポップの位置変更(コア追加)
    const _Sprite_Battler_damageOffsetX = Sprite_Battler.prototype.damageOffsetX;
    Sprite_Battler.prototype.damageOffsetX = function() {
        let result = _Sprite_Battler_damageOffsetX.apply(this);
        const svActorOffsetXNo = !$gameSystem.isSideView() && this._actor ? 32 : 0;
        result += keke_damagePopX + svActorOffsetXNo;
        return result;
    };

    const _Sprite_Battler_damageOffsetY = Sprite_Battler.prototype.damageOffsetY;
    Sprite_Battler.prototype.damageOffsetY = function() {
        let result = _Sprite_Battler_damageOffsetY.apply(this);
        result += keke_damagePopY;
        if (isFrontViewAdapt(this)) {
            const statusWindow = SceneManager._scene._statusWindow;
            const rect = statusWindow.faceRect(0);
            result += rect.height;
        }
        return result;
    };

    //- ダメージポップのレイヤー変更(コア追加)
    if (isMz()) {
    const _Sprite_Actor_createDamageSprite = Sprite_Actor.prototype.createDamageSprite;
    Sprite_Actor.prototype.createDamageSprite = function() {
        _Sprite_Actor_createDamageSprite.apply(this);
        if (!isFrontViewAdapt(this)) { return; }
        // レイヤー変更
        if (isFrontViewAdapt(this) && !$gameTemp._fullAnimeStatusKe) {
            const sprite = this._damages[this._damages.length - 1];
            SceneManager._scene._windowLayer.addChild(sprite);
        }
    };
    };

    //- フロントビュー対応か
    function isFrontViewAdapt(sprite) {
        const statusWindow = SceneManager._scene._statusWindow;
        return !$gameSystem.isSideView() && sprite._actor && (statusWindow && statusWindow.visible) && isMz();
    };

    //- MV時のダメージポップ位置補整(コア追加)
    if (isMv()) {
    const _Sprite_Battler_setupDamagePopup = Sprite_Battler.prototype.setupDamagePopup;
    Sprite_Battler.prototype.setupDamagePopup = function() {
        const requested = this._battler.isDamagePopupRequested();
        const damages = this._damages.map(d => d);
        _Sprite_Battler_setupDamagePopup.apply(this);
        if (requested) {
            if (this._battler.isSpriteVisible()) {
                const last = damages[damages.length - 1];
                if (last && last.children.length) {
                    const cur = this._damages[this._damages.length - 1];
                    cur.x = last.x + 8;
                    cur.y = last.y - 16;
                }
            }
        }
    };
    }

})();


code:
//=============================================================================
// KillBonus.js
// ----------------------------------------------------------------------------
// (C)2016 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.4.0 2020/03/10 撃破ボーナス発生時にボーナス対象にアニメーションを再生できる機能を追加
// 1.3.0 2019/11/09 条件に指定ターン以内撃破、クリティカル撃破を追加。ボーナスに最初のドロップアイテムの確率変更追加
// 1.2.0 2019/06/11 撃破ボーナスとして任意の変数を増減させる機能を追加
// 1.1.0 2017/06/08 ボーナス取得条件としてノーダメージ、ノーデス、ノースキルおよびスイッチを追加
// 1.0.0 2016/08/07 初版
// ----------------------------------------------------------------------------
// [Blog]   : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================

/*:
 * @plugindesc 撃破ボーナスプラグイン
 * @author トリアコンタン
 *
 * @help 敵を撃破した際に何らかの報酬を得ることができます。
 * 撃破するとHPやMPを回復するステートや装備品等が作成できます。
 *
 * 特徴を有するデータベースのメモ欄に以下の通り記述してください。
 * <KB_HP:20>          # 自身のHPを20回復します。
 * <KB_HPRate:5>       # 自身のHPを5%回復します。
 * <KB_MP:20>          # 自身のMPを20回復します。
 * <KB_MPRate:5>       # 自身のMPを5%回復します。
 * <KB_TP:20>          # 自身のTPを20回復します。
 * <KB_TPRate:5>       # 自身のTPを5%回復します。
 * <KB_Gold:5>         # お金が5G増加します。
 * <KB_お金:5>         # 同上
 * <KB_State:5>        # 自身にステートID[5]を付与します。
 * <KB_ステート:5>     # 同上
 * <KB_StateAll:5>     # 味方全体にステートID[5]を付与します。
 * <KB_ステート全体:5> # 同上
 * <KB_StateEnemy:5>   # 敵全体にステートID[5]を付与します。
 * <KB_ステート敵:5>   # 同上
 * <KB_Variable:1, 20> # 変数[1]が20増加します。
 * <KB_変数:1, 20>     # 同上
 * <KB_Script:script>  # 任意のJavaScriptを実行します。
 * <KB_ドロップ率:2>    # 最初のドロップアイテムのドロップ率を2倍にします。
 * <KB_DropRate:2>     # 同上
 *
 * 撃破ボーナス条件をひとつだけ付けることができます。
 * <KB_条件:ノーダメージ> # ダメージを受けずに撃破で報酬
 * <KB_Cond:NoDamage>     # 同上
 * <KB_条件:ノースキル>   # スキルを使わずに撃破で報酬
 * <KB_Cond:NoSkill>      # 同上
 * <KB_条件:ノーデス>     # 戦闘不能者を出さずに撃破で報酬
 * <KB_Cond:NoDeath>      # 同上
 * <KB_条件:1>            # スイッチ[1]がONのときに撃破で報酬
 * <KB_Cond:1>            # 同上
 * <KB_条件:turn[1]>     # [1]ターン以内に撃破で報酬
 * <KB_Cond:turn[1]>     # 同上
 * <KB_条件:クリティカル> # クリティカル撃破で報酬
 * <KB_Cond:Critical>    # 同上
 *
 * 撃破ボーナスの発動時にアニメーションを再生できます。
 * 対象は撃破した側のバトラーですが、ステートの場合は付与された対象になります。
 * <KB_アニメーション:1>   # ボーナス発生時アニメーション[1]を再生
 * <KB_Animation:1>       # 同上
 * <KB_アニメ遅延:64>      # ボーナス発生時アニメーションの遅延を64フレームに設定
 * <KB_AnimationDelay:64> # 同上
 *
 * このプラグインにはプラグインコマンドはありません。
 *
 * 利用規約：
 *  作者に無断で改変、再配布が可能で、利用形態（商用、18禁利用等）
 *  についても制限はありません。
 *  このプラグインはもうあなたのものです。
 */

(function() {
    'use strict';
    var metaTagPrefix = 'KB_';

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

    var getArgString = function(arg, upperFlg) {
        arg = convertEscapeCharacters(arg);
        return upperFlg ? arg.toUpperCase() : arg;
    };

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

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

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

    //=============================================================================
    // BattleManager
    //  スキルやダメージの状況を保持します。
    //=============================================================================
    var _BattleManager_setup = BattleManager.setup;
    BattleManager.setup = function(troopId, canEscape, canLose) {
        _BattleManager_setup.apply(this, arguments);
        $gameParty.members().forEach(function(member) {
            member.initKillBonusCondition();
        });
    };

    //=============================================================================
    // Game_BattlerBase
    //  スキルやダメージの状況を保持します。
    //=============================================================================
    Game_BattlerBase._condNoDamages = ['NoDamage', 'ノーダメージ'];
    Game_BattlerBase._condNoSkill   = ['NoSkill', 'ノースキル'];
    Game_BattlerBase._condNoDeath   = ['NoDeath', 'ノーデス'];
    Game_BattlerBase._condCritial   = ['Critical', 'クリティカル'];

    Game_BattlerBase.prototype.initKillBonusCondition = function() {
        this._noSkill  = true;
        this._noDamage = true;
        this._noDeath  = true;
    };

    Game_BattlerBase.prototype.breakNoSkill = function() {
        this._noSkill  = false;
    };

    Game_BattlerBase.prototype.breakNoDamage = function() {
        this._noDamage  = false;
    };

    Game_BattlerBase.prototype.breakNoDeath = function() {
        this._noDeath  = false;
    };

    Game_BattlerBase.prototype.canAcceptKillBonus = function(critical) {
        return this.traitObjects().every(function(data) {
            return this.checkDataForKillBonus(data, critical);
        }.bind(this));
    };

    Game_BattlerBase.prototype.checkDataForKillBonus = function(data, critical) {
        var condition = getMetaValues(data, ['Cond', '条件']);
        if (!condition) return true;
        if (Game_BattlerBase._condNoDamages.contains(condition) && !this._noDamage) {
            return false;
        }
        if (Game_BattlerBase._condNoSkill.contains(condition) && !this._noSkill) {
            return false;
        }
        if (Game_BattlerBase._condNoDeath.contains(condition) && !this._noDeath) {
            return false;
        }
        if (Game_BattlerBase._condCritial.contains(condition) && !critical) {
            return false;
        }
        var regResult = /turn\[(\d+)]/gi.exec(condition);
        if (regResult && $gameTroop.turnCount() > parseInt(regResult[1])) {
            return false;
        }
        var switchId = parseInt(convertEscapeCharacters(condition));
        if (switchId > 0 && !$gameSwitches.value(switchId)) {
            return false;
        }
        return true;
    };

    var _Game_BattlerBase_die = Game_BattlerBase.prototype.die;
    Game_BattlerBase.prototype.die = function() {
        _Game_BattlerBase_die.apply(this, arguments);
        this.breakNoDeath();
    };

    //=============================================================================
    // Game_Battler
    //  ダメージ時にノーダメージフラグを解除します。
    //=============================================================================
    var _Game_Battler_performDamage = Game_Battler.prototype.performDamage;
    Game_Battler.prototype.performDamage = function() {
        _Game_Battler_performDamage.apply(this, arguments);
        this.breakNoDamage();
    };

    //=============================================================================
    // Game_Action
    //  撃破ボーナスを適用します。
    //=============================================================================
    var _Game_Action_testApply = Game_Action.prototype.testApply;
    Game_Action.prototype.testApply = function(target) {
        this._criticalForKillBonus = false;
        var result = _Game_Action_testApply.apply(this, arguments);
        if (result && !this.isAttack() && !this.isGuard()) {
            this.subject().breakNoSkill();
        }
        return result;
    };

    var _Game_Action_applyCritical = Game_Action.prototype.applyCritical;
    Game_Action.prototype.applyCritical = function(damage) {
        this._criticalForKillBonus = true;
        return _Game_Action_applyCritical.apply(this, arguments);
    };

    var _Game_Action_executeHpDamage      = Game_Action.prototype.executeHpDamage;
    Game_Action.prototype.executeHpDamage = function(target, value) {
        _Game_Action_executeHpDamage.apply(this, arguments);
        if (target.hp === 0) {
            this.executeKillBonus(target);
        }
    };

    Game_Action.prototype.executeKillBonus = function(target) {
        var subject = this.subject();
        if (!subject || !subject.canAcceptKillBonus(this._criticalForKillBonus)) return;
        this._gainHp = 0;
        this._gainMp = 0;
        this._gainTp = 0;
        this._bonusTarget = subject;
        subject.traitObjects().forEach(function(data) {
            this.executeKillBonusRecoverHp(data, subject);
            this.executeKillBonusRecoverMp(data, subject);
            this.executeKillBonusRecoverTp(data, subject);
            this.executeKillBonusGold(data, subject);
            this.executeKillBonusState(data, subject);
            this.executeKillBonusStateAll(data, subject);
            this.executeKillBonusStateEnemy(data, subject);
            this.executeKillBonusVariable(data, subject);
            this.executeKillBonusScript(data, subject);
            this.executeKillBonusDropRate(data, target);
        }.bind(this));
        this._bonusTarget = null;
        if (this._gainHp !== 0) subject.gainHp(this._gainHp);
        if (this._gainMp !== 0) subject.gainMp(this._gainMp);
        if (this._gainTp !== 0) subject.gainTp(this._gainTp);
    };

    Game_Action.prototype.findMetaForKillBonus = function(data, name) {
        var value = getMetaValues(data, name);
        if (!!value) {
            console.log(name);
            this.executeKillBonusAnimation(data);
        }
        return value;
    };

    Game_Action.prototype.executeKillBonusAnimation = function(data) {
        var id = parseInt(getMetaValues(data, ['アニメーション', 'Animation']));
        if (id > 0) {
            var delay = parseInt(getMetaValues(data, ['アニメ遅延', 'AnimationDelay']));
            if (this._bonusTarget instanceof Game_Unit) {
                this._bonusTarget.members().forEach(function(target) {
                    target.startAnimation(id, false, delay || 0);
                });
            } else {
                this._bonusTarget.startAnimation(id, false, delay || 0);
            }
        }
    };

    Game_Action.prototype.executeKillBonusRecoverHp = function(data, subject) {
        var value = this.findMetaForKillBonus(data, 'HP');
        if (value) this._gainHp += getArgNumberWithEval(value);
        var value2 = this.findMetaForKillBonus(data, 'HPRate');
        if (value2) this._gainHp += Math.floor(subject.mhp * getArgNumberWithEval(value2) / 100);
    };

    Game_Action.prototype.executeKillBonusRecoverMp = function(data, subject) {
        var value = this.findMetaForKillBonus(data, 'MP');
        if (value) this._gainMp += getArgNumberWithEval(value);
        var value2 = this.findMetaForKillBonus(data, 'MPRate');
        if (value2) this._gainMp += Math.floor(subject.mmp * getArgNumberWithEval(value2) / 100);
    };

    Game_Action.prototype.executeKillBonusRecoverTp = function(data, subject) {
        var value = this.findMetaForKillBonus(data, 'TP');
        if (value) this._gainTp += getArgNumberWithEval(value);
        var value2 = this.findMetaForKillBonus(data, 'TPRate');
        if (value2) this._gainTp += Math.floor(subject.maxTp() * getArgNumberWithEval(value2) / 100);
    };

    Game_Action.prototype.executeKillBonusGold = function(data, subject) {
        var value = this.findMetaForKillBonus(data, ['Gold', 'お金']);
        if (value) {
            $gameParty.gainGold(getArgNumberWithEval(value));
        }
    };

    Game_Action.prototype.executeKillBonusVariable = function(data, subject) {
        var value = this.findMetaForKillBonus(data, ['Variable', '変数']);
        if (value) {
            var args = getArgString(value).split(',');
            var id = parseInt(args[0]);
            $gameVariables.setValue(id, $gameVariables.value(id) + parseInt(args[1]) || 0);
        }
    };

    Game_Action.prototype.executeKillBonusState = function(data, subject) {
        var value = this.findMetaForKillBonus(data, ['State', 'ステート']);
        if (value) {
            subject.addState(getArgNumberWithEval(value));
        }
    };

    Game_Action.prototype.executeKillBonusStateAll = function(data, subject) {
        this._bonusTarget = subject.friendsUnit();
        var value = this.findMetaForKillBonus(data, ['StateAll', 'ステート全体']);
        if (value) {
            subject.friendsUnit().members().forEach(function(member) {
                member.addState(getArgNumberWithEval(value));
            });
        }
        this._bonusTarget = subject;
    };

    Game_Action.prototype.executeKillBonusStateEnemy = function(data, subject) {
        this._bonusTarget = subject.opponentsUnit();
        var value = this.findMetaForKillBonus(data, ['StateEnemy', 'ステート敵']);
        if (value) {
            subject.opponentsUnit().members().forEach(function(member) {
                member.addState(getArgNumberWithEval(value));
            });
        }
        this._bonusTarget = subject;
    };

    Game_Action.prototype.executeKillBonusScript = function(data, subject) {
        var value = this.findMetaForKillBonus(data, ['Script', 'スクリプト']);
        if (value) {
            try {
                eval(getArgString(value));
            } catch (e) {
                console.log(e.stack);
            }
        }
    };

    Game_Action.prototype.executeKillBonusDropRate = function(data, target) {
        var value = this.findMetaForKillBonus(data, ['DropRate', 'ドロップ率']);
        if (value) {
            target.setCustomDropRate(getArgNumberWithEval(value));
        }
    };

    /**
     * Game_Enemy
     * ドロップ率変更を実装します。
     */
    Game_Enemy.prototype.setCustomDropRate = function(value) {
        this._customDropRate = value;
    };

    var _Game_Enemy_makeDropItems = Game_Enemy.prototype.makeDropItems;
    Game_Enemy.prototype.makeDropItems = function() {
        this._firstDrop = true;
        return _Game_Enemy_makeDropItems.apply(this, arguments);
    };

    var _Game_Enemy_dropItemRate = Game_Enemy.prototype.dropItemRate;
    Game_Enemy.prototype.dropItemRate = function() {
        var result = _Game_Enemy_dropItemRate.apply(this, arguments);
        if (this._firstDrop && this._customDropRate !== undefined) {
            result *= this._customDropRate;
            this._customDropRate = undefined;
        }
        this._firstDrop = false;
        return result;
    };
})();

repo_name: onms/sister

license: unknown


code:
//=============================================================================
// RPGツクールMV - LL_InfoPopupWIndowMV.js v1.1.1
//-----------------------------------------------------------------------------
// ルルの教会 (Lulu's Church)
// https://nine-yusha.com/
//
// URL below for license details.
// https://nine-yusha.com/plugin/
//=============================================================================

/*:
 * @target MV
 * @plugindesc ポップアップでインフォメッセージを表示します。
 * @author ルルの教会
 * @url https://nine-yusha.com/plugin-infowindow/
 *
 * @help LL_InfoPopupWIndowMV.js
 *
 * ポップアップでインフォメッセージを表示します。
 * アイテム入手メッセージや、各種イベントメッセージなどに使えます。
 * ウィンドウを表示するにはプラグインコマンドを実行してください。
 *
 * プラグインコマンド:
 *   LL_InfoPopupWIndowMV showWindow [表示内容] [表示時間] [X座標] [Y座標] [背景]
 *     表示内容: 各種制御文字が使用可能、複数行表示は不可。
 *     表示時間: ウィンドウの表示時間 (1/60秒、-1を入力すると継続表示)
 *     X・Y座標: autoと入力すると中央に自動で表示。
 *     背景:     0=ウィンドウ、1=暗くする、2=透明
 *
 *   LL_InfoPopupWIndowMV hideWindow
 *     表示中のインフォメッセージを消去します。
 *
 *   【例】
 *   LL_InfoPopupWIndowMV showWindow ここにメッセージ内容を入力 180 0 60 0
 *   LL_InfoPopupWIndowMV showWindow ここにメッセージ内容を入力 180 auto auto 0
 *
 * 利用規約:
 *   ・著作権表記は必要ございません。
 *   ・利用するにあたり報告の必要は特にございません。
 *   ・商用・非商用問いません。
 *   ・R18作品にも使用制限はありません。
 *   ・ゲームに合わせて自由に改変していただいて問題ございません。
 *   ・プラグイン素材としての再配布（改変後含む）は禁止させていただきます。
 *
 * 作者: ルルの教会
 * 作成日: 2022/3/6
 */

(function() {
    "use strict";
    var pluginName = "LL_InfoPopupWIndowMV";
    var parameters = PluginManager.parameters(pluginName);

    //-----------------------------------------------------------------------------
	// PluginCommand (for MV)
    //

    var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function(command, args) {
        _Game_Interpreter_pluginCommand.call(this, command, args);
        if (command === pluginName) {
            switch (args[0]) {
				case "showWindow":
                    var x = args[3] === "auto" ? "auto" : Number(args[3] || 0);
                    var y = args[4] === "auto" ? "auto" : Number(args[4] || 60);

                    exInfoWindowText = String(args[1] || "");
                    exInfoWindowShowCount = Number(args[2] || 180);
                    exInfoWindowPosition = {"x": x, "y": y};
                    exInfoWindowSe = {"name": "", "volume": 90, "pitch": 100, "pan": 0};
                    exInfoWindowBackground = Number(args[5] || 0);
                    exInfoWindowShow = true;
                    break;
                case "hideWindow":
                    exInfoWindowHide = true;
                    break;
            }
        }
	};

    // ウィンドウの表示状態保持用
    var exInfoWindowText = "";
    var exInfoWindowShowCount = 180;
    var exInfoWindowPosition = {};
    var exInfoWindowSe = {};
    var exInfoWindowBackground = 0;
    var exInfoWindowShow = false;
    let exInfoWindowHide = false;

    //-----------------------------------------------------------------------------
    // Scene_Map
    //

    var _Scene_Map_stop = Scene_Map.prototype.stop;
    Scene_Map.prototype.stop = function() {
        this._exInfoWindow.close();
        _Scene_Map_stop.apply(this, arguments);
    };

    var _Scene_Map_terminate = Scene_Map.prototype.terminate;
    Scene_Map.prototype.terminate = function() {
        _Scene_Map_terminate.apply(this, arguments);
        if (!SceneManager.isNextScene(Scene_Battle)) {
            this._exInfoWindow.hide();
        }
    };

    var _Scene_Map_createAllWindows = Scene_Map.prototype.createAllWindows;
    Scene_Map.prototype.createAllWindows = function() {
        _Scene_Map_createAllWindows.apply(this, arguments);
        this.createExInfoWindow();
    };

    Scene_Map.prototype.createExInfoWindow = function() {
        this._exInfoWindow = new Window_ExInfoWindow();
        this.addWindow(this._exInfoWindow);
    };

    var _Scene_Map_callMenu = Scene_Map.prototype.callMenu;
    Scene_Map.prototype.callMenu = function() {
        _Scene_Map_callMenu.apply(this, arguments);
        this._exInfoWindow.hide();
    };

    //-----------------------------------------------------------------------------
    // Scene_Battle
    //

    var _Scene_Battle_stop = Scene_Battle.prototype.stop;
    Scene_Battle.prototype.stop = function() {
        this._exInfoWindow.close();
        _Scene_Battle_stop.apply(this, arguments);
    };

    var _Scene_Battle_terminate = Scene_Battle.prototype.terminate;
    Scene_Battle.prototype.terminate = function() {
        _Scene_Battle_terminate.apply(this, arguments);
        this._exInfoWindow.hide();
    };

    var _Scene_Battle_createAllWindows = Scene_Battle.prototype.createAllWindows;
    Scene_Battle.prototype.createAllWindows = function() {
        _Scene_Battle_createAllWindows.apply(this, arguments);
        this.createExInfoWindow();
    };

    Scene_Battle.prototype.createExInfoWindow = function() {
        this._exInfoWindow = new Window_ExInfoWindow();
        this.addWindow(this._exInfoWindow);
    };

    //-----------------------------------------------------------------------------
    // Window_ExInfoWindow
    //
    // インフォメッセージを表示するウィンドウです。

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

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

    Window_ExInfoWindow.prototype.initialize = function() {
        Window_Base.prototype.initialize.call(this, new Rectangle());
        this.openness = 0;
        this._showCount = 0;
    };

    Window_ExInfoWindow.prototype.start = function() {
        this._showCount = exInfoWindowShowCount;
        this.playSe();
        this.updatePlacement();
        this.updateBackground();
        this.createContents();
        this.refresh();
    };

    Window_ExInfoWindow.prototype.playSe = function() {
        if (exInfoWindowSe.name) AudioManager.playSe(exInfoWindowSe);
    };

    Window_ExInfoWindow.prototype.update = function() {
        Window_Base.prototype.update.call(this);
        // ウィンドウ表示判定
        if (exInfoWindowShow) {
            this.start();
            exInfoWindowShow = false;
        }
        // ウィンドウ消去判定
        if (exInfoWindowHide) {
            this.close();
            exInfoWindowHide = false;
        }
        if (this._showCount !== 0) {
            this.updateFadeIn();
            if (this._showCount > 0) {
                this._showCount--;
            }
        } else {
            this.updateFadeOut();
        }
    };

    Window_ExInfoWindow.prototype.updateFadeIn = function() {
        this.openness += 32;
    };

    Window_ExInfoWindow.prototype.updateFadeOut = function() {
        this.openness -= 32;
    };

    Window_ExInfoWindow.prototype.close = function() {
        this._showCount = 0;
    };

    Window_ExInfoWindow.prototype.updatePlacement = function() {
        this.width = this.windowWidth();
        this.height = this.windowHeight();

        if (exInfoWindowPosition.x === "auto") {
            this.x = (Graphics.boxWidth - this.windowWidth()) / 2;
        } else {
            this.x = exInfoWindowPosition.x;
        }
        if (exInfoWindowPosition.y === "auto") {
            this.y = (Graphics.boxHeight - this.windowHeight()) / 2;
        } else {
            this.y = exInfoWindowPosition.y;
        }
    };

    Window_ExInfoWindow.prototype.updateBackground = function() {
        this.setBackgroundType(exInfoWindowBackground);
    };

    Window_ExInfoWindow.prototype.windowWidth = function() {
        if (exInfoWindowText) {
            var textWidth = this.textWidthEx(exInfoWindowText);
            var padding = this.padding;
            var width = Math.ceil(textWidth) + padding * 2;
            return Math.min(width, Graphics.boxWidth);
        } else {
            return 0;
        }
    };

    Window_ExInfoWindow.prototype.windowHeight = function() {
        return this.fittingHeight(1);
    };

    Window_ExInfoWindow.prototype.refresh = function() {
        this.contents.clear();
        this.drawTextEx(exInfoWindowText, 0, 0, this.innerWidth);
    };

    // for MV
    Window_ExInfoWindow.prototype.textWidthEx = function(text) {
        return this.drawTextEx(text, 0, this.contents.height);
    };
})();


code:
//=============================================================================
// RPGツクールMV - LL_MenuScreenBaseMV.js v1.1.0
//-----------------------------------------------------------------------------
// ルルの教会 (Lulu's Church)
// https://nine-yusha.com/
//
// URL below for license details.
// https://nine-yusha.com/plugin/
//=============================================================================

/*:
 * @target MV
 * @plugindesc メニュー画面立ち絵設定の共通ベースプラグインです。
 * @author ルルの教会
 * @url https://nine-yusha.com/plugin-menuscreen/
 *
 * @help LL_MenuScreenBaseMV.js
 *
 * メニュー画面立ち絵設定の共通ベースプラグインです。
 * このプラグインでアクター毎の立ち絵リストを定義します。
 *
 * 下記のようにステート、スイッチ、変数条件で表示する立ち絵を複数定義できます。
 *   ・スイッチ1がONかつ毒状態の立ち絵
 *   ・変数1が10以上かつ毒状態の立ち絵
 *   ・スイッチ1がONの時の立ち絵
 *   ・毒状態の立ち絵
 *   ・スイッチ・ステート・変数条件なしの通常立ち絵 (最低限必要)
 *
 * 残りHP％で立ち絵を切り替える:
 *   まず「残りHP％」を「100」に設定した立ち絵リストを作成します。
 *   上記をコピーして「残りHP％」を「50」に変更し、立ち絵リストを複製します。
 *   これでHPが半分以下になった場合、「50」に設定した立ち絵が呼ばれます。
 *   残りHP％毎に、複数立ち絵を定義することも可能です。
 *
 * 画像ファイルの表示優先順:
 *   1. ステートID、スイッチID、変数条件全てに一致するもの
 *   2. ステートID、スイッチID両方に一致するもの
 *   3. ステートID、変数条件両方に一致するもの
 *   4. ステートIDのみ一致するもの
 *   5. スイッチID、変数条件両方に一致するもの
 *   6. スイッチIDのみ一致するもの
 *   7. 変数条件のみ一致するもの
 *   8. 条件なし (ステートID、スイッチID、変数条件全て設定なし)
 *   (上記の中で、残りHP％が最も低いものが優先して表示されます)
 *
 * 戦闘中立ち絵プラグイン連携:
 *   LL_StandingPictureBattleMV が導入されている場合は、
 *   戦闘中の立ち絵リストとそのまま連携させることも可能です。
 *
 * プラグインコマンドはありません。
 *
 * 利用規約:
 *   ・著作権表記は必要ございません。
 *   ・利用するにあたり報告の必要は特にございません。
 *   ・商用・非商用問いません。
 *   ・R18作品にも使用制限はありません。
 *   ・ゲームに合わせて自由に改変していただいて問題ございません。
 *   ・プラグイン素材としての再配布（改変後含む）は禁止させていただきます。
 *
 * 作者: ルルの教会
 * 作成日: 2022/3/7
 *
 * @param menuPictures
 * @text 立ち絵リスト
 * @desc メニュー画面に表示する立ち絵を定義します。
 * 特定ステート時、スイッチON時の立ち絵を複数定義できます。
 * @default []
 * @type struct<menuPictures>[]
 *
 * @param onSpbPlugin
 * @text 戦闘中立ち絵プラグイン連携
 * @desc ※この項目は使用しません
 *
 * @param onSpbPluginEnable
 * @text 立ち絵リストを連携
 * @desc LL_StandingPictureBattle の立ち絵リストと連携させます。
 * ONにするとこのプラグインの立ち絵リスト設定は無視されます。
 * @default false
 * @type boolean
 * @parent onSpbPlugin
 */

/*~struct~menuPictures:
 *
 * @param actorId
 * @text アクターID
 * @desc アクターIDです。立ち絵を定義するアクターを選択してください。
 * @type actor
 *
 * @param stateId
 * @text ステートID
 * @desc 特定ステートで立ち絵を変更したい場合に使用します。
 * 通常時の立ち絵は空白(なし)で設定ください。
 * @type state
 *
 * @param switchId
 * @text スイッチID
 * @desc スイッチONで立ち絵を変更したい場合に使用します。
 * 通常時の立ち絵は空白(なし)で設定ください。
 * @type switch
 *
 * @param variableCase
 * @text 変数条件
 * @desc 変数条件で立ち絵を変更したい場合に使用します。
 * @default
 * @type struct<variableCase>
 *
 * @param hpPercentage
 * @text 残りHP％
 * @desc 残りHP％で立ち絵を変更したい場合に使用します。
 * 通常時の立ち絵は100％で設定してください。
 * @default 100
 * @min 0
 * @max 100
 * @type number
 *
 * @param imageName
 * @text 画像ファイル名
 * @desc 立ち絵として表示する画像ファイルを選択してください。
 * @dir img/pictures
 * @type file
 * @require 1
 *
 * @param x
 * @text X座標
 * @desc 立ち絵の表示位置(X)の調整値です。
 * ＋で右へ、－で左へ調整します。 (初期値: 0)
 * @default 0
 * @min -9999
 * @max 9999
 * @type number
 *
 * @param y
 * @text Y座標
 * @desc 立ち絵の表示位置(Y)の調整値です。
 * ＋で下へ、－で上へ調整します。 (初期値: 0)
 * @default 0
 * @min -9999
 * @max 9999
 * @type number
 *
 * @param scaleX
 * @text X拡大率
 * @desc 立ち絵の拡大率(X)です。
 * @default 100
 * @min -2000
 * @max 2000
 * @type number
 *
 * @param scaleY
 * @text Y拡大率
 * @desc 立ち絵の拡大率(Y)です。
 * @default 100
 * @min -2000
 * @max 2000
 * @type number
 */

/*~struct~variableCase:
 *
 * @param id
 * @text 変数ID
 * @desc 条件に使用する変数IDです。
 * @type variable
 *
 * @param type
 * @text 変数条件
 * @desc 変数IDとの比較条件です。
 * @default equal
 * @type select
 * @option 一致する
 * @value equal
 * @option 以上
 * @value higher
 * @option 以下
 * @value lower
 *
 * @param value
 * @text 変数比較数値
 * @desc 変数IDと比較する数値です。
 * @default 0
 * @min -99999999
 * @max 99999999
 * @type number
 */

(function() {
	"use strict";
	var pluginName = "LL_MenuScreenBaseMV";

	var parameters = PluginManager.parameters(pluginName);
	var paramJsonParse = function(key, value) {
		try {
			return JSON.parse(value);
		} catch(e) {
			return value;
		}
	};

	var menuPictures = String(parameters["menuPictures"] || "[]");
	var onSpbPluginEnable = eval(parameters["onSpbPluginEnable"] || "true");
	var menuPictureLists = JSON.parse(JSON.stringify(menuPictures, paramJsonParse));

	//-----------------------------------------------------------------------------
	// 戦闘中立ち絵プラグインの立ち絵リストを取得
	// On LL_StandingPictureBattle Plugin
	//-----------------------------------------------------------------------------
	var spbPluginName = "LL_StandingPictureBattleMV";
	var spbParameters = PluginManager.parameters(spbPluginName);
	var spbCommandPictures = String(spbParameters["sbCommandPictures"] || "[]");
	var spbCommandPictureLists = JSON.parse(JSON.stringify(spbCommandPictures, paramJsonParse));

	//-----------------------------------------------------------------------------
	// Ex Menu Screen Base Class
	//
	// メニュー画面立ち絵設定の独自クラスを追加定義します。

	class ExMenuScreenBase {

		//-----------------------------------------------------------------------------
		// 画像ファイル名を取得
		//-----------------------------------------------------------------------------
		static getImageName (actorId) {
			// 立ち絵リストを取得
			var pictureLists = this.getPictureLists();
			if (!pictureLists) return;

			// アクターのステート情報を取得
			var actorStates = [];
			if (actorId) actorStates = $gameActors.actor(actorId)._states;
			var specificPicture = null;

			// アクターIDが一致する立ち絵を検索
			pictureLists = pictureLists.filter(function(item) {
				if (Number(item.actorId) == actorId) {
					return true;
				}
			});

			// ステートにかかっているか？
			if (actorStates.length) {
				// ステートID・スイッチID・変数IDが有効な立ち絵リストを検索
				specificPicture = pictureLists.filter(function(item) {
					if (item.variableCase) {
						if (
							actorStates.indexOf(Number(item.stateId)) !== -1 &&
							$gameSwitches.value(Number(item.switchId)) &&
							(
								String(item.variableCase.type) == "equal" && $gameVariables.value(Number(item.variableCase.id)) == Number(item.variableCase.value) ||
								String(item.variableCase.type) == "higher" && $gameVariables.value(Number(item.variableCase.id)) >= Number(item.variableCase.value) ||
								String(item.variableCase.type) == "lower" && $gameVariables.value(Number(item.variableCase.id)) <= Number(item.variableCase.value)
							)
						) {
							return true;
						}
					}
				});
				if (specificPicture.length) return this.checkHpPercentage(actorId, specificPicture);
				// ステートID・スイッチIDが有効な立ち絵リストを検索
				specificPicture = pictureLists.filter(function(item) {
					if (actorStates.indexOf(Number(item.stateId)) !== -1 && $gameSwitches.value(Number(item.switchId)) && !item.variableCase) {
						return true;
					}
				});
				if (specificPicture.length) return this.checkHpPercentage(actorId, specificPicture);
				// ステートID・変数IDが有効な立ち絵リストを検索
				specificPicture = pictureLists.filter(function(item) {
					if (item.variableCase) {
						if (
							actorStates.indexOf(Number(item.stateId)) !== -1 &&
							(Number(item.switchId) === 0 || !item.switchId) &&
							(
								String(item.variableCase.type) == "equal" && $gameVariables.value(Number(item.variableCase.id)) == Number(item.variableCase.value) ||
								String(item.variableCase.type) == "higher" && $gameVariables.value(Number(item.variableCase.id)) >= Number(item.variableCase.value) ||
								String(item.variableCase.type) == "lower" && $gameVariables.value(Number(item.variableCase.id)) <= Number(item.variableCase.value)
							)
						) {
							return true;
						}
					}
				});
				if (specificPicture.length) return this.checkHpPercentage(actorId, specificPicture);
				// ステートIDが有効な立ち絵リストを検索
				specificPicture = pictureLists.filter(function(item) {
					if (actorStates.indexOf(Number(item.stateId)) !== -1 && (Number(item.switchId) === 0 || !item.switchId) && !item.variableCase) {
						return true;
					}
				});
				if (specificPicture.length) return this.checkHpPercentage(actorId, specificPicture);
			}

			// スイッチID・変数IDが有効な立ち絵リストを検索
			specificPicture = pictureLists.filter(function(item) {
				if (item.variableCase) {
					if (
						(Number(item.stateId) === 0 || !item.stateId) &&
						$gameSwitches.value(Number(item.switchId)) &&
						(
							String(item.variableCase.type) == "equal" && $gameVariables.value(Number(item.variableCase.id)) == Number(item.variableCase.value) ||
							String(item.variableCase.type) == "higher" && $gameVariables.value(Number(item.variableCase.id)) >= Number(item.variableCase.value) ||
							String(item.variableCase.type) == "lower" && $gameVariables.value(Number(item.variableCase.id)) <= Number(item.variableCase.value)
						)
					) {
						return true;
					}
				}
			});
			if (specificPicture.length) return this.checkHpPercentage(actorId, specificPicture);
			// スイッチIDが有効な立ち絵リストを検索
			specificPicture = pictureLists.filter(function(item) {
				if ((Number(item.stateId) === 0 || !item.stateId) && $gameSwitches.value(Number(item.switchId)) && !item.variableCase) {
					return true;
				}
			});
			if (specificPicture.length) return this.checkHpPercentage(actorId, specificPicture);
			// 変数IDが有効な立ち絵リストを検索
			specificPicture = pictureLists.filter(function(item) {
				if (item.variableCase) {
					if (
						(Number(item.stateId) === 0 || !item.stateId) &&
						(Number(item.switchId) === 0 || !item.switchId) &&
						(
							String(item.variableCase.type) == "equal" && $gameVariables.value(Number(item.variableCase.id)) == Number(item.variableCase.value) ||
							String(item.variableCase.type) == "higher" && $gameVariables.value(Number(item.variableCase.id)) >= Number(item.variableCase.value) ||
							String(item.variableCase.type) == "lower" && $gameVariables.value(Number(item.variableCase.id)) <= Number(item.variableCase.value)
						)
					) {
						return true;
					}
				}
			});
			if (specificPicture.length) return this.checkHpPercentage(actorId, specificPicture);

			// 上記で見つからなかった場合、通常の立ち絵を検索
			var normalPicture = pictureLists.filter(function(item) {
				if ((Number(item.stateId) === 0 || !item.stateId) && (Number(item.switchId) === 0 || !item.switchId) && !item.variableCase) return true;
			});
			if (normalPicture.length) return this.checkHpPercentage(actorId, normalPicture);
		}

		static checkHpPercentage (actorId, pictureLists) {
			// アクターの残HP％を取得
			var hpRate = this.getHpRate(actorId);
			// 最もHP%が低い立ち絵を適用する
			var minHpRate = 100;
			var result = null;
			pictureLists.forEach(function(item) {
				if (hpRate <= Number(item.hpPercentage) && minHpRate >= Number(item.hpPercentage)) {
					result = item;
					minHpRate = Number(item.hpPercentage);
				} else if (!item.hpPercentage && minHpRate >= 100) {
					// プラグインパラメータが更新されていない場合、便宜的に100として扱う
					result = item;
					minHpRate = Number(item.hpPercentage);
				}
			});
			return result;
		}

		static getPictureLists () {
			return onSpbPluginEnable ? spbCommandPictureLists : menuPictureLists;
		}

		static onSpbPluginEnable () {
			return onSpbPluginEnable;
		}

		// アクターのHPレートを取得
		static getHpRate (actorId) {
			if (!$gameActors.actor(actorId)) return 0;
			return $gameActors.actor(actorId).mhp > 0 ? $gameActors.actor(actorId).hp / $gameActors.actor(actorId).mhp * 100 : 0;
		}
	}

	window.ExMenuScreenBase = ExMenuScreenBase;
})();


code:
//=============================================================================
// RPGツクールMV - LL_MenuScreenCustomMV.js v1.4.4
//-----------------------------------------------------------------------------
// ルルの教会 (Lulu's Church)
// https://nine-yusha.com/
//
// URL below for license details.
// https://nine-yusha.com/plugin/
//=============================================================================

/*:
 * @target MV
 * @plugindesc メニュー画面レイアウトをカスタマイズします。
 * @author ルルの教会
 * @url https://nine-yusha.com/plugin-menuscreencustom/
 * @base LL_MenuScreenBase
 * @orderAfter LL_MenuScreenBase
 *
 * @help LL_MenuScreenCustom.js
 *
 * メニュー画面レイアウトをカスタマイズします。
 * 顔グラフィックの代わりに立ち絵を表示することもできます。
 * ※表示する立ち絵リストは「LL_MenuScreenBase」で設定してください。
 *
 * 立ち絵が上手く表示されない場合:
 *   何も表示されない場合は、X・Y座標始点のマイナス値を大きくしてみるか、
 *   拡大率を小さくしてみてください。
 *   顔グラフィックが表示されている時は、立ち絵リストが紐づけできていません。
 *   立ち絵リストが正しく設定されているか確認してみてください。
 *
 * ヘルプウィンドウ:
 *   ヘルプウィンドウの左上と右上、左下と右下に任意の情報を表示できます。
 *   表示する内容（値）はスクリプトで記述してください。
 *
 * プラグインコマンドはありません。
 *
 * 利用規約:
 *   ・著作権表記は必要ございません。
 *   ・利用するにあたり報告の必要は特にございません。
 *   ・商用・非商用問いません。
 *   ・R18作品にも使用制限はありません。
 *   ・ゲームに合わせて自由に改変していただいて問題ございません。
 *   ・プラグイン素材としての再配布（改変後含む）は禁止させていただきます。
 *
 * 作者: ルルの教会
 * 作成日: 2022/6/7
 *
 * @param menuSettings
 * @text メニュー画面の設定
 * @desc ※この項目は使用しません
 *
 * @param numVisibleRows
 * @text アクター行数
 * @desc アクター一覧画面の行数です。 (推奨値: 1～2)
 * @default 2
 * @min 1
 * @max 10
 * @type number
 * @parent menuSettings
 *
 * @param maxCols
 * @text アクター列数
 * @desc アクター一覧画面の列数です。 (推奨値: 1～2)
 * @default 2
 * @min 1
 * @max 10
 * @type number
 * @parent menuSettings
 *
 * @param currencyWindowPosition
 * @text 所持金の表示位置
 * @desc ヘルプウィンドウの右下に独自の項目を表示するときは、
 * 「メニュー下に別ウィンドウで表示」に設定してください。
 * @default helpWindowRightBottom
 * @type select
 * @option 表示しない
 * @value hidden
 * @option ヘルプウィンドウの右下
 * @value helpWindowRightBottom
 * @option メニュー下に別ウィンドウで表示
 * @value menuCommandBottom
 * @parent menuSettings
 *
 * @param backgroundImages
 * @text 背景画像の設定
 * @desc メニュー画面の背景画像を変更します。
 * @default []
 * @type struct<backgroundImages>[]
 * @parent menuSettings
 *
 * @param layoutSettings
 * @text 表示位置の設定
 * @desc ※この項目は使用しません
 *
 * @param actorNameLH
 * @text アクター名表示位置
 * @desc アクター名を上から何行目に表示するか設定します。
 * -1にすると非表示になります。 (初期値: 0)
 * @default 0
 * @min -1
 * @max 100
 * @type number
 * @parent layoutSettings
 *
 * @param actorNameX
 * @text アクター名表示位置(X)
 * @desc アクター名の横位置を調整します。(初期値: 0)
 * プラスにすると右へ、マイナスにすると左へ移動します。
 * @default 0
 * @min -9999
 * @max 9999
 * @type number
 * @parent layoutSettings
 *
 * @param actorLevelLH
 * @text レベル表示位置
 * @desc レベルを上から何行目に表示するか設定します。
 * -1にすると非表示になります。 (初期値: 1)
 * @default 1
 * @min -1
 * @max 100
 * @type number
 * @parent layoutSettings
 *
 * @param actorLevelX
 * @text レベル表示位置(X)
 * @desc レベルの横位置を調整します。(初期値: 0)
 * プラスにすると右へ、マイナスにすると左へ移動します。
 * @default 0
 * @min -9999
 * @max 9999
 * @type number
 * @parent layoutSettings
 *
 * @param actorIconLH
 * @text ステート表示位置
 * @desc ステートアイコンを上から何行目に表示するか設定します。
 * -1にすると非表示になります。 (初期値: 2)
 * @default 2
 * @min -1
 * @max 100
 * @type number
 * @parent layoutSettings
 *
 * @param actorIconX
 * @text ステート表示位置(X)
 * @desc ステートアイコンの横位置を調整します。(初期値: 0)
 * プラスにすると右へ、マイナスにすると左へ移動します。
 * @default 0
 * @min -9999
 * @max 9999
 * @type number
 * @parent layoutSettings
 *
 * @param actorClassLH
 * @text 職業名表示位置
 * @desc 職業名を上から何行目に表示するか設定します。
 * -1にすると非表示になります。 (初期値: 3)
 * @default 3
 * @min -1
 * @max 100
 * @type number
 * @parent layoutSettings
 *
 * @param actorClassX
 * @text 職業名表示位置(X)
 * @desc 職業名の横位置を調整します。(初期値: 0)
 * プラスにすると右へ、マイナスにすると左へ移動します。
 * @default 0
 * @min -9999
 * @max 9999
 * @type number
 * @parent layoutSettings
 *
 * @param actorGaugeLH
 * @text ゲージ表示位置
 * @desc HP・MP・TPゲージを上から何行目に表示するか設定します。
 * -1にすると非表示になります。 (初期値: 4)
 * @default 4
 * @min -1
 * @max 100
 * @type number
 * @parent layoutSettings
 *
 * @param actorGaugeX
 * @text ゲージ表示位置(X)
 * @desc ゲージの横位置を調整します。(初期値: 0)
 * プラスにすると右へ、マイナスにすると左へ移動します。
 * @default 0
 * @min -9999
 * @max 9999
 * @type number
 * @parent layoutSettings
 *
 * @param lvPadding
 * @text Lvの余白調整値
 * @desc Lv表記の余白調整値です。
 * 数値を小さくすると余白が狭くなります。 (初期値: 84)
 * @default 84
 * @min 0
 * @max 2000
 * @type number
 * @parent layoutSettings
 *
 * @param gaugeWidth
 * @text ゲージの幅
 * @desc ゲージの幅(長さ)です。  (初期値: 186)
 * この設定はメニュー画面トップのみ適用されます。
 * @default 186
 * @min 0
 * @max 2000
 * @type number
 * @parent layoutSettings
 *
 * @param pictureSettings
 * @text 立ち絵表示の設定
 * @desc ※この項目は使用しません
 *
 * @param showStandingPicture
 * @text 立ち絵を表示
 * @desc 顔グラフィックの代わりに立ち絵を表示します。
 * @default true
 * @type boolean
 * @parent pictureSettings
 *
 * @param menuWindowPictureX
 * @text X座標始点
 * @desc 顔グラフィックの代わりに表示する立ち絵の表示位置(X)です。
 * @default 0
 * @min -2000
 * @max 2000
 * @type number
 * @parent pictureSettings
 *
 * @param menuWindowPictureY
 * @text Y座標始点
 * @desc 顔グラフィックの代わりに表示する立ち絵の表示位置(Y)です。
 * @default 0
 * @min -2000
 * @max 2000
 * @type number
 * @parent pictureSettings
 *
 * @param menuWindowPictureScale
 * @text 拡大率
 * @desc 立ち絵の拡大率です。 (初期値: 100)
 * @default 100
 * @min -2000
 * @max 2000
 * @type number
 * @parent pictureSettings
 *
 * @param menuHelpSettings
 * @text ヘルプウィンドウの設定
 * @desc ※この項目は使用しません
 *
 * @param menuHelpWindowEnable
 * @text ヘルプウィンドウを表示
 * @desc メニュー画面上部にヘルプウィンドウを表示します。
 * @default true
 * @type boolean
 * @parent menuHelpSettings
 *
 * @param menuHelpTexts
 * @text メニュー説明文
 * @desc メニュー説明文のリストを定義します。
 * @default ["{\"symbol\":\"アイテム\",\"helpText\":\"入手したアイテムを使用します。\"}","{\"symbol\":\"スキル\",\"helpText\":\"習得したスキルを使用します。\"}","{\"symbol\":\"装備\",\"helpText\":\"装備を変更します。\"}","{\"symbol\":\"ステータス\",\"helpText\":\"ステータスを確認します。\"}","{\"symbol\":\"並び替え\",\"helpText\":\"パーティの並び順を変更します。\"}","{\"symbol\":\"オプション\",\"helpText\":\"オプション画面を開きます。\"}","{\"symbol\":\"セーブ\",\"helpText\":\"セーブ画面を開きます。\"}","{\"symbol\":\"ゲーム終了\",\"helpText\":\"ゲームを終了します。\"}"]
 * @type struct<menuHelpTexts>[]
 * @parent menuHelpSettings
 *
 * @param leftBlockLabel
 * @text 左上の項目名
 * @desc 左上に表示する項目名です。
 * 空白にすると非表示になります。
 * @default 現在地：
 * @type string
 * @parent menuHelpSettings
 *
 * @param leftBlockValue
 * @text 左上の値
 * @desc 左上に表示する値をスクリプトで記述します。
 * @default $gameMap.displayName()
 * @type combo
 * @option $gameVariables.value(1)   // 変数ID:1の値
 * @option $gameSwitches.value(1) ? "有効" : "無効"  // スイッチID:1の状態
 * @option $gameMap.displayName()  // マップ名
 * @option $gameParty.size()  // パーティー人数
 * @option $gameParty.steps()  // 現在の歩数
 * @option $gameParty.gold()  // 所持金
 * @option $gameParty.numItems($dataItems[1])  // アイテムID:1の所持数
 * @option $gameParty.numItems($dataWeapons[1])  // 武器ID:1の所持数
 * @option $gameParty.numItems($dataArmors[1])  // 防具ID:1の所持数
 * @option $gameSystem.playtimeText()   // プレイ時間
 * @option $gameSystem.saveCount()  // セーブ回数
 * @option $gameSystem.battleCount()  // 戦闘回数
 * @parent menuHelpSettings
 *
 * @param leftBlockAlign
 * @text 左上の文字揃え
 * @desc 左上に表示する値の文字配置を選択します。
 * @default left
 * @type select
 * @option 左揃え
 * @value left
 * @option 中央揃え
 * @value center
 * @option 右揃え
 * @value right
 * @parent menuHelpSettings
 *
 * @param rightBlockLabel
 * @text 右上の項目名
 * @desc 右上に表示する項目名です。
 * 空白にすると非表示になります。
 * @default プレイ時間：
 * @type string
 * @parent menuHelpSettings
 *
 * @param rightBlockValue
 * @text 右上の値
 * @desc 右上に表示する値をスクリプトで記述します。
 * @default $gameSystem.playtimeText()
 * @type combo
 * @option $gameVariables.value(1)   // 変数ID:1の値
 * @option $gameSwitches.value(1) ? "有効" : "無効"  // スイッチID:1の状態
 * @option $gameMap.displayName()  // マップ名
 * @option $gameParty.size()  // パーティー人数
 * @option $gameParty.steps()  // 現在の歩数
 * @option $gameParty.gold()  // 所持金
 * @option $gameParty.numItems($dataItems[1])  // アイテムID:1の所持数
 * @option $gameParty.numItems($dataWeapons[1])  // 武器ID:1の所持数
 * @option $gameParty.numItems($dataArmors[1])  // 防具ID:1の所持数
 * @option $gameSystem.playtimeText()   // プレイ時間
 * @option $gameSystem.saveCount()  // セーブ回数
 * @option $gameSystem.battleCount()  // 戦闘回数
 * @parent menuHelpSettings
 *
 * @param rightBlockAlign
 * @text 右上の文字揃え
 * @desc 右上に表示する値の文字配置を選択します。
 * @default right
 * @type select
 * @option 左揃え
 * @value left
 * @option 中央揃え
 * @value center
 * @option 右揃え
 * @value right
 * @parent menuHelpSettings
 *
 * @param rightBottomBlockLabel
 * @text 右下の項目名
 * @desc 右下に表示する項目名です。
 * ※所持金の表示位置が「ヘルプウィンドウの右下」時は無効
 * @default
 * @type string
 * @parent menuHelpSettings
 *
 * @param rightBottomBlockValue
 * @text 右下の値
 * @desc 右下に表示する値をスクリプトで記述します。
 * ※所持金の表示位置が「ヘルプウィンドウの右下」時は無効
 * @default
 * @type combo
 * @option $gameVariables.value(1)   // 変数ID:1の値
 * @option $gameSwitches.value(1) ? "有効" : "無効"  // スイッチID:1の状態
 * @option $gameMap.displayName()  // マップ名
 * @option $gameParty.size()  // パーティー人数
 * @option $gameParty.steps()  // 現在の歩数
 * @option $gameParty.gold()  // 所持金
 * @option $gameParty.numItems($dataItems[1])  // アイテムID:1の所持数
 * @option $gameParty.numItems($dataWeapons[1])  // 武器ID:1の所持数
 * @option $gameParty.numItems($dataArmors[1])  // 防具ID:1の所持数
 * @option $gameSystem.playtimeText()   // プレイ時間
 * @option $gameSystem.saveCount()  // セーブ回数
 * @option $gameSystem.battleCount()  // 戦闘回数
 * @parent menuHelpSettings
 *
 * @param rightBottomBlockAlign
 * @text 右下の文字揃え
 * @desc 右下に表示する値の文字配置を選択します。
 * ※所持金の表示位置が「ヘルプウィンドウの右下」時は無効
 * @default left
 * @type select
 * @option 左揃え
 * @value left
 * @option 中央揃え
 * @value center
 * @option 右揃え
 * @value right
 * @parent menuHelpSettings
 *
 * @param leftBottomBlockLabel
 * @text 左下の項目名
 * @desc 左下に表示する項目名です。
 * ※設定するとメニュー説明文が表示されなくなります
 * @default
 * @type string
 * @parent menuHelpSettings
 *
 * @param leftBottomBlockValue
 * @text 左下の値
 * @desc 左下に表示する値をスクリプトで記述します。
 * ※設定するとメニュー説明文が表示されなくなります
 * @default
 * @type combo
 * @option $gameVariables.value(1)   // 変数ID:1の値
 * @option $gameSwitches.value(1) ? "有効" : "無効"  // スイッチID:1の状態
 * @option $gameMap.displayName()  // マップ名
 * @option $gameParty.size()  // パーティー人数
 * @option $gameParty.steps()  // 現在の歩数
 * @option $gameParty.gold()  // 所持金
 * @option $gameParty.numItems($dataItems[1])  // アイテムID:1の所持数
 * @option $gameParty.numItems($dataWeapons[1])  // 武器ID:1の所持数
 * @option $gameParty.numItems($dataArmors[1])  // 防具ID:1の所持数
 * @option $gameSystem.playtimeText()   // プレイ時間
 * @option $gameSystem.saveCount()  // セーブ回数
 * @option $gameSystem.battleCount()  // 戦闘回数
 * @parent menuHelpSettings
 *
 * @param leftBottomBlockAlign
 * @text 左下の文字揃え
 * @desc 左下に表示する値の文字配置を選択します。
 * @default left
 * @type select
 * @option 左揃え
 * @value left
 * @option 中央揃え
 * @value center
 * @option 右揃え
 * @value right
 * @parent menuHelpSettings
 */

/*~struct~menuHelpTexts:
 *
 * @param symbol
 * @text メニュー名
 * @desc メニュー名を入力します。
 * @type string
 *
 * @param helpText
 * @text メニュー説明文
 * @desc メニューの説明文を入力します。
 * @type string
 */

/*~struct~backgroundImages:
 *
 * @param sceneName
 * @text シーン名
 * @desc 背景画像を設定するシーン名です。
 * 独自で追加したシーン名を直接入力することもできます。
 * @default Scene_Menu
 * @type combo
 * @option Scene_Menu
 * @option Scene_Item
 * @option Scene_Skill
 * @option Scene_Equip
 * @option Scene_Status
 * @option Scene_Options
 * @option Scene_Save
 * @option Scene_Load
 * @option Scene_GameEnd
 *
 * @param imageName
 * @text 背景画像
 * @desc 背景画像として表示する画像を選択してください。
 * @dir img/system
 * @type file
 * @require 1
 */

(function() {
	"use strict";
	var pluginName = "LL_MenuScreenCustomMV";

	var parameters = PluginManager.parameters(pluginName);
	var numVisibleRows = Number(parameters["numVisibleRows"] || 2);
	var maxCols = Number(parameters["maxCols"] || 2);
	var currencyWindowPosition = String(parameters["currencyWindowPosition"] || "helpWindowRightBottom");
	// 表示位置の設定
	var actorNameLH = Number(parameters["actorNameLH"] || 0);
	var actorLevelLH = Number(parameters["actorLevelLH"] || 1);
	var actorIconLH = Number(parameters["actorIconLH"] || 2);
	var actorClassLH = Number(parameters["actorClassLH"] || 3);
	var actorGaugeLH = Number(parameters["actorGaugeLH"] || 4);
	var lvPadding = Number(parameters["lvPadding"] || 84);
	var gaugeWidth = Number(parameters["gaugeWidth"] || 186);
	// 表示位置の設定(X)
	var actorNameX = Number(parameters["actorNameX"] || 0);
	var actorLevelX = Number(parameters["actorLevelX"] || 0);
	var actorIconX = Number(parameters["actorIconX"] || 0);
	var actorClassX = Number(parameters["actorClassX"] || 0);
	var actorGaugeX = Number(parameters["actorGaugeX"] || 0);
	// 立ち絵表示の設定
	var showStandingPicture = eval(parameters["showStandingPicture"] || "true");
	var menuWindowPictureX = Number(parameters["menuWindowPictureX"] || 0);
	var menuWindowPictureY = Number(parameters["menuWindowPictureY"] || 0);
	var menuWindowPictureScale = Number(parameters["menuWindowPictureScale"] || 100);
	// ヘルプウィンドウの設定
	var menuHelpWindowEnable = eval(parameters["menuHelpWindowEnable"] || "true");
	var menuHelpTexts = JSON.parse(parameters["menuHelpTexts"] || "null");
	var leftBlockLabel = String(parameters["leftBlockLabel"] || "");
	var leftBlockValue = String(parameters["leftBlockValue"] || "");
	var leftBlockAlign = String(parameters["leftBlockAlign"] || "left");
	var rightBlockLabel = String(parameters["rightBlockLabel"] || "");
	var rightBlockValue = String(parameters["rightBlockValue"] || "");
	var rightBlockAlign = String(parameters["rightBlockAlign"] || "right");
	var rightBottomBlockLabel = String(parameters["rightBottomBlockLabel"] || "");
	var rightBottomBlockValue = String(parameters["rightBottomBlockValue"] || "");
	var rightBottomBlockAlign = String(parameters["rightBottomBlockAlign"] || "left");
	var leftBottomBlockLabel = String(parameters["leftBottomBlockLabel"] || "");
	var leftBottomBlockValue = String(parameters["leftBottomBlockValue"] || "");
	var leftBottomBlockAlign = String(parameters["leftBottomBlockAlign"] || "left");
	// 背景画像の設定
	var backgroundImages = JSON.parse(parameters["backgroundImages"] || "null");

	var menuHelpLists = [];
	if (menuHelpTexts) {
		menuHelpTexts.forEach(function(elm) {
			menuHelpLists[String(JSON.parse(elm).symbol)] = String(JSON.parse(elm).helpText);
		});
	}

	var backgroundImageLists = [];
	if (backgroundImages) {
		backgroundImages.forEach(function(elm) {
			backgroundImageLists.push(JSON.parse(elm));
		});
	}

	// メニュー画面ヘルプウィンドウの標準高さ (lineHeight)
	var menuHelpWindowLH = 2;

	// ヘルプウィンドウフォントサイズ
	var menuHelpWindowFontSize = 24;

	// MZのcontens.bltを再現
	Bitmap.prototype.bltMZ = function(source, sx, sy, sw, sh, dx, dy, dw, dh) {
		dw = dw || sw;
		dh = dh || sh;
		try {
			var image = source._canvas || source._image;
			this.context.globalCompositeOperation = "source-over";
			this.context.drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh);
			this._baseTexture.update();
		} catch (e) {
			//
		}
	};

	var _Scene_MenuBase_createBackground = Scene_MenuBase.prototype.createBackground;
	Scene_MenuBase.prototype.createBackground = function() {
		var sceneName = SceneManager._scene.constructor.name;
		// 背景画像を検索
		var originalBackgroundImage = backgroundImageLists.filter(function(item) {
			if (String(item.sceneName) == sceneName) return true;
		});
		if (originalBackgroundImage[0]) {
			// 独自の背景画像を表示
			this._backgroundSprite = new Sprite();
			this._backgroundSprite.bitmap = ImageManager.loadSystem(originalBackgroundImage[0].imageName);
			this.addChild(this._backgroundSprite);
			return;
		}
		_Scene_MenuBase_createBackground.apply(this, arguments);
	};

	// ヘルプウィンドウの高さを定義
	Scene_MenuBase.prototype.calcMenuHelpWindowHeight = function() {
		var lineHeight = 36;
		var height = lineHeight * 3;
		if (!leftBlockLabel && !rightBlockLabel) height = lineHeight * 2;
		if (!menuHelpWindowEnable) height = 0;
		return height;
	};

	var _Scene_Menu_create = Scene_Menu.prototype.create;
	Scene_Menu.prototype.create = function() {
		_Scene_Menu_create.apply(this, arguments);
		this.createMenuHelpWindow();
		if (menuHelpWindowEnable) {
			this._commandWindow.y = this._menuHelpWindow.height;
			this._statusWindow.y = this._menuHelpWindow.height;
			this._statusWindow.height = this._statusWindow.height - this._menuHelpWindow.height;
			this._statusWindow.refresh();
		}
		if (currencyWindowPosition != "menuCommandBottom") {
			this._goldWindow.visible = false;
		}
		this._statusWindow.reserveStandingPictures();
	};

	var _Scene_ItemBase_createActorWindow = Scene_ItemBase.prototype.createActorWindow;
	Scene_ItemBase.prototype.createActorWindow = function() {
		_Scene_ItemBase_createActorWindow.apply(this, arguments);
		if (menuHelpWindowEnable) {
			this._actorWindow.y = this.calcMenuHelpWindowHeight();
			this._actorWindow.height = this._actorWindow.height - this.calcMenuHelpWindowHeight();
			this._actorWindow.refresh();
		}
	};
	Scene_Menu.prototype.createMenuHelpWindow = function() {
		this._menuHelpWindow = new Window_MenuHelp();
		this.addWindow(this._menuHelpWindow);
	};

	var _Scene_Menu_update = Scene_Menu.prototype.update;
    Scene_Menu.prototype.update = function() {
		_Scene_Menu_update.apply(this, arguments);
		// インフォメーションウィンドウの更新
		var helpText = menuHelpLists[this._commandWindow.currentName()] ? menuHelpLists[this._commandWindow.currentName()] : "";
		this._menuHelpWindow.setText(helpText);
	};

	// Reserve Standing Picture (MV)
	Window_Base.prototype.reserveStandingPictures = function() {
		$gameParty.members().forEach(function(actor) {
			var mPicture = ExMenuScreenBase.getImageName(actor.actorId());
			if (mPicture) {
				ImageManager.reservePicture(mPicture.imageName);
			}
		}, this);
	};

	// Get Current Name
	Window_Command.prototype.currentName = function() {
		return this.currentData() ? this.currentData().name : null;
	};

	// ウィンドウ内に立ち絵を描画
	Window_MenuStatus.prototype.drawStandingPicture = function(
		pictureName, x, y, width, height, sx, sy, scaleX, scaleY
	) {
		width = width || 200;
		height = height || 200;
		sx = sx || 0;
		sy = sy || 0;
		var bitmap = ImageManager.loadPicture(pictureName);
		var pw = width;
		var ph = height;
		var sw = Math.min(width, pw);
		var sh = Math.min(height, ph);
		var dx = Math.floor(x + Math.max(width - pw, 0) / 2);
		var dy = Math.floor(y + Math.max(height - ph, 0) / 2);
		var dw = Math.min(width, pw);
		var dh = Math.min(height, ph);

		// for iOS Safari
		if (sx < 0) {
			dx += sx * -1 * scaleX;
			sw -= sx * -1 * scaleX;
			dw -= sx * -1 * scaleX;
			sx = 0;
		}
		if (sy < 0) {
			dy += sy * -1 * scaleY;
			sh -= sy * -1 * scaleY;
			dh -= sy * -1 * scaleY;
			sy = 0;
		}

		// bitmap.addLoadListener(function() {
	    //     this.contents.blt(bitmap, sx, sy, sw / scaleX, sh / scaleY, dx, dy, dw, dh);
        // }.bind(this));

		// for MV
		bitmap.addLoadListener(function() {
			this.contents.bltMZ(bitmap, sx, sy, sw / scaleX, sh / scaleY, dx, dy, dw, dh);
        }.bind(this));
	};

	Window_MenuStatus.prototype.exDrawActorSimpleStatus = function(actor, x, y, width) {
		var lineHeight = this.lineHeight();
		if (actorNameLH > -1) this.drawActorName(actor, x + actorNameX, y + lineHeight * actorNameLH, width - actorNameX);
		if (actorLevelLH > -1) this.drawActorLevel(actor, x + actorLevelX, y + lineHeight * actorLevelLH);
		if (actorIconLH > -1) this.drawActorIcons(actor, x + actorIconX, y + lineHeight * actorIconLH, width - actorIconX);
		if (actorClassLH > -1) this.drawActorClass(actor, x + actorClassX, y + lineHeight * actorClassLH, width - actorClassX);
		// if (actorGaugeLH > -1) this.placeBasicGauges(actor, x, y + lineHeight * actorGaugeLH);

		// for MV
		if (actorGaugeLH > -1) {
			this.drawActorHp(actor, x + actorGaugeX, y + lineHeight * actorGaugeLH, gaugeWidth);
    		this.drawActorMp(actor, x + actorGaugeX, y + lineHeight * (actorGaugeLH + 1), gaugeWidth);
		}
	};

	Window_MenuStatus.prototype.drawItemImage = function(index) {
		var actor = $gameParty.members()[index];
		var rect = this.itemRect(index);

		this.changePaintOpacity(actor.isBattleMember());
		// 立ち絵 or 顔グラフィック描画
		var mPicture = ExMenuScreenBase.getImageName(actor.actorId());
		if (mPicture && showStandingPicture) {
			var width = rect.width - 2;
			var height = rect.height - 2;
			var x = rect.x + 1;
			var y = rect.y + 1;
			var sx = (Number(mPicture.x) + menuWindowPictureX) * -1;
			var sy = (Number(mPicture.y) + menuWindowPictureY) * -1;
			var scaleX = Number(mPicture.scaleX) / 100;
			var scaleY = Number(mPicture.scaleY) / 100;
			// 拡大率を適用
			scaleX *= menuWindowPictureScale / 100;
			scaleY *= menuWindowPictureScale / 100;

			// ピンチ判定
			if (ExMenuScreenBase.getHpRate(actor.actorId()) > Number(mPicture.pinchPercentage) || !mPicture.pinchImageName) {
				// 通常
				this.drawStandingPicture(String(mPicture.imageName), x, y, width, height, sx, sy, scaleX, scaleY);
			} else {
				// ピンチ
				this.drawStandingPicture(String(mPicture.pinchImageName), x, y, width, height, sx, sy, scaleX, scaleY);
			}
		} else {
			var width = Window_Base._faceWidth;
			// 横幅が小さい場合、横幅に合わせてトリミング
			if (rect.width - 2 < width) {
				width = rect.width - 2;
			}
			var height = rect.height - 2;
			var x = rect.x + rect.width - width - 1;
			var y = rect.y + 1;
			this.drawActorFace(actor, x, y, width, height);
		}
		this.changePaintOpacity(true);
	};

	Window_MenuStatus.prototype.drawItemStatus = function(index) {
		var actor = $gameParty.members()[index];
		var rect = this.itemRect(index);
		var x = rect.x + 2;
		var y = rect.y + 2;
		var width = rect.width - 4;

		// 画像キャッシュ判定
		var mPicture = ExMenuScreenBase.getImageName(actor.actorId());
		if (mPicture && showStandingPicture) {
			var pictureName = null;
			// ピンチ判定 (旧Ver.互換用)
			if (ExMenuScreenBase.getHpRate(actor.actorId()) > Number(mPicture.pinchPercentage) || !mPicture.pinchImageName) {
				pictureName = String(mPicture.imageName);
			} else {
				pictureName = String(mPicture.pinchImageName);
			}
			var bitmap = ImageManager.loadPicture(pictureName);
			bitmap.addLoadListener(function() {
				this.exDrawActorSimpleStatus(actor, x, y, width);
			}.bind(this));
		} else {
			this.exDrawActorSimpleStatus(actor, x, y, width);
		}
	};

	Window_MenuStatus.prototype.numVisibleRows = function() {
		return numVisibleRows;
	};

	Window_MenuStatus.prototype.maxCols = function() {
		return maxCols;
	};

	Window_MenuStatus.prototype.drawActorLevel = function(actor, x, y) {
		this.changeTextColor(this.systemColor());
		this.drawText(TextManager.levelA, x, y, 48);
		this.resetTextColor();
		this.drawText(actor.level, x + lvPadding, y, 36, 'right');
	};

	//-----------------------------------------------------------------------------
	// Window_MenuHelp
	//

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

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

    Window_MenuHelp.prototype.initialize = function() {
		var width = Graphics.boxWidth;
		var height = this.lineHeight() * 3;
		if (!leftBlockLabel && !rightBlockLabel) height = this.lineHeight() * 2;
		if (!menuHelpWindowEnable) height = 0;

		Window_Base.prototype.initialize.call(this, 0, 0, width, height);
		this.refresh();
    };

    Window_MenuHelp.prototype.setText = function(text) {
	    this._text = text;
	    this.refresh();
    };

    Window_MenuHelp.prototype.clear = function() {
	    this.setText("");
    };

    Window_MenuHelp.prototype.refresh = function() {
		this.contents.clear();
		this.contents.fontSize = this.getFontSize();
		// マップ名
		this.drawLeftBlock();
		// プレイ時間
		this.drawRightBlock();
		// 所持金
		this.drawCurrency();
		// メニューヘルプ
		this.drawMenuHelp();
		this.contents.fontSize = this.standardFontSize();
	};

	Window_MenuHelp.prototype.getFontSize = function() {
		return menuHelpWindowFontSize;
	};

	Window_MenuHelp.prototype.innerWidth = function() {
		return Math.max(0, this.width - this.padding * 2);
    };

	Window_MenuHelp.prototype.drawLeftBlock = function() {
		if (!leftBlockLabel) return;
		var y = 0;
		var oneThirdWidth = Math.floor(this.innerWidth() / 2);
	    this.changeTextColor(this.systemColor());
		this.drawText(leftBlockLabel, 0, y, this.contents.measureTextWidth(leftBlockLabel), leftBlockAlign);
		this.resetTextColor();
		this.drawText(eval(leftBlockValue), this.contents.measureTextWidth(leftBlockLabel), y, oneThirdWidth * 1 - this.contents.measureTextWidth(leftBlockLabel), leftBlockAlign);
	};

	Window_MenuHelp.prototype.drawRightBlock = function() {
		if (!rightBlockLabel) return;
		var y = 0;
		var oneThirdWidth = Math.floor(this.innerWidth() / 2);
		this.changeTextColor(this.systemColor());
		this.drawText(rightBlockLabel, oneThirdWidth * 1, y, this.contents.measureTextWidth(rightBlockLabel), rightBlockAlign);
		this.resetTextColor();
		this.drawText(eval(rightBlockValue), this.contents.measureTextWidth(rightBlockLabel) + oneThirdWidth * 1, y, oneThirdWidth - this.contents.measureTextWidth(rightBlockLabel), rightBlockAlign);
	};

	Window_MenuHelp.prototype.drawCurrency = function() {
		var y = !leftBlockLabel && !rightBlockLabel ? 0 : this.lineHeight() * 1;
		var oneThirdWidth = Math.floor(this.innerWidth() / 3);

		if (currencyWindowPosition == "helpWindowRightBottom") {
			// 所持金の表示位置が「ヘルプウィンドウの右下」の場合、所持金を描画
			var currencyUnit = TextManager.currencyUnit;
			this.drawCurrencyValue($gameParty.gold(), currencyUnit, oneThirdWidth * 1.5, y, oneThirdWidth * 1.5);
		} else {
			// それ以外の場合、独自の項目を描画
			if (!rightBottomBlockLabel) return;
			this.changeTextColor(this.systemColor());
			this.drawText(rightBottomBlockLabel, oneThirdWidth * 1.5, y, this.contents.measureTextWidth(rightBottomBlockLabel), rightBottomBlockAlign);
			this.resetTextColor();
			this.drawText(eval(rightBottomBlockValue), this.contents.measureTextWidth(rightBottomBlockLabel) + oneThirdWidth * 1.5, y, oneThirdWidth * 1.5 - this.contents.measureTextWidth(rightBottomBlockLabel), rightBottomBlockAlign);
		}
	};

	Window_MenuHelp.prototype.drawMenuHelp = function() {
		var y = !leftBlockLabel && !rightBlockLabel ? 0 : this.lineHeight() * 1;
		var oneThirdWidth = Math.floor(this.innerWidth() / 3);

		if (leftBottomBlockLabel != "") {
			// 左下に独自の項目を表示する場合 (v1.4.0)
			this.changeTextColor(this.systemColor());
			this.drawText(leftBottomBlockLabel, 0, y, this.contents.measureTextWidth(leftBottomBlockLabel), leftBottomBlockAlign);
			this.resetTextColor();
			this.drawText(eval(leftBottomBlockValue), this.contents.measureTextWidth(leftBottomBlockLabel), y, oneThirdWidth * 1.5 - this.contents.measureTextWidth(leftBottomBlockLabel), leftBottomBlockAlign);
		} else {
			// メニューヘルプを表示
			this.resetTextColor();
			this.drawText(this._text ? this._text : "", 0, y, this.innerWidth() - oneThirdWidth * 1.5, leftBottomBlockAlign);
		}
	};
})();


code:
//=============================================================================
// RPGツクールMV - LL_MenuScreenShopMV.js v1.0.3
//-----------------------------------------------------------------------------
// ルルの教会 (Lulu's Church)
// https://nine-yusha.com/
//
// URL below for license details.
// https://nine-yusha.com/plugin/
//=============================================================================

/*:
 * @target MV
 * @plugindesc ショップ画面に立ち絵を表示します。
 * @author ルルの教会
 * @url https://nine-yusha.com/plugin-menuscreenshop/
 * @base LL_MenuScreenBaseMV
 * @orderAfter LL_MenuScreenBaseMV
 *
 * @help LL_MenuScreenShopMV.js
 *
 * ショップの購入画面で装備品が選択されている時に、
 * 選択されているアクターの立ち絵を自動表示します。
 * ※表示する立ち絵リストは「LL_MenuScreenBaseMV」で設定してください。
 *
 * アクター立ち絵の表示位置について:
 *   アクター立ち絵はLL_MenuScreenBaseMVで設定済みのX・Y座標に表示されます。
 *   (戦闘中立ち絵プラグインと連携している場合は、戦闘中立ち絵のX・Y座標)
 *   表示位置は右側の「X座標始点」「Y座標始点」で調整できます。
 *
 * 店員の立ち絵表示について:
 *   店員の立ち絵と台詞を「店員設定リスト」で設定することができます。
 *   (立ち絵のみ、台詞のみ、背景画像のみとかでも設定できます)
 *   「店員指定変数」で設定した変数でショップ毎に店員の切り替えが可能です。
 *
 * アイテムカテゴリを他プラグインで拡張している場合:
 *   「カテゴリを標準幅で表示」を有効にすると競合を解決できる場合があります。
 *   この場合は「LL_MenuScreenShopMV」を他プラグインよりも下に配置してください。
 *
 * プラグインコマンドはありません。
 *
 * 利用規約:
 *   ・著作権表記は必要ございません。
 *   ・利用するにあたり報告の必要は特にございません。
 *   ・商用・非商用問いません。
 *   ・R18作品にも使用制限はありません。
 *   ・ゲームに合わせて自由に改変していただいて問題ございません。
 *   ・プラグイン素材としての再配布（改変後含む）は禁止させていただきます。
 *
 * 作者: ルルの教会
 * 作成日: 2022/1/24
 *
 * @param actorSettings
 * @text アクター立ち絵表示の設定
 * @desc ※この項目は使用しません
 *
 * @param shopWindowPictureX
 * @text X座標始点
 * @desc アクター立ち絵の表示位置(X)調整値です。(初期値: 0)
 * ＋で右へ、－で左へ調整します。
 * @default 0
 * @min -9999
 * @type number
 * @parent actorSettings
 *
 * @param shopWindowPictureY
 * @text Y座標始点
 * @desc アクター立ち絵の表示位置(Y)調整値です。(初期値: 0)
 * ＋で下へ、－で上へ調整します。
 * @default 0
 * @min -9999
 * @type number
 * @parent actorSettings
 *
 * @param shopSettings
 * @text 店員立ち絵表示の設定
 * @desc ※この項目は使用しません
 *
 * @param shopLists
 * @text 店員設定リスト
 * @desc ショップで表示する店員のリストを作成します。
 * @default []
 * @type struct<shopLists>[]
 * @parent shopSettings
 *
 * @param shopNumberVariable
 * @text 店員指定変数
 * @desc 店員設定リストを指定する変数IDです。
 * この変数に入っている番号の店員設定が自動で呼び出されます。
 * @type variable
 * @parent shopSettings
 *
 * @param shopMessageWindowSettings
 * @text メッセージウィンドウの設定
 * @desc ※この項目は使用しません
 *
 * @param shopMessageWindowOffsetX
 * @text X座標調整値
 * @desc ウィンドウの表示位置(X)の調整値です。
 * ＋で右へ、－で左へ調整します。
 * @default 0
 * @min -9999
 * @max 9999
 * @type number
 * @parent shopMessageWindowSettings
 *
 * @param shopMessageWindowOffsetY
 * @text Y座標調整値
 * @desc ウィンドウの表示位置(Y)の調整値です。
 * ＋で下へ、－で上へ調整します。
 * @default 0
 * @min -9999
 * @max 9999
 * @type number
 * @parent shopMessageWindowSettings
 *
 * @param shopMessageWindowWidth
 * @text 幅
 * @desc ウィンドウの幅です。
 * 数値かスクリプト形式で入力してください。
 * @default Graphics.boxWidth / 2
 * @type string
 * @parent shopMessageWindowSettings
 *
 * @param shopMessageWindowNumRows
 * @text 行数
 * @desc ウィンドウの高さを何行分にするか設定します。
 * @default 4
 * @type number
 * @parent shopMessageWindowSettings
 *
 * @param itemCategoryWindowDefault
 * @text カテゴリを標準幅で表示
 * @desc 売却画面のカテゴリウィンドウの幅を調整しません。
 * 他プラグインとの競合用設定です。(通常はOFFのままでOKです)
 * @default false
 * @type boolean
 */

/*~struct~shopLists:
 *
 * @param number
 * @text 番号
 * @desc 店員指定変数で呼び出される番号です。
 * 重複しない番号でリストを作成してください。
 * @max 2000
 * @min 1
 * @type number
 *
 * @param staffImageName
 * @text 店員立ち絵画像
 * @desc 店員の立ち絵として表示する画像ファイルです。
 * ※設定なしでも可
 * @dir img/pictures
 * @type file
 * @require 1
 *
 * @param staffThanksImageName
 * @text 店員立ち絵画像 (お礼)
 * @desc 購入・売却完了時に立ち絵を切り替える場合に設定します。
 * ※設定なしの場合は通常立ち絵がそのまま表示されます
 * @dir img/pictures
 * @type file
 * @require 1
 *
 * @param x
 * @text X座標
 * @desc 店員立ち絵の表示位置(X)です。
 * @default 464
 * @min -9999
 * @type number
 *
 * @param y
 * @text Y座標
 * @desc 店員立ち絵の表示位置(Y)です。
 * @default 96
 * @min -9999
 * @type number
 *
 * @param commandMessage
 * @text ショップ画面メッセージ
 * @desc ショップ画面開始時に表示されるメッセージです。
 * ※設定なしでも可
 * @type note
 *
 * @param buyMessage
 * @text 購入画面メッセージ
 * @desc 購入画面で表示されるメッセージです。
 * ※設定なしでも可
 * @type note
 *
 * @param sellMessage
 * @text 売却画面メッセージ
 * @desc 売却画面で表示されるメッセージです。
 * ※設定なしでも可
 * @type note
 *
 * @param thanksMessage
 * @text お礼メッセージ
 * @desc 購入・売却完了時のメッセージです。
 * ※設定なしでも可
 * @type note
 *
 * @param backgroundImage
 * @text 背景画像
 * @desc 背景画像を表示する場合は画像を選択してください。
 * @dir img/pictures
 * @type file
 * @require 1
 */

(function() {
	"use strict";
	var pluginName = "LL_MenuScreenShopMV";

	var parameters = PluginManager.parameters(pluginName);
	var shopWindowPictureX = Number(parameters["shopWindowPictureX"] || 0);
	var shopWindowPictureY = Number(parameters["shopWindowPictureY"] || 0);
	var shopNumberVariable = Number(parameters["shopNumberVariable"] || 0);
	var shopListArrays = JSON.parse(parameters["shopLists"] || "null");
	var itemCategoryWindowDefault = eval(parameters["itemCategoryWindowDefault"] || "false");
	var shopMessageWindowOffsetX = Number(parameters["shopMessageWindowOffsetX"] || 0);
	var shopMessageWindowOffsetY = Number(parameters["shopMessageWindowOffsetY"] || 0);
	var shopMessageWindowWidth = String(parameters["shopMessageWindowWidth"] || "Graphics.boxWidth / 2");
	var shopMessageWindowNumRows = Number(parameters["shopMessageWindowNumRows"] || 4);
	var shopLists = [];
	if (shopListArrays) {
		shopListArrays.forEach(function(elm) {
			shopLists.push(JSON.parse(elm));
		});
	}

	var shopSettings = null;
	var callUpdateMessageWithPicture = false;

	//-----------------------------------------------------------------------------
	// Scene_Shop
	//
	// The scene class of the shop screen.

	var _Scene_Shop_initialize = Scene_Shop.prototype.initialize;
	Scene_Shop.prototype.initialize = function() {
		_Scene_Shop_initialize.apply(this, arguments);

		// ショップ設定の読み込み
		this.loadShopExSettings();
	};

	Scene_Shop.prototype.loadShopExSettings = function() {
		shopSettings = shopLists.filter(function(item) {
			if (Number(item.number) == $gameVariables.value(shopNumberVariable)) return true;
		});
		if (!shopSettings[0]) {
			shopSettings = {
				backgroundImage: "",
				buyMessage: "",
				commandMessage: "",
				number: -1,
				sellMessage: "",
				staffImageName: "",
				staffThanksImageName: "",
				thanksMessage: "",
				x: 0,
				y: 0
			};
		} else {
			shopSettings = shopSettings[0];
		}
	};

	var _Scene_Shop_update = Scene_Shop.prototype.update;
	Scene_Shop.prototype.update = function() {
		_Scene_Shop_update.apply(this, arguments);

		this.updateStandingPicture();
	};

	var _Scene_Shop_create = Scene_Shop.prototype.create;
	Scene_Shop.prototype.create = function() {
		_Scene_Shop_create.apply(this, arguments);

		this.createMessageWindow();
		this.createStandingPicture();
		this.reserveStandingPictures();
		this.refreshActor();
		this.updateMessageWithPicture();

		this._dummyWindow.opacity = 0;
	};

	Scene_Shop.prototype.createStandingPicture = function() {
		// 店員立ち絵
		this._staffPicture = new Sprite();
		this._staffPicture.bitmap = ImageManager.loadPicture(String(shopSettings.staffImageName));
		this._staffPicture.x = Number(shopSettings.x);
		this._staffPicture.y = Number(shopSettings.y);
		this.addChildAt(this._staffPicture, this.children.indexOf(this._windowLayer));
		// 対象アクター立ち絵
		this._actorPicture = new Sprite();
		this._actorPicture.bitmap = ImageManager.loadPicture("");
		this._actorPicture.x = 0;
		this._actorPicture.y = 0;
		this.addChildAt(this._actorPicture, this.children.indexOf(this._windowLayer));
	};

	var _Scene_Shop_createBackground = Scene_Shop.prototype.createBackground;
	Scene_Shop.prototype.createBackground = function() {
		if (shopSettings.backgroundImage) {
			// 独自の背景画像を表示
			this._backgroundSprite = new Sprite();
			this._backgroundSprite.bitmap = ImageManager.loadPicture(String(shopSettings.backgroundImage));
			this.addChild(this._backgroundSprite);
			return;
		}
		_Scene_Shop_createBackground.apply(this, arguments);
	};

	Scene_Shop.prototype.createCategoryWindow = function() {
		this._categoryWindow = new Window_ShopItemCategory();
		this._categoryWindow.setHelpWindow(this._helpWindow);
		this._categoryWindow.y = this._dummyWindow.y;
		this._categoryWindow.hide();
		this._categoryWindow.deactivate();
		this._categoryWindow.setHandler('ok', this.onCategoryOk.bind(this));
		this._categoryWindow.setHandler('cancel', this.onCategoryCancel.bind(this));
		this.addWindow(this._categoryWindow);
	};

	Scene_Shop.prototype.statusWidth = function() {
		return Graphics.boxWidth / 2;
	};

	Scene_Shop.prototype.statusHeight = function() {
		return 184;
	};

	var _Scene_Shop_activateBuyWindow = Scene_Shop.prototype.activateBuyWindow;
	Scene_Shop.prototype.activateBuyWindow = function() {
		_Scene_Shop_activateBuyWindow.apply(this, arguments);

		this.updateMessageWithPicture();
	};

	var _Scene_Shop_commandSell = Scene_Shop.prototype.commandSell;
	Scene_Shop.prototype.commandSell = function() {
		_Scene_Shop_commandSell.apply(this, arguments);

		this.updateMessageWithPicture();
	};

	var _Scene_Shop_onBuyOk = Scene_Shop.prototype.onBuyOk;
	Scene_Shop.prototype.onBuyOk = function() {
		_Scene_Shop_onBuyOk.apply(this, arguments);

		this._statusWindow.hide();
		this.updateMessageWithPicture("buy");
	};

	var _Scene_Shop_onBuyCancel = Scene_Shop.prototype.onBuyCancel;
	Scene_Shop.prototype.onBuyCancel = function() {
		_Scene_Shop_onBuyCancel.apply(this, arguments);

		this._messageWindow.show();
		this.updateMessageWithPicture();
	};

	var _Scene_Shop_onCategoryCancel = Scene_Shop.prototype.onCategoryCancel;
	Scene_Shop.prototype.onCategoryCancel = function() {
		_Scene_Shop_onCategoryCancel.apply(this, arguments);

		this.updateMessageWithPicture();
	};

	var _Scene_Shop_onSellOk = Scene_Shop.prototype.onSellOk;
	Scene_Shop.prototype.onSellOk = function() {
		_Scene_Shop_onSellOk.apply(this, arguments);

		this._statusWindow.hide();
		this.updateMessageWithPicture("sell");
	};

	var _Scene_Shop_onSellCancel = Scene_Shop.prototype.onSellCancel;
	Scene_Shop.prototype.onSellCancel = function() {
		_Scene_Shop_onSellCancel.apply(this, arguments);

		this.updateMessageWithPicture("sell");
	};

	var _Scene_Shop_onNumberOk = Scene_Shop.prototype.onNumberOk;
	Scene_Shop.prototype.onNumberOk = function() {
		_Scene_Shop_onNumberOk.apply(this, arguments);

		this.updateMessageWithPicture("thanks");
	};

	Scene_Shop.prototype.createBuyWindow = function() {
		var wy = this._dummyWindow.y;
		var wh = this._dummyWindow.height - this.statusHeight();
		this._buyWindow = new Window_ShopBuy(0, wy, wh, this._goods);
		this._buyWindow.setHelpWindow(this._helpWindow);
		this._buyWindow.setStatusWindow(this._statusWindow);
		this._buyWindow.hide();
		this._buyWindow.setHandler('ok', this.onBuyOk.bind(this));
		this._buyWindow.setHandler('cancel', this.onBuyCancel.bind(this));
		this._buyWindow.setHandler("pagedown", this.nextActor.bind(this));
		this._buyWindow.setHandler("pageup", this.previousActor.bind(this));
		this.addWindow(this._buyWindow);
	};

	Scene_Shop.prototype.createMessageWindow = function() {
		this._messageWindow = new Window_ShopMessage();
		this.addWindow(this._messageWindow);
	};

	Scene_Shop.prototype.needsPageButtons = function() {
		return true;
	};

	Scene_Shop.prototype.arePageButtonsEnabled = function() {
		return (this._buyWindow && this._buyWindow.active);
	};

	Scene_Shop.prototype.onActorChange = function() {
		Scene_MenuBase.prototype.onActorChange.call(this);
		this.refreshActor();
		this.activateBuyWindow();
	};

	Scene_Shop.prototype.refreshActor = function() {
		var actor = this.actor();
		this._statusWindow.setActor(actor);
	};

	Scene_Shop.prototype.updateStandingPicture = function() {
		if (callUpdateMessageWithPicture) {
			this.updateMessageWithPicture();
			callUpdateMessageWithPicture = false;
		}

		if (this._buyWindow && this._buyWindow.active) {
			var item = this._buyWindow.item();
			if (DataManager.isWeapon(item) || DataManager.isArmor(item)) {
				var actor = this.actor();
				var equipPicture = ExMenuScreenBase.getImageName(actor.actorId());
				if (equipPicture) {
					// ピンチ判定 (旧Ver.)
					if (ExMenuScreenBase.getHpRate(actor._actorId) > Number(equipPicture.pinchPercentage) || !equipPicture.pinchImageName) {
						// 通常
						this._actorPicture.bitmap = ImageManager.loadPicture(equipPicture.imageName);
					} else {
						// ピンチ
						this._actorPicture.bitmap = ImageManager.loadPicture(equipPicture.pinchImageName);
					}
					this._actorPicture.x = Number(equipPicture.x) + shopWindowPictureX;
					this._actorPicture.y = Number(equipPicture.y) + shopWindowPictureY;
					this._actorPicture.scale.x = Number(equipPicture.scaleX) / 100;
					this._actorPicture.scale.y = Number(equipPicture.scaleY) / 100;
					this._actorPicture.opacity = 255;
					this._staffPicture.opacity = 0;
					this._messageWindow.hide();
					return;
				}
			}
		}

		this._actorPicture.opacity = 0;
		this._staffPicture.opacity = 255;
		if (this._messageWindow._text) this._messageWindow.show();
	};

	Scene_Shop.prototype.updateMessageWithPicture = function(messageType) {
		if (!messageType) {
			if (this._commandWindow && this._commandWindow.active) {
				messageType = "command";
			}
			if (this._buyWindow && this._buyWindow.active) {
				messageType = "buy";
			}
			if (this._categoryWindow && this._categoryWindow.active) {
				messageType = "sell";
			}
			if (this._sellWindow && this._sellWindow.active) {
				messageType = "sell";
			}
		}

		// ウィンドウ位置調整値
		var offsetX = shopMessageWindowOffsetX;
		var offsetY = shopMessageWindowOffsetY;
		var windowWidth = eval(shopMessageWindowWidth);
		var windowHeight = this._messageWindow.fittingHeight(shopMessageWindowNumRows);
		if (shopMessageWindowNumRows == 4) {
			windowHeight = this._statusWindow.height;
		}

		switch (messageType) {
			case "command":
				this._messageWindow.setText(String(shopSettings.commandMessage));
				this._messageWindow.width = Graphics.boxWidth;
				this._messageWindow.height = this._messageWindow.windowHeight();
				this._messageWindow.x = (Graphics.boxWidth - this._messageWindow.width) / 2;
				this._messageWindow.y = Graphics.boxHeight - this._messageWindow.height;
				this._messageWindow.show();
				this._staffPicture.bitmap = ImageManager.loadPicture(String(shopSettings.staffImageName));
				break;
			case "buy":
				this._messageWindow.setText(String(shopSettings.buyMessage));
				this._messageWindow.width = windowWidth;
				this._messageWindow.height = windowHeight;
				this._messageWindow.x = this._buyWindow.width + offsetX;
				this._messageWindow.y = Graphics.boxHeight - this._messageWindow.height - this._helpWindow.height + offsetY;
				this._messageWindow._text ? this._messageWindow.show() : this._messageWindow.hide();
				this._staffPicture.bitmap = ImageManager.loadPicture(String(shopSettings.staffImageName));
				break;
			case "sell":
				this._messageWindow.setText(String(shopSettings.sellMessage));
				this._messageWindow.width = windowWidth;
				this._messageWindow.height = windowHeight;
				this._messageWindow.x = this._buyWindow.width + offsetX;
				this._messageWindow.y = Graphics.boxHeight - this._messageWindow.height - this._helpWindow.height + offsetY;
				this._messageWindow._text ? this._messageWindow.show() : this._messageWindow.hide();
				this._staffPicture.bitmap = ImageManager.loadPicture(String(shopSettings.staffImageName));
				break;
			case "thanks":
				if (shopSettings.thanksMessage) {
					this._messageWindow.setText(String(shopSettings.thanksMessage));
					this._messageWindow.width = windowWidth;
					this._messageWindow.height = windowHeight;
					this._messageWindow.x = this._buyWindow.width + offsetX;
					this._messageWindow.y = Graphics.boxHeight - this._messageWindow.height - this._helpWindow.height + offsetY;
					this._messageWindow._text ? this._messageWindow.show() : this._messageWindow.hide();
				}
				if (shopSettings.staffThanksImageName) {
					this._staffPicture.bitmap = ImageManager.loadPicture(String(shopSettings.staffThanksImageName));
				}
				break;
		}
	}

	Scene_Shop.prototype.reserveStandingPictures = function() {
		if (shopSettings.staffImageName) ImageManager.loadPicture(String(shopSettings.staffImageName));
		if (shopSettings.staffThanksImageName) ImageManager.loadPicture(String(shopSettings.staffThanksImageName));

		$gameParty.members().forEach(function(actor) {
			var picture = ExMenuScreenBase.getImageName(actor._actorId);
			if (picture) {
				ImageManager.loadPicture(picture.imageName);
				// ピンチ時立ち絵 (旧Ver.)
				if (picture.pinchImageName) {
					ImageManager.loadPicture(picture.pinchImageName);
				}
			}
		}, this);
	};

	// for MV
	Scene_Shop.prototype.createCommandWindow = function() {
		this._commandWindow = new Window_ShopCommand(this._goldWindow.x, this._purchaseOnly);
		this._commandWindow.y = 0;
		this._commandWindow.setHandler('buy', this.commandBuy.bind(this));
		this._commandWindow.setHandler('sell', this.commandSell.bind(this));
		this._commandWindow.setHandler('cancel', this.popScene.bind(this));
		this.addWindow(this._commandWindow);
	};

	Scene_Shop.prototype.createDummyWindow = function() {
		var wy = this._commandWindow.y + this._commandWindow.height;
		var wh = Graphics.boxHeight - wy - this._helpWindow.height;
		this._dummyWindow = new Window_Base(0, wy, Graphics.boxWidth / 2, wh);
		this.addWindow(this._dummyWindow);
	};

	Scene_Shop.prototype.createSellWindow = function() {
		var wy = this._categoryWindow.y + this._categoryWindow.height;
		var wh = Graphics.boxHeight - wy - this._helpWindow.height;
		this._sellWindow = new Window_ShopSell(0, wy, Graphics.boxWidth / 2, wh);
		this._sellWindow.setHelpWindow(this._helpWindow);
		this._sellWindow.hide();
		this._sellWindow.setHandler('ok', this.onSellOk.bind(this));
		this._sellWindow.setHandler('cancel', this.onSellCancel.bind(this));
		this._categoryWindow.setItemWindow(this._sellWindow);
		this.addWindow(this._sellWindow);
	};

	Scene_Shop.prototype.createGoldWindow = function() {
		this._goldWindow = new Window_Gold(0, 0);
		this._goldWindow.x = Graphics.boxWidth - this._goldWindow.width;
		this.addWindow(this._goldWindow);
	};

	Scene_Shop.prototype.createStatusWindow = function() {
		var wx = 0;
		var wy = Graphics.boxHeight - this.statusHeight() - this._helpWindow.height;
		var ww = this.statusWidth();
		var wh = this.statusHeight();
		this._statusWindow = new Window_ShopStatus(wx, wy, ww, wh);
		this._statusWindow.hide();
		this.addWindow(this._statusWindow);
	};

	var _Scene_Shop_createHelpWindow = Scene_Shop.prototype.createHelpWindow;
	Scene_Shop.prototype.createHelpWindow = function() {
		_Scene_Shop_createHelpWindow.apply(this, arguments);

		this._helpWindow.y = Graphics.boxHeight - this._helpWindow.height;
	};

	//-----------------------------------------------------------------------------
	// Window_ShopMessage
	//

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

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

	Window_ShopMessage.prototype.initialize = function() {
		var width = this.windowWidth();
		var height = this.windowHeight();
		Window_Base.prototype.initialize.call(this, 0, 0, width, height);
		this._text = "";
	};

	Window_ShopMessage.prototype.setText = function(text) {
		if (this._text !== text) {
			// this._text = text;
			// for MV
			this._text = JSON.parse(text || "null");
			this.refresh();
		}
	};

	Window_ShopMessage.prototype.clear = function() {
		this.setText("");
	};

	Window_ShopMessage.prototype.refresh = function() {
		this.contents.clear();
		this.drawTextEx(this._text, this.textPadding(), 0);
	};

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

	Window_ShopMessage.prototype.windowHeight = function() {
		return this.fittingHeight(4);
	};

	//-----------------------------------------------------------------------------
	// Window_ShopStatus
	//
	// The window for displaying number of items in possession and the actor's
	// equipment on the shop screen.

	var _Window_ShopStatus_initialize = Window_ShopStatus.prototype.initialize;
	Window_ShopStatus.prototype.initialize = function(x, y, width, height) {
		_Window_ShopStatus_initialize.apply(this, arguments, x, y, width, height);

		this._actor = null;
		this._arrowCursorAnimation = 0;
		this.createArrowCursors();
	};

	var _Window_ShopStatus_update = Window_ShopStatus.prototype.update;
	Window_ShopStatus.prototype.update = function() {
		_Window_ShopStatus_update.apply(this, arguments);

		this.updateArrowCursor();
	};

	Window_ShopStatus.prototype.createArrowCursors = function() {
		var w = this._width;
		var h = this._height;
		var p = 24;
		var q = p / 2;
		var sx = 84 + p;
		var sy = 12 + p;
		this._rightArrowSprite = new Sprite();
		this.addChild(this._rightArrowSprite);
		this._rightArrowSprite.bitmap = this._windowskin;
		this._rightArrowSprite.anchor.x = 0.5;
		this._rightArrowSprite.anchor.y = 0.5;
		this._rightArrowSprite.setFrame(sx + q + 36, sy, q, p);
		this._rightArrowSprite.move(w - q / 2, h / 2 + 32);
		this._leftArrowSprite = new Sprite();
		this.addChild(this._leftArrowSprite);
		this._leftArrowSprite.bitmap = this._windowskin;
		this._leftArrowSprite.anchor.x = 0.5;
		this._leftArrowSprite.anchor.y = 0.5;
		this._leftArrowSprite.setFrame(sx + q, sy, q, p);
		this._leftArrowSprite.move(0 + q / 2, h / 2 + 32);
	}

	Window_ShopStatus.prototype.updateArrowCursor = function() {
		if (this._item && this._rightArrowSprite && this._leftArrowSprite) {
			if (this.isEquipItem() && $gameParty.size() > 1 && this._arrowCursorAnimation < 25) {
				this._rightArrowSprite.visible = true;
				this._leftArrowSprite.visible = true;
			} else {
				this._rightArrowSprite.visible = false;
				this._leftArrowSprite.visible = false;
			}
		}
		this._arrowCursorAnimation++;
		if (this._arrowCursorAnimation > 48) this._arrowCursorAnimation = 0;
	};

	Window_ShopStatus.prototype.drawEquipInfo = function(x, y) {
		var actor = this._actor;
		if (actor) {
			this.drawActorEquipInfo(x, y, actor);
		}
	};

	Window_ShopStatus.prototype.setActor = function(actor) {
		if (this._actor !== actor) {
			this._actor = actor;
			this.refresh();
		}
	};

	Window_ShopStatus.prototype.isPageChangeEnabled = function() {
		return false;
	};

	//-----------------------------------------------------------------------------
	// Window_ShopBuy
	//
	// The window for selecting an item to buy on the shop screen.

	var _Window_ShopBuy_update = Window_ShopBuy.prototype.update;
	Window_ShopBuy.prototype.update = function() {
		var lastIndex = this.index();

		_Window_ShopBuy_update.apply(this, arguments);

		if (this.index() !== lastIndex) {
			callUpdateMessageWithPicture = true;
		}
	};

	var _Window_ShopBuy_cursorRight = Window_ShopBuy.prototype.cursorRight;
	Window_ShopBuy.prototype.cursorRight = function() {
		_Window_ShopBuy_cursorRight.apply(this, arguments);

		var item = this.item();
		var isEquipItem = DataManager.isWeapon(item) || DataManager.isArmor(item);
		if (isEquipItem) {
			this.processPagedown();
		}
	};

	var _Window_ShopBuy_cursorLeft = Window_ShopBuy.prototype.cursorLeft;
	Window_ShopBuy.prototype.cursorLeft = function() {
		_Window_ShopBuy_cursorLeft.apply(this, arguments);

		var item = this.item();
		var isEquipItem = DataManager.isWeapon(item) || DataManager.isArmor(item);
		if (isEquipItem) {
			this.processPageup();
		}
	};

	// for MV
	Window_ShopBuy.prototype.windowWidth = function() {
		return Graphics.boxWidth / 2;
	};

	//-----------------------------------------------------------------------------
	// Window_ShopSell
	//
	// The window for selecting an item to sell on the shop screen.

	Window_ShopSell.prototype.maxCols = function() {
		return 1;
	};

	var _Window_ShopSell_update = Window_ShopSell.prototype.update;
	Window_ShopSell.prototype.update = function() {
		var lastIndex = this.index();

		_Window_ShopSell_update.apply(this, arguments);

		if (this.index() !== lastIndex) {
			callUpdateMessageWithPicture = true;
		}
	};

	//-----------------------------------------------------------------------------
	// Window_ShopItemCategory
	//

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

	Window_ShopItemCategory.prototype = Object.create(Window_ItemCategory.prototype);
	Window_ShopItemCategory.prototype.constructor = Window_ShopItemCategory;

	var _Window_ShopItemCategory_maxCols = Window_ShopItemCategory.prototype.maxCols;
	Window_ShopItemCategory.prototype.maxCols = function() {
		if (itemCategoryWindowDefault) {
			return _Window_ShopItemCategory_maxCols.apply(this, arguments);
		}

		return 2;
	};

	// for MV
	var _Window_ShopItemCategory_windowWidth = Window_ShopItemCategory.prototype.windowWidth;
	Window_ShopItemCategory.prototype.windowWidth = function() {
		if (itemCategoryWindowDefault) {
			return _Window_ShopItemCategory_windowWidth.apply(this, arguments);
		}

		return Graphics.boxWidth / 2;
	};

	var _Window_ShopItemCategory_windowHeight = Window_ShopItemCategory.prototype.windowHeight;
	Window_ShopItemCategory.prototype.windowHeight = function() {
		if (itemCategoryWindowDefault) {
			return _Window_ShopItemCategory_windowHeight.apply(this, arguments);
		}

		return this.fittingHeight(2);
	};

	// for MV
	//-----------------------------------------------------------------------------
	// Window_ShopNumber
	//
	// The window for inputting quantity of items to buy or sell on the shop
	// screen.

	Window_ShopNumber.prototype.windowWidth = function() {
		return Graphics.boxWidth / 2;
	};

})();