code:
//=============================================================================
// NpcFollower.js
// ----------------------------------------------------------------------------
// (C) 2016 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.1.1 2019/11/02 1.1.0の修正でメンバーの入れ替えを実施すると表示が不正になる場合がある問題を修正
// 1.1.0 2019/01/27 通常のフォロワーを表示せず、NPCフォロワーのみを表示できる機能を追加
// 1.0.3 2018/08/06 コアスクリプトが1.6.0より古い場合にエラーになる記述を修正
// 1.0.2 2017/01/17 プラグインコマンドが小文字でも動作するよう修正（byこまちゃん先輩）
// 1.0.1 2016/07/17 セーブデータをロードした際のエラーになる現象の修正
// 1.0.0 2016/07/14 初版
// ----------------------------------------------------------------------------
// [Blog]   : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================

/*:
 * @plugindesc NPC Follower plugin
 * @author triacontane
 *
 * @param MaxNpcNumber
 * @desc 同時に隊列に存在できるNPCの最大数です。
 * @default 1
 *
 * @param HideNormalFollower
 * @desc 隊列歩行の設定にかかわらず通常のフォロワーを一切表示せず、NPCフォロワーのみを表示します。
 * @default false
 * @type boolean
 *
 * @help マップ上の隊列の好きな位置にパーティメンバー以外のNPCを追加します。
 * NPCはデータベース上はアクターで定義してプラグインコマンドから追加、削除します。
 * 戦闘員ではないので、メニュー画面や戦闘画面には影響を与えません。
 * また、隊列表示していない場合は何も表示されません。
 *
 * 同一IDのアクターを複数追加することもできます。
 *
 * プラグインコマンド詳細
 *  イベントコマンド「プラグインコマンド」から実行。
 *  （パラメータの間は半角スペースで区切る）
 *
 * NF_NPC追加 4 1 # アクターID[4]をNPCとしてパーティの[1]番目の後ろに追加
 * NF_ADD_NPC 5 3 # アクターID[5]をNPCとしてパーティの[3]番目の後ろに追加
 * NF_NPC削除 1   # [1]番目に追加したNPCを全て削除
 * NF_REM_NPC 3   # [3]番目に追加したNPCを全て削除
 *
 * インデックスの指定は追加したNPCとは関係なく、
 * パーティの並び順(1...バトルメンバー数)を指定してください。
 *
 * This plugin is released under the MIT License.
 */
/*:ja
 * @plugindesc NPCフォロワープラグイン
 * @author トリアコンタン
 *
 * @param 最大同時NPC数
 * @desc 同時に隊列に存在できるNPCの最大数です。
 * @default 1
 * @type number
 * @min 1
 *
 * @param 通常フォロワーを表示しない
 * @desc 隊列歩行の設定にかかわらず通常のフォロワーを一切表示せず、NPCフォロワーのみを表示します。
 * @default false
 * @type boolean
 *
 * @help マップ上の隊列の好きな位置にパーティメンバー以外のNPCを追加します。
 * NPCはデータベース上はアクターで定義してプラグインコマンドから追加、削除します。
 * 戦闘員ではないので、メニュー画面や戦闘画面には影響を与えません。
 * また、隊列表示していない場合は何も表示されません。
 *
 * 同一IDのアクターを複数追加することもできます。
 *
 * プラグインコマンド詳細
 *  イベントコマンド「プラグインコマンド」から実行。
 *  （パラメータの間は半角スペースで区切る）
 *
 * NF_NPC追加 4 1 # アクターID[4]をNPCとしてパーティの[1]番目の後ろに追加
 * NF_ADD_NPC 5 3 # アクターID[5]をNPCとしてパーティの[3]番目の後ろに追加
 * NF_NPC削除 1   # [1]番目に追加したNPCを全て削除
 * NF_REM_NPC 3   # [3]番目に追加したNPCを全て削除
 *
 * インデックスの指定は追加したNPCとは関係なく、
 * パーティの並び順(1...バトルメンバー数)を指定してください。
 *
 * 利用規約：
 *  作者に無断で改変、再配布が可能で、利用形態（商用、18禁利用等）
 *  についても制限はありません。
 *  このプラグインはもうあなたのものです。
 */

(function() {
    'use strict';
    var pluginName    = 'NpcFollower';
    var metaTagPrefix = 'NF';

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

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

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

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

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

    //=============================================================================
    // パラメータの取得と整形
    //=============================================================================
    var paramMaxNpcNumber       = getParamNumber(['MaxNpcNumber', '最大同時NPC数']);
    var paramHideNormalFollower = getParamBoolean(['HideNormalFollower', '通常フォロワーを表示しない']);

    //=============================================================================
    // Game_Interpreter
    //  プラグインコマンドを追加定義します。
    //=============================================================================
    var _Game_Interpreter_pluginCommand      = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function(command, args) {
        _Game_Interpreter_pluginCommand.apply(this, arguments);
        this.pluginCommandNpcFollower(command.replace(new RegExp(metaTagPrefix, 'i'), ''), args);
    };

    Game_Interpreter.prototype.pluginCommandNpcFollower = function(command, args) {
        switch (getCommandName(command)) {
            case '_NPC追加' :
            case '_ADD_NPC' :
                var actorId = getArgNumberWithEval(args[0]);
                $gameParty.addNpc(actorId, getArgNumberWithEval(args[1], 1));
                break;
            case '_NPC削除' :
            case '_REM_NPC' :
                $gameParty.removeNpc(getArgNumberWithEval(args[0], 1));
                break;
        }
    };

    //=============================================================================
    // Game_Party
    //  NPCの追加と削除を追加定義します。
    //=============================================================================
    var _Game_Party_initialize      = Game_Party.prototype.initialize;
    Game_Party.prototype.initialize = function() {
        _Game_Party_initialize.apply(this, arguments);
        this.initNpc();
    };

    Game_Party.prototype.initNpc = function() {
        this._npcs       = [];
        this._npcIndexes = [];
    };

    Game_Party.prototype.isNpcInvalid = function() {
        return !this._npcs;
    };

    Game_Party.prototype.initNpcIfNeed = function() {
        if (this.isNpcInvalid()) {
            this.initNpc();
            $gamePlayer.followers().initNpc();
        }
    };

    Game_Party.prototype.addNpc = function(actorId, index) {
        if (this._npcs.length < paramMaxNpcNumber) {
            this._npcs.push(actorId);
            this._npcIndexes.push(index);
            $gamePlayer.refresh();
            $gameMap.requestRefresh();
        } else {
            throw new Error('登録可能な最大数を超えています。');
        }
    };

    Game_Party.prototype.removeNpc = function(index) {
        for (var i = 0, n = this._npcs.length; i < n; i++) {
            if (this._npcIndexes[i] === index) {
                this._npcs.splice(i, 1);
                this._npcIndexes.splice(i, 1);
                i--;
            }
        }
        $gamePlayer.refresh();
        $gameMap.requestRefresh();
    };

    Game_Party.prototype.npcMembers = function() {
        return this._npcs.map(function(id) {
            return $gameActors.actor(id);
        });
    };

    Game_Party.prototype.visibleMembers = function() {
        return this._visibleMembers;
    };

    Game_Party.prototype.makeVisibleMembers = function() {
        var battleMembers  = this.battleMembers();
        var npcMembers     = this.npcMembers();
        var visibleMembers = [];
        for (var i = 0, n = this.maxBattleMembers() + 1; i < n; i++) {
            for (var j = 0, m = npcMembers.length; j < m; j++) {
                if (this._npcIndexes[j] === i) {
                    visibleMembers.push(npcMembers[j]);
                }
            }
            if (battleMembers.length > i && !paramHideNormalFollower) {
                visibleMembers.push(battleMembers[i]);
            }
        }
        this._visibleMembers = visibleMembers;
    };

    //=============================================================================
    // Game_Followers
    //  NPCの最大数ぶんだけ余分にGame_Followerを作成します。
    //=============================================================================
    var _Game_Followers_initialize      = Game_Followers.prototype.initialize;
    Game_Followers.prototype.initialize = function() {
        _Game_Followers_initialize.apply(this, arguments);
        if (paramHideNormalFollower) {
            this._data = [];
        }
        this.initNpc();
    };

    Game_Followers.prototype.initNpc = function() {
        var memberLength = this._data.length > 0 ? this._data.length + 1 : 0;
        for (var i = 0; i < paramMaxNpcNumber; i++) {
            this._data.push(new Game_Follower(memberLength + i));
        }
    };

    //=============================================================================
    // Game_Follower
    //  NPC判定を追加定義します。
    //=============================================================================
    var _Game_Follower_actor      = Game_Follower.prototype.actor;
    Game_Follower.prototype.actor = function() {
        _Game_Follower_actor.apply(this, arguments);
        return $gameParty.visibleMembers()[this._memberIndex];
    };

    //=============================================================================
    // Game_Player
    //  リフレッシュまえに表示メンバーを更新します。
    //=============================================================================
    var _Game_Player_refresh      = Game_Player.prototype.refresh;
    Game_Player.prototype.refresh = function() {
        $gameParty.makeVisibleMembers();
        _Game_Player_refresh.apply(this, arguments);
    };

    //=============================================================================
    // DataManager
    //  プラグイン未適用のデータをロードした場合に必要なデータを初期化します。
    //=============================================================================
    var _DataManager_loadGame = DataManager.loadGame;
    DataManager.loadGame      = function(saveFileId) {
        var result = _DataManager_loadGame.apply(this, arguments);
        $gameParty.initNpcIfNeed();
        return result;
    };
})();


code:
//=============================================================================
// OggOnly.js
// PUBLIC DOMAIN
// ----------------------------------------------------------------------------
// 2018/07/23 国際化と微修正
//=============================================================================

/*:
 * @plugindesc Use only ogg files to play the audio.
 * @author krmbn0576
 *
 * @param deleteM4a
 * @type boolean
 * @text Delete all m4a files
 * @desc Delete all m4a files the next time you playtest. Backup your files before execute.
 * @default false
 *
 * @help
 * Use only ogg files to play the audio such as BGM and SE.
 * You need no longer to prepare m4a files.
 *
 * Usage:
 * Locate stbvorbis.js, stbvorbis_asm.js, and this plugin in plugins directory.
 * Turn ON Only this plugin, but DO NOT register the others to plugin manager.
 *
 *
 * License:
 * PUBLIC DOMAIN
 *
 * Thanks:
 * This plugin uses stbvorbis.js(https://github.com/hajimehoshi/stbvorbis.js)
 * as a ogg decoder. Thanks!
 */

/*:ja
 * @plugindesc 音声ファイルの再生にoggファイルのみを使用します。
 * @author くらむぼん
 *
 * @param deleteM4a
 * @type boolean
 * @text m4aファイルを消去
 * @desc 次にテストプレイを開始した時、すべてのm4aファイルを削除します。念の為バックアップを取った上でご活用ください。
 * @default false
 *
 * @help
 * BGMや効果音などの音声ファイルにoggファイルのみを使用します。
 * 本プラグインを入れている場合、m4aファイルを用意しなくても音声を再生できます。
 *
 * 使い方：
 * pluginsフォルダに本プラグインとstbvorbis.jsとstbvorbis_asm.jsを配置してください。
 * ３つのうち本プラグイン「だけ」をプラグイン管理でONに設定してください。
 * 他の２つはOFFでも構いませんし、プラグイン管理に登録しなくても構いません。
 *
 *
 * ライセンス：
 * このプラグインの利用法に制限はありません。お好きなようにどうぞ。
 *
 * 謝辞：
 * このプラグインはoggデコーダーとしてstbvorbis.jsを使用しています。
 * (https://github.com/hajimehoshi/stbvorbis.js)
 * ありがとうございます！みんなどんどん使ってね！！
 */

(function() {
    'use strict';
    var parameters = PluginManager.parameters('OggOnly');
    var deleteM4a = parameters['deleteM4a'] === 'true';

    // ただただ互換性回復のため再定義。 / Recover compatiblity.
    Utils.isOptionValid = function(name) {
        if (location.search.slice(1).split('&').contains(name)) return true;
        return typeof window.nw !== "undefined" && nw.App.argv.length > 0 && nw.App.argv[0].split('&').contains(name);
    };

    if (deleteM4a && Utils.isOptionValid('test') && Utils.isNwjs()) {
        var exec = require('child_process').exec;
        var messages, success, failure;
        if (navigator.language.contains('ja')) {
            messages = [
                'すべてのm4aファイルを削除しますか？',
                '本当に削除しますか？念のため、先にプロジェクトフォルダのバックアップをとっておくことをおすすめします。',
                'こうかいしませんね？'
            ];
            success = 'すべてのm4aファイルを削除しました。';
            failure = 'm4aファイルの削除中にエラーが発生しました。 ';
        } else {
            messages = [
                'Delete all m4a files?',
                'Are you sure?',
                'This cannot be undone. Are you really, REALLY sure?'
            ];
            success = 'All m4a files have been deleted.';
            failure = 'Error occured while deleting m4a files.';
        }
        if (messages.every(function(message) { return confirm(message); })) {
            var command = process.platform === 'win32' ? 'del /s *.m4a' : 'find . -name "*.m4a" -delete';
            exec(command, function(error) {
                alert(error ? failure : success);
            });
        }
    }

    PluginManager.loadScript('stbvorbis.js');

    AudioManager.audioFileExt = function() {
        return '.ogg';
    };

    if (!WebAudio.canPlayOgg()) {
        WebAudio._context.decodeAudioData = function(arrayBuffer, callback, errorback) {
            return stbvorbis.decode(arrayBuffer).then(function(result) {
                var channels = result.data.length;
                var buffer = this.createBuffer(result.data.length, result.data[0].length, result.sampleRate);
                for (var i = 0; i < channels; i++) {
                    if (buffer.copyToChannel) {
                        buffer.copyToChannel(result.data[i], i);
                    } else {
                        buffer.getChannelData(i).set(result.data[i]);
                    }
                }
                return buffer;
            }.bind(this)).then(callback, errorback);
        };
    }
})();

repo_name: onms/melphias

license: unknown


code:
//=============================================================================
// OperateDearFollowers.js
// ----------------------------------------------------------------------------
// Copyright (c) 2017 Tsumio
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.0.2 2017/09/10 フォロワーの操作解除時、自動ですり抜けをONにするよう変更。
// 1.0.1 2017/09/09 プラグインコマンドを追加。不具合の修正。
// 1.0.0 2017/09/09 公開。
// ----------------------------------------------------------------------------
// [GitHub] : https://github.com/Tsumio/rmmv-plugins
// [Blog]   : http://ntgame.wpblog.jp/
// [Twitter]: https://twitter.com/TsumioNtGame
//=============================================================================

/*:
 * @plugindesc This plugin enables the operation of the follower.
 * @author Tsumio
 *
 * @param ----Basic Settings----
 * @desc
 * @default
 *
 * @param OperatingSwitchNumber
 * @type switch
 * @desc When you want to operate followers, this switch should be turned on.
 * @default 11
 *
 * @help This plugin enables the operation of the follower.
 *
 * ----feature----
 * -> Turn on a specific switch so you can operate the follower.
 * -> When you switch off the switch, the follower will automatically return.
 *
 * ----how to use----
 * You can use this plugin after setting some plugin parameters.
 *
 * ----script command operation----
 * When you want to operate a follower with a script command, turn ON the operation switch and write the following script.
 * this.operateFollower(followerNumber, moveRoute);
 *
 * "followerNumber" start from 0;
 * "moveRoute" of argument can be received the same object as the object passed to the forceMoveRoute method.
 * Details of moveRoute are written in the following site.
 * https://ameblo.jp/rpgmaker1892/entry-12113554385.html
 *
 * For example.
 * When you want the first follower to move to right one step, write as the following.
 *     var moveRoute = {
 *       "list":[{"code":3},
 *       ],
 *       "repeat":false,
 *       "skippable":true,
 *       "wait":true};
 *   this.operateFollower(0, moveRoute);
 *
 * ----plugin command----
 * All plugin commands start with "ODF".
 * Plugin commands are distinguish uppercase and lowercase.
 * And separate each word with a space.
 * Please make sure.
 *
 * "ODF processRouteEnd FollowerNumber" : RouteEnd.
 * "ODF moveDown FollowerNumber"  : Move down.
 * "ODF moveLeft FollowerNumber"  : Move left.
 * "ODF moveRight FollowerNumber" : Move right.
 * "ODF moveUp FollowerNumber"    : Move up.
 * "ODF moveLowerLeft FollowerNumber"  : Move lower left.
 * "ODF moveLowerRight FollowerNumber" : Move lower right.
 * "ODF moveUpperLeft FollowerNumber"  : Move upper left.
 * "ODF moveUpperRight FollowerNumber" : Move upper right.
 * "ODF moveRandom FollowerNumber" : Move random.
 * "ODF moveTowardPlayer FollowerNumber"   : Move toward player.
 * "ODF moveAwayFromPlayer FollowerNumber" : Move away from player.
 * "ODF moveForward FollowerNumber"  : Move forward.
 * "ODF moveBackward FollowerNumber" : Move backward.
 * "ODF turnDown FollowerNumber"  : Turn down.
 * "ODF turnLeft FollowerNumber"  : Turn left.
 * "ODF turnRight FollowerNumber" : Turn right.
 * "ODF turnUp FollowerNumber"    : Turn up.
 * "ODF turnRight90 FollowerNumber" : Turn right 90 dgrees.
 * "ODF turnLeft90 FollowerNumber" : Turn left 90 dgrees.
 * "ODF turn180 FollowerNumber" : Turn 180 dgrees.
 * "ODF turnRightOrLeft90 FollowerNumber" : Turn right or left 90 dgrees.
 * "ODF turnRandom FollowerNumber" : Turn random.
 * "ODF turnTowardPlayer FollowerNumber" : Turn toward player.
 * "ODF turnAwayFromPlayer FollowerNumber" : Turn away from player.
 * "ODF setWalkAnimeOn FollowerNumber" : On walking anime.
 * "ODF setWalkAnimeOff FollowerNumber" : Off walking anime.
 * "ODF setStepAnimeOn FollowerNumber" : On stepping anime.
 * "ODF setStepAnimeOff FollowerNumber" : Off stepping anime.
 * "ODF setDirectionFixOn FollowerNumber" : On fixing direction.
 * "ODF setDirectionFixOff FollowerNumber" : Off fixing direction.
 * "ODF setThroughOn FollowerNumber" : On through mode.
 * "ODF setThroughOff FollowerNumber" : Off through mode.
 * "ODF setTransparentOn FollowerNumber" : On transparent mode.
 * "ODF setTransparentOff FollowerNumber" : Off transparent mode.
 * "ODF jump FollowerNumber OffsetX OffsetY" : Jump.
 * "ODF setImage FollowerNumber ImageName ImageNumber" : Change character image.
 * "ODF wait FollowerNumber WaitTime" : Wait.
 * "ODF setMoveSpeed FollowerNumber Speed" : Change moving speed.
 * "ODF setMoveFrequency FollowerNumber Frequency" : Change moving requency.
 * "ODF setOpacity FollowerNumber Opacity" : Change opacity.
 * "ODF setBlendMode FollowerNumber BlendMode" : Change blend mode.
 *
 * ----change log---
 * 1.0.2 2017/09/10 When canceling the follower's operation, change to automatically turn on through mode.
 * 1.0.1 2017/09/09 Add plugin commands.Bug fix.
 * 1.0.0 2017/09/09 Release.
 *
 * ----remarks----
 * I shall not be responsible for any loss, damages and troubles from using this plugin.
 *
 * --Terms of Use--
 * This plugin is free for both commercial and non-commercial use.
 * You may edit the source code to suit your needs,
 * so long as you don't claim the source code belongs to you.
 *
 */
/*:ja
 * @plugindesc フォロワーを操作するプラグインです。
 * @author ツミオ
 *
 * @param ----基本的な設定----
 * @desc
 * @default
 *
 * @param 操作用スイッチ番号
 * @type switch
 * @desc フォロワーを操作したいとき、ONにするスイッチ番号を設定します。
 * @default 11
 *
 * @help フォロワーを操作するプラグインです。
 *
 * 【特徴】
 * ・特定のスイッチをONにすると、フォロワーを操作できるようになります。
 * ・スイッチをOFFにすると、フォロワーは自動で戻ってきます。
 *
 * 【使用方法】
 * プラグインの導入後、プラグインパラメーターを設定することによって使用できます。
 *
 *
 * 【スクリプトコマンドでの操作】
 * フォロワーをスクリプトコマンドで操作するには、操作用のスイッチをONにしたあと、以下のような記述をします。
 * this.operateFollower(followerNumber, moveRoute);
 *
 * followerNumberは0から始まります。
 * 引数moveRouteには、forceMoveRouteメソッドに渡すオブジェクトと同じオブジェクトを渡せます。
 * moveRouteの詳細は、以下のサイトに詳しく載っています。
 * https://ameblo.jp/rpgmaker1892/entry-12113554385.html
 *
 * 例えば一番最初のフォロワーを右に一歩動かしたい場合、以下のように記述します。
 *     var moveRoute = {
 *       "list":[{"code":3},
 *       ],
 *       "repeat":false,
 *       "skippable":true,
 *       "wait":true};
 *   this.operateFollower(0, moveRoute);
 *
 * 【プラグインコマンド】
 * 全てのプラグインコマンドは「ODF」から始まります。
 * また、説明上では視認性のためにカギカッコを使用していますが、実際にプラグインコマンドに入力する際には
 * カギカッコの入力は不要です。
 *
 * 全てのプラグインコマンドは大文字と小文字を区別します。
 * 各単語の間は半角スペースで区切ります（全角では認識しません）。
 * 間違わないように気をつけてください。
 *
 * 「ODF processRouteEnd フォロワー番号」 : 移動終了。
 * 「ODF moveDown フォロワー番号」  : 下に移動。
 * 「ODF moveLeft フォロワー番号」  : 左に移動。
 * 「ODF moveRight フォロワー番号」 : 右に移動。
 * 「ODF moveUp フォロワー番号」    : 上に移動。
 * 「ODF moveLowerLeft フォロワー番号」  : 左下に移動。
 * 「ODF moveLowerRight フォロワー番号」 : 右下に移動。
 * 「ODF moveUpperLeft フォロワー番号」  : 左上に移動。
 * 「ODF moveUpperRight フォロワー番号」 : 右上に移動。
 * 「ODF moveRandom フォロワー番号」 : ランダムに移動。
 * 「ODF moveTowardPlayer フォロワー番号」   : プレイヤーに近づく。
 * 「ODF moveAwayFromPlayer フォロワー番号」 : プレイヤーから遠ざかる。
 * 「ODF moveForward フォロワー番号」  : 一歩前進。
 * 「ODF moveBackward フォロワー番号」 : 一歩後退。
 * 「ODF turnDown フォロワー番号」  : 下を向く。
 * 「ODF turnLeft フォロワー番号」  : 左を向く。
 * 「ODF turnRight フォロワー番号」 : 右を向く。
 * 「ODF turnUp フォロワー番号」    : 上を向く。
 * 「ODF turnRight90 フォロワー番号」 : 右に90度回転。
 * 「ODF turnLeft90 フォロワー番号」 : 左に90度回転。
 * 「ODF turn180 フォロワー番号」 : 180度回転。
 * 「ODF turnRightOrLeft90 フォロワー番号」 : 右か左に90度回転。
 * 「ODF turnRandom フォロワー番号」 : ランダムに方向回転
 * 「ODF turnTowardPlayer フォロワー番号」 : プレイヤーの方を向く。
 * 「ODF turnAwayFromPlayer フォロワー番号」 : プレイヤーの逆を向く。
 * 「ODF setWalkAnimeOn フォロワー番号」 : 歩行アニメON。
 * 「ODF setWalkAnimeOff フォロワー番号」 : 歩行アニメOFF。
 * 「ODF setStepAnimeOn フォロワー番号」 : 足踏みアニメON。
 * 「ODF setStepAnimeOff フォロワー番号」 : 足踏みアニメOFF。
 * 「ODF setDirectionFixOn フォロワー番号」 : 向き固定ON。
 * 「ODF setDirectionFixOff フォロワー番号」 : 向き固定OFF。
 * 「ODF setThroughOn フォロワー番号」 : すり抜けON。
 * 「ODF setThroughOff フォロワー番号」 : すり抜けOFF。
 * 「ODF setTransparentOn フォロワー番号」 : 透明化ON。
 * 「ODF setTransparentOff フォロワー番号」 : 透明化OFF。
 * 「ODF jump フォロワー番号 オフセットX オフセットY」 : ジャンプ。
 * 「ODF setImage フォロワー番号 イメージ名 イメージ番号」 : 画像の変更。
 * 「ODF wait フォロワー番号 待機時間」 : ウェイト。
 * 「ODF setMoveSpeed フォロワー番号 移動速度」 : 移動速度の変更。
 * 「ODF setMoveFrequency フォロワー番号 移動頻度」 : 移動頻度の変更。
 * 「ODF setOpacity フォロワー番号 不透明度」 : 不透明度の変更。
 * 「ODF setBlendMode フォロワー番号 合成方法」 : 合成方法の変更。
 *
 * 【更新履歴】
 * 1.0.2 2017/09/10 フォロワーの操作解除時、自動ですり抜けをONにするよう変更。
 * 1.0.1 2017/09/09 プラグインコマンドを追加。不具合の修正。
 * 1.0.0 2017/09/09 公開。
 *
 * 【備考】
 * 当プラグインを利用したことによるいかなる損害に対しても、制作者は一切の責任を負わないこととします。
 *
 * 【利用規約】
 * ソースコードの著作権者が自分であると主張しない限り、
 * 作者に無断で改変、再配布が可能です。
 * 利用形態（商用、18禁利用等）についても制限はありません。
 * 自由に使用してください。
 *
 */

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

////=============================================================================
//// NTMO
////  Declare NTMO namespace.
////=============================================================================
    var NTMO = NTMO || {};
    NTMO.ODF = function(){
    };

////=============================================================================
//// Local function
////  These functions checks & formats pluguin's command parameters.
////  I borrowed these functions from Triacontane.Thanks!
////=============================================================================
    var getParamString = 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 '';
    };

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

////=============================================================================
//// Get and set pluguin parameters.
////=============================================================================
    var param                          = {};
    //Basic Stteings
    param.operatingSwitchNumber        = getParamNumber(['OperatingSwitchNumber', '操作用スイッチ番号']);

//-----------------------------------------------------------------------------
// Settings for plugin command.
//-----------------------------------------------------------------------------
    var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function (command, args) {
        _Game_Interpreter_pluginCommand.call(this, command, args);
        if (command === 'ODF') {
            switch (args[0]) {
                case 'processRouteEnd':
                case 'moveDown':
                case 'moveLeft':
                case 'moveRight':
                case 'moveUp':
                case 'moveLowerLeft':
                case 'moveLowerRight':
                case 'moveUpperLeft':
                case 'moveUpperRight':
                case 'moveRandom':
                case 'moveTowardPlayer':
                case 'moveAwayFromPlayer':
                case 'moveForward':
                case 'moveBackward':
                case 'turnDown':
                case 'turnLeft':
                case 'turnRight':
                case 'turnUp':
                case 'turnRight90':
                case 'turnLeft90':
                case 'turn180':
                case 'turnRightOrLeft90':
                case 'turnRandom':
                case 'turnTowardPlayer':
                case 'turnAwayFromPlayer':
                case 'setWalkAnimeOn':
                case 'setWalkAnimeOff':
                case 'setStepAnimeOn':
                case 'setStepAnimeOff':
                case 'setDirectionFixOn':
                case 'setDirectionFixOff':
                case 'setThroughOn':
                case 'setThroughOff':
                case 'setTransparentOn':
                case 'setTransparentOff':
                    NTMO.ODF_Base.operate(args[0], args[1]);
                    break;
                case 'jump':
                case 'setImage':
                    NTMO.ODF_Base.operate(args[0], args[1], args[2], args[3]);
                    break;
                case 'wait':
                case 'setMoveSpeed':
                case 'setMoveFrequency':
                case 'setOpacity':
                case 'setBlendMode':
                    NTMO.ODF_Base.operate(args[0], args[1], args[2]);
                    break;
            }
        }
    };

////==============================
//// NTMO.BGB_Base
//================================
    NTMO.ODF_Base = function(){
    };

    NTMO.ODF_Base.canGetFollower = function(num) {
        return $gamePlayer.followers()._data.length > num;
    };

    NTMO.ODF_Base.operate = function(command, num) {
        if(!NTMO.ODF_Base.canGetFollower(num)){
            return;
        }

        var follower = $gamePlayer.followers()._data[Number(num)];

        switch (command) {
            case 'processRouteEnd':
                follower.processRouteEnd();
                break;
            case 'moveDown':
                follower.moveStraight(2);
                break;
            case 'moveLeft':
                follower.moveStraight(4);
                break;
            case 'moveRight':
                follower.moveStraight(6);
                break;
            case 'moveUp':
                follower.moveStraight(8);
                break;
            case 'moveLowerLeft':
                follower.moveDiagonally(4, 2);
                break;
            case 'moveLowerRight':
                follower.moveDiagonally(6, 2);
                break;
            case 'moveUpperLeft':
                follower.moveDiagonally(4, 8);
                break;
            case 'moveUpperRight':
                follower.moveDiagonally(6, 8);
                break;
            case 'moveRandom':
                follower.moveRandom();
                break;
            case 'moveTowardPlayer':
                follower.moveTowardPlayer();
                break;
            case 'moveAwayFromPlayer':
                follower.moveAwayFromPlayer();
                break;
            case 'moveForward':
                follower.moveForward();
                break;
            case 'moveBackward':
                follower.moveBackward();
                break;
            case 'jump':
                follower.jump(Number(arguments[2]), Number(arguments[3]));
                break;
            case 'wait':
                follower._waitCount = Number(arguments[2]) - 1;
                break;
            case 'turnDown':
                follower.setDirection(2);
                break;
            case 'turnLeft':
                follower.setDirection(4);
                break;
            case 'turnRight':
                follower.setDirection(6);
                break;
            case 'turnUp':
                follower.setDirection(8);
                break;
            case 'turnRight90':
                follower.turnRight90();
                break;
            case 'turnLeft90':
                follower.turnLeft90();
                break;
            case 'turn180':
                follower.turn180();
                break;
            case 'turnRightOrLeft90':
                follower.turnRightOrLeft90();
                break;
            case 'turnRandom':
                follower.turnRandom();
                break;
            case 'turnTowardPlayer':
                follower.turnTowardPlayer();
                break;
            case 'turnAwayFromPlayer':
                follower.turnAwayFromPlayer();
                break;
            case 'setMoveSpeed':
                follower.setMoveSpeed(Number(arguments[2]));
                break;
            case 'setMoveFrequency':
                follower.setMoveFrequency(Number(arguments[2]));
                break;
            case 'setWalkAnimeOn':
                follower.setWalkAnime(true);
                break;
            case 'setWalkAnimeOff':
                follower.setWalkAnime(false);
                break;
            case 'setStepAnimeOn':
                follower.setStepAnime(true);
                break;
            case 'setStepAnimeOff':
                follower.setStepAnime(false);
                break;
            case 'setDirectionFixOn':
                follower.setDirectionFix(true);
                break;
            case 'setDirectionFixOff':
                follower.setDirectionFix(false);
                break;
            case 'setThroughOn':
                follower.setThrough(true);
                break;
            case 'setThroughOff':
                follower.setThrough(false);
                break;
            case 'setTransparentOn':
                follower.setTransparent(true);
                break;
            case 'setTransparentOff':
                follower.setTransparent(false);
                break;
            case 'setImage':
                follower.setImage(arguments[2], Number(arguments[3]));
                break;
            case 'setOpacity':
                follower.setOpacity(Number(arguments[2]));
                break;
            case 'setBlendMode':
                follower.setBlendMode(Number(arguments[2]));
                break;
        }
    };

////=============================================================================
//// Game_Followers
////  Add operating followers function.
////  Maybe I must override some methods.
////=============================================================================

    //Override.
    var _Game_Followers_updateMove = Game_Followers.prototype.updateMove;
    Game_Followers.prototype.updateMove = function() {
        //If user turn on the switch for operating followers, original method does not excute.
        if(this.canOperateFollowers()){
            this.updateOperatingFollowers();
            return;
        }

        _Game_Followers_updateMove.call(this);
    };

    Game_Followers.prototype.updateOperatingFollowers = function() {

    };

    Game_Followers.prototype.canOperateFollowers = function() {
        return $gameSwitches.value(param.operatingSwitchNumber);
    };

    Game_Followers.prototype.forceMoveRoute = function(num, moveRoute) {
        this._data[num].forceMoveRoute(moveRoute);
    };

    Game_Followers.prototype.clearMoveRoute = function() {
        for(var follower of this._data){
            follower.setMoveRoute(null);
            follower.setTransparent($dataSystem.optTransparent);
            follower.setThrough(true);
        }
    };

////=============================================================================
//// Game_Follower
////  Add operating follower function.
////  This is not follower"s" but follower class !
////=============================================================================

   var _Game_Follower_update = Game_Follower.prototype.update;
    Game_Follower.prototype.update = function() {
        if(this.canOperateFollower()){
            Game_Character.prototype.update.call(this);
            return;
        }

        _Game_Follower_update.call(this);
    };

    Game_Follower.prototype.canOperateFollower = function() {
        return $gameSwitches.value(param.operatingSwitchNumber);
    };

////=============================================================================
//// Game_Switches
////  Set gathering event !
////=============================================================================
    var _Game_Switches_setValue = Game_Switches.prototype.setValue;
    Game_Switches.prototype.setValue = function(switchId, value) {
        _Game_Switches_setValue.call(this, switchId, value);

        //Set gathering event.
        if(switchId === param.operatingSwitchNumber &&
            !$gameSwitches.value(param.operatingSwitchNumber)){
            $gamePlayer.followers().clearMoveRoute();
            $gamePlayer.gatherFollowers();
        }
    };

////=============================================================================
//// Game_Interpreter
////  Add a operating function !
////=============================================================================
    Game_Interpreter.prototype.operateFollower = function(num, moveRoute) {
        $gamePlayer.followers().forceMoveRoute(num, moveRoute);
    };

})();


code:
//=============================================================================
// OriginMenuStatus.js
//=============================================================================
// ----------------------------------------------------------------------------
// Version
// 1.0.0 2019/08/06 ベータ版作成
// ----------------------------------------------------------------------------
//=============================================================================
/*:
 * @plugindesc メニュー画面にステータスコマンドを追加します。追加されたコマンドをクリックすると設定した名前と名前に紐づく値の一覧を表示します
 * @author kanatsuki (http://isyukan.com/)
 *
 * @param command_name
 * @desc メニューに表示するコマンド名を設定します。
 * @default 特殊ステータス
 *
 * @param param_name_1
 * @desc 設定するパラメーター名1 カンマ（,)区切りで指定します。設定方法はヘルプを参照してください。
 * @default
 *
 * @param param_name_2
 * @desc 設定するパラメーター名2 カンマ（,)区切りで指定します。設定方法はヘルプを参照してください。
 * @default
 *
 * @param param_name_3
 * @desc 設定するパラメーター名3 カンマ（,)区切りで指定します。設定方法はヘルプを参照してください。
 * @default
 *
 * @param param_name_4
 * @desc 設定するパラメーター名4 カンマ（,)区切りで指定します。設定方法はヘルプを参照してください。
 * @default
 *
 * @param param_name_5
 * @desc 設定するパラメーター名5 カンマ（,)区切りで指定します。設定方法はヘルプを参照してください。
 * @default
 *
 * @param param_name_6
 * @desc 設定するパラメーター名6 カンマ（,)区切りで指定します。設定方法はヘルプを参照してください。
 * @default
 *
 * @param param_name_7
 * @desc 設定するパラメーター名7 カンマ（,)区切りで指定します。設定方法はヘルプを参照してください。
 * @default
 *
 * @param param_name_8
 * @desc 設定するパラメーター名8 カンマ（,)区切りで指定します。設定方法はヘルプを参照してください。
 * @default
 *
 * @param param_name_9
 * @desc 設定するパラメーター名9 カンマ（,)区切りで指定します。設定方法はヘルプを参照してください。
 * @default
 *
 * @param param_name_10
 * @desc 設定するパラメーター名10 カンマ（,)区切りで指定します。設定方法はヘルプを参照してください。
 * @default
 *
 * @param paramName_pos_x
 * @desc パラメーター名の位置を設定します。設定しない場合は画面横幅の半分の位置を全項目に設定します。
 *
 * @param paramName_align
 * @desc パラメーター名を左揃え、真ん中整列、右揃えのいずれかに設定します。left,center,rightのいずれかの値を設定してください
 * @default left
*
 * @param parameter_pos_x
 *  @desc パラメーター値の位置を設定します。設定しない場合は一番長いパラメーター名 + 20の値を全項目に設定します。
 *
 * @param param_pos_y
 * @desc パラメーター名の位置を設定します。設定しない場合は50で自動設定します。
 * @default 50
 *
 *
 * @param line_interval
 * @desc パラメーターの縦軸の間隔幅（param1とparam2の間）を設定します。設定しない場合は50で自動設定します。
 * @default 50
 *
 * @param image_x
 * @desc 画像位置を設定します。設定しない場合は10で自動設定します。
 * @default 10
 *
 * @param image_y
 * @desc 画像位置を設定します。設定しない場合は10で自動設定します。
 * @default 10
 *
 * @help param_name_〇の設定は下記の形で行います
 * 「パラメーター名,パラメーター初期値,パラメーター値の後に続く名前（回や％など）,文字列無視のフラグ(必要な場合はtrueと書いてください)」
 * 必須はパラメーター名のみです。残りは必要なもののみ入力してください。
 *
 *
 * 例1：
 * 経験値:,0,回
 * 例2:
 * 経験:,,%
 * 例3:
 * 初回の相手のコメント:
 *
 * 最後の文字列無視のフラグは、他のパラメーター値と比べて長い文章を入力するときのみ指定してください。
 *
 * またこのプラグインはイベントコマンドのプラグインコマンドから下記の方法でパラメーター値の設定、画像の設定が行えます。
 *
 * SetParamVariable
 * 　指定した変数の値を設定します。代入のため初期値はありません。
 * 　2回目を呼び出した場合は1回目に設定した値を上書きます。
 * 　コマンドはプラグインコマンドに「OriginMenuStatus SetParamVariable param〇 △」を入力することで呼び出しが行えます。
 * 　〇の部分には「param_name_1」などの最後尾についている1～10の値を設定します。
 * 　変数番号を指定してください。
 *
 * 　例1：変数1の値をパラメーター1に設定したい場合
 * 　　「OriginMenuStatus SetParamVariable param1 1」
 * 　例2：変数2のパラメーター5に設定したい場合
 * 　　「OriginMenuStatus SetParamVariable param5 2」
 *
 * SetParam
 * 　設定された値を設定します。代入のため初期値はありません。
 * 　2回目を呼び出した場合は1回目に設定した値を上書きます。
 * 　コマンドはプラグインコマンドに「OriginMenuStatus SetParam param〇 △」を入力することで呼び出しが行えます。
 * 　〇の部分には「param_name_1」の最後尾についている1～10の値を設定します。
 * 　△は好きな値を設定してください。
 *
 * 　例1：パラメーター1に「相手」を設定したい場合
 * 　　「OriginMenuStatus SetParam param1 相手」
 *
 * SetPicture
 * 　ファイル名を設定します。代入のため初期値はありません。2回目を呼び出した場合は1回目に設定した値を上書きます。
 * 　コマンドはプラグインコマンドに「OriginMenuStatus SetPicture △」を入力することで呼び出しが行えます。
 * 　△はファイル名を設定してください。
 *
 *  　例1：のパラメーターに「立ち絵01c_笑.png」を設定したい場合。
 * 　　「OriginMenuStatus SetPicture 立ち絵01c_笑」
 *
 * 　※あらかじめ「プロジェクト名/img/pictures」フォルダに「立ち絵01c_笑.png」を格納しておく必要があります。
 *   ※例ではファイル名を日本語で記載しましたが、
 * 　　日本語文字はプログラム上問題が発生する可能性があるため（ツクール以外のプログラム含め共通の仕様になります）ファイル名は英数字での管理を推奨します。

 ・メニュー画面に、下記の項目を追加します。
 ・メニューコマンド
 ・エッチステータス画面

 作者: kanatsuki (
 作成日: 2019/8/03
*/

// 自作オブジェクトのコンストラクタ
// 即時関数の外に出しておかないとデータをロードした時に
// prototypeがundefinedになるので注意
function OriginMenuStatusSaveObj(){
    this.initialize.apply(this, arguments);
}

// 以下から即時関数
(function(){
    'use strict';

    //-----------------------------------------------------------------------------
    // 初期化処理

    const pluginName = "OriginMenuStatus";
    // メニュー画面コマンドと選択した後の処理をつなぐ際のバインド名
    const command_bind_name = 'origin_menu_status';

    // 設定値の固有名
    const PARAM_LIST =
    {
    'param1': 'param_name_1',
    'param2': 'param_name_2',
    'param3': 'param_name_3',
    'param4': 'param_name_4',
    'param5': 'param_name_5',
    'param6': 'param_name_6',
    'param7': 'param_name_7',
    'param8': 'param_name_8',
    'param9': 'param_name_9',
    'param10': 'param_name_10',}

    // 設定パラメーター取得
    let parameters = PluginManager.parameters(pluginName)
    // パラメータからデータを取得
    const command_name = String(parameters['command_name'] || '特殊ステータス')

// -------------------------------------------------------------------------------------
// データ設定

   // プラグインコマンドの定義
   var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;

   Game_Interpreter.prototype.pluginCommand = function(command, args)
   {
        _Game_Interpreter_pluginCommand.call(this, command, args);
        if(command === pluginName){
            switch(args[0]){
                case 'AddParam':
                $gameSystem.OriginMenuStatusSaveObj().AddParam(args[1],args[2])
                break;
                case 'SubParam':
                $gameSystem.OriginMenuStatusSaveObj().SubParam(args[1],args[2])
                break;
                case 'SetParam':
                $gameSystem.OriginMenuStatusSaveObj().SetParam(args[1],args[2])
                break;
                case 'SetParamVariable':
                $gameSystem.OriginMenuStatusSaveObj().SetParamVariable(args[1],args[2])
                break;
                case 'GetParam':
                return $gameSystem.OriginMenuStatusSaveObj().GetParam(args[1])
                case 'SetPicture':
                $gameSystem.OriginMenuStatusSaveObj().SetPicture(args[1])
                break;
                case 'GetPicture':
                return $gameSystem.OriginMenuStatusSaveObj().GetPicture()
            }
        }
    };

    // Game_System
    // プラグインのデータを保存するために
    // Game_Systemにオブジェクトを追加しておく
    // ---------- Game_System ここから ----------
    var _Game_System_initialize = Game_System.prototype.initialize;
    Game_System.prototype.initialize = function(){
        _Game_System_initialize.call(this);
        this._OriginMenuStatusSaveObj = new OriginMenuStatusSaveObj();
    };

    Game_System.prototype.OriginMenuStatusSaveObj = function(){
	    return this._OriginMenuStatusSaveObj;
    };
    // ---------- Game_System ここまで ----------

    // 自作クラス(オブジェクト)
    OriginMenuStatusSaveObj.prototype = Object.create(OriginMenuStatusSaveObj.prototype);
    OriginMenuStatusSaveObj.prototype.costructor = OriginMenuStatusSaveObj;

    OriginMenuStatusSaveObj.prototype.initialize = function(){
    	this.originParamValue = {}
        this.fileName = ''
    };

    OriginMenuStatusSaveObj.prototype.AddParam = function(key ,value){
        const nowValue = this.GetParam(key) === undefined ? 0 : this.GetParam(key)
        this.originParamValue[PARAM_LIST[key]] = nowValue + parseInt(value)
    }

    OriginMenuStatusSaveObj.prototype.SubParam = function(key ,value){
        const nowValue = this.GetParam(key) === undefined ? 0 : this.GetParam(key)
        this.originParamValue[PARAM_LIST[key]] = nowValue - parseInt(value)
    }

    OriginMenuStatusSaveObj.prototype.SetParam = function(key ,value){
        this.originParamValue[PARAM_LIST[key]] = value;
    }

    OriginMenuStatusSaveObj.prototype.SetParamVariable = function(key ,value){
        this.originParamValue[PARAM_LIST[key]] = $gameVariables.value(value);
    }

    OriginMenuStatusSaveObj.prototype.GetParam = function(key){
    	return this.originParamValue[PARAM_LIST[key]]
    }

    OriginMenuStatusSaveObj.prototype.SetPicture = function(fileName){
        this.fileName = fileName
    }

    OriginMenuStatusSaveObj.prototype.GetPicture = function(){
    	return this.fileName
    }

 //-----------------------------------------------------------------------------
 // コマンド処理

    // プラグインコマンドの定義
    const _Window_MenuCommand_addOriginalCommands = Window_MenuCommand.prototype.addOriginalCommands;
    Window_MenuCommand.prototype.addOriginalCommands = function(){
        _Window_MenuCommand_addOriginalCommands.call(this);
        let enabled = this.areMainCommandsEnabled();
        this.addCommand(command_name, command_bind_name, enabled);
    };

    // コマンド選択時の処理
    const _Scene_Menu_prototype_createCommandWindow = Scene_Menu.prototype.createCommandWindow;
    Scene_Menu.prototype.createCommandWindow = function() {
        _Scene_Menu_prototype_createCommandWindow.call(this);

        this._commandWindow.setHandler(command_bind_name, () => {
        // メニューが選択されたらステータス画面を呼び出す
            SceneManager.push(OriginMenuStatus);
        });

    }

 //-----------------------------------------------------------------------------
    // 呼び出されるメニュー画面

    function OriginMenuStatus() {
        this.initialize.apply(this, arguments);
    }
    OriginMenuStatus.prototype = Object.create(Scene_MenuBase.prototype);
    OriginMenuStatus.prototype.constructor = OriginMenuStatus;

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

    // 画面構築
    OriginMenuStatus.prototype.create = function()  {
        Scene_MenuBase.prototype.create.call(this);

        // ベースのWindowを作成
        this._baseWindow = new BaseWindow();
        this.addWindow(this._baseWindow);
        this._baseWindow.setHandler('cancel', this.popScene.bind(this));

        // 画像描画
        if(!this.drawImage()) return;

        this._originSysMessage = [];
        this._originParamMessage = [];

        let drawList = []
        let paramNameMaxLength = 1,paramValueMaxLength = 1
        Object.keys(PARAM_LIST).forEach(function(key) {
            let val = PARAM_LIST[key];
            let parameterName = String(parameters[val] || '')

            // なければ次の値へ
            if(! parameterName) return true;

            let splitdata = parameterName.split(',')
            let drawData = {};
            drawData.name = splitdata[0]
            drawData.value = splitdata.length > 1 ? splitdata[1] : ''
            let saveValue = $gameSystem.OriginMenuStatusSaveObj().GetParam(key) || '';
            if(saveValue) drawData.value = saveValue

            drawData.after_name = splitdata.length > 2 ? splitdata[2] : ''

            if(splitdata.length > 3) {
                try {
                    drawData.is_ignorelength = Boolean(splitdata[3])
                } catch (error) {
                    drawData.is_ignorelength =  false
                }

            } else {
                drawData.is_ignorelength = false
            }

            // 一番長い文字列を格納しておく
            if(drawData.name !== undefined && paramNameMaxLength < drawData.name.length) paramNameMaxLength = drawData.name.length

            // パラメーター値は長いもの対策としてis_ignorelengthがたってたらその部分を処理しないように対策
            if(drawData.value !== undefined && drawData.is_ignorelength === false) {
                if(paramValueMaxLength < String(drawData.value).length) paramValueMaxLength = String(drawData.value).length
            }
            drawList.push(drawData)
        });

        // パラメーター位置を取得して描画する
        const line_interval = parseInt(parameters['line_interval'] || 50)
        const paramName_pos_x = parseInt(parameters['paramName_pos_x'] || (Graphics.width / 2))
        const parameter_pos_x = parseInt(parameters['parameter_pos_x'] || paramName_pos_x + (this._baseWindow.GetFontSize() * paramNameMaxLength) + 20)
        const param_pos_y = parseInt(parameters['param_pos_y'] || 50)
        const paremterNameAlign = parameters['paramName_align'] || 'left'

        let cnt = 0;
        drawList.forEach(function(data) {
            let tmp;
            // パラメーター名
            tmp = this._baseWindow.DrawParameterName(data.name, paramName_pos_x, param_pos_y + (cnt * line_interval),　paramNameMaxLength, paremterNameAlign);
            this._originSysMessage.push(tmp);

            // パラメーター値
            length = data.is_ignorelength !== false ? String(data.value).length : paramValueMaxLength
            tmp = this._baseWindow.DrawParameterValue(data.value, parameter_pos_x, param_pos_y + (cnt * line_interval), length, data.after_name)
            this._originParamMessage.push(tmp);
            cnt++;
        },this)

        // 画面に表示するためメッセージを追加
        this._originSysMessage.forEach(function(windowItem) {
            this.addWindow(windowItem);
        }, this);
         // 画面に表示するためメッセージを追加
         this._originParamMessage.forEach(function(windowItem) {
            this.addWindow(windowItem);
        }, this);
    };

    // イメージを追加
    OriginMenuStatus.prototype.drawImage = function()
    {
        // 描画処理
        try {
            let pictname = $gameSystem.OriginMenuStatusSaveObj().GetPicture();

            if (pictname) {
                // throw 'エラー:' + pictname + 'のファイルが見つかりませんでした。'
                var bitmap = ImageManager.loadPicture(pictname);
                var sprite = new Sprite(bitmap);
                sprite.x = parseInt(parameters['image_x'] || 10)
                sprite.y = parseInt(parameters['image_y'] || 10)
                this.addWindow(sprite);
            }
        } catch (error) {
            return false;
        }
        return true ;
    }

 //-----------------------------------------------------------------------------
    /**
     * BaseWindow
     * 一番下に表示するウィンドウ。
     * @constructor
     */
    function BaseWindow() {
        this.initialize.apply(this, arguments);
    }
    BaseWindow.prototype  = Object.create(Window_Selectable.prototype);
    BaseWindow.prototype.constructor = BaseWindow;

    BaseWindow.prototype.initialize = function() {
        Window_Selectable.prototype.initialize.call(this, 0, 0, Graphics.boxWidth, Graphics.boxHeight);
        this._actor = null;
        this.contents.paintOpacity = 0;
        this.refresh();
        this.activate();
    };

    BaseWindow.prototype.GetFontSize = function() {
        return this.standardFontSize();
    }

    // パラメーター名描画。
    BaseWindow.prototype.DrawParameterName = function(message, x, y, length, align) {
        let bitmap = new Bitmap(Graphics.width, Graphics.height);
        bitmap.fontSize = 23;//this.standardFontSize()
        bitmap.textColor = this.systemColor()
        bitmap.drawText(message, x, y, length * this.standardFontSize(), this.lineHeight(), align);
        return new Sprite(bitmap);
    };

    // パラメーター値描画
    BaseWindow.prototype.DrawParameterValue = function(message, x, y, length ,afterName) {
        let bitmap = new Bitmap(Graphics.width, Graphics.height);
        bitmap.fontSize = 23;// this.standardFontSize()
        bitmap.textColor = this.normalColor()
        bitmap.drawText(message, x, y, length * this.standardFontSize(), this.lineHeight(), 'right');
        if(afterName) {
            bitmap.textColor = this.systemColor()
            bitmap.drawText(afterName, x + (length * this.standardFontSize()) + 10, y, String(afterName).length * this.standardFontSize(), this.lineHeight(), 'left');
        }
        return new Sprite(bitmap);
    };

})();


code:
//=============================================================================
// ParallaxLayerMap.js
// ----------------------------------------------------------------------------
// Copyright (c) 2015-2017 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.1.2 2018/12/22 HalfMove.jsによる減速斜め移動など特定の条件下でマップの描画位置がずれる場合がある現象を修正
// 1.1.1 2017/11/19 MOG_ChronoEngine.js等との競合を解消
// 1.1.0 2017/09/20 ヘルプにサンプルマップの旨を記載
// 1.1.0 2017/09/14 合成方法や不透明度の初期値を設定できるメモ欄を追加
// 1.0.0 2017/08/20 初版
// 0.9.0 2017/08/19 プロトタイプ版
// ----------------------------------------------------------------------------
// [Blog]   : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================

/*:
 * @plugindesc ParallaxLayerMapPlugin
 * @author triacontane
 *
 * @help ParallaxLayerMap.js
 *
 * 複数のレイヤーを使った多層一枚絵マップを作成可能にします。
 * イベントでレイヤーを作成するので、レイヤー数は無制限です。
 *
 * イベントを作成してメモ欄を以下の通り記述すると、指定した画像がマップに表示され、
 * かつイベント位置とは無関係に画像の左上がマップの左上に合わせられます。
 *
 * <PLM:file>        # 「img/parallaxes/file」を一枚絵として表示します。
 * <PLM_Blend:1>     # 合成方法の初期値を「加算」にします。
 * <PLM合成:1>       # 同上
 * <PLM_Opacity:128> # 不透明度の初期値を「128」にします。
 * <PLM不透明度:128> # 同上
 *
 * イベント内の「画像」「オプション」項目は無視されますが、その他の項目は
 * 通常のイベントと同じように機能します。
 *
 * 合成方法や不透明度などを後から変更したい場合は、自律移動で指定するか
 * 以下の「キャラクターグラフィック表示拡張プラグイン」と併用してください。
 * https://raw.githubusercontent.com/triacontane/RPGMakerMV/master/CharacterGraphicExtend.js
 *
 * スクリプト（「移動ルートの設定」から実行）
 * this.shiftPosition(10, 20); # 表示位置をX[10] Y[20]ずらします。
 *
 * 注意！
 * 当プラグインはマップのループには対応していません。
 *
 * このプラグインにはプラグインコマンドはありません。
 *
 * 当プラグインで使用できるサンプルマップをどらぴか様よりご提供いただきました。
 * この場を借りて御礼申し上げます。
 *
 * 以下のURLから「Download」ボタンでダウンロードできます。
 * クレジット表記なしでご自由にお使い頂けるご許可を頂いています。
 * https://github.com/triacontane/RPGMakerMV/blob/master/Sample/sample_parallax.zip
 *
 * PIKA's GAME GALLERY
 * https://mashimarohb252d6.wixsite.com/pikasgame
 *
 * @noteParam PLM
 * @noteRequire 1
 * @noteDir img/parallaxes
 * @noteType file
 * @noteData events
 *
 * This plugin is released under the MIT License.
 */
/*:ja
 * @plugindesc 多層レイヤー一枚絵マッププラグイン
 * @author トリアコンタン
 *
 * @help ParallaxLayerMap.js
 *
 * 複数のレイヤーを使った多層一枚絵マップを作成可能にします。
 * イベントでレイヤーを作成するので、レイヤー数は無制限です。
 *
 * イベントを作成してメモ欄を以下の通り記述すると、指定した画像がマップに表示され、
 * かつイベント位置とは無関係に画像の左上がマップの左上に合わせられます。
 *
 * <PLM:file>        # 「img/parallaxes/file」を一枚絵として表示します。
 * <PLM_Blend:1>     # 合成方法の初期値を「加算」にします。
 * <PLM合成:1>       # 同上
 * <PLM_Opacity:128> # 不透明度の初期値を「128」にします。
 * <PLM不透明度:128> # 同上
 *
 * イベント内の「画像」「オプション」項目は無視されますが、その他の項目は
 * 通常のイベントと同じように機能します。
 *
 * 合成方法や不透明度などを後から変更したい場合は、自律移動で指定するか
 * 以下の「キャラクターグラフィック表示拡張プラグイン」と併用してください。
 * https://raw.githubusercontent.com/triacontane/RPGMakerMV/master/CharacterGraphicExtend.js
 *
 * スクリプト（「移動ルートの設定」から実行）
 * this.shiftPosition(10, 20); # 表示位置をX[10] Y[20]ずらします。
 *
 * 注意！
 * 当プラグインはマップのループには対応していません。
 *
 * このプラグインにはプラグインコマンドはありません。
 *
 * 当プラグインで使用できるサンプルマップをどらぴか様よりご提供いただきました。
 * この場を借りて御礼申し上げます。
 *
 * 以下のURLから「Download」ボタンでダウンロードできます。
 * クレジット表記なしでご自由にお使い頂けるご許可を頂いています。
 * https://github.com/triacontane/RPGMakerMV/blob/master/Sample/sample_parallax.zip
 *
 * PIKA's GAME GALLERY
 * https://mashimarohb252d6.wixsite.com/pikasgame
 *
 * @noteParam PLM
 * @noteRequire 1
 * @noteDir img/parallaxes
 * @noteType file
 * @noteData events
 *
 * 利用規約：
 *  作者に無断で改変、再配布が可能で、利用形態（商用、18禁利用等）
 *  についても制限はありません。
 *  このプラグインはもうあなたのものです。
 */

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

    //=============================================================================
    // ローカル関数
    //  プラグインパラメータやプラグインコマンドパラメータの整形やチェックをします
    //=============================================================================
    var getMetaValue = function(object, name) {
        var metaTagName = metaTagPrefix + name;
        if (!object || !object.meta) {
            return undefined;
        }
        return object.meta.hasOwnProperty(metaTagName) ? convertEscapeCharacters(object.meta[metaTagName]) : undefined;
    };

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

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

    var isNotAString = function(args) {
        return String(args) !== args;
    };

    //=============================================================================
    // Game_Map
    //  画面上のピクセル座標を返します。
    //=============================================================================
    Game_Map.prototype.displayPixelX = function() {
        return this.displayX() * this.tileWidth();
    };

    Game_Map.prototype.displayPixelY = function() {
        return this.displayY() * this.tileHeight();
    };

    //=============================================================================
    // Game_Character
    //  マップレイヤー名を取得します。
    //=============================================================================
    Game_CharacterBase.prototype.getMapLayerName = function() {
        return this._mapLayerName;
    };

    Game_CharacterBase.prototype.isMapLayer = function() {
        return !!this._mapLayerName;
    };

    var _Game_CharacterBase_isNearTheScreen = Game_CharacterBase.prototype.isNearTheScreen;
    Game_CharacterBase.prototype.isNearTheScreen = function() {
        return this.isMapLayer() || _Game_CharacterBase_isNearTheScreen.apply(this, arguments);
    };

    Game_CharacterBase.prototype.shiftPosition = function(x, y) {
        this._additionalX = x;
        this._additionalY = y;
    };

    Game_CharacterBase.prototype.existPage = function() {
        return false;
    };

    //=============================================================================
    // Game_Event
    //  レイヤーイベントに関する機能を実装します。
    //=============================================================================
    var _Game_Event_initialize      = Game_Event.prototype.initialize;
    Game_Event.prototype.initialize = function(mapId, eventId) {
        _Game_Event_initialize.apply(this, arguments);
        this._mapLayerName = getMetaValue(this.getOriginalEvent(), '') || null;
        if (this._mapLayerName) {
            this.initBlendMode();
            this.initOpacity();
        }
    };

    Game_Event.prototype.initBlendMode = function() {
        var blendMode = getMetaValues(this.getOriginalEvent(), ['_Blend', '合成']);
        if (blendMode) {
            this._blendMode = parseInt(blendMode);
        }
    };

    Game_Event.prototype.initOpacity = function() {
        var blendMode = getMetaValues(this.getOriginalEvent(), ['_Opacity', '不透明度']);
        if (blendMode) {
            this._opacity = parseInt(blendMode);
        }
    };

    // Resolve conflict for TemplateEvent
    Game_Event.prototype.getOriginalEvent = function() {
        return $dataMap.events[this._eventId];
    };

    Game_Event.prototype.existPage = function() {
        return this._pageIndex >= 0;
    };

    Game_Event.prototype.getLayerX = function() {
        return (this._additionalX || 0) - Math.round($gameMap.displayPixelX());
    };

    Game_Event.prototype.getLayerY = function() {
        return (this._additionalY || 0) - Math.round($gameMap.displayPixelY());
    };

    //=============================================================================
    // Spriteset_Map
    //  キャラクタースプライトをマップレイヤースプライトに差し替えます。
    //=============================================================================
    var _Spriteset_Map_createCharacters      = Spriteset_Map.prototype.createCharacters;
    Spriteset_Map.prototype.createCharacters = function() {
        _Spriteset_Map_createCharacters.apply(this, arguments);
        var layerSprites = this._characterSprites.filter(function(sprite) {
            return sprite.isLayer && sprite.isLayer();
        });
        layerSprites.forEach(function(oldSprite) {
            this.replaceLayerSprite(oldSprite);
        }, this);
    };

    Spriteset_Map.prototype.replaceLayerSprite = function(oldSprite) {
        var deleteIndex = this._characterSprites.indexOf(oldSprite);
        if (deleteIndex >= 0) {
            this._characterSprites.splice(deleteIndex, 1);
        }
        this._tilemap.removeChild(oldSprite);
        var newSprite = new Sprite_MapLayer(oldSprite.getCharacter());
        this._tilemap.addChild(newSprite);
    };

    //=============================================================================
    // Sprite_Character
    //  マップレイヤー判定を追加します。
    //=============================================================================
    var _Sprite_Character_character         = Sprite_Character.prototype.setCharacter;
    Sprite_Character.prototype.setCharacter = function(character) {
        _Sprite_Character_character.apply(this, arguments);
        this._layerName = character.getMapLayerName();
    };

    Sprite_Character.prototype.getCharacter = function() {
        return this._character;
    };

    Sprite_Character.prototype.isLayer = function() {
        return !!this._layerName;
    };

    //=============================================================================
    // Sprite_MapLayer
    //  マップレイヤーを扱うクラスです。
    //=============================================================================
    function Sprite_MapLayer() {
        this.initialize.apply(this, arguments);
    }

    Sprite_MapLayer.prototype             = Object.create(Sprite_Character.prototype);
    Sprite_MapLayer.prototype.constructor = Sprite_MapLayer;

    Sprite_MapLayer.prototype.setCharacter = function(character) {
        Sprite_Character.prototype.setCharacter.apply(this, arguments);
        this.loadLayerBitmap();
    };

    Sprite_MapLayer.prototype.initMembers = function() {
        Sprite_Character.prototype.initMembers.apply(this, arguments);
        this.anchor.x = 0;
        this.anchor.y = 0;
    };

    Sprite_MapLayer.prototype.loadLayerBitmap = function() {
        this.bitmap = ImageManager.loadParallax(this._layerName, 0);
    };

    Sprite_MapLayer.prototype.updateVisibility = function() {
        Sprite_Character.prototype.updateVisibility.apply(this, arguments);
        if (!this._character.existPage()) {
            this.visible = false;
        }
    };

    Sprite_MapLayer.prototype.updatePosition = function() {
        this.x = this._character.getLayerX();
        this.y = this._character.getLayerY();
        this.z = this._character.screenZ();
    };

    Sprite_MapLayer.prototype.updateBitmap = function() {
        // do nothing
    };

    Sprite_MapLayer.prototype.updateFrame = function() {
        // do nothing
    };
})();


code:
//=============================================================================
// ParallelPreload.js
// ----------------------------------------------------------------------------
// Copyright (c) 2015 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 2.0.3 2017/12/21 最新のコアスクリプトで正常に画像が表示されない場合があるため利用を非推奨とします。
// 2.0.2 2017/06/18 本体v1.5.0で機能しなくなる問題に対応（by 奏ねこま様）
// 2.0.1 2017/05/27 競合の可能性のある記述（Objectクラスへのプロパティ追加）をリファクタリング
// 2.0.0 2016/08/05 本体v1.3.0対応（1.2.0では使えなくなります）
//                  素材のプリロード時に発生するエラー(対象が存在しない等)を抑制するよう仕様変更
// 1.1.2 2016/07/23 コードのリファクタリングとヘルプの修正
// 1.1.1 2016/04/29 ログ出力を無効化するパラメータを追加
// 1.1.0 2016/04/28 音声素材の並列プリロードに対応
//                  他のプラグインの影響等で、特定のシーンでプリロードが止まってしまう問題を修正
// 1.0.1 2016/04/25 色相が0以外の画像がすべて0で表示されてしまう問題を修正
//                  色相に関する制約の説明を追加
//                  ブラウザプレー時、戦闘アニメの表示速度が著しく低下する問題を修正
//                  バトルテストとイベントテストが実行できなくなる問題を修正
// 1.0.0 2016/04/23 初版
// ----------------------------------------------------------------------------
// [Blog]   : http://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================

/*:
 * @plugindesc 並列プリロードプラグイン
 * @author トリアコンタン
 *
 * @param 素材一覧データ
 * @desc 「/data」以下に配置するJSONファイル名
 * @default MV_Project
 *
 * @param ロード間隔
 * @desc ファイルをロードする間隔(フレーム単位)です。0に指定すると全てロードしてからゲーム開始します。(ブラウザ時は除く)
 * @default 0
 *
 * @param ログ出力
 * @desc ロードしたファイルパスをログに出力します。(テストプレー時のみ)
 * @default OFF
 *
 * @help
 * 本プラグインは、最新のコアスクリプトで一部画像が正常に表示されないため
 * 公開は停止しませんが、利用を非推奨とします。
 *
 * 一時期のコアスクリプトにはプリロード機能がなかったため本プラグインを
 * 作成しましたが、OSS版の導入以後はコアスクリプト側で適切な
 * 画像の読み込みと破棄の機能が実装されたため、当プラグインは
 * 役割を終えたものと判断します。
 * -------------------------------------------------------------------------
 *
 * ゲーム開始時に画像素材を並列ロードします。
 * 可能な限り負荷を分散、軽減するように設計されています。
 *
 * ロードする素材の一覧はfftfantt氏制作の「素材一覧用JSON作成プログラム」を
 * 使用してください。(2016/04/28時点でMITライセンス)
 * 同プログラムから必要な素材の一覧が作成されたJSONファイル
 * 「MV_Project.json」を作成して「/data」以下に配置します。
 * 作成する際は、「拡張子をつける」チェックを外してください。
 *
 * ・使い方
 * https://github.com/fftfantt/RPGMakerMV/wiki/JSON_Maker_for_MV
 *
 * ・本体
 * https://raw.githubusercontent.com/fftfantt/RPGMakerMV/master/JSON_Maker_for_MV.zip
 *
 * ブラウザから実行する場合、画像のロードが完了してから次のロードを開始します。
 * そのため、大量の画像を指定するとロード完了までに時間が掛かり
 * 効果が薄くなります。
 *
 * chromeでプレーする場合、大量に画像をロードすると処理速度が著しく低下します。
 * （本プラグインなしでも一定時間プレーすると発生する本体側の問題です）
 * その場合、下記を参考に対策プラグインの導入をお願いします。(本体ver1.2.0の場合)
 *
 * http://fanblogs.jp/tabirpglab/archive/422/0
 *
 * プリロードできるのは、色相が0の画像データのみです。
 * どうしても色相を変えた画像をロードしたい場合は「MV_Project.json」を
 * 該当箇所を以下の通り直接編集する必要があります。
 *
 * 例：色相が「100」の「Bat.png」をプリロードしたい場合
 * "Bat" -> "Bat:100"
 *
 * 注意！
 * このプラグインを適用したゲームをモバイルネットワークでプレーすると、
 * 通信量が膨大になる恐れがあります。必要に応じて注意喚起ください。
 *
 * 利用規約：
 *  作者に無断で改変、再配布が可能で、利用形態（商用、18禁利用等）
 *  についても制限はありません。
 *  このプラグインはもうあなたのものです。
 */

var $dataMaterials = null;

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

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

    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 iterate = function(that, handler) {
        Object.keys(that).forEach(function(key, index) {
            handler.call(that, key, that[key], index);
        });
    };

    //=============================================================================
    // パラメータの取得と整形
    //=============================================================================
    var paramMaterialListData = getParamString(['MaterialListData', '素材一覧データ']) + '.json';
    var paramLoadInterval     = getParamNumber(['LoadInterval', 'ロード間隔']);
    var paramOutputLog        = getParamBoolean(['OutputLog', 'ログ出力']);

    var localLoadComplete     = false;
    var localIntervalCount    = 0;

    //=============================================================================
    // DataManager
    //  ロード対象素材スタックの作成を追加定義します。
    //=============================================================================
    DataManager._databaseFiles.push(
        {name: '$dataMaterials', src: paramMaterialListData}
    );
    DataManager.materialFilePaths = null;

    var _DataManager_loadDataFile = DataManager.loadDataFile;
    DataManager.loadDataFile = function(name, src) {
        if (name === '$dataMaterials' && (this.isBattleTest() || this.isEventTest())) {
            arguments[1] = paramMaterialListData;
        }
        _DataManager_loadDataFile.apply(this, arguments);
    };

    var _DataManager_onLoad = DataManager.onLoad;
    DataManager.onLoad = function(object) {
        _DataManager_onLoad.apply(this, arguments);
        if (object === $dataMaterials) {
            this.initParallelPreload();
        }
    };

    DataManager.initParallelPreload = function() {
        this.materialFilePaths = [];
        iterate($dataMaterials, function (key, value) {
            for (var i = 0, n = value.length; i < n; i++) {
                this.materialFilePaths.push([key, value[i]]);
            }
        }.bind(this));
    };

    DataManager.loadMaterial = function() {
        var filePathInfo = this.materialFilePaths.shift();
        if (filePathInfo) {
            if (Utils.isOptionValid('test') && paramOutputLog) {
                console.log('Load material : ' + filePathInfo[0] + '/' + filePathInfo[1]);
            }
            var loadImageHandler = ImageManager.loadHandlers[filePathInfo[0]];
            if (loadImageHandler) this.loadImage(loadImageHandler, filePathInfo);
            var loadAudioHandler = AudioManager.loadHandlers[filePathInfo[0]];
            if (loadAudioHandler) this.loadAudio(loadAudioHandler, filePathInfo);
        } else {
            localLoadComplete = true;
        }
    };

    DataManager.loadImage = function(loadHandler, filePathInfo) {
        var key = filePathInfo[1].split(':');
        var hue = key.length > 1 ? parseInt(key[1], 10) : 0;
        var bitmap = ImageManager[loadHandler](key[0], hue);
        if (bitmap.isReady()) return;
        bitmap._isNeedLagDraw = true;
        bitmap._lagDrawHue = hue;
        if (Utils.isNwjs()) {
            localIntervalCount = paramLoadInterval;
        } else {
            localIntervalCount = Infinity;
            bitmap.addLoadListener(function () {
                localIntervalCount = paramLoadInterval;
            }.bind(this));
        }
    };

    DataManager.loadAudio = function(loadHandler, filePathInfo) {
        if (AudioManager.shouldUseHtml5Audio()) return;
        var audio = AudioManager[loadHandler](filePathInfo[0], filePathInfo[1]);
        if (Utils.isNwjs()) {
            localIntervalCount = paramLoadInterval;
        } else {
            localIntervalCount = Infinity;
            audio.addLoadListener(function () {
                localIntervalCount = paramLoadInterval;
            }.bind(this));
        }
    };

    //=============================================================================
    // SceneManager
    //  ロード処理を実行します。
    //=============================================================================
    var _SceneManager_updateScene = SceneManager.updateScene;
    SceneManager.updateScene = function() {
        _SceneManager_updateScene.apply(this, arguments);
        if (!localLoadComplete && DataManager.materialFilePaths) this.updateParallelPreload();
    };

    SceneManager.updateParallelPreload = function() {
        while (localIntervalCount <= 0 && !localLoadComplete) {
            DataManager.loadMaterial();
        }
        localIntervalCount--;
    };

    //=============================================================================
    // ImageManager
    //  ロード処理を実行します。
    //=============================================================================
    ImageManager.loadHandlers = {
        animations   : 'loadAnimation',
        battlebacks1 : 'loadBattleback1',
        battlebacks2 : 'loadBattleback2',
        enemies      : 'loadEnemy',
        characters   : 'loadCharacter',
        faces        : 'loadFace',
        parallaxes   : 'loadParallax',
        pictures     : 'loadPicture',
        sv_actors    : 'loadSvActor',
        sv_enemies   : 'loadSvEnemy',
        system       : 'loadSystem',
        tilesets     : 'loadTileset',
        titles1      : 'loadTitle1',
        titles2      : 'loadTitle2'
    };

    var _ImageManager_loadNormalBitmap = ImageManager.loadNormalBitmap;
    ImageManager.loadNormalBitmap = function(path, hue) {
        var bitmap = _ImageManager_loadNormalBitmap.apply(this, arguments);
        if (!bitmap.isReady()) bitmap._isNeedLagDraw = false;
        return bitmap;
    };

    var _ImageManager_isReady = ImageManager.isReady;
    ImageManager.isReady = function() {
        var result = _ImageManager_isReady.apply(this, arguments);
        if (result) return true;
        for (var key in this.cache._inner) {
            if (!this.cache._inner.hasOwnProperty(key)) continue;
            var bitmap = this.cache._inner[key].item;
            if (!bitmap.isReady() && !bitmap._isNeedLagDraw) {
                return false;
            }
        }
        return true;
    };

    var _ImageManager_isReady2 = ImageManager.isReady;
    ImageManager.isReady      = function() {
        var result = false;
        try {
            result = _ImageManager_isReady2.apply(this, arguments);
        } catch (e) {
            for (var key in this.cache._inner) {
                if (!this.cache._inner.hasOwnProperty(key)) continue;
                var bitmap = this.cache._inner[key].item;
                if (bitmap.isError() && bitmap._isNeedLagDraw) {
                    bitmap.eraseError();
                    delete this.cache._inner[key];
                }
            }
            result = _ImageManager_isReady2.apply(this, arguments);
        }
        return result;
    };

    //=============================================================================
    // AudioManager
    //  ロード用のメソッド名を定義します。
    //=============================================================================
    AudioManager.loadHandlers = {
        bgm : 'createBuffer',
        bgs : 'createBuffer',
        se  : 'createBuffer',
        me  : 'createBuffer'
    };

    //=============================================================================
    // Bitmap
    //  ロードと描画のタイミングを分離します。
    //=============================================================================
    var _Bitmap__onLoad = Bitmap.prototype._onLoad;
    Bitmap.prototype._onLoad = function() {
        if (!this._isNeedLagDraw) {
            _Bitmap__onLoad.apply(this, arguments);
        } else {
            this._isLoading = false;
            this._loadingState = 'loaded';  // added by nekoma.
            this.resize(this._image.width, this._image.height);
            this._callLoadListeners();
        }
    };

    Bitmap.prototype.drawImage = function() {
        this._context.drawImage(this._image, 0, 0);
        if (this._lagDrawHue !== 0) {
            this.rotateHue(this._lagDrawHue);
        }
        this._setDirty();
        this._isNeedLagDraw = false;
    };

    Bitmap.prototype.drawImageIfNeed = function() {
        if (this._isNeedLagDraw) {
            if (this.isReady()) {
                this.drawImage();
            } else {
                this._isNeedLagDraw = false;
            }
        }
    };

    var _Bitmap_blt = Bitmap.prototype.blt;
    Bitmap.prototype.blt = function(source, sx, sy, sw, sh, dx, dy, dw, dh) {
        source.drawImageIfNeed();
        _Bitmap_blt.apply(this, arguments);
    };

    var _Bitmap_bltImage = Bitmap.prototype.bltImage;
    Bitmap.prototype.bltImage = function(source, sx, sy, sw, sh, dx, dy, dw, dh) {
        source.drawImageIfNeed();
        _Bitmap_bltImage.apply(this, arguments);
    };

    Bitmap.prototype.eraseError = function() {
        this._hasError  = false;
        this._isLoading = false;
        this._loadingState = 'none';    // added by nekoma.
    };

    //=============================================================================
    // Sprite
    //  Bitmapのロード完了時に描画処理を実行します。
    //=============================================================================
    var _Sprite__onBitmapLoad = Sprite.prototype._onBitmapLoad;
    Sprite.prototype._onBitmapLoad = function() {
        if (this._bitmap) this._bitmap.drawImageIfNeed();
        _Sprite__onBitmapLoad.apply(this, arguments);
    };

    //=============================================================================
    // TilingSprite
    //  Bitmapのロード完了時に描画処理を実行します。
    //=============================================================================
    var _TilingSprite__onBitmapLoad = TilingSprite.prototype._onBitmapLoad;
    TilingSprite.prototype._onBitmapLoad = function() {
        if (this._bitmap) this._bitmap.drawImageIfNeed();
        _TilingSprite__onBitmapLoad.apply(this, arguments);
    };

    //=============================================================================
    // Spriteset_Map
    //  タイルセットはすぐに描画します。
    //=============================================================================
    var _Spriteset_Map_loadTileset = Spriteset_Map.prototype.loadTileset;
    Spriteset_Map.prototype.loadTileset = function() {
        _Spriteset_Map_loadTileset.apply(this, arguments);
        if (this._tileset) {
            this._tilemap.bitmaps.forEach(function(bitmap) {
                bitmap.drawImageIfNeed();
            });
        }
    };
})();


code:
//
//  永続ステート ver1.00
//
// author yana
//

var Imported = Imported || {};
Imported['PermanentState'] = 1.00;
/*:
 * @plugindesc ver1.00/戦闘不能や全回復で解除されないステートを設定できるようにします。
 * @author Yana
 *
 * @help ------------------------------------------------------
 * 使用方法
 * ------------------------------------------------------
 * ステートのメモ欄に
 * <永続ステート>
 * または、
 * <Permanent>
 * と記述すると、そのステートは戦闘不能や全回復で解除されなくなります。
 * それ以外は通常のステートと同じようにターン経過、バトル終了、解除効果などで
 * 解除されます。
 *
 * ------------------------------------------------------
 * 利用規約
 * ------------------------------------------------------
 * 使用に制限はありません。商用、アダルト、いずれにも使用できます。
 * 二次配布も制限はしませんが、サポートは行いません。
 * 著作表示は任意です。行わなくても利用できます。
 * 要するに、特に規約はありません。
 * バグ報告や使用方法等のお問合せはネ実ツクールスレ、または、Twitterにお願いします。
 * https://twitter.com/yanatsuki_
 * 素材利用は自己責任でお願いします。
 * ------------------------------------------------------
 * 更新履歴:
 * ver1.00:
 * 公開
 */

(function(){
	////////////////////////////////////////////////////////////////////////////////////

	var parameters = PluginManager.parameters('PermanentState');

	////////////////////////////////////////////////////////////////////////////////////

	DataManager.isPermanent = function(state) {
		if (!state){ return false }
		return !!state.meta['永続ステート'] || !!state.meta['Permanent'];
	};

	////////////////////////////////////////////////////////////////////////////////////

	var __GBBase_clearStates = Game_BattlerBase.prototype.clearStates;
	Game_BattlerBase.prototype.clearStates = function() {
		var states = this._states ? this._states.clone() : [];
		var turns = this._stateTurns ? JsonEx.makeDeepCopy(this._stateTurns) : {};
		__GBBase_clearStates.call(this);
		if (states.length < 1){ return }
		states.forEach(function(stateId){
			var state = $dataStates[stateId];
			if (DataManager.isPermanent(state)){
				this._states.push(state.id);
				this._stateTurns[state.id] = turns[state.id]
			}
		}.bind(this));
	};

	////////////////////////////////////////////////////////////////////////////////////

}());