code:
//=============================================================================
// MessageWindowPopup.js
// ----------------------------------------------------------------------------
// Copyright (c) 2015 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.3.3 2016/07/02 ポップアップ有効時は選択肢の最大表示数が8になるよう修正
// 1.3.2 2016/06/02 YEP_MessageCore.jsとのウィンドウ位置に関する競合を解消
// 1.3.1 2016/05/25 フォロワーにフキダシを表示できる機能を追加
// 1.3.0 2016/03/21 ウィンドウの表示位置をキャラクターの高さに合わせて自動調整するよう修正
//                  ポップアップウィンドウ専用のウィンドウスキンを使用する機能を追加
//                  位置とサイズを微調整する機能を追加
//                  選択肢と数値入力ウィンドウの表示方法を2種類追加
// 1.2.3 2016/02/23 YEP_MessageCore.jsより上に配置した場合に発生するエラーを修正
//                  （正常に動作しない点はそのままです）
// 1.2.2 2016/02/20 YEP_MessageCore.js最新版に対応
// 1.2.1 2016/02/20 YEP_MessageCore.jsのネームポップをポップアップウィンドウと連動するよう対応
// 1.2.0 2016/02/13 並列処理のイベントが存在するときにポップアップ設定がクリアされてしまう
//                  問題の修正
//                  ウィンドウの表示位置を下に表示できる設定を追加
// 1.1.3 2016/02/04 イベント終了時にポップアップ設定をクリアするよう修正
// 1.1.2 2016/01/31 行間を調整できる機能を追加
// 1.1.1 2016/01/30 選択肢と数値入力ウィンドウをポップアップと連携するよう修正
//                  その他微調整と軽微な表示不良修正
// 1.1.0 2016/01/29 高確率で競合するバグを修正
//                  ポップアップウィンドウがキャラクターの移動に追従するよう修正
//                  顔グラフィックが見切れないよう修正
//                  実行中のイベントをポップアップ対象にできる機能を追加（0を指定）
//                  英語対応
// 1.0.0 2016/01/28 初版
// ----------------------------------------------------------------------------
// [Blog]   : http://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================

/*:
 * @plugindesc Popup window plugin
 * @author triacontane
 *
 * @param FontSize
 * @desc Font size of popup window
 * @default 22
 *
 * @param Padding
 * @desc Padding of popup window
 * @default 10
 *
 * @param AutoPopup
 * @desc Popup set when event starting（ON/OFF）
 * @default ON
 *
 * @param FaceScale
 * @desc Scale of face graphic of popup window(1-100%)
 * @default 75
 *
 * @param WindowLinkage
 * @desc Select window and Number input window is linkage with popup window(ON/OFF)
 * @default ON
 *
 * @param BetweenLines
 * @desc Between the Lines
 * @default 4
 *
 * @param ThroughWindow
 * @desc Window through if overlap windows(ON/OFF)
 * @default OFF
 *
 * @help Change the message window from fixed to popup
 *
 * Plugin Command
 *
 * MWP_VALID [Character ID]
 *  Popup window valid
 *  Player:-1 Current event:0 Event:1...
 * ex:MWP_VALID 0
 *
 * MWP_INVALID
 *  Popup window invalid
 * ex:MWP_INVALID
 *
 * MWP_SETTING [parameter]
 *  Popup window setting. parameter are...
 *   POS_UPPER
 *     Window position fixed upper.
 *
 * 　POS_LOWER
 *     Window position fixed upper.
 *
 * 　POS_AUTO
 *     Window position auto.
 *
 *   SKIN [File name(/img/system/...)]
 *     Setting window skin for popup message.
 *
 *   SUB_POS_PLAYER
 *     Choice window or NumberInput displays player.
 *
 *   SUB_POS_INNER
 *     Choice window or NumberInput displays internal message window.
 *
 *   SUB_POS_NORMAL
 *     Choice window or NumberInput displays normal position.
 *
 * MWP_ADJUST [parameter]
 *   Popup window adjust. parameter are...
 *
 *   POS [X] [Y]
 *     Popup window adjust relative position.
 *
 * 　SIZE [Width] [Height]
 * 　　Popup window adjust relative size.
 *
 * This plugin is released under the MIT License.
 */
/*:ja
 * @plugindesc フキダシウィンドウプラグイン
 * @author トリアコンタン
 *
 * @param フォントサイズ
 * @desc フキダシウィンドウのデフォルトフォントサイズ
 * 通常ウィンドウのフォントサイズ：28
 * @default 22
 *
 * @param 余白
 * @desc フキダシウィンドウの余白サイズ
 * 通常ウィンドウの余白：18
 * @default 10
 *
 * @param 自動設定
 * @desc イベント起動時にフキダシの対象が、起動したイベントに自動設定されます。（ON/OFF）
 * OFFの場合は通常のメッセージウィンドウに設定されます。
 * @default ON
 *
 * @param フェイス倍率
 * @desc フキダシウィンドウの顔グラフィック表示倍率(1-100%)
 * @default 75
 *
 * @param ウィンドウ連携
 * @desc 選択肢ウィンドウと数値入力ウィンドウを
 * ポップアップウィンドウに連動させます。(ON/OFF)
 * @default ON
 *
 * @param 行間
 * @desc 行と行の間のスペースをピクセル単位で設定します。
 * @default 4
 *
 * @param ウィンドウ透過
 * @desc ウィンドウが重なったときに透過表示します。(ON/OFF)
 * 選択肢をフキダシ内に表示する場合はONにしてください。
 * @default OFF
 *
 * @help メッセージウィンドウを指定したキャラクターの頭上にフキダシで
 * 表示するよう変更します。
 *
 * YEP_MessageCore.jsのネームポップと併せて使用する場合は、
 * プラグイン管理画面で当プラグインをYEP_MessageCore.jsより
 * 下に配置してください。
 *
 * プラグインコマンド詳細
 *  イベントコマンド「プラグインコマンド」から実行。
 *  （パラメータの間は半角スペースで区切る）
 *
 * MWP_VALID [キャラクターID] or
 * フキダシウィンドウ有効化 [キャラクターID]
 * 　メッセージウィンドウを指定したキャラクターIDの頭上に表示するようにします。
 * 　プレイヤー : -1 このイベント : 0 指定したIDのイベント : 1 ～
 *   フォロワー : -2, -3, -4
 *
 * 例：MWP_VALID 0
 * 　　フキダシウィンドウ有効化 3
 *
 * MWP_INVALID or
 * フキダシウィンドウ無効化
 * 　ウィンドウの表示方法を通常に戻します。
 *
 * 例：MWP_INVALID
 * 　　フキダシウィンドウ無効化
 *
 * MWP_SETTING [設定内容] or
 * フキダシウィンドウ設定 [設定内容]
 * 　フキダシウィンドウの設定を行います。設定内容に以下を入力。
 *
 * 　POS_UPPER or 位置_上固定
 * 　　ウィンドウの位置をキャラクターの上で固定します。
 *
 * 　POS_LOWER or 位置_下固定
 * 　　ウィンドウの位置をキャラクターの下で固定します。
 *
 * 　POS_AUTO or 位置_自動
 * 　　通常はキャラクターの上に表示し、ウィンドウが上に見切れる場合のみ
 * 　　下に表示します。
 *
 *   SKIN or スキン [/img/system/以下に配置するスキンのファイル名]
 *     フキダシウィンドウ時専用のウィンドウスキンを設定します。
 *
 *   SUB_POS_PLAYER or サブ位置_プレイヤーの頭上
 *   　選択肢および数値入力のウィンドウをプレイヤーの頭上に表示します。
 *   　位置関係次第でウィンドウが被る場合があるので、必要に応じて
 *   　ウィンドウ透過のパラメータを有効にしてください。
 *
 *   SUB_POS_INNER or サブ位置_メッセージウィンドウ内部
 *     選択肢および数値入力のウィンドウをメッセージウィンドウに含めます。
 *     この設定を使用する場合は必ずウィンドウ透過のパラメータを
 *     有効にしてください。
 *
 *   SUB_POS_NORMAL or サブ位置_通常
 *   　選択肢および数値入力のウィンドウをフキダシウィンドウの下に表示します。
 *   　特に設定を変更しない場合はこの設定になります。
 *
 * 例：MWP_SETTING POS_UPPER
 * 　　フキダシウィンドウ設定 位置_自動
 * 　　MWP_SETTING SKIN window2
 * 　　フキダシウィンドウ設定 サブ位置_プレイヤーの頭上
 *
 * MWP_ADJUST [設定内容] or
 * フキダシウィンドウ調整 [設定内容]
 * 　フキダシウィンドウの表示位置やサイズを微調整します。設定内容に以下を入力。
 *
 * 　POS or 位置 [X座標] [Y座標]
 * 　　ウィンドウのX座標とY座標を調整します。指定するのは元の座標からの相対です。
 *
 * 　SIZE or サイズ [横幅] [高さ]
 * 　　ウィンドウの横幅と高さを調整します。指定するのは元のサイズからの相対です。
 *
 * 例：MWP_ADJUST POS 5 -3
 * 　　フキダシウィンドウ調整 サイズ 20 -40
 *
 * 利用規約：
 *  作者に無断で改変、再配布が可能で、利用形態（商用、18禁利用等）
 *  についても制限はありません。
 *  このプラグインはもうあなたのものです。
 */
(function () {
    'use strict';
    var pluginName = 'MessageWindowPopup';

    var checkTypeFunction = function (value) {
        return checkType(value, 'Function');
    };

    var checkType = function (value, typeName) {
        return Object.prototype.toString.call(value).slice(8, -1) === typeName;
    };

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

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

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

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

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

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

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

    //=============================================================================
    // パラメータのバリデーション
    //=============================================================================
    var paramThroughWindow = getParamBoolean(['ThroughWindow', 'ウィンドウ透過']);
    var paramFaceScale = getParamNumber(['FaceScale', 'フェイス倍率'], 1, 100);
    var paramFontSize = getParamNumber(['FontSize', 'フォントサイズ'], 1);
    var paramPadding = getParamNumber(['Padding', '余白'], 1);
    var paramLinkage = getParamBoolean(['WindowLinkage', 'ウィンドウ連携']);
    var paramBetweenLines = getParamNumber(['BetweenLines', '行間'], 0);
    var paramAutoPopup = getParamBoolean(['AutoPopup', '自動設定']);

    //=============================================================================
    // Game_Interpreter
    //  プラグインコマンドを追加定義します。
    //=============================================================================
    var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function (command, args) {
        _Game_Interpreter_pluginCommand.apply(this, arguments);
        try {
            this.pluginCommandMessageWindowPopup(command, args);
        } catch (e) {
            if ($gameTemp.isPlaytest() && Utils.isNwjs()) {
                var window = require('nw.gui').Window.get();
                var devTool = window.showDevTools();
                devTool.moveTo(0, 0);
                devTool.resizeTo(Graphics.width, Graphics.height);
                window.focus();
            }
            console.log('プラグインコマンドの実行中にエラーが発生しました。');
            console.log('- コマンド名 　: ' + command);
            console.log('- コマンド引数 : ' + args);
            console.log('- エラー原因   : ' + e.toString());
        }
    };

    Game_Interpreter.prototype.pluginCommandMessageWindowPopup = function (command, args) {
        switch (getCommandName(command)) {
            case 'MWP_VALID':
            case 'フキダシウィンドウ有効化':
                var eventId = getArgNumber(args[0]);
                if (eventId === 0) eventId = this.eventId();
                $gameSystem.setMessagePopup(eventId);
                break;
            case 'MWP_INVALID':
            case 'フキダシウィンドウ無効化':
                $gameSystem.clearMessagePopup();
                break;
            case 'MWP_SETTING':
            case 'フキダシウィンドウ設定':
                switch (getCommandName(args[0])) {
                    case 'POS_UPPER':
                    case '位置_上固定':
                        $gameSystem.setPopupFixUpper();
                        break;
                    case 'POS_LOWER':
                    case '位置_下固定':
                        $gameSystem.setPopupFixLower();
                        break;
                    case 'POS_AUTO':
                    case '位置_自動':
                        $gameSystem.setPopupAuto();
                        break;
                    case 'SKIN':
                    case 'スキン':
                        $gameSystem.setPopupWindowSkin(getArgString(args[1]));
                        this.setWaitMode('image');
                        break;
                    case 'SUB_POS_NORMAL':
                    case 'サブ位置_通常':
                        $gameSystem.setPopupSubWindowPosition(0);
                        break;
                    case 'SUB_POS_PLAYER':
                    case 'サブ位置_プレイヤーの頭上':
                        $gameSystem.setPopupSubWindowPosition(1);
                        break;
                    case 'SUB_POS_INNER':
                    case 'サブ位置_メッセージウィンドウ内部':
                        $gameSystem.setPopupSubWindowPosition(2);
                        break;
                }
                break;
            case 'MWP_ADJUST':
            case 'フキダシウィンドウ調整':
                switch (getCommandName(args[0])) {
                    case 'SIZE':
                    case 'サイズ':
                        $gameSystem.setPopupAdjustSize(getArgNumber(args[1]), getArgNumber(args[2]));
                        break;
                    case 'POS':
                    case '位置':
                        $gameSystem.setPopupAdjustPosition(getArgNumber(args[1]), getArgNumber(args[2]));
                        break;
                }
                break;
        }
    };

    var _Game_Interpreter_terminate = Game_Interpreter.prototype.terminate;
    Game_Interpreter.prototype.terminate = function () {
        _Game_Interpreter_terminate.apply(this, arguments);
        if (this._depth === 0 && this.isGameMapInterpreter()) $gameSystem.clearMessagePopup();
    };

    Game_Interpreter.prototype.setGameMapInterpreter = function () {
        this._gameMapInterpreter = true;
    };

    Game_Interpreter.prototype.isGameMapInterpreter = function () {
        return this._gameMapInterpreter;
    };

    //=============================================================================
    // Game_System
    //  ポップアップフラグを保持します。
    //=============================================================================
    var _Game_System_initialize = Game_System.prototype.initialize;
    Game_System.prototype.initialize = function () {
        _Game_System_initialize.apply(this, arguments);
        this._messagePopupCharacterId = 0;
        this._messagePopupPosition = null;
        this._messagePopupAdjustSize = null;
        this._messagePopupAdjustPosition = null;
        this._messagePopupWindowSkin = null;
        this._messagePopupSubWindowPosition = 0;
    };

    Game_System.prototype.setPopupSubWindowPosition = function (position) {
        this._messagePopupSubWindowPosition = position.clamp(0, 2);
    };

    Game_System.prototype.getPopupSubWindowPosition = function () {
        return this._messagePopupSubWindowPosition;
    };

    Game_System.prototype.setPopupWindowSkin = function (fileName) {
        this._messagePopupWindowSkin = fileName;
        ImageManager.loadSystem(fileName);
    };

    Game_System.prototype.getPopupWindowSkin = function () {
        return this._messagePopupWindowSkin;
    };

    Game_System.prototype.setMessagePopup = function (id) {
        this._messagePopupCharacterId = id;
    };

    Game_System.prototype.clearMessagePopup = function () {
        this._messagePopupCharacterId = 0;
    };

    Game_System.prototype.getMessagePopupId = function () {
        return this._messagePopupCharacterId !== 0 ? this._messagePopupCharacterId : null;
    };

    Game_System.prototype.setPopupFixUpper = function () {
        this._messagePopupPosition = 1;
    };

    Game_System.prototype.setPopupFixLower = function () {
        this._messagePopupPosition = 2;
    };

    Game_System.prototype.setPopupAuto = function () {
        this._messagePopupPosition = 0;
    };

    Game_System.prototype.setPopupAdjustSize = function (w, h) {
        this._messagePopupAdjustSize = [w, h];
    };

    Game_System.prototype.getPopupAdjustSize = function () {
        return this._messagePopupAdjustSize;
    };

    Game_System.prototype.setPopupAdjustPosition = function (x, y) {
        this._messagePopupAdjustPosition = [x, y];
    };

    Game_System.prototype.getPopupAdjustPosition = function () {
        return this._messagePopupAdjustPosition;
    };

    Game_System.prototype.isPopupFixUpper = function () {
        return this._messagePopupPosition === 1;
    };

    Game_System.prototype.isPopupFixLower = function () {
        return this._messagePopupPosition === 2;
    };

    //=============================================================================
    // Game_Map
    //  イベント起動時に自動設定を適用します。
    //=============================================================================
    var _Game_Map_setupStartingMapEvent = Game_Map.prototype.setupStartingMapEvent;
    Game_Map.prototype.setupStartingMapEvent = function () {
        var result = _Game_Map_setupStartingMapEvent.apply(this, arguments);
        if (result) {
            if (paramAutoPopup) {
                $gameSystem.setMessagePopup(this._interpreter.eventId());
            } else {
                $gameSystem.clearMessagePopup();
            }
        }
        return result;
    };

    var _Game_Map_setup = Game_Map.prototype.setup;
    Game_Map.prototype.setup = function (mapId) {
        _Game_Map_setup.apply(this, arguments);
        this._interpreter.setGameMapInterpreter();
    };

    //=============================================================================
    // Game_Troop
    //  戦闘開始時にポップアップフラグを解除します。
    //=============================================================================
    var _Game_Troop_setup = Game_Troop.prototype.setup;
    Game_Troop.prototype.setup = function (troopId) {
        _Game_Troop_setup.apply(this, arguments);
        $gameSystem.clearMessagePopup();
    };

    //=============================================================================
    // Game_CharacterBase
    //  キャラクターの高さを設定します。
    //=============================================================================
    var _Game_CharacterBase_initMembers = Game_CharacterBase.prototype.initMembers;
    Game_CharacterBase.prototype.initMembers = function () {
        _Game_CharacterBase_initMembers.apply(this, arguments);
        this.setSizeForMessagePopup(0, 0);
    };

    Game_CharacterBase.prototype.setSizeForMessagePopup = function (width, height) {
        this._size = [width, height];
    };

    Game_CharacterBase.prototype.getHeightForPopup = function () {
        return this._size[1];
    };

    //=============================================================================
    // Sprite_Character
    //  キャラクターの高さを逆設定します。
    //=============================================================================
    var _Sprite_Character_updateBitmap = Sprite_Character.prototype.updateBitmap;
    Sprite_Character.prototype.updateBitmap = function () {
        if (this.isImageChanged()) this._imageChange = true;
        _Sprite_Character_updateBitmap.apply(this, arguments);
        if (this._imageChange) {
            this.bitmap.addLoadListener(function () {
                var width = this.bitmap.width === 1 ? $gameMap.tileWidth() : this.patternWidth();
                var height = this.bitmap.height === 1 ? $gameMap.tileHeight() : this.patternHeight();
                this._character.setSizeForMessagePopup(width, height);
            }.bind(this));
            this._imageChange = false;
        }
    };

    //=============================================================================
    // Window_Base
    //  共通処理を定義します。
    //=============================================================================
    var _Window_Base_loadWindowskin = Window_Base.prototype.loadWindowskin;
    Window_Base.prototype.loadWindowskin = function () {
        var popupSkin = $gameSystem.getPopupWindowSkin();
        if (this.isPopup() && popupSkin) {
            this.windowskin = ImageManager.loadSystem(popupSkin);
        } else {
            _Window_Base_loadWindowskin.apply(this, arguments);
        }
    };

    Window_Base.prototype.setPauseSignToTail = function (lowerFlg) {
        if (lowerFlg) {
            this._windowPauseSignSprite.rotation = 180 * Math.PI / 180;
            this._windowPauseSignSprite.y = 12;
            this._windowPauseSignSprite.anchor.y = 0;
        } else {
            this._windowPauseSignSprite.rotation = 0;
            this._windowPauseSignSprite.y = this.height + 12;
            this._windowPauseSignSprite.anchor.y = 1;
        }
        this._pauseSingToTail = true;
    };

    Window_Base.prototype.setPauseSignToNormal = function () {
        this._windowPauseSignSprite.rotation = 0;
        this._windowPauseSignSprite.anchor.y = 1.0;
        this._windowPauseSignSprite.move(this._width / 2, this._height);
        this._pauseSingToTail = false;
    };

    var _Window_Base_updatePauseSign = Window_Base.prototype._updatePauseSign;
    Window_Base.prototype._updatePauseSign = function () {
        _Window_Base_updatePauseSign.apply(this, arguments);
        if (this._pauseSingToTail) this._windowPauseSignSprite.alpha = 1.0;
    };

    Window_Base.prototype.isPopupLower = function () {
        return $gameSystem.isPopupFixLower() || (!$gameSystem.isPopupFixUpper() && this.y < 0);
    };

    Window_Base.prototype.setPopupPosition = function (character) {
        var pos = $gameSystem.getPopupAdjustPosition();
        this.x = character.screenX() - this.width / 2 + (pos ? pos[0] : 0);
        this.y = character.screenY() - this.height - (character.getHeightForPopup() + 8) + (pos ? pos[1] : 0);
        var lowerFlg = this.isPopupLower();
        if (lowerFlg) this.y = character.screenY() + 8;
        this.setPauseSignToTail(lowerFlg);
        var deltaX = 0;
        if (this.x < 0) {
            deltaX = this.x;
            this.x = 0;
        }
        if (this.x + this.width > Graphics.boxWidth) {
            deltaX = this.x + this.width - Graphics.boxWidth;
            this.x = Graphics.boxWidth - this.width;
        }
        this._windowPauseSignSprite.x = this._width / 2 + deltaX;
    };

    Window_Base.prototype.updatePlacementPopup = function () {
        if (!this._messageWindow) return;
        if (paramLinkage) {
            switch ($gameSystem.getPopupSubWindowPosition()) {
                case 0:
                    this.x = this._messageWindow.x;
                    this.y = this._messageWindow.y + this._messageWindow.height;
                    this.setPauseSignToNormal();
                    break;
                case 1:
                    this.setPopupPosition($gamePlayer);
                    break;
                case 2:
                    var pos = this._messageWindow.getSubWindowPosition();
                    this.x = pos.x;
                    this.y = pos.y;
                    this.setPauseSignToNormal();
                    this.opacity = 0;
                    break;
            }
        } else {
            this.y = Graphics.boxHeight - this.height - this._messageWindow.windowHeight() / 2;
        }
    };

    Window_Base.prototype.isPopup = function () {
        return false;
    };

    Window_Base.prototype.isPopupLinkage = function () {
        return this.isPopup() && paramLinkage;
    };

    Window_Base.prototype.resetLayout = function () {
        this.padding = this.standardPadding();
        this.width = this.windowWidth();
        this.height = this.windowHeight();
        this.loadWindowskin();
        this.setPauseSignToNormal();
    };

    //=============================================================================
    // Window_Message
    //  ポップアップする場合、表示内容により座標とサイズを自動設定します。
    //=============================================================================
    Window_Message._faceHeight = Math.floor(Window_Base._faceHeight * paramFaceScale / 100);
    Window_Message._faceWidth = Math.floor(Window_Base._faceWidth * paramFaceScale / 100);

    var _Window_Message_standardFontSize = Window_Message.prototype.standardFontSize;
    Window_Message.prototype.standardFontSize = function () {
        return this.isPopup() ? paramFontSize : _Window_Message_standardFontSize.apply(this, arguments);
    };

    var _Window_Message_standardPadding = Window_Message.prototype.standardPadding;
    Window_Message.prototype.standardPadding = function () {
        return this.isPopup() ? paramPadding : _Window_Message_standardPadding.apply(this, arguments);
    };

    var _Window_Message_calcTextHeight = Window_Message.prototype.calcTextHeight;
    Window_Message.prototype.calcTextHeight = function (textState, all) {
        var height = _Window_Message_calcTextHeight.apply(this, arguments);
        return this.isPopup() ? height - 8 + paramBetweenLines : height;
    };

    var _Window_Message_startMessage = Window_Message.prototype.startMessage;
    Window_Message.prototype.startMessage = function () {
        this.updateTargetCharacterId();
        _Window_Message_startMessage.apply(this, arguments);
        this.loadWindowskin();
        this.resetLayout();
    };

    Window_Message.prototype.updateTargetCharacterId = function () {
        this._targetCharacterId = $gameSystem.getMessagePopupId();
    };

    var _Window_Message_resetFontSettings = Window_Message.prototype.resetFontSettings;
    Window_Message.prototype.resetFontSettings = function () {
        _Window_Message_resetFontSettings.apply(this, arguments);
        if (this.isPopup()) this.contents.fontSize = paramFontSize;
    };

    Window_Message.prototype.getPopupTargetCharacter = function () {
        var id = this._targetCharacterId;
        if (id < -1) {
            return $gamePlayer.followers().follower((id * -1) - 2);
        } else if (id === -1) {
            return $gamePlayer;
        } else if (id > -1) {
            return $gameMap.event(id);
        } else {
            return null;
        }
    };

    Window_Message.prototype.isPopup = function () {
        return !!this.getPopupTargetCharacter();
    };

    var _Window_Message_update = Window_Message.prototype.update;
    Window_Message.prototype.update = function () {
        _Window_Message_update.apply(this, arguments);
        if (this.openness > 0 && this.isPopup()) this.updatePlacementPopup();
    };

    var _Window_Message_updatePlacement = Window_Message.prototype.updatePlacement;
    Window_Message.prototype.updatePlacement = function () {
        if (typeof Yanfly === 'undefined' || !Yanfly.Message) {
            this.x = 0;
        }
        _Window_Message_updatePlacement.apply(this, arguments);
        if (this.isPopup()) this.updatePlacementPopup();
    };

    Window_Message.prototype.isPopupLower = function () {
        return $gameSystem.isPopupFixLower() || (!$gameSystem.isPopupFixUpper() && this.y < 0);
    };

    Window_Message.prototype.updatePlacementPopup = function () {
        this.setPopupPosition(this.getPopupTargetCharacter());
        if (this._choiceWindow && $gameMessage.isChoice()) {
            this._choiceWindow.updatePlacementPopup();
        }
        this._numberWindow.updatePlacementPopup();
        if (this._nameWindow && checkTypeFunction(this._nameWindow.updatePlacementPopup)) {
            this._nameWindow.updatePlacementPopup();
        }
    };

    Window_Message.prototype.resetLayout = function () {
        this.padding = this.standardPadding();
        if (this.getPopupTargetCharacter()) {
            this.processVirtual();
        } else {
            this.width = this.windowWidth();
            this.height = this.windowHeight();
            this.setPauseSignToNormal();
        }
        this.updatePlacement();
        this.updateBackground();
    };

    Window_Message.prototype.processVirtual = function () {
        var virtual = {};
        virtual.index = 0;
        virtual.text = this.convertEscapeCharacters($gameMessage.allText());
        virtual.maxWidth = 0;
        this.newPage(virtual);
        while (!this.isEndOfText(virtual)) {
            this.processVirtualCharacter(virtual);
        }
        virtual.y += virtual.height;
        this._subWindowY = virtual.y;
        var choices = $gameMessage.choices();
        if (choices && $gameSystem.getPopupSubWindowPosition() === 2) {
            virtual.y += choices.length * this._choiceWindow.lineHeight();
            virtual.maxWidth = Math.max(virtual.maxWidth, this.newLineX() + this._choiceWindow.maxChoiceWidth());
        }
        var digit = $gameMessage.numInputMaxDigits();
        if (digit && $gameSystem.getPopupSubWindowPosition() === 2) {
            virtual.y += this._numberWindow.lineHeight();
        }
        var width = virtual.maxWidth + this.padding * 2;
        var height = Math.max(this.getFaceHeight(), virtual.y) + this.padding * 2;
        var adjust = $gameSystem.getPopupAdjustSize();
        if (adjust) {
            width += adjust[0];
            height += adjust[1];
        }
        this.width = width;
        this.height = height;
    };

    Window_Message.prototype.getSubWindowPosition = function () {
        var pos = new Point();
        pos.x = this.x + this.newLineX();
        pos.y = this.y + this._subWindowY;
        return pos;
    };

    Window_Message.prototype.processVirtualCharacter = function (textState) {
        switch (textState.text[textState.index]) {
            case '\n':
                this.processNewLine(textState);
                break;
            case '\f':
                this.processNewPage(textState);
                break;
            case '\x1b':
                this.processVirtualEscapeCharacter(this.obtainEscapeCode(textState), textState);
                break;
            default:
                this.processVirtualNormalCharacter(textState);
                break;
        }
    };

    Window_Message.prototype.processVirtualEscapeCharacter = function (code, textState) {
        switch (code) {
            case 'C':
                this.changeTextColor(this.textColor(this.obtainEscapeParam(textState)));
                break;
            case 'I':
                this.processVirtualDrawIcon(this.obtainEscapeParam(textState), textState);
                break;
            case '{':
                this.makeFontBigger();
                break;
            case '}':
                this.makeFontSmaller();
                break;
        }
    };

    Window_Message.prototype.processVirtualNormalCharacter = function (textState) {
        var c = textState.text[textState.index++];
        textState.x += this.textWidth(c);
        textState.maxWidth = Math.max(textState.maxWidth, textState.x);
    };

    Window_Message.prototype.processVirtualDrawIcon = function (iconIndex, textState) {
        textState.x += Window_Base._iconWidth + 4;
        textState.maxWidth = Math.max(textState.maxWidth, textState.x);
    };

    var _Window_Message_newLineX = Window_Message.prototype.newLineX;
    Window_Message.prototype.newLineX = function () {
        if (this.isPopup()) {
            return $gameMessage.faceName() === '' ? 0 : Window_Message._faceWidth + 8;
        } else {
            return _Window_Message_newLineX.apply(this, arguments);
        }
    };

    Window_Message.prototype.getFaceHeight = function () {
        return $gameMessage.faceName() === '' ? 0 : Window_Message._faceHeight;
    };

    var _Window_Message_drawFace = Window_Message.prototype.drawFace;
    Window_Message.prototype.drawFace = function (faceName, faceIndex, x, y, width, height) {
        if (this.isPopup()) {
            width = width || Window_Base._faceWidth;
            height = height || Window_Base._faceHeight;
            var bitmap = ImageManager.loadFace(faceName);
            var pw = Window_Base._faceWidth;
            var ph = Window_Base._faceHeight;
            var sw = Math.min(width, pw);
            var sh = Math.min(height, ph);
            var dx = Math.floor(x + Math.max(width - pw, 0) / 2);
            var dy = Math.floor(y + Math.max(height - ph, 0) / 2);
            var sx = faceIndex % 4 * pw + (pw - sw) / 2;
            var sy = Math.floor(faceIndex / 4) * ph + (ph - sh) / 2;
            this.contents.blt(bitmap, sx, sy, sw, sh, dx, dy, Window_Message._faceWidth, Window_Message._faceHeight);
        } else {
            _Window_Message_drawFace.apply(this, arguments);
        }
    };

    //=============================================================================
    // Window_ChoiceList
    //  ポップアップする場合、メッセージウィンドウに連動して表示位置と余白を調整します。
    //=============================================================================
    var _Window_ChoiceList_standardFontSize = Window_ChoiceList.prototype.standardFontSize;
    Window_ChoiceList.prototype.standardFontSize = function () {
        return this.isPopupLinkage() ? paramFontSize : _Window_ChoiceList_standardFontSize.apply(this, arguments);
    };

    var _Window_ChoiceList_standardPadding = Window_ChoiceList.prototype.standardPadding;
    Window_ChoiceList.prototype.standardPadding = function () {
        return this.isPopupLinkage() ? paramPadding : _Window_ChoiceList_standardPadding.apply(this, arguments);
    };

    var _Window_ChoiceList_lineHeight = Window_ChoiceList.prototype.lineHeight;
    Window_ChoiceList.prototype.lineHeight = function () {
        return this.isPopupLinkage() ? paramFontSize + 8 : _Window_ChoiceList_lineHeight.apply(this, arguments);
    };

    var _Window_ChoiceList_updatePlacement = Window_ChoiceList.prototype.updatePlacement;
    Window_ChoiceList.prototype.updatePlacement = function () {
        this.resetLayout();
        _Window_ChoiceList_updatePlacement.apply(this, arguments);
        if (this.isPopup()) this.updatePlacementPopup();
    };

    var _Window_ChoiceList_refresh = Window_ChoiceList.prototype.refresh;
    Window_ChoiceList.prototype.refresh = function () {
        this.resetLayout();
        _Window_ChoiceList_refresh.apply(this, arguments);
    };

    Window_ChoiceList.prototype.isPopup = function () {
        return this._messageWindow.isPopup();
    };

    var _Window_ChoiceList_numVisibleRows = Window_ChoiceList.prototype.numVisibleRows;
    Window_ChoiceList.prototype.numVisibleRows = function () {
        var result = _Window_ChoiceList_numVisibleRows.apply(this, arguments);
        if (this.isPopupLinkage()) {
            result = Math.min($gameMessage.choices().length, 8);
        }
        return result;
    };

    //=============================================================================
    // Window_NumberInput
    //  ポップアップする場合、メッセージウィンドウに連動して表示位置と余白を調整します。
    //=============================================================================
    var _Window_NumberInput_standardFontSize = Window_NumberInput.prototype.standardFontSize;
    Window_NumberInput.prototype.standardFontSize = function () {
        return this.isPopupLinkage() ? paramFontSize : _Window_NumberInput_standardFontSize.apply(this, arguments);
    };

    var _Window_NumberInput_standardPadding = Window_NumberInput.prototype.standardPadding;
    Window_NumberInput.prototype.standardPadding = function () {
        return this.isPopupLinkage() ? paramPadding : _Window_NumberInput_standardPadding.apply(this, arguments);
    };

    var _Window_NumberInput_lineHeight = Window_NumberInput.prototype.lineHeight;
    Window_NumberInput.prototype.lineHeight = function () {
        return this.isPopupLinkage() ? paramFontSize + 8 : _Window_NumberInput_lineHeight.apply(this, arguments);
    };

    var _Window_NumberInput_updatePlacement = Window_NumberInput.prototype.updatePlacement;
    Window_NumberInput.prototype.updatePlacement = function () {
        this.resetLayout();
        this.opacity = 255;
        _Window_NumberInput_updatePlacement.apply(this, arguments);
        if (this.isPopup()) this.updatePlacementPopup();
    };

    Window_NumberInput.prototype.isPopup = function () {
        return this._messageWindow.isPopup();
    };

    //=============================================================================
    // Window_NameBox
    //  メッセージウィンドウに連動して表示位置と余白を調整します。
    //=============================================================================
    if (typeof Window_NameBox !== 'undefined') {
        var _Window_NameBox_standardFontSize = Window_NameBox.prototype.standardFontSize;
        Window_NameBox.prototype.standardFontSize = function () {
            return this.isPopupLinkage() ? paramFontSize : _Window_NameBox_standardFontSize.apply(this, arguments);
        };

        var _Window_NameBox_standardPadding = Window_NameBox.prototype.standardPadding;
        Window_NameBox.prototype.standardPadding = function () {
            return this.isPopupLinkage() ? paramPadding : _Window_NameBox_standardPadding.apply(this, arguments);
        };

        var _Window_NameBox_lineHeight = Window_NameBox.prototype.lineHeight;
        Window_NameBox.prototype.lineHeight = function () {
            return this.isPopupLinkage() ? paramFontSize + 8 : _Window_NameBox_lineHeight.apply(this, arguments);
        };

        var _Window_NameBox_updatePlacement = Window_NameBox.prototype.updatePlacement;
        Window_NameBox.prototype.updatePlacement = function () {
            this.resetLayout();
            _Window_NameBox_updatePlacement.apply(this, arguments);
            if (this.isPopup()) this.updatePlacementPopup();
        };

        var _Window_NameBox_refresh = Window_NameBox.prototype.refresh;
        Window_NameBox.prototype.refresh = function () {
            this.resetLayout();
            return _Window_NameBox_refresh.apply(this, arguments);
        };

        Window_NameBox.prototype.isPopup = function () {
            return this._parentWindow.isPopup();
        };

        Window_NameBox.prototype.updatePlacementPopup = function () {
            this.x = this._parentWindow.x;
            this.y = this._parentWindow.y - this.height;
        };
    }

    //=============================================================================
    // ウィンドウを透過して重なり合ったときの表示を自然にします。
    //=============================================================================
    if (paramThroughWindow && !WindowLayer.throughWindow) {
        WindowLayer.throughWindow = true;
        //=============================================================================
        //  WindowLayer
        //   描画前に配列を逆転させます。
        //=============================================================================
        var _WindowLayer__renderWebGL = WindowLayer.prototype._renderWebGL;
        WindowLayer.prototype._renderWebGL = function (renderSession) {
            this.children.reverse();
            _WindowLayer__renderWebGL.apply(this, arguments);
            this.children.reverse();
        };

        WindowLayer.prototype._webglMaskWindow = function (renderSession, window) { };
        WindowLayer.prototype._canvasClearWindowRect = function (renderSession, window) { };
    }
})();


code:
//=============================================================================
// MouseWheelExtend.js
// ----------------------------------------------------------------------------
// Copyright (c) 2015-2016 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.2.0 2017/05/18 ホイールクリックしたときにスイッチを切り替えられる機能を追加
// 1.1.0 2016/07/04 マウスホイールの状態をスイッチや変数に格納する機能など4種類の機能を追加
// 1.0.0 2016/07/03 初版
// ----------------------------------------------------------------------------
// [Blog]   : http://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================

/*:
 * @plugindesc Mouse Wheel Extend
 * @author triacontane
 *
 * @param MessageScroll
 * @desc マウスホイールを手前に回転させてメッセージ送りをします。戻すことはできません。
 * @default ON
 *
 * @param CursorMove
 * @desc マウスホイールを動かしてウィンドウのカーソルを移動します。
 * @default ON
 *
 * @param WheelOk
 * @desc マウスホイールのクリックに決定ボタンと同等の機能を持たせます。
 * @default ON
 *
 * @param WheelCancel
 * @desc マウスホイールのクリックにキャンセルボタンと同等の機能を持たせます。
 * @default OFF
 *
 * @param WheelSwitch
 * @desc マウスホイールのクリックで任意のスイッチをONにします。マップ画面でのみ有効です。
 * @default 0
 *
 * @param WheelToggle
 * @desc マウスホイールのクリックで任意のスイッチをON/OFFを切り替えます。マップ画面でのみ有効です。
 * @default 0
 *
 * @param ScrollDirection
 * @desc マウスホイールのスクロールに十字キーと同等の機能を持たせます。
 * @default OFF
 *
 * @param ScrollVariable
 * @desc マウスホイールのスクロールで任意の変数に値を設定します。
 * 下:2 左:4 右:6 上:8　マップ画面でのみ有効です。
 * @default 0
 *
 * @param SensitivityY
 * @desc マウスホイールの縦回転の感度です。通常はこのままでOKです。
 * @default 20
 *
 * @param SensitivityX
 * @desc マウスホイールの横回転の感度です。通常はこのままでOKです。
 * @default 20
 *
 * @help あまり使用されていないマウスホイールの機能を拡張します。
 * 個別に使用可否を設定できます。
 * マウスホイールのない環境（スマートフォン、一部のPC）では意味がないので
 * 注意してください。マウスによっては左右スクロールがない or 正しく取得できない
 * 場合があります。
 *
 * ・メッセージ送り
 * マウスホイールを手前に回転させてメッセージ送りをします。戻すことはできません。
 *
 * ・カーソル移動
 * マウスホイールを動かしてウィンドウのカーソルを移動します。
 *
 * ・クリックで決定、キャンセル
 * マウスホイールのクリックに決定、キャンセルボタンと同等の機能を持たせます。
 * 両方指定すると決定ボタンが優先されます。
 *
 * ・クリックでスイッチ、トグル
 * マウスホイールのクリックで任意のスイッチをONにします。マップ画面でのみ有効です。
 * コモンイベントのトリガー等に使用できます。
 * トグルの場合はクリックするたびにスイッチのON/OFFが切り替わります。
 *
 * ・スクロールで十字キー
 * マウスホイールのスクロールに十字キーと同等の機能を持たせます。
 *
 * ・スクロールで変数
 * マウスホイールのスクロールで任意の変数に値を設定します。
 * 下:2 左:4 右:6 上:8　マップ画面でのみ有効です。
 *
 * このプラグインにはプラグインコマンドはありません。
 *
 * This plugin is released under the MIT License.
 */
/*:ja
 * @plugindesc マウスホイール拡張プラグイン
 * @author トリアコンタン
 *
 * @param メッセージ送り
 * @desc マウスホイールを手前に回転させてメッセージ送りをします。戻すことはできません。
 * @default ON
 *
 * @param カーソル移動
 * @desc マウスホイールを動かしてウィンドウのカーソルを移動します。
 * @default ON
 *
 * @param クリックで決定
 * @desc マウスホイールのクリックに決定ボタンと同等の機能を持たせます。
 * @default ON
 *
 * @param クリックでキャンセル
 * @desc マウスホイールのクリックにキャンセルボタンと同等の機能を持たせます。
 * @default OFF
 *
 * @param クリックでスイッチ
 * @desc マウスホイールのクリックで任意のスイッチをONにします。マップ画面でのみ有効です。
 * @default 0
 *
 * @param クリックでトグル
 * @desc マウスホイールのクリックで任意のスイッチをON/OFFを切り替えます。マップ画面でのみ有効です。
 * @default 0
 *
 * @param スクロールで十字キー
 * @desc マウスホイールのスクロールに十字キーと同等の機能を持たせます。
 * @default OFF
 *
 * @param スクロールで変数
 * @desc マウスホイールのスクロールで任意の変数に値を設定します。
 * 下:2 左:4 右:6 上:8　マップ画面でのみ有効です。
 * @default 0
 *
 * @param 感度Y
 * @desc マウスホイールの縦回転の感度です。通常はこのままでOKです。
 * @default 20
 *
 * @param 感度X
 * @desc マウスホイールの横回転の感度です。通常はこのままでOKです。
 * @default 20
 *
 * @help あまり使用されていないマウスホイールの機能を拡張します。
 * 個別に使用可否を設定できます。
 * マウスホイールのない環境（スマートフォン、一部のPC）では意味がないので
 * 注意してください。マウスによっては左右スクロールがない or 正しく取得できない
 * 場合があります。
 *
 * ・メッセージ送り
 * マウスホイールを手前に回転させてメッセージ送りをします。戻すことはできません。
 *
 * ・カーソル移動
 * マウスホイールを動かしてウィンドウのカーソルを移動します。
 *
 * ・クリックで決定、キャンセル
 * マウスホイールのクリックに決定、キャンセルボタンと同等の機能を持たせます。
 * 両方指定すると決定ボタンが優先されます。
 *
 * ・クリックでスイッチ、トグル
 * マウスホイールのクリックで任意のスイッチをONにします。マップ画面でのみ有効です。
 * コモンイベントのトリガー等に使用できます。
 * トグルの場合はクリックするたびにスイッチのON/OFFが切り替わります。
 *
 * ・スクロールで十字キー
 * マウスホイールのスクロールに十字キーと同等の機能を持たせます。
 *
 * ・スクロールで変数
 * マウスホイールのスクロールで任意の変数に値を設定します。
 * 下:2 左:4 右:6 上:8　マップ画面でのみ有効です。
 *
 * このプラグインにはプラグインコマンドはありません。
 *
 * 利用規約：
 *  作者に無断で改変、再配布が可能で、利用形態（商用、18禁利用等）
 *  についても制限はありません。
 *  このプラグインはもうあなたのものです。
 */

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

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

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

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

    //=============================================================================
    // パラメータの取得と整形
    //=============================================================================
    var paramCursorMove = getParamBoolean(['CursorMove', 'カーソル移動']);
    var paramMessageScroll = getParamBoolean(['MessageScroll', 'メッセージ送り']);
    var paramWheelOk = getParamBoolean(['WheelOk', 'クリックで決定']);
    var paramWheelCancel = getParamBoolean(['WheelCancel', 'クリックでキャンセル']);
    var paramWheelSwitch = getParamNumber(['WheelSwitch', 'クリックでスイッチ'], 0);
    var paramWheelToggle = getParamNumber(['WheelToggle', 'クリックでトグル'], 0);
    var paramScrollDirection = getParamBoolean(['ScrollDirection', 'スクロールで十字キー']);
    var paramScrollVariable = getParamNumber(['ScrollVariable', 'スクロールで変数'], 0);
    var paramSensitivityY = getParamNumber(['SensitivityY', '感度Y'], 1);
    var paramSensitivityX = getParamNumber(['SensitivityX', '感度X'], 1);

    var _Game_Map_update = Game_Map.prototype.update;
    Game_Map.prototype.update = function (sceneActive) {
        _Game_Map_update.apply(this, arguments);
        this.updateWheelTrigger();
    };

    Game_Map.prototype.updateWheelTrigger = function () {
        if (TouchInput.isMiddleTriggered()) {
            if (paramWheelSwitch) {
                $gameSwitches.setValue(paramWheelSwitch, true);
            }
            if (paramWheelToggle) {
                var prevValue = $gameSwitches.value(paramWheelToggle);
                $gameSwitches.setValue(paramWheelToggle, !prevValue);
            }
        }
        if (paramScrollVariable) {
            var prevValue = $gameVariables.value(paramScrollVariable);
            var value = 0;
            if (TouchInput.wheelX >= paramSensitivityX) {
                value = 4;
            }
            if (TouchInput.wheelX <= -paramSensitivityX) {
                value = 6;
            }
            if (TouchInput.wheelY >= paramSensitivityY) {
                value = 2;
            }
            if (TouchInput.wheelY <= -paramSensitivityY) {
                value = 8;
            }
            if (prevValue !== value) {
                $gameVariables.setValue(paramScrollVariable, value);
            }
        }
    };

    if (paramMessageScroll) {
        //=============================================================================
        // Window_Message
        //  ホイールでメッセージ送りをします。
        //=============================================================================
        var _Window_Message_isTriggered = Window_Message.prototype.isTriggered;
        Window_Message.prototype.isTriggered = function () {
            return _Window_Message_isTriggered.apply(this, arguments) || TouchInput.wheelY >= paramSensitivityY;
        };
    }

    if (paramCursorMove) {
        //=============================================================================
        // Window_Selectable
        //  ホイールでカーソル移動をします。
        //=============================================================================
        var _Window_Selectable_processCursorMove = Window_Selectable.prototype.processCursorMove;
        Window_Selectable.prototype.processCursorMove = function () {
            var lastIndex = this.index();
            _Window_Selectable_processCursorMove.apply(this, arguments);
            if (this.index() !== lastIndex) return;
            if (this.isCursorMovable()) {
                if (TouchInput.wheelY >= paramSensitivityY) {
                    this.cursorDown(false);
                }
                if (TouchInput.wheelY <= -paramSensitivityY) {
                    this.cursorUp(false);
                }
                if (TouchInput.wheelX >= paramSensitivityX) {
                    this.cursorLeft(false);
                }
                if (TouchInput.wheelX <= -paramSensitivityX) {
                    this.cursorRight(false);
                }
                if (this.index() !== lastIndex) {
                    SoundManager.playCursor();
                }
            }
        };
    }

    //=============================================================================
    // TouchInput
    //  ホイールクリックを決定ボタンにリンクします。
    //=============================================================================
    var _TouchInput_update2 = TouchInput.update;
    TouchInput.update = function () {
        _TouchInput_update2.apply(this, arguments);
        this._middleTriggered = this._events.middleTriggered;
        this._events.middleTriggered = false;
    };

    var _TouchInput__onMiddleButtonDown = TouchInput._onMiddleButtonDown;
    TouchInput._onMiddleButtonDown = function (event) {
        _TouchInput__onMiddleButtonDown.apply(this, arguments);
        if (paramWheelOk) {
            Input.setCurrentStateForWheelExtendOk(true);
        } else if (paramWheelCancel) {
            Input.setCurrentStateForWheelExtendCancel(true);
        }
        this._events.middleTriggered = true;
    };

    var _TouchInput__onMouseUp = TouchInput._onMouseUp;
    TouchInput._onMouseUp = function (event) {
        _TouchInput__onMouseUp.apply(this, arguments);
        if (event.button === 1) {
            if (paramWheelOk) {
                Input.setCurrentStateForWheelExtendOk(false);
            } else if (paramWheelCancel) {
                Input.setCurrentStateForWheelExtendCancel(false);
            }
        }
    };

    TouchInput.isMiddleTriggered = function () {
        return this._middleTriggered;
    };

    if (paramScrollDirection) {
        TouchInput._wheelValidFrame = 12;

        var _TouchInput__onWheel = TouchInput._onWheel;
        TouchInput._onWheel = function (event) {
            _TouchInput__onWheel.apply(this, arguments);
            if (event.deltaY <= -paramSensitivityY) {
                this._wheelUp = TouchInput._wheelValidFrame;
                Input.setCurrentStateForWheelExtendUp(true);
            }
            if (event.deltaY >= paramSensitivityY) {
                this._wheelDown = TouchInput._wheelValidFrame;
                Input.setCurrentStateForWheelExtendDown(true);
            }
            if (event.deltaX <= -paramSensitivityX) {
                this._wheelRight = TouchInput._wheelValidFrame;
                Input.setCurrentStateForWheelExtendRight(true);
            }
            if (event.deltaX >= paramSensitivityX) {
                this._wheelLeft = TouchInput._wheelValidFrame;
                Input.setCurrentStateForWheelExtendLeft(true);
            }
        };

        var _TouchInput_update = TouchInput.update;
        TouchInput.update = function () {
            _TouchInput_update.apply(this, arguments);
            this.updateWheelDirection();
        };

        TouchInput.updateWheelDirection = function () {
            if (this._wheelUp > 0) {
                this._wheelUp--;
                if (this._wheelUp <= 0) {
                    Input.setCurrentStateForWheelExtendUp(false);
                }
            }
            if (this._wheelDown > 0) {
                this._wheelDown--;
                if (this._wheelDown <= 0) {
                    Input.setCurrentStateForWheelExtendDown(false);
                }
            }
            if (this._wheelRight > 0) {
                this._wheelRight--;
                if (this._wheelRight <= 0) {
                    Input.setCurrentStateForWheelExtendRight(false);
                }
            }
            if (this._wheelLeft > 0) {
                this._wheelLeft--;
                if (this._wheelLeft <= 0) {
                    Input.setCurrentStateForWheelExtendLeft(false);
                }
            }
        };
    }

    //=============================================================================
    // Input
    //  マウスホイールの情報をキー入力に変換します。
    //=============================================================================
    Input.setCurrentStateForWheelExtendOk = function (value) {
        this.setCurrentStateForWheelExtend(13, value);
    };

    Input.setCurrentStateForWheelExtendCancel = function (value) {
        this.setCurrentStateForWheelExtend(27, value);
    };

    Input.setCurrentStateForWheelExtendDown = function (value) {
        this.setCurrentStateForWheelExtend(40, value);
    };

    Input.setCurrentStateForWheelExtendLeft = function (value) {
        this.setCurrentStateForWheelExtend(37, value);
    };

    Input.setCurrentStateForWheelExtendRight = function (value) {
        this.setCurrentStateForWheelExtend(39, value);
    };

    Input.setCurrentStateForWheelExtendUp = function (value) {
        this.setCurrentStateForWheelExtend(38, value);
    };

    Input.setCurrentStateForWheelExtend = function (code, value) {
        this._currentState[this.keyMapper[code]] = !!value;
    };
})();

repo_name: dazed/translations

license: unknown


code:
//=============================================================================
// MoveAnime2.js
//=============================================================================
//Copyright (c) 2016 Trb
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
//
//twitter https://twitter.com/Trb_surasura
/*:
 * @plugindesc アニメーションを飛ばすプラグイン 2
 * @author Trb
 *
 * @version 1.0(2.0)  2016 4/22 前Move_anime.jsから大きく改変したため別プラグインとしました
 *          1.1       2016 7/ 4 アニメーションの表示位置が[頭上]、[中心]だった時、アニメーションの始点がおかしくなる不具合を修正
 *
 *
 * @help アニメーションを使用者から相手へ向かって飛ばすことができます。
 * 設定方法はスキルのメモ欄に書く方法とスクリプトコマンドで設定する方法の2種類があります。
 *
 * ----設定方法1----
 * スキルのメモ欄に
 * <move: a>
 * <arc: b>
 * <deflection: c>
 * <repeat: d>
 * と書いて下さい。(a,b,c,dにはそれぞれ任意の数字を記入)
 * moveの設定は必須ですが、それ以外は不要なら無記入でも大丈夫です。
 *
 * <move:a>
 *   アニメーションの移動に掛けるフレーム数です。
 *   （10フレーム掛けて飛ばしたければ <move:10> と書きます）
 *
 * <arc:b>
 *   この値を設定すると、bの高さの放物線の軌道で飛んでいきます。
 *   （arc:1 = 標準解像度で1ピクセルです）
 *
 * <deflection:c>
 *   この値を設定すると、arcの値にプラスマイナスcの乱数が加算されます。
 *   (<arc:50> <deflection:100> と書くと実際のarc値は -50～150 の幅になる)
 *   多段ヒットの技にこの設定を適用することで乱れ撃ちのようになります。
 *
 * <repeat:d>
 *   この値を設定すると、同じアニメーションをd回繰り返し再生します。
 *   これはYEP_BattleCoreを入れると連続攻撃時にアニメーションが1回しか表示されない問題に
 *   対応するために追加した機能であり、
 *   これ単体で使うと本来の再生回数*d回再生されるようになってしまうので注意して下さい。
 *
 *
 * ----設定方法2----
 * スクリプトコマンド：setParams(アニメーションID,move値,arc値,deflection値)
 * で、アニメーションIDを指定してパラメータを設定できます。
 * イベントコマンドや別プラグインで表示させるアニメーション、フィールドでのアニメーションなど、
 * スキルのメモ欄で設定できないものはこちらを使って下さい。
 *
 * 例 ID5番のアニメを10フレームで飛ばせるようにしたい場合
 * 		setParams(5,10) というように書く
 *  (こちらもメモ欄と同じように、arc値、deflection値は不要なら省略出来ます)
 *
 * 一度設定したら別の値で上書きしない限り有効なので、ゲームの開始時に
 * イベントでまとめて設定しておくと便利です。
 * ただし保存用の変数を設定していないとセーブデータに保存されません。
 *
 *
 * ==============================================================
 *
 * ----その他機能----
 *
 * setStartPosition(アニメーションID,x,y)
 *   この値を設定すると、アニメーションの開始位置がスキルの使用者ではなく
 *   指定した座標になります。
 *
 *
 *   例 ID10番のアニメを(100,200)の座標から飛ばすようにする
 *       setParams_sp(10,100,200)
 *
 *
 * clearParams(アニメーションID)
 *   指定したアニメーションIDの設定を全てリセットします。
 *
 *
 *
 * @param use_field
 * @desc フィールド上でもアニメーションを飛ばせるようにするか
 * フィールドで使わない･･･false  使う･･･true
 * @default false
 *
 * @param variable
 * @desc setParamsで設定した値を保存する変数番号。
 * 0だと保存されません。
 * @default 0
 *
 *
 */
(function () {

	var parameters = PluginManager.parameters('MoveAnime2');
	var UseField = String(parameters['use_field']);
	var Variable = parameters['variable'];

	var params = [];
	var subjectX = 0;//使用者の座標
	var subjectY = 0;
	//paramsの中身
	var moveDuration = 0, arcRate = 1, deflection = 2, repeats = 3, startX = 4, startY = 5;

	//各設定値の代入用関数
	setParams = function (id, move, arc, def, rep) {
		id = Math.max(id, 0);
		if (!params[id]) params[id] = [];
		params[id][moveDuration] = move || 0;
		params[id][arcRate] = arc || 0;
		params[id][deflection] = def || 0;
		params[id][repeats] = rep || 0;
	};

	setStartPosition = function (id, a, b) {
		if (!params[id]) params[id] = [];
		params[id][startX] = a;
		params[id][startY] = b;
	};

	clearParams = function (id) {
		params[id] = [];
	};

	var SBu = Sprite_Battler.prototype.update;
	Sprite_Battler.prototype.update = function () {
		SBu.call(this);
		//行動中のキャラの座標を取得する
		if (this._battler != null && this._battler.isActing()) {
			if (!$gameSystem.isSideView() && this._actor) {
				//フロントビューの場合
				subjectX = Graphics.boxWidth / 2;
				subjectY = Graphics.boxHeight * 0.8;
			} else {
				subjectX = this.x;
				subjectY = this.y;
			}
		}

	};

	var WBsa = Window_BattleLog.prototype.startAction;
	Window_BattleLog.prototype.startAction = function (subject, action, targets) {
		var item = action.item();
		if (Number(item.meta.move) > 0) {//スキルのメモにムーブ値が設定されていたら代入
			setParams(item.animationId, Number(item.meta.move), Number(item.meta.arc) || 0,
				Number(item.meta.deflection) || 0, Number(item.meta.repeat) || 0);
		}
		WBsa.call(this, subject, action, targets);
	};

	Window_BattleLog.prototype.showNormalAnimation = function (targets, animationId, mirror) {
		var animation = $dataAnimations[animationId];
		if (animation) {
			var delay = this.animationBaseDelay();
			var nextDelay = this.animationNextDelay();
			targets.forEach(function (target) {
				target.startAnimation(animationId, mirror, delay);
				delay += nextDelay;
				var repeat = params[animationId] ? params[animationId][repeats] : 0;
				while (repeat > 0) {//repeat値の分アニメーションを繰り返す処理を追加
					target.startAnimation(animationId, mirror, delay);
					delay += nextDelay;
					repeat -= 1;
				}
			});
		}
	};

	var SAim = Sprite_Animation.prototype.initMembers;
	Sprite_Animation.prototype.initMembers = function () {
		SAim.call(this);
		this._x2 = 0;
		this._y2 = 0;
		this._duration2 = 0;
		this._arcRate = 0;
		this._arc = 0;
	};

	//アニメーションのセットアップ時に各パラメータを代入
	var SAs = Sprite_Animation.prototype.setup;
	Sprite_Animation.prototype.setup = function (target, animation, mirror, delay) {
		if (params[animation.id]) {
			var prm = params[animation.id];
			if (prm[startX]) {//startXが設定されてる場合はその値
				var sx = mirror ? Graphics.boxWidth - prm[startX] : prm[startX];
			} else {//そうでない場合は技使用者の座標
				sx = $gameParty.inBattle() ? subjectX : $gamePlayer.screenX();
			}
			if (prm[startY]) {
				var sy = prm[startY];
			} else {
				sy = $gameParty.inBattle() ? subjectY : $gamePlayer.screenY();
			}

			if ($gameParty.inBattle()) {//戦闘時
				var t = target._battler ? target : target.parent;
				var pos = animation.position;//アニメーションのポジションに応じて位置補正を加える（ver.1.1修正箇所）
				this._x2 = sx - t.x;
				this._y2 = sy - t.y - t.height * (pos - 2) / 2;//

			} else if (UseField == 'true') {//フィールド時
				this._x2 = sx - target.x;
				this._y2 = sy - target.y;

			}
			this._duration2 = prm[moveDuration];
			this._arc = this._duration2;
			this._arcRate = prm[arcRate] + (Math.random() - 0.5) * prm[deflection] * 2;

		}
		SAs.call(this, target, animation, mirror, delay);
	};

	//上で代入した値を元に位置補正を加える
	var SAup = Sprite_Animation.prototype.updatePosition;
	Sprite_Animation.prototype.updatePosition = function () {
		SAup.call(this);
		//表示位置補正の計算
		if (this._duration2 > 0) {
			this._x2 -= this._x2 / this._duration2;
			this._y2 -= this._y2 / this._duration2;
			this.x += this._x2;
			this.y += this._y2 - Math.sin(this._duration2 / this._arc * Math.PI) * this._arcRate;
			this._duration2 -= 1;
		}
	};

	//セーブ時にparamsを変数に入れる
	var SSof = Scene_Save.prototype.onSavefileOk;
	Scene_Save.prototype.onSavefileOk = function () {
		if (Variable > 0) {
			$gameVariables._data[Variable] = params.clone();
		}
		SSof.call(this);
	};

	//ロード時にparamsに移す
	var SLol = Scene_Load.prototype.onLoadSuccess;
	Scene_Load.prototype.onLoadSuccess = function () {
		if (Variable > 0) {
			try {
				params = $gameVariables._data[Variable].clone();
			}
			catch (e) { }
		}
		SLol.call(this);
	};

})();


code:
//=============================================================================
// MovieManager.js
// ----------------------------------------------------------------------------
// Copyright (c) 2015 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.0.1 2016/06/24 メニューを開いたときに最後に表示していたムービーが写り込む不具合を修正
// 1.0.0 2016/06/09 初版
// ----------------------------------------------------------------------------
// [Blog]   : http://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================

/*:
 * @plugindesc 動画管理プラグイン
 * @author トリアコンタン
 *
 * @help イベントコマンド「ムービーの再生」で再生できる動画をピクチャのように
 * コントロールできるようになります。
 * 座標や拡大率はもちろん、ループ可否や再生速度を自由に調整可能です。
 * イベントコマンド「ムービーの再生」後に以下のプラグインコマンドを実行します。
 *
 * プラグインコマンド詳細
 *  イベントコマンド「プラグインコマンド」から実行。
 *  （パラメータの間は半角スペースで区切る）
 *
 * すべてのプラグインコマンドはムービーが再生中でなくても有効です。
 *
 * MM_移動_座標 [X座標] [Y座標] [移動時間(f)] [待ちフラグ(ON/OFF)]
 *  ムービーの表示座標を時間を掛けて変更します。
 *  下記の例は、座標[100:100]に[60]フレーム掛けて移動し、処理中はウェイトします。
 *  ex:MM_移動_座標 100 100 60 ON
 *
 * MM_移動_拡大率 [X拡大率(100%)] [Y拡大率(100%)] [時間(f)] [待ちフラグ(ON/OFF)]
 *  ムービーの拡大率を時間を掛けて変更します。
 *  下記の例は、縦横の拡大率を[50%]に60フレーム掛けて縮小し、
 *  処理中はウェイトしません。
 *  ex:MM_移動_拡大率 50 50 60
 *
 * MM_移動_不透明度 [不透明度(0-256)] [時間(f)] [ウェイトフラグ(ON/OFF)]
 *  ムービーの不透明度を時間を掛けて変更します。
 *  下記の例は、不透明度が変数[1]の値に即座に変更されます。
 *  ex:MM_移動_不透明度 \v[1] 0 ON
 *
 * MM_設定_再生速度 [再生速度(標準:1.0)]
 *  ムービーの再生速度倍率を変更します。
 *  下記の例は、再生速度が1.5倍になります。
 *  ex:MM_設定_再生速度 1.5
 *
 * MM_設定_再生位置 [再生位置(S)]
 *  ムービーの再生位置を変更します。
 *  ただしChromeの場合ロードしていない位置に移動すると再生が終了してしまうため
 *  使用には注意が必要です。(2016/06/12時点での最新版で確認)
 *  下記の例は、100秒目の再生位置にジャンプします。
 *  ex:MM_設定_再生位置 100
 *
 * MM_設定_画面に合わせる [設定値(ON/OFF)]
 *  ONにすると拡大率が100%の状態でムービーのサイズが画面にフィットするように
 *  調整されます。OFFにすると元の動画ファイルのサイズに合わせます。
 *  ex:MM_設定_画面に合わせる ON
 *
 * MM_設定_ループ [設定値(ON/OFF)]
 *  ONにすると、再生終了後に最初からループ再生します。
 *  ex:MM_設定_ループ ON
 *
 * MM_一時停止
 *  再生を一時停止します。
 *  ex:MM_一時停止
 *
 * MM_再生
 *  一時停止した状態から再生します。初回はイベントコマンドだけで再生されるので
 *  このコマンドの実行は不要です。
 *  ex:MM_再生
 *
 * MM_停止
 *  再生を終了してムービーを消去します。
 *  ex:MM_停止
 *
 * MM_ウェイト
 *  ムービーの再生が終了するまでイベント実行を待機します。
 *  ループ再生している場合はゲームの進行が停止するので注意してください。
 *  ex:MM_ウェイト
 *
 * スクリプトコマンド詳細
 *
 * MovieManager.isPlaying();
 * ムービーが再生中の場合にtrueを返します。
 *
 * 制約事項
 * 現状、ムービーの表示状態はセーブできません。
 *
 * 利用規約：
 *  作者に無断で改変、再配布が可能で、利用形態（商用、18禁利用等）
 *  についても制限はありません。
 *  このプラグインはもうあなたのものです。
 */
function MovieManager() {
    throw new Error('This is a static class');
}

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

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

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

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

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

    var convertEscapeCharactersAndEval = function (text, evalFlg) {
        if (text === null || text === undefined) {
            text = evalFlg ? '0' : '';
        }
        var windowLayer = SceneManager._scene._windowLayer;
        if (windowLayer) {
            var result = windowLayer.children[0].convertEscapeCharacters(text);
            return evalFlg ? eval(result) : result;
        } else {
            return text;
        }
    };

    //=============================================================================
    // Bitmap
    //  キャプチャに表示中のムービーを含めます。
    //=============================================================================
    var _Bitmap_snap = Bitmap.snap;
    Bitmap.snap = function (stage) {
        var bitmap = _Bitmap_snap.apply(this, arguments);
        if (Graphics.isVideoPlaying()) {
            var video = Graphics.getVideo();
            bitmap.context.drawImage(video, video.x, video.y, video.width, video.height);
        }
        return bitmap;
    };

    //=============================================================================
    // Graphics
    //  ムービー再生に必要なタグを動的に生成します。
    //=============================================================================
    Graphics._videoScaleFitScreen = false;

    Graphics._createVideo = function () {
        this._videoFrame = document.createElement('div');
        this._videoFrame.id = 'GameVideoFrame';
        this._video = document.createElement('video');
        this._video.id = 'GameVideo';
        this._videoVisible = false;
        document.body.appendChild(this._videoFrame);
        this._videoFrame.appendChild(this._video);
        this.setVideoContentsPosition(0, 0);
        this.setVideoContentsScale(1.0, 1.0);
        this._updateVideo();
        this._centerElement(this._video);
        this._video.style.margin = 0;
        this._videoLoading = false;
    };

    Graphics.getVideo = function () {
        return this._video;
    };

    var _Graphics_playVideo = Graphics.playVideo;
    Graphics.playVideo = function (src) {
        _Graphics_playVideo.apply(this, arguments);
        this._videoLoading = true;
    };

    Graphics.stopVideo = function () {
        this._updateVisibility(false);
    };

    Graphics.setVisibleMovie = function (value) {
        this._videoFrame.style.visibility = (value ? 'visible' : 'hidden');
    };

    Graphics.setVideoScaleFitScreen = function (value) {
        this._videoScaleFitScreen = value;
        this.setVideoContentsScale(this._video.scaleX, this._video.scaleY);
    };

    var _Graphics_isVideoPlaying = Graphics.isVideoPlaying;
    Graphics.isVideoPlaying = function () {
        return _Graphics_isVideoPlaying.apply(this, arguments) || this.isVideoLoading();
    };

    Graphics.isVideoLoading = function () {
        return this._videoLoading;
    };

    Graphics._updateVisibility = function (videoVisible) {
        this._videoVisible = videoVisible;
        this._video.style.visibility = (videoVisible ? 'visible' : 'hidden');
        this._videoLoading = false;
    };

    Graphics._isVideoVisible = function () {
        return this._videoVisible;
    };

    var _Graphics__onVideoLoad = Graphics._onVideoLoad;
    Graphics._onVideoLoad = function () {
        _Graphics__onVideoLoad.apply(this, arguments);
        this.setVideoContentsScale(this._video.scaleX, this._video.scaleY);
    };

    var _Graphics__updateVideo = Graphics._updateVideo;
    Graphics._updateVideo = function () {
        var prevVideo = this._video;
        this._video = this._videoFrame;
        _Graphics__updateVideo.apply(this, arguments);
        this._video = prevVideo;
        this._updateVideoContents();
    };

    Graphics.setVideoContentsPosition = function (x, y) {
        this._video.x = x;
        this._video.y = y;
        this._updateVideoContents();
    };

    Graphics.setVideoContentsScale = function (scaleX, scaleY) {
        this._video.scaleX = scaleX;
        this._video.scaleY = scaleY;
        this._video.width = (this._videoScaleFitScreen ? this._width : this._video.videoWidth) * scaleX;
        this._video.height = (this._videoScaleFitScreen ? this._height : this._video.videoHeight) * scaleY;
        this._updateVideoContents();
    };

    Graphics._updateVideoContents = function () {
        var video = this._video;
        video.style.width = video.width * this._realScale + 'px';
        video.style.height = video.height * this._realScale + 'px';
        video.style.left = video.x * this._realScale + 'px';
        video.style.top = video.y * this._realScale + 'px';
    };

    //=============================================================================
    // Game_Interpreter
    //  プラグインコマンドを追加定義します。
    //=============================================================================
    var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function (command, args) {
        _Game_Interpreter_pluginCommand.apply(this, arguments);
        if (!command.match(new RegExp('^' + metaTagPrefix))) return;
        try {
            this.pluginCommandMovieManager(command.replace(metaTagPrefix, ''), args);
        } catch (e) {
            if ($gameTemp.isPlaytest() && Utils.isNwjs()) {
                var window = require('nw.gui').Window.get();
                if (!window.isDevToolsOpen()) {
                    var devTool = window.showDevTools();
                    devTool.moveTo(0, 0);
                    devTool.resizeTo(window.screenX + window.outerWidth, window.screenY + window.outerHeight);
                    window.focus();
                }
            }
            console.log('プラグインコマンドの実行中にエラーが発生しました。');
            console.log('- コマンド名 　: ' + command);
            console.log('- コマンド引数 : ' + args);
            console.log('- エラー原因   : ' + e.stack || e.toString());
        }
    };

    Game_Interpreter.prototype.pluginCommandMovieManager = function (command, args) {
        var waitTime = 0;
        switch (getCommandName(command)) {
            case '設定_ループ':
            case 'SETTING_LOOP':
                MovieManager.setLoop(getArgBoolean(args[0]));
                break;
            case '設定_画面に合わせる':
            case 'SETTING_FIT_SCREEN':
                MovieManager.setScaleFitScreen(getArgBoolean(args[0]));
                break;
            case '設定_再生速度':
            case 'SETTING_PLAY_RATE':
                MovieManager.setPlaybackRate(getArgFloat(args[0], 0));
                break;
            case '設定_再生位置':
            case 'SETTING_CURRENT_TIME':
                MovieManager.setCurrentTime(getArgFloat(args[0], 0));
                break;
            case '移動_不透明度':
            case 'MOVE_OPACITY':
                waitTime = getArgNumber(args[1], 0);
                MovieManager.moveOpacity(getArgNumber(args[0], 0, 256), waitTime);
                if (getArgBoolean(args[2])) this.wait(waitTime);
                break;
            case '移動_座標':
            case 'MOVE_POSITION':
                waitTime = getArgNumber(args[2], 0);
                MovieManager.movePosition(getArgNumber(args[0]), getArgNumber(args[1]), waitTime);
                if (getArgBoolean(args[3])) this.wait(waitTime);
                break;
            case '移動_拡大率':
            case 'MOVE_SCALE':
                waitTime = getArgNumber(args[2], 0);
                MovieManager.moveScale(getArgNumber(args[0]), getArgNumber(args[1]), waitTime);
                if (getArgBoolean(args[3])) this.wait(waitTime);
                break;
            case '停止':
            case 'STOP':
                MovieManager.stop();
                break;
            case 'ウェイト':
            case 'WAIT':
                this.setWaitMode('video');
                break;
            case '一時停止':
            case 'PAUSE':
                MovieManager.pause();
                break;
            case '再生':
            case 'PLAY':
                MovieManager.play();
                break;
        }
    };

    var _Game_Interpreter_command261 = Game_Interpreter.prototype.command261;
    Game_Interpreter.prototype.command261 = function () {
        _Game_Interpreter_command261.apply(this, arguments);
        this._waitMode = '';
    };

    //=============================================================================
    // SceneManager
    //  動画管理モジュールを操作します。
    //=============================================================================
    var _SceneManager_initialize = SceneManager.initialize;
    SceneManager.initialize = function () {
        _SceneManager_initialize.apply(this, arguments);
        MovieManager.initTarget();
    };

    var _SceneManager_updateScene = SceneManager.updateScene;
    SceneManager.updateScene = function () {
        _SceneManager_updateScene.apply(this, arguments);
        MovieManager.update();
    };

    //=============================================================================
    // MovieManager
    //  動画管理モジュールです。
    //=============================================================================
    MovieManager.initTarget = function () {
        this._targetX = this.getPositionX();
        this._targetY = this.getPositionY();
        this._durationPosition = 0;
        this._targetScaleX = this.getScaleX();
        this._targetScaleY = this.getScaleY();
        this._durationScale = 0;
        this._targetOpacity = this.getOpacity();
        this._durationOpacity = 0;
    };

    MovieManager.update = function () {
        this.updatePosition();
        this.updateScale();
        this.updateOpacity();
    };

    MovieManager.updatePosition = function () {
        if (this._durationPosition > 0) {
            var x = this.getPositionX();
            var y = this.getPositionY();
            var d = this._durationPosition;
            x = (x * (d - 1) + this._targetX) / d;
            y = (y * (d - 1) + this._targetY) / d;
            this.setPosition(x, y);
            this._durationPosition--;
        }
    };

    MovieManager.updateScale = function () {
        if (this._durationScale > 0) {
            var sx = this.getScaleX();
            var sy = this.getScaleY();
            var d = this._durationScale;
            sx = (sx * (d - 1) + this._targetScaleX) / d;
            sy = (sy * (d - 1) + this._targetScaleY) / d;
            this.setScale(sx, sy);
            this._durationScale--;
        }
    };

    MovieManager.updateOpacity = function () {
        if (this._durationOpacity > 0) {
            var opacity = this.getOpacity();
            var d = this._durationOpacity;
            opacity = (opacity * (d - 1) + this._targetOpacity) / d;
            this.setOpacity(opacity);
            this._durationOpacity--;
        }
    };

    MovieManager.getVideo = function () {
        return Graphics.getVideo();
    };

    MovieManager.isPlaying = function () {
        return Graphics._isVideoVisible();
    };

    MovieManager.play = function () {
        if (!Graphics.isVideoLoading()) {
            this.getVideo().play();
        }
    };

    MovieManager.pause = function () {
        this.getVideo().pause();
    };

    MovieManager.stop = function () {
        this.pause();
        Graphics.stopVideo();
        this.initTarget();
    };

    MovieManager.setLoop = function (value) {
        this.getVideo().loop = !!value;
    };

    MovieManager.getLoop = function () {
        return this.getVideo().loop;
    };

    MovieManager.setScaleFitScreen = function (value) {
        Graphics.setVideoScaleFitScreen(!!value);
    };

    MovieManager.setCurrentTime = function (value) {
        this.getVideo().currentTime = value;
    };

    MovieManager.getCurrentTime = function () {
        return this.getVideo().currentTime;
    };

    MovieManager.setPlaybackRate = function (value) {
        this.getVideo().playbackRate = value;
    };

    MovieManager.getPlaybackRate = function () {
        return this.getVideo().playbackRate;
    };

    MovieManager.moveOpacity = function (opacity, duration) {
        if (duration === 0) {
            this.setOpacity(opacity);
        } else {
            this._targetOpacity = opacity;
            this._durationOpacity = duration;
        }
    };

    MovieManager.setOpacity = function (opacity) {
        var realOpacity = opacity / 256;
        if (realOpacity !== this.getOpacity()) {
            this.getVideo().style.opacity = realOpacity;
        }
    };

    MovieManager.getOpacity = function () {
        return this.getVideo().style.opacity * 256;
    };

    MovieManager.moveScale = function (scaleX, scaleY, duration) {
        if (duration === 0) {
            this.setScale(scaleX, scaleY);
        } else {
            this._targetScaleX = scaleX;
            this._targetScaleY = scaleY;
            this._durationScale = duration;
        }
    };

    MovieManager.setScale = function (scaleX, scaleY) {
        if (scaleX !== this.getScaleX() || scaleY !== this.getScaleY()) {
            Graphics.setVideoContentsScale(scaleX / 100, scaleY / 100);
        }
    };

    MovieManager.getScaleX = function () {
        return this.getVideo().scaleX * 100;
    };

    MovieManager.getScaleY = function () {
        return this.getVideo().scaleY * 100;
    };

    MovieManager.movePosition = function (x, y, duration) {
        if (duration === 0) {
            this.setPosition(x, y);
        } else {
            this._targetX = x;
            this._targetY = y;
            this._durationPosition = duration;
        }
    };

    MovieManager.setPosition = function (x, y) {
        if (this.getPositionX() !== x || this.getPositionY() !== y) {
            Graphics.setVideoContentsPosition(x, y);
        }
    };

    MovieManager.getPositionX = function () {
        return this.getVideo().x;
    };

    MovieManager.getPositionY = function () {
        return this.getVideo().y;
    };
})();


code:
//=============================================================================
// MovieMapToBattle.js
//=============================================================================

/*:
 * @plugindesc フィールドとか戦闘で動画が複数使えるようになるよ
 * (なぜか .webm しか認識しない) あとweb版だとなぜか動かないね…
 * @author １１１
 *
 *
 * @help プラグインコマンドはありません。
 *
 * フィールドならプラグインコマンドから
 * MovieMap イベントID ファイル名
 * MovieMap 1 ./movies/testVideo.webm
 * って感じで。
 *
 * 戦闘中はスキルのnote欄で
 * [x,y] ファイル名
 * <movie:[0,100] ./movies/bigbun.webm>
 * みたいに書く。
 */
(function () {
    PIXI.VideoTexture.fromUrl = function (videoSrc, scaleMode) {
        var video = document.createElement('video');
        video.src = videoSrc;
        video.autoPlay = true;
        video.play();
        var obj = PIXI.VideoTexture.textureFromVideo(video, scaleMode);
        obj.video = video;
        return obj;
    };

    //=============================================================================
    // Game_Interpreter - register plugin commands
    //=============================================================================
    var _Game_Interpreter_pluginCommand =
        Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function (command, args) {
        _Game_Interpreter_pluginCommand.call(this, command, args)
        // フィールド用
        if (command === 'MovieMap') {
            var sprite = new Sprite_Movie(args[1]); // ファイル名
            sprite.charSet(args[0]) // event_id
            SceneManager._scene.addChild(sprite);
        }
    };
    //
    var battleNoteFunc = function (text) {
        var args = text.split(" ");
        var sprite = new Sprite_Movie(args[1]);
        if (args[0].match(/\[.+?\]/)) {
            var ary = eval(args[0]);
            if (Array.isArray(ary)) {
                var x = ary[0];
                var y = ary[1];
            } else {
                throw new Error('noteの記述がおかしい');
            }
        }
        sprite.move(x, y);
        SceneManager._scene.addChild(sprite);
    }

    var _Game_Battler_useItem =
        Game_Battler.prototype.useItem;
    Game_Battler.prototype.useItem = function (item) {
        if (item.meta.movie) battleNoteFunc(item.meta.movie);
        _Game_Battler_useItem.call(this, item);
    };

    // ToDo
    // item.Scope 2,4,5,6,8,10は全体対象なので中央にでも、1,3,7,9,11は個別なので
    // その対象(targets)の座標とか…
    //
    /*
        var _BattleManager_startAction = BattleManager.startAction;
        BattleManager.startAction = function() {
            _BattleManager_startAction.call(this);
            var subject = this._subject;
            var action = subject.currentAction();
            var targets = action.makeTargets();
            var item = action.item();
            if(item.meta.movie)
                subject.useItem(item , targets);
        };
    */
    //
    function Sprite_Movie() {
        this.initialize.apply(this, arguments);
    }
    Sprite_Movie.prototype = Object.create(Sprite.prototype);
    Sprite_Movie.prototype.constructor = Sprite_Movie;
    Sprite_Movie.prototype.initialize = function (f_name) {
        var texture = PIXI.VideoTexture.fromUrl(f_name, 1); //
        PIXI.Sprite.call(this, texture);
        // 読み込み終わってからでないと画像の大きさ分からない
        texture.video.addEventListener("loadedmetadata", (function () {
            var width = this._video.videoWidth;
            var height = this._video.videoHeight;
            this._frame = new Rectangle(0, 0, width, height);
            this._realFrame = new Rectangle(0, 0, width, height);
            this._refresh();
        }).bind(this), false);
        //
        this._video = texture.video;
        // this._video.playbackRate = 3.0;
        this._bitmap = ""; //
        this._frame = new Rectangle(0, 0, 1, 1); //
        this._realFrame = new Rectangle(0, 0, 1, 1); //
        this._offset = new Point();
        this._blendColor = [0, 0, 0, 0];
        this._colorTone = [0, 0, 0, 0];
        this._canvas = null;
        this._context = null;
        this._tintTexture = null;
        this.spriteId = Sprite._counter++;
        this.opaque = false;
        this.loop = false; //
    };
    Sprite_Movie.prototype.stop = function () {
        this._video.pause();
    }
    Sprite_Movie.prototype.play = function () {
        this._video.play();
    }
    Sprite_Movie.prototype.isEnd = function () {
        return this._video.ended;
    }
    Sprite_Movie.prototype.charSet = function (char_id) {
        var event = $gameMap.event(char_id);
        var that = this;
        var _onUpdate = this.onUpdate;
        this.onUpdate = function () { // 既存のfunctionに追加
            _onUpdate();
            that.move(event.screenX() - that.width / 2,
                event.screenY() - that.height / 2);
        }
    }
    Sprite_Movie.prototype.onUpdate = function () { }
    Sprite_Movie.prototype.update = function () {
        this.onUpdate();
        if (this.isEnd()) {
            if (this.loop) { // _video.loop = trueでも出来るみたいだけどね
                this._video.currentTime = 0;
                this._video.play();
            } else {
                var scene = this.parent;
                scene.removeChild(this);
            }
        }
    }
})();


code:
//==============================================================================
// MrTS_BattleCharacterLimit.js
//==============================================================================

/*:
* @plugindesc Changes character placement for battles.
* @author Mr. Trivel
*
* @param Max Characters
* @desc Max characters in battle
* @default 5
*
* @param Characters Per Row
* @desc Characters per row in battle
* @default 3
*
* @param Offset
* @desc Starting horizontal offset of characters
* @default 120
*
* @param Vertical Offset
* @desc Starting vertical offset of characters
* @default 360
*
* @param Lower Index
* @desc How further each character below is
* @default 48
*
* @param Forward Offset
* @desc Move the rows by an offset for each row in battle
* @default 100
*
* @param Row Spacing
* @desc Space between rows
* @default 100
*
* @param Vertical Chara Spacing
* @desc Space between rows
* @default 54
*
* @help
* --------------------------------------------------------------------------------
* Terms of Use
* --------------------------------------------------------------------------------
* Don't remove the header or claim that you wrote this plugin.
* Credit Mr. Trivel if using this plugin in your project.
* Free for commercial and non-commercial projects.
* --------------------------------------------------------------------------------
* Version 1.1
* --------------------------------------------------------------------------------
*/

(function () {
	var parameters = PluginManager.parameters('MrTS_BattleCharacterLimit');

	var maxCharacters = Number(parameters['Max Characters'] || 5);
	var charasPerRow = Number(parameters['Characters Per Row'] || 3);
	var rightOffset = Number(parameters['Offset'] || 120);
	var topOffset = Number(parameters['Vertical Offset'] || 360);
	var lowerCharaIndex = Number(parameters['Lower Index'] || 48);
	var forwardIndex = Number(parameters['Forward Offset'] || 100);
	var rowSpacing = Number(parameters['Row Spacing'] || 100);
	var charaVerticalSpacing = Number(parameters['Vertical Chara Spacing'] || 54);

	Game_Party.prototype.maxBattleMembers = function () {
		return maxCharacters;
	};

	Sprite_Actor.prototype.setActorHome = function (index) {
		var c = Math.floor(index / charasPerRow);
		var x = (Graphics.boxWidth - rightOffset) - forwardIndex * Math.floor($gameParty.battleMembers().length / charasPerRow) + lowerCharaIndex * (index % charasPerRow) + rowSpacing * c;
		var y = topOffset + (index % charasPerRow) * charaVerticalSpacing;
		this.setHome(x, y);
	};

})();


code:
//=============================================================================
// NRP_DebugTile.js
//=============================================================================
/*:
 * @target MV MZ
 * @plugindesc v1.01 Displays tile information in debug mode.
 * @author Takeshi Sunagawa (http://newrpg.seesaa.net/)
 * @url http://newrpg.seesaa.net/article/481013577.html
 *
 * @help Displays tile information in debug mode.
 *
 * Displays the TileId and AutotileType,
 * which are usually difficult to verify.
 *
 * In particular, AutotileType is used to determine the background of the battle.
 * This item is not usually checked.
 * It is useful for setting up other plugins.
 *
 * ※This plugin is a rush job.
 *   I may organize it soon.
 * ※I have made it so that it does not work in production,
 *   but just in case, you might want to turn off the plugin
 *   when you no longer need it.
 *
 * [Usage]
 * After running the game, use F2 to display the FPS.
 * Next to it, the TileId and AutotileType
 * of the player's current location are displayed.
 * Also, the target is the uppermost layer,
 * except for tiles with a ☆ traffic rating.
 *
 * [Terms]
 * There are no restrictions.
 * Modification, redistribution freedom, commercial availability,
 * and rights indication are also optional.
 * The author is not responsible,
 * but will deal with defects to the extent possible.
 *
 * @param PassageIgnoreTerrain
 * @type string
 * @desc Specify the terrain tag (1~7) to ignore the passage judgment. Multiple tags can be specified. (e.g.:1,3)
 */

/*:ja
 * @target MV MZ
 * @plugindesc v1.01 タイル情報をデバッグ表示します。
 * @author 砂川赳（http://newrpg.seesaa.net/）
 * @url http://newrpg.seesaa.net/article/481013577.html
 *
 * @help タイル情報をデバッグ表示します。
 *
 * 通常、確認が困難なタイルＩＤとオートタイルタイプを表示します。
 *
 * 特にオートタイルタイプは戦闘背景の判定に用いられていますが、
 * 通常は確認できない項目です。
 * 他のプラグインでの設定に役立ててください。
 *
 * ※このプラグインはやっつけ仕事です。
 * 　そのうち整理するかもしれません。
 * ※一応、本番では動作しないようにしていますが、
 * 　念のため不要になったら、プラグインをオフにしたほうがよいかも？
 *
 * ■使用方法
 * ゲーム実行後、Ｆ２でＦＰＳを表示してください。
 * その隣に、プレイヤーの現在地のタイルＩＤとオートタイルタイプが表示されます。
 * また、対象となるのは通行判定が☆のタイルを除いた最も上のレイヤーです。
 *
 * ■利用規約
 * 特に制約はありません。
 * 改変、再配布自由、商用可、権利表示も任意です。
 * 作者は責任を負いませんが、不具合については可能な範囲で対応します。
 */
(function () {
    "use strict";

    const PLUGIN_NAME = "NRP_DebugTile";
    const parameters = PluginManager.parameters(PLUGIN_NAME);

    /**
     * ●テスト実行かどうか？
     */
    function isPlaytest() {
        // ブラウザ実行時は常に本番と判定
        if (isBrowserMode()) {
            return false;

            // ※この段階では$gameTemp.isPlaytest()は有効にならないため、こちらで判定。
        } else if (Utils.isOptionValid("test")) {
            return true;
        }
        return false;
    }

    /**
     * ●ブラウザ実行かどうか？
     */
    function isBrowserMode() {
        if (!Utils.isNwjs()) {
            return true;
        }
        return false;
    }

    /**
     * ●ＭＺの場合
     */
    if (Utils.RPGMAKER_NAME == "MZ") {
        /**
         * ●ＦＰＳの表示更新
         */
        const _Graphics_FPSCounter__update = Graphics.FPSCounter.prototype._update;
        Graphics.FPSCounter.prototype._update = function () {
            _Graphics_FPSCounter__update.apply(this, arguments);

            // テスト時以外は終了
            if (!isPlaytest()) {
                return;

                // 表示中以外は終了
            } else if (this._boxDiv.style.display === "none") {
                return;
            }

            // まだ準備できていない場合があるのでチェック
            if (this._boxDiv && $dataMap && $gamePlayer && $gameParty) {
                // 戦闘中は終了
                if ($gameParty.inBattle()) {
                    return;
                }

                // 表示領域を拡張
                this._boxDiv.style.width = "500px";

                // 対象とするレイヤーを取得
                const layerNo = getStepLayer($gamePlayer.x, $gamePlayer.y);
                if (layerNo >= 0) {
                    this._numberDiv.textContent +=
                        " TileID:" + $gameMap.tileId($gamePlayer.x, $gamePlayer.y, layerNo);
                    this._numberDiv.textContent +=
                        " AutotileType:" + $gameMap.autotileType($gamePlayer.x, $gamePlayer.y, layerNo);
                }
            }
        };
    }

    /**
     * ●ＭＶの場合
     */
    if (Utils.RPGMAKER_NAME == "MV") {
        const _Spriteset_Map_update = Spriteset_Map.prototype.update;
        Spriteset_Map.prototype.update = function () {
            _Spriteset_Map_update.apply(this, arguments);

            // テスト時以外は終了
            if (!isPlaytest()) {
                return;
            }

            // まだ準備できていない場合があるのでチェック
            if ($dataMap && $gamePlayer && $gameParty) {
                // 戦闘中は終了
                if ($gameParty.inBattle()) {
                    return;
                }

                const modeBox = Graphics._modeBox;

                // 表示領域を拡張
                modeBox.style.width = "170px";
                modeBox.style.height = "90px";

                // 対象とするレイヤーを取得
                const layerNo = getStepLayer($gamePlayer.x, $gamePlayer.y);
                if (layerNo >= 0) {
                    const modeText = document.getElementById('modeText');
                    modeText.style.fontSize = '20px';
                    modeText.style.fontWeight = 'bold';

                    modeText.textContent =
                        " TileID:" + $gameMap.tileId($gamePlayer.x, $gamePlayer.y, layerNo);
                    modeText.textContent +=
                        " AutotileType:" + $gameMap.autotileType($gamePlayer.x, $gamePlayer.y, layerNo);
                }
            }
        };
    }

    /**
     * ●☆を除いた有効な最大レイヤー番号
     * ※要するに足を踏みしめるレイヤー
     */
    function getStepLayer(x, y) {
        // 各タイルが保有するフラグ情報
        const flags = $gameMap.tilesetFlags();
        // 上のレイヤーから順番にループ
        const tiles = $gameMap.layeredTiles(x, y);
        for (let i = 0; i < 4; i++) {
            const tileId = tiles[i];
            const layerNo = 3 - i;

            // 通行判定☆（0x10）を除く最初のタイルが対象
            if ((flags[tileId] & 0x10) === 0) {
                return layerNo;
            }
        }
        // 無効の場合は-1
        return -1;
    }

})();