code:
//=============================================================================
// KMS_MapActiveMessage.js
//   Last update: 2018/01/01
//=============================================================================

/*:
 * @plugindesc
 * [v0.1.2] Show messages automatically for events on map.
 *
 * @author Kameo (Kamesoft)
 *
 * @param Balloon offset Y
 * @default 20
 * @desc Vertical position offset for balloons by pixel.
 *
 * @param Balloon margin
 * @default -8
 * @desc Adjust frame size of balloons by pixel.
 *
 * @param Default range
 * @default 4
 * @desc Default distance for displaying message by tile unit.
 *
 * @param Display duration
 * @default 300
 * @desc Display frame count.
 *
 * @param Max message count
 * @default 10
 * @desc Max number of active messages.
 *
 * @param Message skin
 * @default ActiveMessageSkin
 * @require 1
 * @dir img/system/
 * @type file
 * @desc Message skin for active message. Load from img/system.
 *
 *
 * @help
 *
 * ## Plugin command
 *
 * MapActiveMessage enable      # Enable active message
 * MapActiveMessage disable     # Display active message
 * MapActiveMessage show 10     # Show message of the event whose ID is 10
 * MapActiveMessage show        # Show messages of all events
 *
 */

/*:ja
 * @plugindesc
 * [v0.1.2] プレイヤーが近付いたときに、自動的にメッセージを表示するイベントを作成します。
 *
 * @author かめお (Kamesoft)
 *
 * @param Balloon offset Y
 * @default 20
 * @desc 吹き出しの縦方向の位置をピクセル単位で調整します。
 *
 * @param Balloon margin
 * @default -8
 * @desc 吹き出しの枠サイズをピクセル単位で調整します。
 *
 * @param Default range
 * @default 4
 * @desc メッセージを表示する距離をタイル単位で指定します。
 *
 * @param Display duration
 * @default 300
 * @desc メッセージ表示時間をフレーム単位で指定します。
 *
 * @param Max message count
 * @default 10
 * @desc 表示できるメッセージの最大数です。
 *
 * @param Message skin
 * @default ActiveMessageSkin
 * @require 1
 * @dir img/system/
 * @type file
 * @desc メッセージの表示に使用するスキン画像です。 img/system から読み込みます。
 *
 *
 * @help
 *
 * ■ プラグインコマンド
 *
 * MapActiveMessage enable      # アクティブメッセージを有効にします。
 * MapActiveMessage disable     # アクティブメッセージを無効にします。
 * MapActiveMessage show 10     # イベント ID:10 のメッセージを表示します。
 * MapActiveMessage show        # 全イベントのメッセージを表示します。
 *
 */

var KMS = KMS || {};

(function () {

    'use strict';

    // 定数
    var Const =
    {
        debug: false,              // デバッグモード
        pluginCode: 'MapActiveMessage', // プラグインコード
        regex: {
            activeMessage: /<(?:アクティブメッセージ|ActiveMessage)\s*[:\s]\s*([^>]+)>/i,
            beginMessage: /<(?:アクティブメッセージ開始|BeginActiveMessage)>/i, // * 未使用
            endMessage: /<(?:アクティブメッセージ終了|EndActiveMessage)>/i    // * 未使用
        },

        balloonFrameInfo: { margin: 4, size: 24, lineLength: 48, srcSize: 96 },
        balloonVertexSize: { width: 24, height: 48 },

        // 吹き出しの表示位置
        balloonPosition: { below: 0, above: 1 }
    };

    var PluginName = 'KMS_' + Const.pluginCode;

    KMS.imported = KMS.imported || {};
    KMS.imported[Const.pluginCode] = true;

    // デフォルト値つきで文字列から int を解析
    function parseIntWithDefault(param, defaultValue) {
        var value = parseInt(param);
        return isNaN(value) ? defaultValue : value;
    }

    var pluginParams = PluginManager.parameters(PluginName);
    var Params = {};
    Params.messageSkin = pluginParams['Message skin'] || 'ActiveMessageSkin';
    Params.messageCountMax = Math.max(parseIntWithDefault(pluginParams['Max message count'], 8), 1);
    Params.balloonOffsetY = parseIntWithDefault(pluginParams['Balloon offset Y'], 20);
    Params.balloonMargin = parseIntWithDefault(pluginParams['Balloon margin'], -8);
    Params.defaultRange = Math.max(parseIntWithDefault(pluginParams['Default range'], 4), 1);
    Params.displayDuration = Math.max(parseIntWithDefault(pluginParams['Display duration'], 300), 1);
    Params.fadeFrameCount = Math.max(parseIntWithDefault(pluginParams['Fade frame count'], 8), 1);
    Params.fontSize = Math.max(parseIntWithDefault(pluginParams['Font size'], 18), 1);

    // デバッグログ
    var debuglog;
    if (Const.debug) {
        debuglog = function () { console.log(arguments); }
    }
    else {
        debuglog = function () { }
    }

    var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function (command, args) {
        _Game_Interpreter_pluginCommand.call(this, command, args);

        if (command !== Const.pluginCode) {
            return;
        }

        switch (args[0]) {
            case 'enable':      // 有効化
                $gameSystem.setMapActiveMessageEnabled(true);
                break;

            case 'disable':     // 無効化
                $gameSystem.setMapActiveMessageEnabled(false);
                break;

            case 'show':        // 強制表示 (eventId)
                // eventId 省略時 (undefined) は全イベントが対象
                $gameMap.forceDisplayActiveMessage(parseInt(args[1]));
                break;

            default:
                // 不明なコマンド
                console.error('[%s %s] Unknown command.', Const.pluginCode, args[0]);
                break;
        }
    };

    // タイリング描画
    function tileBlt(dstImage, srcImage, sx, sy, sw, sh, dx, dy, dw, dh) {
        for (var offY = 0; offY < dh; offY += sh) {
            for (var offX = 0; offX < dw; offX += sw) {
                var tempSh = Math.min(sh, dh - offY);
                var tempSw = Math.min(sw, dw - offX);
                dstImage.blt(
                    srcImage,
                    sx, sy, tempSw, tempSh,
                    dx + offX, dy + offY, tempSw, tempSh
                );
            }
        }
    }

    //-----------------------------------------------------------------------------
    // Game_Temp

    var _Game_Temp_initialize = Game_Temp.prototype.initialize;
    Game_Temp.prototype.initialize = function () {
        _Game_Temp_initialize.call(this);

        this.clearMapActiveMessage();
    };

    /**
     * アクティブメッセージの登録
     */
    Game_Temp.prototype.pushMapActiveMessage = function (text, targetEvent, isForced) {
        var message = { text: text, event: targetEvent, isForced: !!isForced };
        this._mapActiveMessages.push(message);
    };

    /**
     * アクティブメッセージのクリア
     */
    Game_Temp.prototype.clearMapActiveMessage = function () {
        this._mapActiveMessages = [];
    };

    /**
     * 次のアクティブメッセージを取得
     */
    Game_Temp.prototype.popNextMapActiveMessage = function () {
        return this._mapActiveMessages.shift();
    };

    /**
     * アクティブメッセージが登録されているか
     */
    Game_Temp.prototype.isMapActiveMessageReady = function () {
        return this._mapActiveMessages.length > 0;
    };

    //-----------------------------------------------------------------------------
    // Game_System

    /**
     * アクティブメッセージの有効状態を取得
     */
    Game_System.prototype.isMapActiveMessageEnabled = function () {
        return this._mapActiveMessageEnabled != null ? this._mapActiveMessageEnabled : true;
    };

    /**
     * アクティブメッセージの有効状態を設定
     */
    Game_System.prototype.setMapActiveMessageEnabled = function (enabled) {
        this._mapActiveMessageEnabled = !!enabled;
    };

    //-----------------------------------------------------------------------------
    // Game_Map

    var _Game_Map_setup = Game_Map.prototype.setup;
    Game_Map.prototype.setup = function (mapId) {
        _Game_Map_setup.call(this, mapId);

        this.initializeActiveMessage();
    };

    /**
     * アクティブメッセージの初期化
     */
    Game_Map.prototype.initializeActiveMessage = function () {
        // 最初は全イベントの表示済みフラグを解除
        this.clearActiveMessageShownFlags();
    };

    /**
     * アクティブメッセージの表示済みフラグを解除
     */
    Game_Map.prototype.clearActiveMessageShownFlags = function () {
        this.events().forEach(function (event) {
            event.setMapActiveMessageShown(false);
        });

        this.requestUpdateActiveMessage();
    };

    /**
     * アクティブメッセージの更新要求
     */
    Game_Map.prototype.requestUpdateActiveMessage = function () {
        this._needsUpdateActiveMessage = true;
    };

    var _Game_Map_update = Game_Map.prototype.update;
    Game_Map.prototype.update = function (sceneActive) {
        _Game_Map_update.call(this, sceneActive);

        this.updateDisplayActiveMessage();
    };

    /**
     * アクティブメッセージの表示判定
     */
    Game_Map.prototype.updateDisplayActiveMessage = function () {
        if (!this._needsUpdateActiveMessage) {
            return;
        }

        this._needsUpdateActiveMessage = false;

        // アクティブメッセージの登録
        var events = $gamePlayer.findAvailableMapActiveMessageEvents();
        events.forEach(function (event) {
            $gameTemp.pushMapActiveMessage(event.getMapActiveMessage(), event);
        });
    };

    /**
     * アクティブメッセージの強制表示
     */
    Game_Map.prototype.forceDisplayActiveMessage = function (eventId) {
        var invoker = function (event) {
            $gameTemp.pushMapActiveMessage(event.getMapActiveMessage(), event, true);
        };

        if (eventId == null || isNaN(eventId)) {
            // 全表示
            this.events().forEach(invoker);
        }
        else {
            // イベント ID 指定
            this.events().filter(function (event) {
                return event.eventId() === eventId;
            }).forEach(invoker);
        }
    };

    var _Game_Map_refresh = Game_Map.prototype.refresh;
    Game_Map.prototype.refresh = function () {
        _Game_Map_refresh.call(this);

        this.requestUpdateActiveMessage();
    };

    //-----------------------------------------------------------------------------
    // Game_CharacterBase

    var _Game_CharacterBase = Game_CharacterBase.prototype.setDirection;
    Game_CharacterBase.prototype.setDirection = function (d) {
        _Game_CharacterBase.call(this, d);

        // 移動時には方向指定があるはずなので、ここでメッセージの更新要求を出す
        if ($gameMap != null) {
            $gameMap.requestUpdateActiveMessage();
        }
    };

    //-----------------------------------------------------------------------------
    // Game_Player

    /**
     * アクティブメッセージを表示可能なイベントを探す
     */
    Game_Player.prototype.findAvailableMapActiveMessageEvents = function () {
        if (!this.canMove()) {
            return [];
        }

        // 指定距離内でメッセージ未表示のイベントを列挙
        var candidateEvents = $gameMap.events().filter(function (event) {
            return event.hasMapActiveMessage() &&
                !event.isMapActiveMessageShown() &&
                this.calcDistanceForMapActiveMessage(event) <= Params.defaultRange;
        }, this);

        // 表示済みフラグの解除判定
        $gameMap.events().forEach(function (event) {
            var distance = this.calcDistanceForMapActiveMessage(event);
            if (event.isMapActiveMessageShown()) {
                // メッセージ表示距離から出ていれば表示済みフラグ解除
                if (distance > Params.defaultRange) {
                    event.setMapActiveMessageShown(false);
                }
            }
        }, this);

        return candidateEvents;
    }

    Game_Player.prototype.calcDistanceForMapActiveMessage = function (event) {
        var diffX = this.x - event.x;
        var diffY = this.y - event.y;

        return Math.sqrt(diffX * diffX + diffY * diffY);
    };

    //-----------------------------------------------------------------------------
    // Game_Event

    var _Game_Event_setupPage = Game_Event.prototype.setupPage;
    Game_Event.prototype.setupPage = function () {
        _Game_Event_setupPage.call(this);

        this.setupMapActiveMessage();
    };

    /**
     * 現在のページ番号を取得
     */
    Game_Event.prototype.pageIndex = function () {
        return this._pageIndex;
    };

    /**
     * アクティブメッセージを構築
     */
    Game_Event.prototype.setupMapActiveMessage = function () {
        this._mapActiveMessage = null;
        this._isMapActiveMessageShown = false;

        // 注釈以外に達するまで解析
        var page = this.page();
        if (page == null) {
            return;
        }

        var isComment = function (command) {
            return command && (command.code === 108 || command.code === 408);
        };

        // 複数行対応のために注釈を結合
        var index = 0;
        var command = page.list[index];
        var comment = '';
        while (isComment(command)) {
            if (comment.length > 0) {
                comment += '\n';
            }
            comment += command.parameters[0];
            command = page.list[index++];
        }

        // メッセージ定義を解析
        var match = Const.regex.activeMessage.exec(comment);
        if (match != null) {
            this._mapActiveMessage = match[1];
        }
    };

    /**
     * アクティブメッセージを取得
     */
    Game_Event.prototype.getMapActiveMessage = function () {
        return this._mapActiveMessage;
    };

    /**
     * アクティブメッセージが存在するか
     */
    Game_Event.prototype.hasMapActiveMessage = function () {
        return this._mapActiveMessage != null;
    };

    /**
     * アクティブメッセージを表示済みか
     */
    Game_Event.prototype.isMapActiveMessageShown = function () {
        return this._isMapActiveMessageShown;
    };

    /**
     * アクティブメッセージ表示済みかどうかを設定
     */
    Game_Event.prototype.setMapActiveMessageShown = function (shown) {
        this._isMapActiveMessageShown = !!shown;
    };

    //-----------------------------------------------------------------------------
    // Sprite_MapActiveMessageBalloon
    //
    // アクティブメッセージの吹き出し用スプライト

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

    Sprite_MapActiveMessageBalloon.prototype = Object.create(Sprite_Base.prototype);
    Sprite_MapActiveMessageBalloon.prototype.constructor = Sprite_MapActiveMessageBalloon;

    Sprite_MapActiveMessageBalloon.prototype.initialize = function () {
        Sprite_Base.prototype.initialize.call(this);

        this.anchor.y = 0.5;
        this.initMembers();
    };

    Sprite_MapActiveMessageBalloon.prototype.initMembers = function () {
        this._owner = null;
    };

    /**
     * オーナーウィンドウの設定
     */
    Sprite_MapActiveMessageBalloon.prototype.setOwner = function (owner) {
        this._owner = owner;
    };

    /**
     * 位置をオーナーウィンドウに合わせる
     */
    Sprite_MapActiveMessageBalloon.prototype.followOwner = function () {
        this.y = this._owner.height / 2;
    };

    /**
     * サイズをオーナーウィンドウに合わせる
     */
    Sprite_MapActiveMessageBalloon.prototype.fitToOwner = function () {
        if (this._owner == null) {
            return;
        }

        var frameSize = Const.balloonFrameInfo.size;
        var vertexHeight = Const.balloonVertexSize.height;
        var heightOffset = (vertexHeight - frameSize) * 2;

        // Bitmap のサイズ調整
        var bitmapWidth = this._owner.width;
        var bitmapHeight = this._owner.height + heightOffset;
        if (this.bitmap == null ||
            (this.width != bitmapWidth || this.height != bitmapHeight)) {
            this.bitmap = new Bitmap(bitmapWidth, bitmapHeight);
        }
        else {
            this.bitmap.clear();
        }

        if (Const.debug) {
            this.bitmap.fillRect(0, 0, bitmapWidth, bitmapHeight, 'rgba(160, 255, 160, 0.5)');
        }
    };

    /**
     * 吹き出しの再描画
     */
    Sprite_MapActiveMessageBalloon.prototype.refresh = function () {
        if (this._owner == null) {
            return;
        }

        // サイズの調整
        this.fitToOwner();

        // 吹き出しの描画
        var frameSize = Const.balloonFrameInfo.size;
        var vertexHeight = Const.balloonVertexSize.height;
        var offsetX = -Params.balloonMargin;
        var offsetY = vertexHeight - frameSize - Params.balloonMargin;
        this.drawBalloon(
            offsetX,
            offsetY,
            this.width - offsetX * 2,
            this.height - offsetY * 2
        );
    };

    /**
     * 吹き出しを描画
     */
    Sprite_MapActiveMessageBalloon.prototype.drawBalloon = function (x, y, width, height) {
        if (this._owner == null) {
            return;
        }

        this.drawBalloonBackground(x, y, width, height);
        this.drawBalloonFrame(x, y, width, height);
    };

    /**
     * 吹き出しの背景を描画
     */
    Sprite_MapActiveMessageBalloon.prototype.drawBalloonBackground = function (x, y, width, height) {
        var srcImage = this._owner.getWindowSkin();
        var frame = Const.balloonFrameInfo;

        var prevOpacity = this.bitmap.paintOpacity;
        this.bitmap.paintOpacity = this._owner.backOpacity;

        // 背景下層
        this.bitmap.blt(
            srcImage,
            0, 0, frame.srcSize, frame.srcSize,
            x + frame.margin, y + frame.margin, width - frame.margin * 2, height - frame.margin * 2
        );

        // 背景上層
        tileBlt(
            this.bitmap, srcImage,
            0, frame.srcSize, frame.srcSize, frame.srcSize,
            x + frame.margin, y + frame.margin, width - frame.margin * 2, height - frame.margin * 2
        );

        this.bitmap.paintOpacity = prevOpacity;
    };

    /**
     * 吹き出しの枠を描画
     */
    Sprite_MapActiveMessageBalloon.prototype.drawBalloonFrame = function (x, y, width, height) {
        var srcImage = this._owner.getWindowSkin();
        var vertexOffset = this._owner.getBalloonVertexX();
        var balloonPos = this._owner.getBalloonPosition();

        var frame = Const.balloonFrameInfo;
        var vertexSize = Const.balloonVertexSize;

        // 吹き出しの頂点は枠内に収める
        vertexOffset = Math.min(
            Math.max(vertexOffset, 0),
            width - (frame.size * 2 + vertexSize.width)
        );

        // 縦枠 + コーナーを描画
        function drawFrameV(sx, dx, dy) {
            this.bitmap.blt(
                srcImage,
                sx, 0, frame.size, frame.size,
                dx, dy, frame.size, frame.size
            );
            this.bitmap.blt(
                srcImage,
                sx, frame.size, frame.size, frame.lineLength,
                dx, dy + frame.size, frame.size, height - frame.size * 2
            );
            this.bitmap.blt(
                srcImage,
                sx, frame.size + frame.lineLength, frame.size, frame.size,
                dx, dy + height - frame.size, frame.size, frame.size
            );
        }

        // 横枠と頂点を描画
        function drawFrameH(sy, dx, dy, showVertex) {
            var baseSx = frame.srcSize + frame.size;
            var frameWidth = width - frame.size * 2;
            var leftWidth = showVertex ? vertexOffset : frameWidth;

            // 枠線の左側 (頂点がない場合は全体)
            this.bitmap.blt(
                srcImage,
                baseSx, sy, frame.lineLength, frame.size,
                dx, dy, leftWidth, frame.size
            );

            if (!showVertex) {
                // 頂点を描画しない
                return;
            }

            // sy > 0 なら下枠、sy === 0 なら上枠のはず
            var newDx = dx + leftWidth;
            var newDy = dy + (sy > 0 ? 0 : -(vertexSize.height - frame.size));

            // 頂点
            var vertexSx = frame.srcSize + (sy > 0 ? 0 : vertexSize.width);
            this.bitmap.blt(
                srcImage,
                vertexSx, frame.srcSize, vertexSize.width, vertexSize.height,
                newDx, newDy, vertexSize.width, vertexSize.height
            );

            if (Const.debug) {
                this.bitmap.fillRect(newDx, newDy, vertexSize.width, vertexSize.height, 'rgba(255, 160, 160, 0.5)');
            }

            // 枠線の右側
            var rightWidth = frameWidth - (leftWidth + vertexSize.width);
            if (rightWidth > 0) {
                newDx += vertexSize.width;
                this.bitmap.blt(
                    srcImage,
                    baseSx, sy, frame.lineLength, frame.size,
                    newDx, dy, rightWidth, frame.size
                );
            }
        }

        // 左枠
        drawFrameV.call(this, frame.srcSize, x, y);

        // 右枠
        drawFrameV.call(this, frame.srcSize + frame.size + frame.lineLength, x + width - frame.size, y);

        // 上枠 + 頂点
        drawFrameH.call(
            this,
            0, x + frame.size, y,
            balloonPos === Const.balloonPosition.below
        );

        // 下枠 + 頂点
        drawFrameH.call(
            this,
            frame.size + frame.lineLength, x + frame.size, y + height - frame.size,
            balloonPos === Const.balloonPosition.above
        );
    };

    //-----------------------------------------------------------------------------
    // Sprite_Character

    /**
     * 同一のイベントか判定
     */
    Sprite_Character.prototype.isSameEvent = function (event) {
        if (this._character == null ||
            event == null ||
            !(this._character instanceof Game_Event)) {
            return false;
        }

        return this._character.eventId() === event.eventId();
    };

    //-----------------------------------------------------------------------------
    // Spriteset_Map

    /**
     * 指定されたイベントに対応するキャラクタースプライトを取得
     */
    Spriteset_Map.prototype.findCharacterSpriteByEvent = function (event) {
        var sameSprites = this._characterSprites.filter(function (sprite) {
            return sprite.isSameEvent(event);
        });

        if (sameSprites.length > 0) {
            return sameSprites[0];
        }
        else {
            return null;
        }
    };

    //-----------------------------------------------------------------------------
    // Window_MapActiveMessage
    //
    // マップ上でアクティブメッセージを表示するウィンドウ
    // (スプライトでも良いが、メッセージ周りはウィンドウの方が扱いやすい)

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

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

    // メッセージの一時描画バッファ
    Window_MapActiveMessage.tempMessageBuffer = null;

    /**
     * アクティブメッセージ用スキンの事前読み込み
     */
    Window_MapActiveMessage.preloadWindowskin = function () {
        ImageManager.loadSystem(Params.messageSkin);
    };

    Window_MapActiveMessage.prototype.initialize = function () {
        // コンテンツサイズは内容に応じて可変なので、ウィンドウサイズは仮
        Window_Base.prototype.initialize.call(this, 0, 0, 64, 64);

        if (Window_MapActiveMessage.tempMessageBuffer == null) {
            Window_MapActiveMessage.tempMessageBuffer =
                new Bitmap(Graphics.boxWidth, Graphics.boxHeight / 2);
        }

        this._balloonSprite = null;

        this.opacity = 0;
        this.contentsOpacity = 0;
        this.initMembers();
    };

    Window_MapActiveMessage.prototype.standardFontSize = function () {
        return Params.fontSize;
    };

    Window_MapActiveMessage.prototype.loadWindowskin = function () {
        // デフォルトのスキンの代わりに、アクティブメッセージ用のスキンを読み込む
        this._windowskin = ImageManager.loadSystem(Params.messageSkin);
    };

    /**
     * ウィンドウスキンを取得
     */
    Window_MapActiveMessage.prototype.getWindowSkin = function () {
        return this._windowskin;
    };

    Window_MapActiveMessage.prototype.initMembers = function () {
        this._textState = null;
        this._event = null;
        this._characterSprite = null;
        this._targetPageIndex = 0;
        this._duration = 0;
        this._isForceDisplay = false;
        this._balloonPosition = Const.balloonPosition.above;
    };

    Window_MapActiveMessage.prototype.show = function () {
        Window_Base.prototype.show.call(this);

        if (this._balloonSprite != null) {
            this._balloonSprite.show();
        }
    };

    Window_MapActiveMessage.prototype.hide = function () {
        this._duration = 0;

        Window_Base.prototype.hide.call(this);

        if (this._balloonSprite != null) {
            this._balloonSprite.hide();
        }
    };

    /**
     * フェードアウト
     */
    Window_MapActiveMessage.prototype.fadeOut = function () {
        if (this.isFadingOut()) {
            return;
        }

        if (this.isFadingIn()) {
            // フェードイン中は同じ不透明度からフェードアウトする
            this._duration = Params.displayDuration - this._duration;
        }
        else {
            this._duration = Params.fadeFrameCount;
        }
    };

    Window_MapActiveMessage.prototype.numVisibleRows = function () {
        return 4;
    };

    /**
     * 吹き出しスプライトの設定
     */
    Window_MapActiveMessage.prototype.setBalloonSprite = function (sprite) {
        sprite.setOwner(this);
        this._balloonSprite = sprite;

        // ウィンドウの裏に表示
        this.addChildAt(sprite, 0);
    };

    /**
     * イベントに対する吹き出しの表示位置を取得
     */
    Window_MapActiveMessage.prototype.getBalloonPosition = function () {
        return this._balloonPosition;
    };

    /**
     * メッセージ表示中か
     */
    Window_MapActiveMessage.prototype.isDisplaying = function () {
        return this._duration > 0;
    };

    /**
     * 強制表示されたか
     */
    Window_MapActiveMessage.prototype.isForced = function () {
        return this._isForceDisplay;
    };

    /**
     * フェードイン中か
     */
    Window_MapActiveMessage.prototype.isFadingIn = function () {
        return this._duration >= Params.displayDuration - Params.fadeFrameCount;
    };

    /**
     * フェードアウト中か
     */
    Window_MapActiveMessage.prototype.isFadingOut = function () {
        return this._duration < Params.fadeFrameCount;
    };

    /**
     * 表示中のイベントと同一イベントか
     */
    Window_MapActiveMessage.prototype.isSameEvent = function (event) {
        if (this._event == null) {
            return false;
        }

        // ページ番号まで同じ場合に同一と見なす
        if (this._event.eventId() === event.eventId() &&
            this._targetPageIndex === event.pageIndex()) {
            return true;
        }

        return false;
    };

    /**
     * イベントが画面内にあるか判定
     */
    Window_MapActiveMessage.prototype.isEventInScreen = function () {
        if (this._event == null) {
            return false;
        }

        var x = this._event.screenX();
        var y = this._event.screenY();
        return x >= 0 && y >= 0 && x <= Graphics.boxWidth && y <= Graphics.boxHeight;
    };

    /**
     * メッセージの表示開始
     *
     * @param {String}              text        '\n' 区切りのメッセージ
     * @param {Game_Event}          event       表示対象のイベント
     * @param {Sprite_Character}    sprite      表示対象のキャラクタースプライト
     * @param {boolean}             isForce     表示時間満了まで強制表示
     */
    Window_MapActiveMessage.prototype.display = function (text, event, sprite, isForce) {
        // 表示のキャンセル
        function rollback() {
            this.initMembers();
            this.hide();
        }

        if (text == null || event == null) {
            rollback.call(this);
            return;
        }

        this._event = event;
        this._characterSprite = sprite;
        if (!this.isEventInScreen()) {
            rollback.call(this);
            return;
        }

        // 表示パラメータの設定
        this._textState =
        {
            index: 0,
            text: this.convertEscapeCharacters(text)
        };
        this._allTextWidth = 0;
        this._targetPageIndex = event.pageIndex();
        this._duration = Params.displayDuration;
        this._isForceDisplay = !!isForce;

        this.newPage(this._textState);
        this.updatePosition();
        this.updateOpacity();
        this.refreshBalloon();

        this.show();

        // 多重表示抑止のため、表示済みフラグを立てる
        event.setMapActiveMessageShown(true);
    };

    /**
     * 新しいページの表示
     */
    Window_MapActiveMessage.prototype.newPage = function (textState) {
        // コンテンツを一時領域に書く
        this.contents = Window_MapActiveMessage.tempMessageBuffer;
        this.contents.clear();
        this.resetFontSettings();
        textState.x = this.newLineX();
        textState.y = 0;
        textState.left = this.newLineX();
        textState.height = this.calcTextHeight(textState, false);
        this._allTextHeight = this.calcTextHeight(textState, true);

        this.updateMessage();

        // コンテンツを一時領域から正式に反映
        this.createContents();
        this.contents.blt(
            Window_MapActiveMessage.tempMessageBuffer,
            0, 0, this._allTextWidth, this._allTextHeight,
            0, 0, this._allTextWidth, this._allTextHeight
        );
    };

    /**
     * メッセージの表示位置を設定
     */
    Window_MapActiveMessage.prototype.updatePosition = function () {
        if (this._event == null) {
            return;
        }

        // 画面外に出る場合は消去
        if (!this.isEventInScreen()) {
            this.hide();
            return;
        }

        // 吹き出しの枠ぶんのマージン
        var margin = Const.balloonFrameInfo.size;

        var balloonOffsetY = Const.balloonVertexSize.height
            - Params.balloonOffsetY
            - margin;
        var heightOffset = this.height
            + (this._characterSprite != null ? this._characterSprite.patternHeight() : $gameMap.tileHeight());

        // デフォルトの位置は上
        var x = this._event.screenX() - this.width / 2;
        var y = this._event.screenY() - (heightOffset + balloonOffsetY);
        this._balloonPosition = Const.balloonPosition.above;

        // 画面左右にははみ出させない
        x = Math.min(Math.max(x, margin), Graphics.boxWidth - this.width - margin);

        // 画面上側にはみ出る場合は下に表示
        if (y < margin) {
            y = this._event.screenY() + balloonOffsetY;
            this._balloonPosition = Const.balloonPosition.below;
        }

        // 画面下側にはみ出る場合は上に表示
        if (y + this.height > Graphics.boxHeight - margin) {
            y -= heightOffset + balloonOffsetY;
            this._balloonPosition = Const.balloonPosition.above;
        }

        this.x = x;
        this.y = y;

        if (this._balloonSprite != null) {
            // 吹き出しの頂点表示を考慮した位置に移動
            this._balloonSprite.followOwner();
        }
    };

    /**
     * ウィンドウのサイズを更新
     */
    Window_MapActiveMessage.prototype.updateWindowSize = function () {
        var offset = this.standardPadding() * 2;
        this.width = this._allTextWidth + offset;
        this.height = this._allTextHeight + offset;
    };

    /**
     * 不透明度の更新
     */
    Window_MapActiveMessage.prototype.updateOpacity = function () {
        var opacity = 255;
        if (this.isFadingIn()) {
            // フェードイン
            opacity = 255 * (Params.displayDuration - this._duration) / Params.fadeFrameCount;
        }
        else if (this.isFadingOut()) {
            // フェードアウト
            opacity = 255 * this._duration / Params.fadeFrameCount;
        }

        this.contentsOpacity = opacity;
        if (this._balloonSprite != null) {
            this._balloonSprite.opacity = opacity;
        }
    };

    /**
     * 吹き出しの再描画
     */
    Window_MapActiveMessage.prototype.refreshBalloon = function () {
        if (this._balloonSprite != null) {
            this._balloonSprite.refresh();
        }
    };

    /**
     * プレイヤーとの距離を確認
     */
    Window_MapActiveMessage.prototype.checkPlayerDistance = function () {
        // 強制表示 or 消去中は距離判定しない
        if (this.isForced() ||
            this._duration <= Params.fadeFrameCount) {
            return;
        }

        // 表示範囲外に出た場合は消す
        var distance = $gamePlayer.calcDistanceForMapActiveMessage(this._event);
        if (distance > Params.defaultRange) {
            this.fadeOut();
        }
    };

    Window_MapActiveMessage.prototype.update = function () {
        Window_Base.prototype.update.call(this);

        if (this._balloonSprite != null) {
            this._balloonSprite.update();
        }

        if (!this.isDisplaying()) {
            return;
        }

        this._duration--;
        this.updateOpacity();
        this.updatePosition();
        this.checkPlayerDistance();

        // 表示が終了したら初期化
        if (!this.isDisplaying()) {
            debuglog('[MapActiveMessage] Finished to display');
            this.initMembers();
        }
    };

    /**
     * メッセージの更新
     */
    Window_MapActiveMessage.prototype.updateMessage = function () {
        if (this._textState == null) {
            return false;
        }

        while (!this.isEndOfText(this._textState)) {
            this.processCharacter(this._textState);
            this._allTextWidth = Math.max(this._allTextWidth, this._textState.x);
        }

        this.updateWindowSize();

        return true;
    };

    /**
     * 吹き出しの頂点位置を取得
     */
    Window_MapActiveMessage.prototype.getBalloonVertexX = function () {
        if (this._event == null) {
            return 0;
        }

        return this._event.screenX()
            - this.x
            - Const.balloonFrameInfo.size
            - Const.balloonVertexSize.width / 2
            + Params.balloonMargin;
    };

    /**
     * 改行時の描画先 X 座標
     */
    Window_MapActiveMessage.prototype.newLineX = function () {
        return 0;
    };

    /**
     * 改行の処理
     */
    Window_MapActiveMessage.prototype.processNewLine = function (textState) {
        this._allTextWidth = Math.max(this._allTextWidth, textState.x);

        Window_Base.prototype.processNewLine.call(this, textState);
    };

    /**
     * 改ページの処理
     */
    Window_MapActiveMessage.prototype.processNewPage = function (textState) {
        Window_Base.prototype.processNewPage.call(this, textState);
        if (textState.text[textState.index] === '\n') {
            textState.index++;
        }

        textState.y = this.contents.height;
    };

    /**
     * テキスト終端か
     */
    Window_MapActiveMessage.prototype.isEndOfText = function (textState) {
        return textState.index >= textState.text.length;
    };

    /**
     * 改ページが必要か
     */
    Window_MapActiveMessage.prototype.needsNewPage = function (textState) {
        return (!this.isEndOfText(textState) &&
            textState.y + textState.height > this.contents.height);
    };

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

    var _Scene_Map_createAllWindows = Scene_Map.prototype.createAllWindows;
    Scene_Map.prototype.createAllWindows = function () {
        _Scene_Map_createAllWindows.call(this);

        this.createActiveMessageWindow();
    };

    /**
     * アクティブメッセージウィンドウの作成
     */
    Scene_Map.prototype.createActiveMessageWindow = function () {
        if (this._activeMessageWindowLayer != null) {
            return;
        }

        var width = Graphics.boxWidth;
        var height = Graphics.boxHeight;
        var x = (Graphics.width - width) / 2;
        var y = (Graphics.height - height) / 2;
        this._activeMessageWindowLayer = new WindowLayer();
        this._activeMessageWindowLayer.move(x, y, width, height);
        this.addChild(this._activeMessageWindowLayer);

        Window_MapActiveMessage.preloadWindowskin();
    };

    var _Scene_Map_update = Scene_Map.prototype.update;
    Scene_Map.prototype.update = function () {
        _Scene_Map_update.call(this);

        this.updateActiveMessageDisplay();
    };

    var _Scene_Map_stop = Scene_Map.prototype.stop;
    Scene_Map.prototype.stop = function () {
        _Scene_Map_stop.call(this);

        $gameTemp.clearMapActiveMessage();
    };

    var _Scene_Map_terminate = Scene_Map.prototype.terminate;
    Scene_Map.prototype.terminate = function () {
        _Scene_Map_terminate.call(this);

        this.destroyActiveMessageWindows();
    };

    /**
     * アクティブメッセージウィンドウの破棄
     */
    Scene_Map.prototype.destroyActiveMessageWindows = function () {
        this._activeMessageWindowLayer.removeChildren();
        this.removeChild(this._activeMessageWindowLayer);
        this._activeMessageWindowLayer = null;
    };

    /**
     * アクティブメッセージの表示を更新
     */
    Scene_Map.prototype.updateActiveMessageDisplay = function () {
        if (!$gameSystem.isMapActiveMessageEnabled() ||
            $gameMap.isEventRunning()) {
            // メッセージを表示できないときは非表示にしつつ各種フラグを解除
            $gameTemp.clearMapActiveMessage();
            $gameMap.clearActiveMessageShownFlags();
            this._activeMessageWindowLayer.children.forEach(function (child) {
                child.fadeOut();
            });
            return;
        }

        // 表示が完了したものを削除
        this._activeMessageWindowLayer.children.filter(function (child) {
            return !child.isDisplaying();
        }).forEach(function (item) {
            this._activeMessageWindowLayer.removeChild(item);
        }, this);

        // 要求されているメッセージを表示できるだけ表示
        while ($gameTemp.isMapActiveMessageReady()) {
            if (!this.displayActiveMessage()) {
                break;
            }
        }
    };

    /**
     * 指定されたイベントのアクティブメッセージが表示されているか判定
     */
    Scene_Map.prototype.isActiveMessageDisplayed = function (event) {
        var layer = this._activeMessageWindowLayer;
        for (var i = 0; i < layer.children.length; i++) {
            var window = layer.children[i];
            if (window.isDisplaying() && window.isSameEvent(event)) {
                return true;
            }
        }

        return false;
    };

    /**
     * アクティブメッセージの表示
     */
    Scene_Map.prototype.displayActiveMessage = function () {
        var layer = this._activeMessageWindowLayer;

        // 最大数に達していたら表示を諦める
        // (children には吹き出しも含まれるので / 2)
        if (layer.children.length / 2 >= Params.messageCountMax) {
            return false;
        }

        // 予約されているメッセージを表示
        var message = $gameTemp.popNextMapActiveMessage();
        while (message != null) {
            // まだ表示していないもののみ表示
            if (!this.isActiveMessageDisplayed(message.event)) {
                var character = this._spriteset.findCharacterSpriteByEvent(message.event);
                var balloon = new Sprite_MapActiveMessageBalloon();
                var window = new Window_MapActiveMessage();
                window.setBalloonSprite(balloon);
                window.display(
                    message.text.replace(/_/g, ' '),
                    message.event,
                    character,
                    message.isForced);
                layer.addChild(window);
            }

            message = $gameTemp.popNextMapActiveMessage();
        }

        return true;
    };

    var _Scene_Map_snapForBattleBackground = Scene_Map.prototype.snapForBattleBackground;
    Scene_Map.prototype.snapForBattleBackground = function () {
        // アクティブメッセージはキャプチャしない
        var layer = this._activeMessageWindowLayer;
        if (layer != null) {
            layer.visible = false;
        }

        _Scene_Map_snapForBattleBackground.call(this);

        if (layer != null) {
            layer.visible = true;
        }
    };

})();


code:
//=============================================================================
// レベル制限装備 / requiredLevelEquipment.js
//=============================================================================

/*:ja
 * v0.5.0
 * @plugindesc レベルが足りないと装備できない武器防具を作成する
 * @author Declare War
 *
 * @help このプラグインには、プラグインコマンドはありません。
 *
 * 武器、防具のメモ:
 *   <requiredLevel:n>       # 装備に必要なレベル
 */

/*:en
 * @plugindesc required level equipment
 * @author Declare War
 *
 * @help This plugin does not provide plugin commands.
 *
 * Weapon, Armor Note:
 *   <requiredLevel:n>       # required level
 */

(function () {
	// Game_BattlerBase
	// canEquip #a
	var _Game_BattlerBase_canEquip = Game_BattlerBase.prototype.canEquip;
	Game_BattlerBase.prototype.canEquip = function (item) {
		if (_Game_BattlerBase_canEquip.call(this, item)) {
			if (this.level >= Number(item.meta.requiredLevel || 0)) {
				return true;
			} else {
				return false;
			}
		} else {
			return false;
		}
	};

})();

repo_name: dazed/translations

license: unknown


code:
//=============================================================================
// LoadComSim.js
//=============================================================================

/*:ja
 * @plugindesc ver1.00 メニューコマンドにロードを追加します。
 * @author まっつＵＰ
 *
 * @param loadtext
 * @desc コマンド「ロード」のコマンド名です。
 * @default ロード
 *
 * @help
 *
 * RPGで笑顔を・・・
 *
 * このヘルプとパラメータの説明をよくお読みになってからお使いください。
 *
 * コマンド「ロード」はイベントテスト中またはセーブデータがないときは選択不能になります。
 *
 * このプラグインを利用する場合は
 * readmeなどに「まっつＵＰ」の名を入れてください。
 * また、素材のみの販売はダメです。
 * 上記以外の規約等はございません。
 * もちろんツクールMVで使用する前提です。
 * 何か不具合ありましたら気軽にどうぞ。
 *
 * 免責事項：
 * このプラグインを利用したことによるいかなる損害も制作者は一切の責任を負いません。
 *
 */

(function () {

    var parameters = PluginManager.parameters('LoadComSim');
    var LCSloadtext = String(parameters['loadtext'] || 'ロード');

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

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

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

    Window_MenuCommand.prototype.isLoadEnabled = function () { //新規
        if (DataManager.isEventTest()) return false; //この行はイベントテスト中かどうか判定しています。
        return DataManager.isAnySavefileExists();
    };

})();


code:
//=============================================================================
// MOG_ActorPictureCM.js
//=============================================================================

/*:
 * @plugindesc (v2.3) Apresenta a imagem do personagem durante a seleção de comandos.
 * @author Moghunter
 *
 * @param Slide Speed
 * @desc Definição da velocidade de deslize.
 * @default 10
 *
 * @param File Name
 * @desc Definição do nome do arquivo.
 * @default Actor_
 *
 * @param ----------------
 *
 * @param Bust Visible
 * @desc Ativar a imagem secundaria do personagem.
 * @default true
 *
 * @param Bust X-Axis
 * @desc Definição da posição Y-axis da imagem.
 * @default 0
 *
 * @param Bust Y-Axis
 * @desc Definição da posição Y-axis da imagem.
 * @default 0
 *
 * @param Bust Slide X
 * @desc Definição de deslize X-Axis.
 * @default -150
 *
 * @param Bust Slide Y
 * @desc Definição de deslize Y-Axis.
 * @default 0
 *
 * @param Breath Effect
 * @desc Ativar respiração de respiração.
 * @default true
 *
 * @param Blink Effect
 * @desc Ativar o efeito de piscar.
 * @default false
 *
 * @param Blink Speed
 * @desc Velocidade de piscar.
 * @default 7
 *
 * @param Blinking Interval
 * @desc Intervalo de para piscar.
 * @default 190
 *
 * @param ----------------
 *
 * @param Face Visible
 * @desc Ativar a imagem primaria do personagem.
 * @default true
 *
 * @param Face X-Axis
 * @desc Definição da posição X-axis da imagem.
 * @default 570
 *
 * @param Face Y-Axis
 * @desc Definição da posição Y-axis da imagem.
 * @default 0
 *
 * @param Face Slide X
 * @desc Definição de deslize X-Axis.
 * @default 150
 *
 * @param Face Slide Y
 * @desc Definição de deslize Y-Axis.
 * @default 0
 *
 * @help
 * =============================================================================
 * +++ MOG - Actor Picture CM (v2.3) +++
 * By Moghunter
 * https://atelierrgss.wordpress.com/
 * =============================================================================
 * Apresenta a imagem do personagem durante a seleção de comandos.
 * As imagens dos personagens devem ser gravadas na pasta. /img/actor_picture_cm/
 * A nomeação dos arquivos devem ser feitas da seguinte forma.
 *
 * Actor_ + ID + _bust.png
 *
 * Exemplo
 *
 * Actor_1_bust.png
 * Actor_2_bust.png
 * Actor_3_bust.png
 *
 * ---------------------------------------------------------------------------------------
 *
 * Para definir a imagem secundária do personagem nomeie o arquivo da seguinte
 * forma.
 *
 * Actor_ ID + _sub.png
 *
 * Exemplo
 *
 * Actor_1_sub.png
 * Actpr_2_sub.png
 * ...
 *
 * ---------------------------------------------------------------------------------------
 *
 * Para definir a imagem dos olhos nomeie o arquivo da seguinte forma.
 *
 * Actor_ ID + _eyes.png
 *
 * Exemplo
 *
 * Actor_1_eyes.png
 * Actpr_2_eyes.png
 * ...
 *
 * =============================================================================
 * PLUGIN COMMAND
 * =============================================================================
 * Se desejar mudar a imagem do arquivo de imagem no meio do jogo utilize o
 * commando abaixo
 *
 * actorCM_fileName : ACTOR_ID : FILE_NAME
 *
 * EG
 *
 * actorCM_fileName : 1 : ActorAwaked_5
 *
 * =============================================================================
 * Para ativar ou desativar o efeito de respiração utilize o plugin
 * command abaixo
 *
 * actorCM_breathEffect : ACTOR_ID : ENABLE
 *
 * EG
 *
 * actorCM_breathEffect : 1 : true
 *
 * =============================================================================
 * HISTÓRICOS
 * =============================================================================
 * (v2.3) - Adição do efeito de respiração.
 *        - Adição do efeito de piscar.
 *        - Diretório de imagem separado.
 * (v2.2) - Melhoria na codificação e na compatibilidade de plugins.
 * (v2.1) - Adicionado a opção de mudar o nome do arquivo através do
 *          plugin command.
 * (v2.0) - Plugin reescrito por completo, melhoria na codificação.
 *        - Adicionado novas opções de plugin parameters.
 */

//=============================================================================
// ** PLUGIN PARAMETERS
//=============================================================================

//=============================================================================
// ** PLUGIN PARAMETERS
//=============================================================================
var Imported = Imported || {};
Imported.MOG_ActorPictureCM = true;
var Moghunter = Moghunter || {};

Moghunter.parameters = PluginManager.parameters('MOG_ActorPictureCM');
Moghunter.actor_slideSpeed = Number(Moghunter.parameters['Slide Speed'] || 10);
Moghunter.actor_fileName = String(Moghunter.parameters['File Name'] || "Actor_");
Moghunter.actor_cm1_visible = String(Moghunter.parameters['Face Visible'] || "true");
Moghunter.actor_cm1_slideX = Number(Moghunter.parameters['Face Slide X'] || 150);
Moghunter.actor_cm1_slideY = Number(Moghunter.parameters['Face Slide Y'] || 0);
Moghunter.actor_cm1_x = Number(Moghunter.parameters['Face X-Axis'] || 570);
Moghunter.actor_cm1_y = Number(Moghunter.parameters['Face Y-Axis'] || 0);
Moghunter.actor_cm2_visible = String(Moghunter.parameters['Bust Visible'] || "true");
Moghunter.actor_cm2_slideX = Number(Moghunter.parameters['Bust Slide X'] || -150);
Moghunter.actor_cm2_slideY = Number(Moghunter.parameters['Bust Slide Y'] || 0);
Moghunter.actor_cm2_x = Number(Moghunter.parameters['Bust X-Axis'] || 0);
Moghunter.actor_cm2_y = Number(Moghunter.parameters['Bust Y-Axis'] || 0);
Moghunter.actor_cm2_breathEffect = String(Moghunter.parameters['Breath Effect'] || "true");

Moghunter.actor_cm3_visible = String(Moghunter.parameters['Blink Effect'] || "true");
Moghunter.actor_cm3_blinkS = Number(Moghunter.parameters['Blink Speed'] || 5);
Moghunter.actor_cm3_blinkD = Number(Moghunter.parameters['Blinking Interval'] || 180);

//=============================================================================
// ** ImageManager
//=============================================================================

//==============================
// * Actor Hud
//==============================
ImageManager.loadActorpicCM = function (filename) {
	return this.loadBitmap('img/actor_picture_cm/', filename, 0, true);
};

//=============================================================================
// ** Game_Temp
//=============================================================================

//==============================
// * Initialize
//==============================
var _alias_mog_actorcm_temp_initialize = Game_Temp.prototype.initialize;
Game_Temp.prototype.initialize = function () {
	_alias_mog_actorcm_temp_initialize.call(this);
	this._actorCmData = [false, false, true];
};

//=============================================================================
// ** Game Interpreter
//=============================================================================

//==============================
// * PluginCommand
//==============================
var _mog_actorCM_gint_pluginCommand = Game_Interpreter.prototype.pluginCommand
Game_Interpreter.prototype.pluginCommand = function (command, args) {
	_mog_actorCM_gint_pluginCommand.call(this, command, args)
	if (command === "actorCM_fileName") { this.setActorCM(args) };
	if (command === "actorCM_breathEffect") { this.setActorBreathEffect(args) };
	return true;
};

//==============================
// * Set Actor CM
//==============================
Game_Interpreter.prototype.setActorCM = function (args) {
	var id = Number(args[1]);
	var fileName = String(args[3]);
	for (var i = 0; i < $gameParty.members().length; i++) {
		var actor = $gameParty.members()[i];
		if (actor._actorId === id) {
			if (actor) { actor.setActorCMNAme(fileName) };
		};
	};
};

//==============================
// * Set Actor Breath Effect
//==============================
Game_Interpreter.prototype.setActorBreathEffect = function (args) {
	var id = Number(args[1]);
	var enable = String(args[3]) == "true" ? true : false;
	for (var i = 0; i < $gameParty.members().length; i++) {
		var actor = $gameParty.members()[i];
		if (actor._actorId === id) {
			if (actor) { actor.setActorCMbreathEffect(enable) };
		};
	};
};

//=============================================================================
// ** Game_Actor
//=============================================================================

//==============================
// * Initialize
//==============================
var _mog_actorcm_gactor_initMembers = Game_Actor.prototype.initMembers;
Game_Actor.prototype.initMembers = function () {
	_mog_actorcm_gactor_initMembers.call(this);
	var breathEffect = String(Moghunter.actor_cm2_breathEffect) == "true" ? true : false;
	this._actorCMData = ["", 0, 0, breathEffect];
};

//==============================
// * Setup
//==============================
var _mog_actorcm_gactor_setup = Game_Actor.prototype.setup;
Game_Actor.prototype.setup = function (actorId) {
	_mog_actorcm_gactor_setup.call(this, actorId);
	this._actorCMData[0] = String(Moghunter.actor_fileName) + this._actorId;
};

//==============================
// * set Actor CMNAme
//==============================
Game_Actor.prototype.setActorCMNAme = function (fileName) {
	this._actorCMData[0] = String(fileName);
};

//==============================
// * set Actor CM Breath Effect
//==============================
Game_Actor.prototype.setActorCMbreathEffect = function (enable) {
	this._actorCMData[3] = enable;
};

//=============================================================================
// ** Scene Base
//=============================================================================

//==============================
// ** create Hud Field
//==============================
Scene_Base.prototype.createHudField = function () {
	this._hudField = new Sprite();
	this._hudField.z = 10;
	this.addChild(this._hudField);
};

//==============================
// ** sort MZ
//==============================
Scene_Base.prototype.sortMz = function () {
	this._hudField.children.sort(function (a, b) { return a.mz - b.mz });
};

//=============================================================================
// ** Scene Battle
//=============================================================================

//==============================
// ** create Spriteset
//==============================
var _mog_actorPicCM_sbattle_createSpriteset = Scene_Battle.prototype.createSpriteset;
Scene_Battle.prototype.createSpriteset = function () {
	_mog_actorPicCM_sbattle_createSpriteset.call(this);
	if (!this._hudField) { this.createHudField() };
	this.createActorCM();
	this.sortMz();
};

//==============================
// * Create Actor CM
//==============================
Scene_Battle.prototype.createActorCM = function () {
	this.actorPictureCM = new Actor_CMPicture();
	this.actorPictureCM.mz = 105;
	this._hudField.addChild(this.actorPictureCM);
};

//=============================================================================
// * Actor_CMPicture
//=============================================================================
function Actor_CMPicture() {
	this.initialize.apply(this, arguments);
};

Actor_CMPicture.prototype = Object.create(Sprite.prototype);
Actor_CMPicture.prototype.constructor = Actor_CMPicture;

//==============================
// * Initialize
//==============================
Actor_CMPicture.prototype.initialize = function () {
	Sprite.prototype.initialize.call(this);
	this._actor = null;
	this._CmName = null;
	this._breahEffect = false;
	$gameTemp._actorCmData = [false, false, true];
	this._cm1 = String(Moghunter.actor_cm1_visible) === "true" ? true : false;
	this._cm2 = String(Moghunter.actor_cm2_visible) === "true" ? true : false;
	this._cm3 = String(Moghunter.actor_cm3_visible) === "true" ? true : false;
	this._sldSpd = Math.min(Math.max(Moghunter.actor_slideSpeed, 1), 999);
	if (this._cm1) { this.createCM1() };
	if (this._cm2) { this.createCM2() };
	if (this._cm3) { this.createCM3() };
};

//==============================
// * is Visible
//==============================
Actor_CMPicture.prototype.isVisible = function () {
	if (!$gameTemp._actorCmData[2]) { return false };
	return $gameTemp._actorCmData[0];
};

//==============================
// * create CM1
//==============================
Actor_CMPicture.prototype.createCM1 = function () {
	this._supSprite = new Sprite();
	this._supSprite.visible = false;
	this._supSpriteData = null;
	this.addChild(this._supSprite);
};

//==============================
// * create CM2
//==============================
Actor_CMPicture.prototype.createCM2 = function () {
	this._bust = new Sprite();
	this._bust.anchor.x = 0.5;
	this._bust.anchor.y = 1.0;
	this._bust.visible = false;
	this._bustData = null;
	this.addChild(this._bust);
};

//==============================
// * create CM3
//==============================
Actor_CMPicture.prototype.createCM3 = function () {
	this._eyes = new Sprite();
	this._eyes.anchor.x = 0.5;
	this._eyes.anchor.y = 1.0;
	this._eyes.visible = false;
	this.addChild(this._eyes);
};

//==============================
// * Hide Sprites
//==============================
Actor_CMPicture.prototype.hideSprites = function () {
	if (this._supSprite) { this._supSprite.visible = false };
	if (this._bust) { this._bust.visible = false };
};

//==============================
// * move To
//==============================
Actor_CMPicture.prototype.moveto = function (value, real_value) {
	if (value == real_value) { return value };
	var dnspeed = 2 + (Math.abs(value - real_value) / this._sldSpd);
	if (value > real_value) {
		value -= dnspeed;
		if (value < real_value) { value = real_value };
	}
	else if (value < real_value) {
		value += dnspeed;
		if (value > real_value) { value = real_value };
	};
	return Math.floor(value);
};

//==============================
// * File Name Real
//==============================
Actor_CMPicture.prototype.fileNameReal = function () {
	if (!this._actor) { return "" };
	return this._actor._actorCMData[0];
};

//==============================
// * FileName
//==============================
Actor_CMPicture.prototype.fileName = function () {
	return String(this._CmName);
};

//==============================
// * Need Refresh Actor
//==============================
Actor_CMPicture.prototype.refreshActor = function () {
	this._actor = BattleManager.actor();
	if (this._actor) { this.refreshSprites() };
};

//==============================
// * refresh Bitmap CM1
//==============================
Actor_CMPicture.prototype.refreshBitmapCM1 = function () {
	var fileName = this.fileName() + "_sup"
	this._supSprite.bitmap = ImageManager.loadActorpicCM(fileName);
	this._supSprite.visible = false;
	this._supSpriteData = null;
};

//==============================
// * refresh Bitmap CM2
//==============================
Actor_CMPicture.prototype.refreshBitmapCM2 = function () {
	//アクターのIDを取得し、アクターIDが２０以下なら脱衣などの差分を作る。
	//アクターIDが９番未満なら一桁、それ以降なら二桁の数字を取る
	if (isNaN(this.fileName().slice(-2))) {
		var actorNum = Number(this.fileName().slice(-1));
	} else {
		var actorNum = Number(this.fileName().slice(-2));
	}
	if (actorNum < 21) {
		var fileName = this.fileName();
		//HPが50%以上の場合「1」50%未満25%以上の場合[2]それ未満の場合[3]を入れる
		if ($gameActors.actor(actorNum).hp > $gameActors.actor(actorNum).mhp * 0.5) {
			fileName += "_1";
		} else if ($gameActors.actor(actorNum).hp > $gameActors.actor(actorNum).mhp * 0.25) {
			fileName += "_2";
		} else {
			fileName += "_3";
		}
		//ステート12の場合は「2」,13の場合は「3」、どちらでもない場合は「1」を入れる
		if ($gameActors.actor(actorNum).isStateAffected(13)) {
			fileName += "3";
		} else if ($gameActors.actor(actorNum).isStateAffected(12)) {
			fileName += "2";
		} else {
			fileName += "1";
		}
		//ステート14の場合は「2」,15の場合は「3」、どちらでもない場合は「1」を入れる
		if ($gameActors.actor(actorNum).isStateAffected(15)) {
			fileName += "3";
		} else if ($gameActors.actor(actorNum).isStateAffected(14)) {
			fileName += "2";
		} else {
			fileName += "1";
		}
		//ステート22の場合は「2」そうでない場合は「1」を入れる
		if ($gameActors.actor(actorNum).isStateAffected(22)) {
			fileName += "2";
		} else {
			fileName += "1";
		}
		fileName += "_bust";
	} else {
		var fileName = this.fileName() + "_bust";
	}

	this._bust.bitmap = ImageManager.loadActorpicCM(fileName);
	this._bust.visible = false;
	this._bust.zoom = {}
	this._bust.zoom.speed = 0.0004;
	this._bust.zoom.maxScale = 0.008;
	this._bust.zoom.phase = 0;
	this._bust.zoom.y = 0;
	this._breahEffect = false;
	this._bustData = null;
	if (this._eyes) { this.refreshBitmapCM3() };
};

//==============================
// * refresh Bitmap CM3
//==============================
Actor_CMPicture.prototype.refreshBitmapCM3 = function () {
	var fileName = this.fileName() + "_eyes";
	this._eyes.bitmap = ImageManager.loadActorpicCM(fileName);
	this._eyes.visible = false;
};

//==============================
// * refresh Sprites
//==============================
Actor_CMPicture.prototype.refreshSprites = function () {
	this._CmName = this._actor ? this._actor._actorCMData[0] : null;
	if (this._supSprite) { this.refreshBitmapCM1() };
	if (this._bust) { this.refreshBitmapCM2() };
};

//==============================
// * Need Refresh Actor
//==============================
Actor_CMPicture.prototype.needRefreshActor = function () {
	if ($gameTemp._actorCmData[1]) { return true };
	if (BattleManager.actor() != this._actor) { return true };
	if (this._actor && this._CmName != this._actor._actorCMData[0])
		return false;
};

//==============================
// * get Data CM1
//==============================
Actor_CMPicture.prototype.getDataCM1 = function () {
	this._supSpriteData = [this._supSprite.bitmap.width, this._supSprite.bitmap.height,
	Moghunter.actor_cm1_x, Moghunter.actor_cm1_y, 0, 0, true,
	Moghunter.actor_cm1_slideX, Moghunter.actor_cm1_slideY
	];
	this._supSprite.visible = true;
	this._supSprite.opacity = 0;
	this._supSprite.x = this._supSpriteData[6] ? this._supSpriteData[2] + this._supSpriteData[7] : this._supSpriteData[2];
	this._supSprite.y = this._supSpriteData[6] ? this._supSpriteData[3] + this._supSpriteData[8] : this._supSpriteData[3];
};

//==============================
// * Update CM1
//==============================
Actor_CMPicture.prototype.updateCM1 = function () {
	if (!this.isVisible()) {
		this._supSpriteData[4] = this._supSpriteData[2] + this._supSpriteData[7];
		this._supSpriteData[5] = this._supSpriteData[3] + this._supSpriteData[8];
		this._supSprite.opacity -= 15;
	} else {
		this._supSpriteData[4] = this._supSpriteData[2];
		this._supSpriteData[5] = this._supSpriteData[3];
		this._supSprite.opacity += 15;
	};
	this._supSprite.x = this.moveto(this._supSprite.x, this._supSpriteData[4]);
	this._supSprite.y = this.moveto(this._supSprite.y, this._supSpriteData[5]);
};

//==============================
// * need Get Data 1
//==============================
Actor_CMPicture.prototype.needGetData1 = function () {
	if (!this._supSprite) { return false };
	if (this._supSpriteData) { return false };
	if (!this._supSprite.bitmap) { return false };
	if (!this._supSprite.bitmap.isReady()) { return false };
	return true;
};

//==============================
// * get Data CM2
//==============================
Actor_CMPicture.prototype.getDataCM2 = function () {
	this._bustData = [this._bust.bitmap.width, this._bust.bitmap.height,
	Moghunter.actor_cm2_x, Moghunter.actor_cm2_y, 0, 0, true,
	Moghunter.actor_cm2_slideX, Moghunter.actor_cm2_slideY,
		0, 0, 0];
	this._bust.visible = true;
	this._bust.opacity = 0;
	this._bustData[2] = Moghunter.actor_cm2_x + (Graphics.boxWidth / 2);
	this._bustData[3] = Moghunter.actor_cm2_y + Graphics.boxHeight;
	this._bust.x = this._bustData[6] ? this._bustData[2] + this._bustData[7] : this._bustData[2];
	this._bust.y = this._bustData[6] ? this._bustData[3] + this._bustData[8] : this._bustData[3];
	this._breahEffect = this._actor._actorCMData[3];
	if (this._eyes) { this.getDataCM3() };
};

//==============================
// * get Data CM 3
//==============================
Actor_CMPicture.prototype.getDataCM3 = function () {
	this._eyesData = {};
	this._eyesData.index = 0;
	this._eyesData.speed = 0;
	this._eyesData.motionM = Number(Moghunter.actor_cm3_blinkS);
	this._eyesData.blinkD = Number(Moghunter.actor_cm3_blinkD)
	this._eyesData.duration = Math.randomInt(60) + 60;
	this._eyesData.cw = this._eyes.bitmap.width / 2;
	this._eyesData.ch = this._eyes.bitmap.height;
	this.refreshFrame(this._eyes, -1);
};

//==============================
// * update Blink
//==============================
Actor_CMPicture.prototype.updateBlink = function () {
	if (this._eyesData.duration <= 0) {
		this._eyesData.speed++;
		if (this._eyesData.speed < this._eyesData.motionM) { return }
		this._eyesData.speed = 0;
		this._eyesData.index++;
		if (this._eyesData.index > 1) {
			this._eyesData.index = -1
			this._eyesData.duration = Math.randomInt(160) + this._eyesData.blinkD;
		};
		this.refreshFrame(this._eyes, this._eyesData.index);
	} else {
		this._eyesData.duration--;
	}
};

//==============================
// * refresh Frame
//==============================
Actor_CMPicture.prototype.refreshFrame = function (sprite, index) {
	var cw = this._eyesData.cw;
	var ch = this._eyesData.ch;
	var fr = cw * index;
	sprite.setFrame(fr, 0, cw, ch)
};

//==============================
// *  update CM3
//==============================
Actor_CMPicture.prototype.updateCM3 = function () {
	this.updateBlink();
	this._eyes.visible = this._bust.visible;
	this._eyes.opacity = this._bust.opacity;
	this._eyes.x = this._bust.x;
	this._eyes.y = this._bust.y;
	this._eyes.scale.x = this._bust.scale.x;
	this._eyes.scale.y = this._bust.scale.y;
};

//==============================
// * breathSpeed
//==============================
Actor_CMPicture.prototype.breathSpeed = function () {
	return 0.000225;
};

//==============================
// * Update CM2
//==============================
Actor_CMPicture.prototype.updateCM2 = function () {
	if (!this.isVisible()) {
		this._bustData[4] = this._bustData[2] + this._bustData[7];
		this._bustData[5] = this._bustData[3] + this._bustData[8];
		this._bust.opacity -= 15;
	} else {
		this._bustData[4] = this._bustData[2];
		this._bustData[5] = this._bustData[3];
		this._bust.opacity += 15;
	};
	this._bust.x = this.moveto(this._bust.x, this._bustData[4]);
	this._bust.y = this.moveto(this._bust.y, this._bustData[5]);
	if (this._breahEffect && this._bust.opacity > 0) { this.updateBreathEffect() };
	if (this._eyes) { this.updateCM3() };
};

//==============================
// * Update Breath Effect
//==============================
Actor_CMPicture.prototype.updateBreathEffect = function () {
	this._bust.zoom.speed = this.breathSpeed();
	if (this._bust.zoom.phase === 0) {
		this._bust.zoom.y += this._bust.zoom.speed
		if (this._bust.zoom.y >= this._bust.zoom.maxScale) {
			this._bust.zoom.y = this._bust.zoom.maxScale;
			this._bust.zoom.phase = 1;
		};
	} else {
		this._bust.zoom.y -= this._bust.zoom.speed
		if (this._bust.zoom.y <= 0) {
			this._bust.zoom.y = 0;
			this._bust.zoom.phase = 0;
		};
	};
	this._bust.scale.y = 1.00 + this._bust.zoom.y;
};

//==============================
// * need Get Data 2
//==============================
Actor_CMPicture.prototype.needGetData2 = function () {
	if (!this._bust) { return false };
	if (this._bustData) { return false };
	if (!this._bust.bitmap) { return false };
	if (!this._bust.bitmap.isReady()) { return false };
	return true;
};

//==============================
// * Update
//==============================
Actor_CMPicture.prototype.update = function () {
	Sprite.prototype.update.call(this);
	if (this.needRefreshActor()) { this.refreshActor() };
	if (this.needGetData1()) { this.getDataCM1() };
	if (this.needGetData2()) { this.getDataCM2() };
	if (this._supSpriteData) { this.updateCM1() };
	if (this._bustData) { this.updateCM2() };
};

//=============================================================================
// * Scene Battle
//=============================================================================

//==============================
// * Update
//==============================
var _alias_mog_actorcm_scbat_update = Scene_Battle.prototype.update;
Scene_Battle.prototype.update = function () {
	_alias_mog_actorcm_scbat_update.call(this);
	$gameTemp._actorCmData[0] = this.sprite_actor_cm_visible();
};

//==============================
// * Sprite Actor CM Visible
//==============================
Scene_Battle.prototype.sprite_actor_cm_visible = function () {
	if (!BattleManager.actor()) { return false };
	if (this._actorWindow.active) { return false };
	if (this._enemyWindow.active) { return false };
	if (this._partyCommandWindow.active) { return false };
	if (!BattleManager.isInputting()) { return false };
	return true;
};


code:
//===========================================================================
// MPI_ModestyPicture.js
//===========================================================================

/*:
 * @plugindesc プレイヤーと重なったピクチャを半透明表示にします。
 * @author 奏ねこま（おとぶき ねこま）
 *
 * @param 半透明にするピクチャ番号
 * @desc プレイヤーと重なったときに半透明にするピクチャの番号を指定してください。カンマ区切りで複数指定できます。
 * @default
 *
 * @param 重なり判定-A
 * @desc 重なり判定-Aを有効にする場合は true を、無効にする場合は false を指定してください。
 * @default true
 *
 * @param 重なり判定-B
 * @desc 重なり判定-Bを有効にする場合は true を、無効にする場合は false を指定してください。
 * @default true
 *
 * @param 重なり判定-C
 * @desc 重なり判定-Cを有効にする場合は true を、無効にする場合は false を指定してください。
 * @default true
 *
 * @param 判定周期
 * @desc 重なり判定を何フレーム毎に行うかを指定してください。
 * @default 4
 *
 * @param 不透明度
 * @desc プレイヤーと重なったときの不透明度を指定してください。[0-255]
 * @default 64
 *
 * @param 変化量
 * @desc 半透明になる際の不透明度の変化量を指定してください。値が大きいほど早く半透明になります。
 * @default 16
 *
 * @help
 * [ 概要 ] ...
 *  指定した番号のピクチャがプレイヤーと重なったとき、半透明表示にします。
 *
 * [ 重なり判定 ] ...
 *  重なり判定ｰA：プレイヤー画像の四隅の座標を判定します。
 *  重なり判定ｰB：プレイヤー画像の上下左右の座標を判定します。
 *  重なり判定ｰC：プレイヤー画像の中心の座標を判定します。
 *
 *   ■重なり判定ｰA  ■重なり判定-B  ■重なり判定-C
 *   ●○○○○○●  ○○○●○○○  ○○○○○○○
 *   ○○○○○○○  ○○○○○○○  ○○○○○○○
 *   ○○○○○○○  ●○○○○○●  ○○○●○○○
 *   ○○○○○○○  ○○○○○○○  ○○○○○○○
 *   ●○○○○○●  ○○○●○○○  ○○○○○○○
 *
 * [ プラグインコマンド ] ...
 *  プラグインコマンドはありません。
 *
 * [ 利用規約 ] ................................................................
 *  ・本プラグインの利用は、RPGツクールMV/RPGMakerMVの正規ユーザーに限られます。
 *  ・商用、非商用、有償、無償、一般向け、成人向けを問わず、利用可能です。
 *  ・利用の際、連絡や報告は必要ありません。また、製作者名の記載等も不要です。
 *  ・プラグインを導入した作品に同梱する形以外での再配布、転載はご遠慮ください。
 *  ・不具合対応以外のサポートやリクエストは、基本的に受け付けておりません。
 *  ・本プラグインにより生じたいかなる問題についても、一切の責任を負いかねます。
 * [ 改訂履歴 ] ................................................................
 *   Version 1.01  2017/01/20  処理の軽量化
 *                             重なり判定条件をプラグインパラメータ化
 *                             茂み属性のタイル上で半透明にならない問題を修正
 *   Version 1.00  2017/01/11  First edition.
 * -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
 *  Web Site: http://makonet.sakura.ne.jp/rpg_tkool/
 *  Twitter : https://twitter.com/koma_neko
 *  Copylight (c) 2017 Nekoma Otobuki
 */

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

var Makonet = Makonet || {};
Makonet.MPC = {};

(function () {
    'use strict';

    var MPD = Makonet.MPC;
    MPD.product = 'MPI_ModestyPicture';
    MPD.parameters = PluginManager.parameters(MPD.product);

    MPD.picture = MPD.parameters['半透明にするピクチャ番号'].trim().split(/ *, */).map(function (value) { return +value });
    MPD.check1 = MPD.parameters['重なり判定-A'].trim().toLowerCase() === 'true';
    MPD.check2 = MPD.parameters['重なり判定-B'].trim().toLowerCase() === 'true';
    MPD.check3 = MPD.parameters['重なり判定-C'].trim().toLowerCase() === 'true';
    MPD.cycle = +MPD.parameters['判定周期'];
    MPD.opacity = +MPD.parameters['不透明度'];
    MPD.step = +MPD.parameters['変化量'];

    var _ = MPD.product;

    //==============================================================================
    // Game_Player
    //==============================================================================

    Object.defineProperty(Game_Player.prototype, _, {
        get: function () { return this[`$${_}`] = this[`$${_}`] || { left: 0, top: 0, right: 0, bottom: 0 }; },
        set: function (value) { this[`$${_}`] = value; },
        configurable: true
    });

    //==============================================================================
    // Sprite_Character
    //==============================================================================

    (function (o, p) {
        var f = o[p]; o[p] = function () {
            f.apply(this, arguments);
            if (this._character === $gamePlayer) {
                var gp = $gamePlayer[_];
                gp.left = parseInt(this.x - this.anchor.x * this.patternWidth());
                gp.top = parseInt(this.y - this.anchor.y * this.patternHeight());
                gp.right = gp.left + this.patternWidth();
                gp.bottom = gp.top + this.patternHeight();
            }
        };
    }(Sprite_Character.prototype, 'updateCharacterFrame'));

    //==============================================================================
    // Sprite_Picture
    //==============================================================================

    Object.defineProperty(Sprite_Picture.prototype, _, {
        get: function () { return this[`$${_}`] = this[`$${_}`] || { modesty: false, opacity: 255, overlap: false }; },
        set: function (value) { this[`$${_}`] = value; },
        configurable: true
    });

    (function (o, p) {
        var f = o[p]; o[p] = function (pictureId) {
            f.apply(this, arguments);
            this[_].modesty = (MPD.picture.indexOf(pictureId) >= 0);
        };
    }(Sprite_Picture.prototype, 'initialize'));

    (function (o, p) {
        var f = o[p]; o[p] = function () {
            f.apply(this, arguments);
            var this_ = this[_];
            if (this_.modesty && !!this.bitmap) {
                if (Graphics.frameCount % MPD.cycle === 0) {
                    var pl = parseInt(this.x - this.anchor.x * this._realFrame.width);
                    var pt = parseInt(this.y - this.anchor.y * this._realFrame.height);
                    var pr = pl + this._realFrame.width;
                    var pb = pt + this._realFrame.height;
                    var gp = $gamePlayer[_];
                    var bl = (gp.left === gp.left.clamp(pl, pr));
                    var bt = (gp.top === gp.top.clamp(pt, pb));
                    var br = (gp.right === gp.right.clamp(pl, pr));
                    var bb = (gp.bottom === gp.bottom.clamp(pt, pb));
                    this_.overlap = false;
                    if ((bl && bt) || (bl && bb) || (br && bt) || (br && bb)) {
                        var cl = gp.left - pl;
                        var ct = gp.top - pt;
                        var cr = gp.right - pl;
                        var cb = gp.bottom - pt;
                        var cx = parseInt((cl + cr) / 2);
                        var cy = parseInt((ct + cb) / 2);
                        if ((MPD.check1 && ((this.bitmap.getAlphaPixel(cl, ct) > 0) ||
                            (this.bitmap.getAlphaPixel(cl, cb) > 0) ||
                            (this.bitmap.getAlphaPixel(cr, ct) > 0) ||
                            (this.bitmap.getAlphaPixel(cr, cb) > 0))) ||
                            (MPD.check2 && ((this.bitmap.getAlphaPixel(cx, ct) > 0) ||
                                (this.bitmap.getAlphaPixel(cx, cb) > 0) ||
                                (this.bitmap.getAlphaPixel(cl, cy) > 0) ||
                                (this.bitmap.getAlphaPixel(cr, cy) > 0))) ||
                            (MPD.check3 && (this.bitmap.getAlphaPixel(cx, cy) > 0))) {
                            this_.overlap = true;
                        }
                    }
                }
                this_.opacity += (MPD.step * (this_.overlap ? -1 : 1));
                this_.opacity = this_.opacity.clamp(MPD.opacity, this.picture().opacity());
                this.opacity = this_.opacity;
            }
        };
    }(Sprite_Picture.prototype, 'updateOther'));
}());


code:
//=============================================================================
// MPP_ChoiceEX.js
//=============================================================================
// Copyright (c) 2015-2019 Mokusei Penguin
// Released under the MIT license
// http://opensource.org/licenses/mit-license.php
//=============================================================================

/*:
 * @plugindesc 【ver.3.11】選択肢の機能拡張
 * @author 木星ペンギン
 *
 * @help ※[]内は未設定でも動作します。
 * プラグインコマンド:
 *   ChoicePos x y[ row]    # 選択肢の位置(x,y)と行数(row)指定
 *   ChoiceVariableId n     # 選択肢のデフォルト位置を変数n番にする
 *   ChoiceRect x y width height
 *                          # 選択肢の座標とサイズを指定
 *   ChoiceUnderMessage     # 選択肢をメッセージの下に表示
 *
 * ※ プラグインコマンドにて指定する値には変数が使用できます。
 *    v[n] と記述することでn番の変数の値を参照します。
 *
 * 注釈:
 *   選択肢ヘルプ             # 各項目の下に設定することでヘルプを表示させる
 *
 * 選択肢テキスト:
 *   if(条件)                # 条件が偽になると項目が表示されなくなる
 *   en(条件)                # 条件が偽になると項目が選択不可
 *
 * ================================================================
 * ▼ 使い方
 * --------------------------------
 *  〇 選択肢を増やす
 *   イベントコマンド『選択肢の表示』を続けて配置すると
 *   一つの選択肢にまとめられます。
 *   まとめたくない場合は、間に注釈などを入れることで
 *   通常通り分けることができます。
 *
 *   『デフォルト』の処理は、なし以外を設定したものが適用されます。
 *   『デフォルト』の処理が複数ある場合、
 *   後に設定された選択肢のものが適用されます。
 *
 *   『キャンセル』の処理は、禁止以外を設定したものが適用されます。
 *   『キャンセル』の処理が複数ある場合、
 *   後に設定された選択肢のものが適用されます。
 *
 *  『背景』と『ウィンドウ位置』は後の選択肢のものが適用されます。
 *
 *
 * ================================================================
 * ▼ プラグインコマンド 詳細
 * --------------------------------
 *  〇 ChoicePos x y[ row]
 *      x   : 選択肢ウィンドウのX座標
 *      y   : 選択肢ウィンドウのY座標
 *      row : 選択肢ウィンドウの行数。未設定の場合はすべて表示
 *
 *   次に表示する選択肢の位置(x,y)と行数(row)指定します。
 *
 * --------------------------------
 *  〇 ChoiceVariableId n
 *      n : 変数番号
 *
 *   次に表示する選択肢のデフォルト位置を変数の値にします。
 *   さらに現在のカーソル位置を変数に入れます。
 *
 *   カーソル位置は最初の選択肢が上から0～5、次の選択肢は10～15と、
 *   選択肢毎に+10されます。
 *
 *   変数に入った値の項目が表示されない場合、なしと同じ処理をします。
 *
 * --------------------------------
 *  〇 ChoiceRect x y width height
 *      x      : X座標
 *      y      : Y座標
 *      width  : 幅
 *      height : 高さ
 *
 *   次に表示する選択肢の座標とサイズを指定します。
 *
 *   各項目、未設定もしくは-1を指定した場合、通常の値が適用されます。
 *
 * --------------------------------
 *  〇 ChoiceUnderMessage
 *
 *   次に表示する選択肢をメッセージウィンドウ内に表示させます。
 *
 *   この機能は[文章の表示]と併用しなければ機能しません。
 *   [文章の表示]の前に実行してください。
 *
 *   選択肢ウィンドウの[背景]は設定したものが適用されます。
 *
 *
 * ================================================================
 * ▼ 選択肢テキスト 詳細
 * --------------------------------
 *  〇 項目が表示される条件の設定
 *   選択肢の文章中に
 *     if(条件)
 *   と入れ、その条件が偽になると項目が表示されなくなります。
 *
 *   『デフォルト』の項目が表示されない場合の動作は、
 *   プラグインパラメータの[Disabled Index]にて設定できます。
 *
 *   『キャンセル』の項目が表示されない場合、禁止と同じ処理をします。
 *
 *   条件内では s でスイッチ、v で変数を参照できます。
 *
 *     例：if(s[1]) とした場合
 *          => スイッチ１番がONで表示、OFFで非表示。
 *        if(!s[2]) とした場合
 *          => スイッチ２番がOFFで表示、ONで非表示。
 *        if(v[5]>0) とした場合
 *          => 変数５番が0より大きければ表示、0以下で非表示。
 *
 *     変数で使える不等号
 *       === : 等しい
 *       !== : 等しくない
 *       <   : より小さい
 *       <=  : より小さいまたは等しい
 *       >   : より大きい
 *       >=  : より大きいまたは等しい
 *
 *     条件式はeval関数で処理されているため、他演算子も使用できます。
 *
 * --------------------------------
 *  〇 項目を半透明で表示する条件の設定
 *   選択肢の文章中に
 *     en(条件)
 *   と入れ、その条件が偽になると項目が半透明で表示されます。
 *   半透明となった項目は選択できなくなります。
 *
 *   条件は上の『項目が表示される条件の設定』と同じです。
 *
 *   『キャンセル』の項目が半透明の場合、ブザーが鳴ります。
 *
 *
 * ================================================================
 * ▼ プラグインパラメータ 詳細
 * --------------------------------
 *  〇 Disabled Index
 *
 *   [デフォルト]となる項目がif(条件)により非表示となった場合、
 *   デフォルト位置をどこにするかを設定します。
 *
 *     none : [なし]と同じ
 *     top  : 先頭の項目
 *
 * --------------------------------
 *  〇 Plugin Commands / Event Comment
 *
 *   プラグインコマンドや注釈で使用するコマンドは、
 *   プラグインパラメータから変更できます。
 *
 *   コマンドを短くしたり日本語にしたりなどして、
 *   自分が使いやすいようにしてください。
 *
 *   プラグインコマンドのみ、変更後もデフォルトのコマンドでも動作します。
 *
 *
 * ================================================================
 * ▼ その他
 * --------------------------------
 *  〇 プラグインコマンドの実行タイミング
 *   プラグインコマンドを使用する場合、[選択肢の表示]の前に実行するのが
 *   好ましいです。
 *   ただし、メッセージウィンドウを表示したまま選択肢の処理を実行したい場合、
 *   [文章の表示]より前にプラグインコマンドを実行してください。
 *
 * --------------------------------
 *  〇 ヘルプメッセージの表示
 *   各選択肢項目の下に注釈で以下の文字列を入れると、
 *   続きの文章をヘルプメッセージとしてカーソルを合わせたときに
 *   標示させることができます。
 *
 *     選択肢ヘルプ
 *
 *   ※注意点
 *    ヘルプメッセージは[文章の表示]と同じ機能を使っているため、
 *    制御文字が使用できます。
 *    ただし、\!と\^は使用できません。
 *
 * ================================
 * 制作 : 木星ペンギン
 * URL : http://woodpenguin.blog.fc2.com/
 *
 * @param maxPageRow
 * @type number
 * @desc 1ページに表示される行数
 * @default 6
 *
 * @param Disabled Index
 * @type select
 * @option none
 * @option top
 * @desc [デフォルト]となる選択肢が表示されない場合のデフォルト位置
 * @default none
 *
 *
 * @param === Command ===
 *
 * @param Plugin Commands
 * @type struct<Plugin>
 * @desc プラグインコマンド名
 * @default {"ChoicePos":"ChoicePos","ChoiceVariableId":"ChoiceVariableId","ChoiceRect":"ChoiceRect","ChoiceUnderMessage":"ChoiceUnderMessage"}
 * @parent === Command ===
 *
 * @param Event Comment
 * @type struct<EventComment>
 * @desc イベントの注釈で使うコマンド名
 * @default {"ChoiceHelp":"選択肢ヘルプ"}
 * @parent === Command ===
 *
 */

/*~struct~Plugin:
 * @param ChoicePos
 * @desc 選択肢の位置(x,y)と行数(row)指定
 * @default ChoicePos
 *
 * @param ChoiceVariableId
 * @desc 選択肢のデフォルト位置を変数n番にする
 * @default ChoiceVariableId
 *
 * @param ChoiceRect
 * @desc 選択肢の座標とサイズ(x,y,width,height)指定
 * @default ChoiceRect
 *
 * @param ChoiceUnderMessage
 * @desc 選択肢をメッセージの下に表示
 * @default ChoiceUnderMessage
 *
 */

/*~struct~EventComment:
 * @param ChoiceHelp
 * @desc 各項目の下に設定することでヘルプを表示させる
 * @default 選択肢ヘルプ
 */

(function () {

    const MPPlugin = {};

    {

        let parameters = PluginManager.parameters('MPP_ChoiceEX');

        MPPlugin.maxPageRow = Number(parameters['maxPageRow']);
        MPPlugin.DisabledIndex = parameters['Disabled Index'];

        MPPlugin.PluginCommands = JSON.parse(parameters['Plugin Commands']);
        MPPlugin.EventComment = JSON.parse(parameters['Event Comment']);

    }

    const Alias = {};

    //-----------------------------------------------------------------------------
    // Game_Message

    //15
    Alias.GaMe_clear = Game_Message.prototype.clear;
    Game_Message.prototype.clear = function () {
        Alias.GaMe_clear.apply(this, arguments);
        this._choiceEnables = [];
        this._choiceResults = [];
        this._helpTexts = [];
        this._choiceX = -1;
        this._choiceY = -1;
        this._choiceWidth = -1;
        this._choiceHeight = -1;
        this._choiceMaxRow = MPPlugin.maxPageRow;
        this._choiceVariableId = 0;
        this.choiceUnderMes = false;
    };

    Game_Message.prototype.setChoiceEnables = function (enables) {
        this._choiceEnables = enables;
    };

    Game_Message.prototype.choiceEnables = function () {
        return this._choiceEnables;
    };

    Game_Message.prototype.setChoiceResults = function (results) {
        this._choiceResults = results;
    };

    Game_Message.prototype.setChoiceHelpTexts = function (texts) {
        this._helpTexts = texts;
    };

    Game_Message.prototype.isHelp = function () {
        return this._helpTexts.length > 0;
    };

    Game_Message.prototype.setChoicePos = function (x, y, row) {
        this._choiceX = x;
        this._choiceY = y;
        this._choiceWidth = -1;
        this._choiceHeight = -1;
        this._choiceMaxRow = row;
    };

    Game_Message.prototype.setChoiceRect = function (x, y, width, height) {
        this._choiceX = x;
        this._choiceY = y;
        this._choiceWidth = width;
        this._choiceHeight = height;
    };

    Game_Message.prototype.setChoiceVariableId = function (id) {
        this._choiceVariableId = id;
    };

    Game_Message.prototype.shiftLine = function (height) {
        this._choiceY += height;
        this._choiceHeight -= height;
    };

    //-----------------------------------------------------------------------------
    // Game_Interpreter

    //336
    Game_Interpreter.prototype.setupChoices = function (params) {
        var data = {
            choices: [],
            enables: [],
            results: [],
            helpTexts: [],
            cancelType: -1,
            defaultType: -1,
            positionType: 0,
            background: 0
        };
        data = this.addChoices(params, this._index, data, 0);
        if (data.choices.length > 0) {
            var helpTexts = [];
            if (data.helpTexts.length > 0) {
                helpTexts = data.results.map(i => data.helpTexts[i]);
            }
            var cancelType = -1;
            if (data.cancelType.mod(10) === 8 || data.results.contains(data.cancelType)) {
                data.results.push(data.cancelType);
                cancelType = data.choices.length;
            }
            var index = data.defaultType;
            if ($gameMessage._choiceVariableId > 0) {
                index = $gameVariables.value($gameMessage._choiceVariableId);
            }
            var defaultType = data.results.indexOf(index);
            if (index >= 0 && defaultType < 0 && MPPlugin.DisabledIndex === "top") {
                defaultType = 0;
            }
            $gameMessage.setChoices(data.choices, defaultType, cancelType);
            $gameMessage.setChoiceEnables(data.enables);
            $gameMessage.setChoiceResults(data.results);
            $gameMessage.setChoiceHelpTexts(helpTexts);
            $gameMessage.setChoiceBackground(data.background);
            $gameMessage.setChoicePositionType(data.positionType);
            $gameMessage.setChoiceCallback(n => this._branch[this._indent] = data.results[n]);
        } else {
            this._branch[this._indent] = -1;
        }
    };

    Game_Interpreter.prototype.addChoices = function (params, i, data, d) {
        var regIf = /\s*if\((.+?)\)/;
        var regEn = /\s*en\((.+?)\)/;
        for (var n = 0; n < params[0].length; n++) {
            var str = params[0][n];
            if (regIf.test(str)) {
                str = str.replace(regIf, '');
                if (RegExp.$1 && !this.evalChoice(RegExp.$1)) continue;
            }
            var enable = true;
            if (regEn.test(str)) {
                str = str.replace(regEn, '');
                enable = this.evalChoice(RegExp.$1);
            }
            data.choices.push(str);
            data.enables.push(enable);
            data.results.push(n + d);
        }
        var cancelType = params[1];
        if (cancelType !== -1) {
            data.cancelType = cancelType + d;
        }
        var defaultType = params.length > 2 ? params[2] : 0;
        if (defaultType >= 0) {
            data.defaultType = defaultType + d;
        }
        data.positionType = params.length > 3 ? params[3] : 2;
        data.background = params.length > 4 ? params[4] : 0;
        var command;
        for (; ;) {
            i++;
            command = this._list[i];
            if (!command) break;
            if (command.indent === this._indent) {
                if (command.code === 402) {
                    this.getHelpText(command.parameters[0] + d, i + 1, data);
                } else if (command.code === 404) {
                    break;
                }
            }
        }
        command = this._list[i + 1];
        if (command && command.code === 102) {
            this.addChoices(command.parameters, i + 1, data, d + 10);
        }
        return data;
    };

    Game_Interpreter.prototype.getHelpText = function (c, i, data) {
        var command = MPPlugin.EventComment.ChoiceHelp || '選択肢ヘルプ';
        if (this._list[i].code === 108 && this._list[i].parameters[0] === command) {
            var texts = [];
            while (this._list[i + 1].code === 408) {
                i++;
                texts.push(this._list[i].parameters[0]);
            }
            data.helpTexts[c] = texts;
        }
    };

    Game_Interpreter.prototype.evalChoice = function (formula) {
        try {
            var s = $gameSwitches._data;
            var v = $gameVariables._data;//修正
            return !!eval(formula);//修正
            //var formula2 = formula.replace(/v\[(\d+)\]/g,//修正
            //    (match, p1) => $gameVariables.value(parseInt(p1)) );//修正
            //return !!eval(formula2);//修正
        } catch (e) {
            alert("条件エラー \n\n " + formula);
            return true;
        }
    };

    //362
    Game_Interpreter.prototype.command403 = function () {
        if (this._branch[this._indent] !== -2) {
            this.skipBranch();
        }
        return true;
    };

    Game_Interpreter.prototype.command404 = function () {
        if (this.nextEventCode() === 102) {
            this._branch[this._indent] -= 10;
            this._index++;
        }
        return true;
    };

    //1739
    Alias.GaIn_pluginCommand = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function (command, args) {
        Alias.GaIn_pluginCommand.apply(this, arguments);
        var args2 = this.mppPluginCommandArgs(args);
        switch (command) {
            case MPPlugin.PluginCommands.ChoicePos:
            case 'ChoicePos':
                var x = args2[0];
                var y = args2[1];
                var row = args2[2] || 99;
                $gameMessage.setChoicePos(x, y, row);
                break;
            case MPPlugin.PluginCommands.ChoiceVariableId:
            case 'ChoiceVariableId':
                $gameMessage.setChoiceVariableId(args2[0]);
                break;
            case MPPlugin.PluginCommands.ChoiceRect:
            case 'ChoiceRect':
                var x = (args2[0] === undefined ? -1 : args2[0]);
                var y = (args2[1] === undefined ? -1 : args2[1]);
                var width = (args2[2] === undefined ? -1 : args2[2]);
                var height = (args2[3] === undefined ? -1 : args2[3]);
                $gameMessage.setChoiceRect(x, y, width, height);
                break;
            case MPPlugin.PluginCommands.ChoiceUnderMessage:
            case 'ChoiceUnderMessage':
                $gameMessage.choiceUnderMes = true;
                break;
        }
        return true;
    };

    Game_Interpreter.prototype.mppPluginCommandArgs = function (args) {
        var v = $gameVariables._data;
        return args.map(function (arg) {
            try {
                return eval(arg) || 0;
            } catch (e) {
                return arg;
            }
        });
    };

    //-----------------------------------------------------------------------------
    // Window

    Window.prototype.isClearWindowRect = function () {
        return true;
    };

    //-----------------------------------------------------------------------------
    // WindowLayer

    //7100
    Alias.WiLa__canvasClearWindowRect = WindowLayer.prototype._canvasClearWindowRect;
    WindowLayer.prototype._canvasClearWindowRect = function (renderSession, window) {
        if (window.isClearWindowRect())
            Alias.WiLa__canvasClearWindowRect.apply(this, arguments);
    };

    //7162
    Alias.WiLa__maskWindow = WindowLayer.prototype._maskWindow;
    WindowLayer.prototype._maskWindow = function (window, shift) {
        Alias.WiLa__maskWindow.apply(this, arguments);
        if (!window.isClearWindowRect()) {
            var rect = this._windowRect;
            rect.x = 0;
            rect.y = 0;
            rect.width = 0;
            rect.height = 0;
        }
    };

    //-----------------------------------------------------------------------------
    // Window_ChoiceList

    Window_ChoiceList.prototype.isClearWindowRect = function () {
        return !this._underMessage;
    };

    if (Window_ChoiceList.prototype.hasOwnProperty('close')) {
        Alias.WiChLi_close = Window_ChoiceList.prototype.close
    }
    Window_ChoiceList.prototype.close = function () {
        if ($gameMessage.isHelp()) this._messageWindow.onShowFast();
        var _super = Alias.WiChLi_close || Window_Command.prototype.close;
        _super.apply(this, arguments);
    };

    if (Window_ChoiceList.prototype.hasOwnProperty('select')) {
        Alias.WiChli_select = Window_ChoiceList.prototype.select;
    }
    Window_ChoiceList.prototype.select = function (index) {
        var variableId = $gameMessage._choiceVariableId;
        if (index !== this.index() && variableId > 0) {
            var results = $gameMessage._choiceResults;
            $gameVariables.setValue(variableId, results[index]);
        }
        var _super = Alias.WiChli_select = Window_Command.prototype.select
        _super.apply(this, arguments);
    };

    //34
    Alias.WiChLi_updatePlacement = Window_ChoiceList.prototype.updatePlacement;
    Window_ChoiceList.prototype.updatePlacement = function () {
        Alias.WiChLi_updatePlacement.apply(this, arguments);
        if ($gameMessage._choiceWidth >= 0) {
            this.width = Math.min($gameMessage._choiceWidth, Graphics.boxWidth);
        }
        if ($gameMessage._choiceHeight >= 0) {
            this.height = Math.min($gameMessage._choiceHeight, Graphics.boxHeight);
        }
        if ($gameMessage._choiceX >= 0) {
            this.x = Math.min($gameMessage._choiceX, Graphics.boxWidth - this.width);
        }
        if ($gameMessage._choiceY >= 0) {
            this.y = Math.min($gameMessage._choiceY, Graphics.boxHeight - this.height);
        }
        this._underMessage = $gameMessage.choiceUnderMes;
    };

    //67
    Window_ChoiceList.prototype.numVisibleRows = function () {
        return Math.min($gameMessage.choices().length, $gameMessage._choiceMaxRow);
    };

    //103
    Window_ChoiceList.prototype.makeCommandList = function () {
        var choices = $gameMessage.choices();
        var enables = $gameMessage._choiceEnables;
        for (var i = 0; i < choices.length; i++) {
            this.addCommand(choices[i], 'choice', enables[i]);
        }
    };

    //110
    Alias.WiChLi_drawItem = Window_ChoiceList.prototype.drawItem;
    Window_ChoiceList.prototype.drawItem = function (index) {
        this.changePaintOpacity(this.isCommandEnabled(index));
        Alias.WiChLi_drawItem.apply(this, arguments);
    };

    //123
    Alias.WiChLi_callOkHandler = Window_ChoiceList.prototype.callOkHandler;
    Window_ChoiceList.prototype.callOkHandler = function () {
        Alias.WiChLi_callOkHandler.apply(this, arguments);
        this._messageWindow.forceClear();
    };

    //129
    Alias.WiChLi_callCancelHandler = Window_ChoiceList.prototype.callCancelHandler;
    Window_ChoiceList.prototype.callCancelHandler = function () {
        Alias.WiChLi_callCancelHandler.apply(this, arguments);
        this._messageWindow.forceClear();
    };

    if (Window_ChoiceList.prototype.hasOwnProperty('processCancel')) {
        Alias.WiChLi_processCancel = Window_ChoiceList.prototype.processCancel
    }
    Window_ChoiceList.prototype.processCancel = function () {
        var type = $gameMessage.choiceCancelType();
        var results = $gameMessage._choiceResults;
        var index = results.indexOf(results[type]);
        if (this.isCancelEnabled() && index !== type && !this.isCommandEnabled(index)) {
            this.playBuzzerSound();
        } else {
            var _super = Alias.WiChLi_processCancel || Window_Command.prototype.processCancel;
            _super.apply(this, arguments);
        }
    };

    Window_ChoiceList.prototype.callUpdateHelp = function () {
        if (this.active && this._messageWindow && $gameMessage.isHelp())
            this.updateHelp();
    };

    Window_ChoiceList.prototype.updateHelp = function () {
        this._messageWindow.forceClear();
        var texts = $gameMessage._helpTexts[this.index()];
        $gameMessage._texts = texts ? texts.clone() : [''];
        this._messageWindow.startMessage();
    };

    //-----------------------------------------------------------------------------
    // Window_Message

    //109
    Alias.WiMe_updatePlacement = Window_Message.prototype.updatePlacement;
    Window_Message.prototype.updatePlacement = function () {
        Alias.WiMe_updatePlacement.apply(this, arguments);
        this.clearUnderChoice();
    };

    Window_Message.prototype.clearUnderChoice = function () {
        if ($gameMessage.choiceUnderMes) {
            var x = this.x + this.standardPadding();
            x += this._textState.left || 0;
            var y = this.y + 4;
            var height = this.windowHeight();
            $gameMessage.setChoiceRect(x, y, -1, height);
        }
    };

    if (Window_Message.prototype.hasOwnProperty('processNewLine')) {
        Alias.WiMe_processNewLine = Window_Message.prototype.processNewLine;
    }
    Window_Message.prototype.processNewLine = function (textState) {
        if ($gameMessage.choiceUnderMes) $gameMessage.shiftLine(textState.height);
        var _super = Alias.WiMe_processNewLine || Window_Base.prototype.processNewLine;
        _super.apply(this, arguments);
    };

    //149
    Alias.WiMe_updateInput = Window_Message.prototype.updateInput;
    Window_Message.prototype.updateInput = function () {
        if ($gameMessage.isHelp() && this._textState) return false;
        return Alias.WiMe_updateInput.apply(this, arguments);
    };

    //196
    Alias.WiMe_onEndOfText = Window_Message.prototype.onEndOfText;
    Window_Message.prototype.onEndOfText = function () {
        if ($gameMessage.isHelp() && !this._choiceWindow.active) {
            this.startInput();
        } else {
            Alias.WiMe_onEndOfText.apply(this, arguments);
        }
    };

    //207
    Alias.WiMe_startInput = Window_Message.prototype.startInput;
    Window_Message.prototype.startInput = function () {
        if (this._choiceWindow.active) return true;
        if ($gameMessage.isChoice() && $gameMessage.choiceUnderMes &&
            this._textState.x !== this._textState.left) {
            $gameMessage.shiftLine(this._textState.height);
        }
        return Alias.WiMe_startInput.apply(this, arguments);
    };

    Window_Message.prototype.forceClear = function () {
        this._textState = null;
        this.close();
        this._goldWindow.close();
    };

    Window_Message.prototype.onShowFast = function () {
        this._showFast = true;
    };

    //243
    Alias.WiMe_newPage = Window_Message.prototype.newPage;
    Window_Message.prototype.newPage = function (textState) {
        Alias.WiMe_newPage.apply(this, arguments);
        this.clearUnderChoice();
    };

})();