code:
//=============================================================================
// BackUpDatabase.js
// ----------------------------------------------------------------------------
// (C)2015-2018 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.1.1 2018/05/13 1.1.0でエラーになる問題を修正
// 1.1.0 2018/05/13 バックアップフォルダを時間単位で作成できる機能を追加
// 1.0.0 2018/04/21 初版
// ----------------------------------------------------------------------------
// [Blog]   : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================

/*:
 * @plugindesc BackUpDatabasePlugin
 * @author triacontane
 *
 * @param backUpPath
 * @desc ファイルの出力パスです。相対パス、絶対パスが利用できます。
 * @default /backup
 *
 * @param includeSave
 * @desc セーブデータが含まれているフォルダもバックアップの対象にします。
 * @default false
 * @type boolean
 *
 * @param timeUnit
 * @desc 有効にすると時間単位でフォルダを作成します。無効にすると日付単位でフォルダを作成します。
 * @default false
 * @type boolean
 *
 * @help BackUpDatabase.js
 *
 * ゲームを起動するたびにデータフォルダ一式を所定の場所にコピーします。
 * フォルダは日付ごとに蓄積され、上限はありません。
 * このプラグインは通常のテストプレー時のみ効果があります。
 * 通常プレー、戦闘テスト、イベントテスト、ブラウザプレーでは何もしません。
 *
 * なお、プラグインの動作テストは十分に行っていますが、
 * 当プラグインは問題発生時のプロジェクトの復元を常に保証するものではありません。
 *
 * This plugin is released under the MIT License.
 */
/*:ja
 * @plugindesc データバックアッププラグイン
 * @author トリアコンタン
 *
 * @param backUpPath
 * @text バックアップパス
 * @desc ファイルの出力パスです。相対パス、絶対パスが利用できます。
 * @default /backup
 *
 * @param includeSave
 * @text セーブデータも含む
 * @desc セーブデータが含まれているフォルダもバックアップの対象にします。
 * @default false
 * @type boolean
 *
 * @param timeUnit
 * @text 時間単位でフォルダ作成
 * @desc 有効にすると時間単位でフォルダを作成します。無効にすると日付単位でフォルダを作成します。
 * @default false
 * @type boolean
 *
 * @help BackUpDatabase.js
 *
 * ゲームを起動するたびにデータフォルダ一式を所定の場所にコピーします。
 * フォルダは日付ごとに蓄積され、上限はありません。
 * このプラグインは通常のテストプレー時のみ効果があります。
 * 通常プレー、戦闘テスト、イベントテスト、ブラウザプレーでは何もしません。
 *
 * なお、プラグインの動作テストは十分に行っていますが、
 * 当プラグインは問題発生時のプロジェクトの復元を常に保証するものではありません。
 *
 * このプラグインにはプラグインコマンドはありません。
 *
 * 利用規約：
 *  作者に無断で改変、再配布が可能で、利用形態（商用、18禁利用等）
 *  についても制限はありません。
 *  このプラグインはもうあなたのものです。
 */

(function() {
    'use strict';

    if (!Utils.isNwjs()) {
        return;
    }

    /**
     * Create plugin parameter. param[paramName] ex. param.commandPrefix
     * @param pluginName plugin name(EncounterSwitchConditions)
     * @returns {Object} Created parameter
     */
    var createPluginParameter = function(pluginName) {
        var paramReplacer = function(key, value) {
            if (value === 'null') {
                return value;
            }
            if (value[0] === '"' && value[value.length - 1] === '"') {
                return value;
            }
            try {
                return JSON.parse(value);
            } catch (e) {
                return value;
            }
        };
        var parameter     = JSON.parse(JSON.stringify(PluginManager.parameters(pluginName), paramReplacer));
        PluginManager.setParameters(pluginName, parameter);
        return parameter;
    };

    var param = createPluginParameter('BackUpDatabase');
    var node  = {
        fs  : require('fs'),
        path: require('path')
    };

    //=============================================================================
    // SceneManager
    //  バックアップ処理を呼び出します。
    //=============================================================================
    var _SceneManager_initialize = SceneManager.initialize;
    SceneManager.initialize      = function() {
        _SceneManager_initialize.apply(this, arguments);
        DataManager.backupAllData();
    };

    //=============================================================================
    // DataManager
    //  バックアップを実行します。
    //=============================================================================
    DataManager.backupAllData = function() {
        if (!Utils.isOptionValid('test') || this.isBattleTest() || this.isEventTest()) {
            return;
        }
        this.backupDataBase();
        this.backupRpgProject();
        if (param.includeSave) {
            this.backupSaveData();
        }
    };

    DataManager.backupDataBase = function() {
        var targetPath   = StorageManager.makeBackupDirectory('data');
        var originalPath = StorageManager.localDataDirectoryPath();
        StorageManager.copyAllFiles(originalPath, targetPath);
    };

    DataManager.backupRpgProject = function() {
        var targetPath   = StorageManager.getBackupRoot();
        var originalPath = StorageManager.getProjectRoot() + '/';
        StorageManager.copyFile(originalPath, targetPath, 'Game.rpgproject');
    };

    DataManager.backupSaveData = function() {
        var targetPath   = StorageManager.makeBackupDirectory('save');
        var originalPath = StorageManager.localFileDirectoryPath();
        StorageManager.copyAllFiles(originalPath, targetPath);
    };

    //=============================================================================
    // StorageManager
    //  バックアップに必要なファイルアクセス処理を提供します。
    //=============================================================================
    StorageManager.copyAllFiles = function(originalPath, targetPath) {
        var copyFile = this.copyFile.bind(this, originalPath, targetPath);
        node.fs.readdir(originalPath, function(error, list) {
            if (error || !list) {
                console.warn(error);
                return;
            }
            list.forEach(function(fileName) {
                copyFile(fileName);
            });
        });
    };

    StorageManager.copyFile = function(originalPath, targetPath, fileName) {
        node.fs.createReadStream(originalPath + fileName).pipe(node.fs.createWriteStream(targetPath + fileName));
    };

    StorageManager.getProjectRoot = function() {
        return node.path.dirname(process.mainModule.filename);
    };

    StorageManager.localDataDirectoryPath = function() {
        return node.path.join(this.getProjectRoot(), 'data/');
    };

    StorageManager.getBackupRoot = function() {
        var filePath = param.backUpPath;
        if (!filePath.match(/^[A-Z]:/)) {
            filePath = node.path.join(this.getProjectRoot(), filePath);
        }
        return filePath.match(/\/$/) ? filePath : filePath + '/';
    };

    StorageManager.getBackupPath = function(prefix) {
        var date = new Date();
        return `${prefix}_${date.getFullYear()}-${(date.getMonth() + 1).padZero(2)}-${date.getDate().padZero(2)}${this.getBackupTimePath()}/`;
    };

    StorageManager.getBackupTimePath = function() {
        if (!param.timeUnit) {
            return '';
        }
        var date = new Date();
        return `_${date.getHours().padZero(2)}${date.getMinutes().padZero(2)}${date.getSeconds().padZero(2)}`;
    };

    StorageManager.makeBackupDirectory = function(type) {
        var filePath = this.getBackupRoot();
        this.makeDirectoryIfNeed(filePath);
        filePath += this.getBackupPath(type);
        this.makeDirectoryIfNeed(filePath);
        return filePath;
    };

    StorageManager.makeDirectoryIfNeed = function(dirPath) {
        if (!node.fs.existsSync(dirPath)) {
            node.fs.mkdirSync(dirPath);
        }
    };
})();


code:
//=============================================================================
// Barrier.js
//=============================================================================

/*:ja
* @plugindesc バリアステートの実装
* @author 剣崎宗二
*
* @param BarrierText
* @desc バリア発動時の表示テキスト (%2=吸収ダメージ量 %3=残強度 %1=バリアのステート名) 破壊された際は表示されません。
* @default %1が%2ダメージを吸収し、残量%3となった！
*
* @param BarrierBreakText
* @desc バリア破壊時メッセージ(%1=バリアのステート名 %2=ダメージ量)
* @default %1が%2のダメージを受け破壊された！
*
* @param Piercing
* @type boolean
* @desc 障壁の体力を超過したダメージが貫通するか否か。falseの場合、如何なる大技でも一発は無効化する。
* @default true
*
* @param PiercingChain
* @type boolean
* @desc 貫通したダメージが次の障壁に阻まれるかどうか。falseの場合貫通ダメージは他の障壁を無視してキャラクターに入る。
* @default true
*
* @param BarrierAnime
* @type number
* @desc バリアで防げた場合のアニメーションID（デフォルト）
* @default 1
*
* @param BarrierBreakAnime
* @type number
* @desc バリアが割れた場合のアニメーションID（デフォルト）
* @default 2
*
* @help
* ダメージを軽減するバリアを再現するためのプラグインです。
* ステートのメモに<barrier:300> (数字は軽減値）を入れると、値がなくなるまで軽減してくれます。
* 尚軽減値はダメージ計算式と同様の式を入れる事も可能ですが、 '>' が使えない事とa(攻撃側)が存在せずb(付与される側)のみ使用可能であることにご留意ください。
* アニメタグはステートに<BarrierBreakAnime:1>　（割れた場合ID3を再生）
* <BarrierAnime:3>　　（割れなかった場合ID1を再生）
* 等。
*/

(function () {

  var parameters = PluginManager.parameters('Barrier');
  var BarrierText = parameters['BarrierText'];
  var BarrierBreakText = parameters['BarrierBreakText'];
  var Piercing = (parameters['Piercing'] == "true");
  var PiercingChain = (parameters['PiercingChain'] == "true");

  var BarrierAnime = Number(parameters['BarrierAnime']);
  var BarrierBreakAnime = Number(parameters['BarrierBreakAnime']);

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

  //ActionLogs系
  var Game_ActionResult_prototype_clear = Game_ActionResult.prototype.clear;
  Game_ActionResult.prototype.clear = function () {
    Game_ActionResult_prototype_clear.call(this);
    this.barrieredDmg = [];
    this.barrieredBreak = [];
  };

  Barrier.findIdIndex = function (array, extid) {
    if (!array) return -1;

    for (var i = 0; i < array.length; i++) {
      if (array[i].id == extid) {
        return i;
      }
    }
    return -1;
  };

  Barrier.findId = function (array, extid) {
    if (!array) return null;

    targetIndex = Barrier.findIdIndex(array, extid)
    if (targetIndex != -1) {
      return array[targetIndex];
    }
    return null;
  };

  Barrier.findFromState = function (array) {
    if (!array) return null;

    for (i = 0; i < array.length; i++) {
      if ($dataStates[array[i]].meta.barrier) {
        return array[i];
      }
    }
    return null;
  };

  Barrier.getUniqueId = function (battler) {
    if (battler.isActor()) {
      return battler.actorId();
    }
    else {
      return "e" + battler.index();
    }
  }

  Barrier.FindAnimeId = function (stateId, broken) {
    if ($dataStates[stateId] && $dataStates[stateId].meta)
    {
       if (broken && $dataStates[stateId].meta.BarrierBreakAnime)
       {return Number($dataStates[stateId].meta.BarrierBreakAnime)}

       if (!broken && $dataStates[stateId].meta.BarrierAnime)
       {return Number($dataStates[stateId].meta.BarrierAnime)}
    }

    return broken ? BarrierBreakAnime : BarrierAnime;
  }

  //Message系
  Window_BattleLog.prototype.displayBarrier = function (target) {
    var targetBarrier = target._barrierList;
    var targetBarrierDmg = target.result().barrieredDmg;
    var targetBarrierBreak = target.result().barrieredBreak;

    var local = this;

    targetBarrierBreak.forEach(function (element) {
      var name = $dataStates[element.id].name;
      var dmg = element.value;
      local.push('showAnimation', target, [target], Barrier.FindAnimeId(element.id, true));
      local.push('addText', BarrierBreakText.format(name, dmg));
    }, this);

    targetBarrierDmg.forEach(function (element) {
      var name = $dataStates[element.id].name;
      var dmg = element.value;
      var left = Barrier.findId(targetBarrier, element.id).value;
      local.push('showAnimation', target, [target], Barrier.FindAnimeId(element.id, false));
      local.push('addText', BarrierText.format(name, dmg, left));
    }, this);
  };

  var Window_BattleLog_prototype_displayHpDamage = Window_BattleLog.prototype.displayHpDamage;
  Window_BattleLog.prototype.displayHpDamage = function (target) {
    this.displayBarrier(target);
    Window_BattleLog_prototype_displayHpDamage.call(this, target);
  }

  //state系
  var Game_Battler_prototype_addState = Game_Battler.prototype.addState;
  Game_Battler.prototype.addState = function (stateId) {
    Game_Battler_prototype_addState.call(this, stateId);

    var targetState = $dataStates[stateId];
    var targetBarrierState = Barrier.findId(this._barrierList, stateId);
    if (targetState && (targetState.meta.barrier || targetState.meta.healablebarrier)) {
      var b = this;
      var b_str = targetState.meta.healablebarrier ? targetState.meta.healablebarrier : targetState.meta.barrier;
      var b_value = eval(b_str);
      if (!b_value) { b_value = 1; }
      var b_healable = !!targetState.meta.healablebarrier;

      if (!targetBarrierState) {
        var barrierStateObject = {};
        barrierStateObject.id = stateId;
        barrierStateObject.value = b_value;
        barrierStateObject.healable = b_healable;
        barrierStateObject.maxValue = b_value;
        this._barrierList.push(barrierStateObject);
      }
      else {
        targetBarrierState.value = b_value;
        targetBarrierState.maxValue = b_value;
      }
    }
  };

  var Game_BattlerBase_prototype_eraseState = Game_BattlerBase.prototype.eraseState;
  Game_BattlerBase.prototype.eraseState = function (stateId) {
    Game_BattlerBase_prototype_eraseState.call(this, stateId)
    var targetState = $dataStates[stateId];
    if (targetState && (targetState.meta.barrier || targetState.meta.healablebarrier)) {
      var targetId = Barrier.findIdIndex(this._barrierList, stateId);
      this._barrierList.splice(targetId, 1);
    }
  };

  var kz_Game_BattlerBase_prototype_clearStates = Game_BattlerBase.prototype.clearStates;
  Game_BattlerBase.prototype.clearStates = function () {
    kz_Game_BattlerBase_prototype_clearStates.call(this);
    this._barrierList = [];
  };

  //Dmg系
  var Game_Action_prototype_executeHpDamage = Game_Action.prototype.executeHpDamage;
  Game_Action.prototype.executeHpDamage = function (target, value) {
    if (target._barrierList && target._barrierList.length > 0) {
      //バリアリストに何か入ってる場合
      var blist = target._barrierList;
      target.result().barrieredDmg = [];
      target.result().barrieredBreak = [];

      if (value > 0) {
        var removalList = [];
        for (var i = 0; i < blist.length; i++) {
          if (blist[i].value > value)  //割れなかった場合
          {
            var dmgObject = {};
            dmgObject.id = blist[i].id;
            dmgObject.value = value;
            target.result().barrieredDmg.push(dmgObject);

            blist[i].value -= value;
            value = 0;
            break;
          }
          else  //割れた場合
          {
            var breakObject = {};
            breakObject.id = blist[i].id;
            breakObject.value = blist[i].value;
            target.result().barrieredBreak.push(breakObject);

            if (Piercing) {
              value -= blist[i].value;
            }
            else {
              value = 0;
            }
            removalList.push(blist[i].id);
            console.log(PiercingChain);
            if (!PiercingChain) { break; }
          }
        }
        for (var i = 0; i < removalList.length; i++) {
          target.removeState(removalList[i]);
        }
      }
      else {
        //回復の場合
        var healableList = blist.filter(function (item) {
          return item.healable;
        });

        for (var i = 0; i < healableList.length; i++) {
          var dmgOnBarrier = healableList[i].value - healableList[i].maxValue;
          if (dmgOnBarrier < value) //バリアの減りの方が激しい場合
          {
            var dmgObject = {};
            dmgObject.id = blist[i].id;
            dmgObject.value = value;
            target.result().barrieredDmg.push(dmgObject);

            healableList[i].value -= value;
            value = 0;
            break;
          }
          else //回復量が上回った場合
          {
            var dmgObject = {};
            dmgObject.id = blist[i].id;
            dmgObject.value = dmgOnBarrier;
            target.result().barrieredDmg.push(dmgObject);

            value -= dmgOnBarrier;
            if (!PiercingChain) { break; }
          }
        }
      }
    }
    Game_Action_prototype_executeHpDamage.call(this, target, value);
  }
})();

repo_name: onms/sister

license: unknown


code:
//=============================================================================
// BattleBalloon.js
// ----------------------------------------------------------------------------
// Copyright (c) 2015-2017 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.0.0 2017/02/25 初版
// ----------------------------------------------------------------------------
// [Blog]   : http://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================

/*:
 * @plugindesc BattleBalloonPlugin
 * @author triacontane
 *
 * @param BalloonSpeedRate
 * @desc フキダシを表示する速度倍率（レート）です。マップ画面のフキダシには影響しません。
 * @default 100
 *
 * @param BalloonWaitTime
 * @desc フキダシ表示後の待機時間(フレーム)です。マップ画面のフキダシには影響しません。
 * @default 12
 *
 * @param BalloonIdEvasion
 * @desc 回避時に表示するフキダシIDです。
 * @default 0
 *
 * @param BalloonIdCounter
 * @desc 反撃時に表示するフキダシIDです。
 * @default 0
 *
 * @param BalloonIdSubstitute
 * @desc 身代わり時に表示するフキダシIDです。
 * @default 0
 *
 * @param BalloonIdCounter
 * @desc 反射時に表示するフキダシIDです。
 * @default 0
 *
 * @help 戦闘中に様々なタイミングでフキダシ（バルーン）を表示できます。
 * さらにフキダシの速度や待機時間を調整できます。
 * 表示対象はアクターおよび敵キャラです。主に以下のタイミングで表示できます。
 *
 * 1. バトルイベント中にプラグインコマンドを実行
 * 　アクター、敵キャラ、スキル使用者を対象にできます。
 * 　スキル使用者を対象にする場合は、スキル実行後のコモンイベント等で
 * 　表示させてください。
 * 　フキダシ表示が完了するまでウェイトすることもできます。
 *
 * 2. 反撃や回避を行った際に自動発動
 * 　パラメータで指定しておけば反撃、回避、魔法反射、身代わりの瞬間に
 * 　指定したIDのバルーンを自動表示します。
 *
 * 3. スキル実行時に自動発動
 * 　スキルもしくはアイテム使用時に自動発動します。
 * 　メモ欄に以下の通り記述してください。
 *
 * <BB_決定時フキダシ:5> # スキル決定時にフキダシ[5]を表示(敵キャラのみ)(※1)
 * <BB_BalloonInput:5>   # 同上
 * <BB_使用時フキダシ:6> # スキル使用時にフキダシ[6]を表示
 * <BB_BalloonUsing:6>   # 同上
 * ※1 正確には敵キャラAIがスキルを決定したタイミングになります。
 *
 * プラグインコマンド詳細
 *  イベントコマンド「プラグインコマンド」から実行。
 *  （パラメータの間は半角スペースで区切る）
 *
 * BB_アクターにバルーン 3 1 ON # アクター[3]にバルーン[1]をウェイトありで表示
 * BB_BALLOON_FOR_ACTOR 3 1 ON  # 同上
 * BB_敵キャラにバルーン 1 2    # インデックス[1]の敵キャラにバルーン[2]を表示
 * BB_BALLOON_FOR_ENEMY 1 2     # 同上
 * BB_使用者にバルーン 3 ON     # スキルの使用者にバルーン[3]を表示
 * BB_BALLOON_FOR_USER 3 ON     # 同上
 *
 * This plugin is released under the MIT License.
 */
/*:ja
 * @plugindesc 戦闘中フキダシ表示プラグイン
 * @author トリアコンタン
 *
 * @param フキダシ速度倍率
 * @desc フキダシを表示する速度倍率（レート）です。マップ画面のフキダシには影響しません。
 * @default 100
 *
 * @param フキダシ待機時間
 * @desc フキダシ表示後の待機時間(フレーム)です。マップ画面のフキダシには影響しません。
 * @default 12
 *
 * @param 回避フキダシID
 * @desc 回避時に表示するフキダシIDです。
 * @default 0
 *
 * @param 反撃フキダシID
 * @desc 反撃時に表示するフキダシIDです。
 * @default 0
 *
 * @param 身代わりフキダシID
 * @desc 身代わり時に表示するフキダシIDです。
 * @default 0
 *
 * @param 反射フキダシID
 * @desc 反射時に表示するフキダシIDです。
 * @default 0
 *
 * @help 戦闘中に様々なタイミングでフキダシ（バルーン）を表示できます。
 * さらにフキダシの速度や待機時間を調整できます。
 * 表示対象はアクターおよび敵キャラです。主に以下のタイミングで表示できます。
 *
 * 1. バトルイベント中にプラグインコマンドを実行
 * 　アクター、敵キャラ、スキル使用者を対象にできます。
 * 　スキル使用者を対象にする場合は、スキル実行後のコモンイベント等で
 * 　表示させてください。
 * 　フキダシ表示が完了するまでウェイトすることもできます。
 *
 * 2. 反撃や回避を行った際に自動発動
 * 　パラメータで指定しておけば反撃、回避、魔法反射、身代わりの瞬間に
 * 　指定したIDのバルーンを自動表示します。
 *
 * 3. スキル実行時に自動発動
 * 　スキルもしくはアイテム使用時に自動発動します。
 * 　メモ欄に以下の通り記述してください。
 *
 * <BB_決定時フキダシ:5> # スキル決定時にフキダシ[5]を表示(敵キャラのみ)(※1)
 * <BB_BalloonInput:5>   # 同上
 * <BB_使用時フキダシ:6> # スキル使用時にフキダシ[6]を表示
 * <BB_BalloonUsing:6>   # 同上
 * ※1 正確には敵キャラAIがスキルを決定したタイミングになります。
 *
 * プラグインコマンド詳細
 *  イベントコマンド「プラグインコマンド」から実行。
 *  （パラメータの間は半角スペースで区切る）
 *
 * BB_アクターにバルーン 3 1 ON # アクター[3]にバルーン[1]をウェイトありで表示
 * BB_BALLOON_FOR_ACTOR 3 1 ON  # 同上
 * BB_敵キャラにバルーン 1 2    # インデックス[1]の敵キャラにバルーン[2]を表示
 * BB_BALLOON_FOR_ENEMY 1 2     # 同上
 * BB_使用者にバルーン 3 ON     # スキルの使用者にバルーン[3]を表示
 * BB_BALLOON_FOR_USER 3 ON     # 同上
 *
 * 利用規約：
 *  作者に無断で改変、再配布が可能で、利用形態（商用、18禁利用等）
 *  についても制限はありません。
 *  このプラグインはもうあなたのものです。
 */

(function() {
    'use strict';
    var pluginName    = 'BattleBalloon';
    var metaTagPrefix = 'BB_';

    //=============================================================================
    // ローカル関数
    //  プラグインパラメータやプラグインコマンドパラメータの整形やチェックをします
    //=============================================================================
    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);
    };

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

    var getMetaValue = function(object, name) {
        var metaTagName = metaTagPrefix + name;
        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 (text == null) text = '';
        var windowLayer = SceneManager._scene._windowLayer;
        return windowLayer ? windowLayer.children[0].convertEscapeCharacters(text) : text;
    };

    var convertAllArguments = function(args) {
        for (var i = 0; i < args.length; i++) {
            args[i] = convertEscapeCharacters(args[i]);
        }
        return args;
    };

    var setPluginCommand = function(commandName, methodName) {
        pluginCommandMap.set(metaTagPrefix + commandName, methodName);
    };

    //=============================================================================
    // パラメータの取得と整形
    //=============================================================================
    var param                 = {};
    param.balloonIdEvasion    = getParamNumber(['BalloonIdEvasion', '回避フキダシID']);
    param.balloonIdReflection = getParamNumber(['BalloonIdReflection', '反射フキダシID']);
    param.balloonIdCounter    = getParamNumber(['BalloonIdCounter', '反撃フキダシID']);
    param.balloonIdSubstitute = getParamNumber(['BalloonIdSubstitute', '身代わりフキダシID']);
    param.balloonSpeedRate    = getParamNumber(['BalloonSpeedRate', 'フキダシ速度倍率']);
    param.balloonWaitTime     = getParamNumber(['BalloonWaitTime', 'フキダシ待機時間']);

    var pluginCommandMap = new Map();
    setPluginCommand('アクターにバルーン', 'requestBalloonActor');
    setPluginCommand('BALLOON_FOR_ACTOR', 'requestBalloonActor');
    setPluginCommand('敵キャラにバルーン', 'requestBalloonEnemy');
    setPluginCommand('BALLOON_FOR_ENEMY', 'requestBalloonEnemy');
    setPluginCommand('使用者にバルーン', 'requestBalloonUser');
    setPluginCommand('BALLOON_FOR_USER', 'requestBalloonUser');

    //=============================================================================
    // Game_Interpreter
    //  プラグインコマンドを追加定義します。
    //=============================================================================
    var _Game_Interpreter_pluginCommand      = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function(command, args) {
        _Game_Interpreter_pluginCommand.apply(this, arguments);
        if (!$gameParty.inBattle()) return;
        var pluginCommandMethod = pluginCommandMap.get(command.toUpperCase());
        if (pluginCommandMethod) {
            this[pluginCommandMethod](convertAllArguments(args));
        }
    };

    var _Game_Interpreter_updateWaitMode      = Game_Interpreter.prototype.updateWaitMode;
    Game_Interpreter.prototype.updateWaitMode = function() {
        var waiting = this.updateWaitModeForBattleBalloon();
        return waiting ? true : _Game_Interpreter_updateWaitMode.apply(this, arguments);
    };

    Game_Interpreter.prototype.updateWaitModeForBattleBalloon = function() {
        var waiting = false;
        if (this._waitMode === 'battleBalloon') {
            waiting = this._battler.isBalloonPlaying();
        } else {
            this._battler = null;
        }
        return waiting;
    };

    Game_Interpreter.prototype.requestBalloonActor = function(args) {
        var actor = $gameActors.actor(getArgNumber(args[0]));
        if (actor && $gameParty.battleMembers().contains(actor)) {
            actor.requestBalloonIfNeed(getArgNumber(args[1], 1));
            this.setWaitForBalloon(args[2], actor);
        }
    };

    Game_Interpreter.prototype.requestBalloonEnemy = function(args) {
        var enemy = $gameTroop.members()[getArgNumber(args[0]) - 1];
        if (enemy) {
            enemy.requestBalloonIfNeed(getArgNumber(args[1], 1));
            this.setWaitForBalloon(args[2], enemy);
        }
    };

    Game_Interpreter.prototype.requestBalloonUser = function(args) {
        var user = BattleManager.getSkillUser();
        if (user) {
            user.requestBalloonIfNeed(getArgNumber(args[0], 1));
            this.setWaitForBalloon(args[1], user);
        }
    };

    Game_Interpreter.prototype.setWaitForBalloon = function(waitFlag, battler) {
        if (waitFlag && waitFlag.toUpperCase() !== 'OFF') {
            this.setWaitMode('battleBalloon');
            this._battler = battler;
        }
    };

    //=============================================================================
    // BattleManager
    //  実行主体に対してバルーンスプライトの表示をリクエストします。
    //=============================================================================
    BattleManager.getSkillUser = function() {
        return this._subject;
    };

    //=============================================================================
    // Game_BattlerBase
    //  バルーンスプライトの表示をリクエストします。
    //=============================================================================
    Game_BattlerBase.prototype.requestBalloon   = Game_CharacterBase.prototype.requestBalloon;
    Game_BattlerBase.prototype.balloonId        = Game_CharacterBase.prototype.balloonId;
    Game_BattlerBase.prototype.startBalloon     = Game_CharacterBase.prototype.startBalloon;
    Game_BattlerBase.prototype.isBalloonPlaying = Game_CharacterBase.prototype.isBalloonPlaying;
    Game_BattlerBase.prototype.endBalloon       = Game_CharacterBase.prototype.endBalloon;

    Game_BattlerBase.prototype.requestBalloonIfNeed = function(balloonId) {
        if (balloonId > 0) {
            this.requestBalloon(balloonId);
        }
    };

    //=============================================================================
    // Game_Battler
    //  リアクションバルーンの表示をリクエストします。
    //=============================================================================
    var _Game_Battler_performSubstitute      = Game_Battler.prototype.performSubstitute;
    Game_Battler.prototype.performSubstitute = function(target) {
        _Game_Battler_performSubstitute.apply(this, arguments);
        this.requestBalloonIfNeed(param.balloonIdSubstitute);
    };

    var _Game_Battler_performReflection      = Game_Battler.prototype.performReflection;
    Game_Battler.prototype.performReflection = function(target) {
        _Game_Battler_performReflection.apply(this, arguments);
        this.requestBalloonIfNeed(param.balloonIdReflection);
    };

    var _Game_Battler_performCounter      = Game_Battler.prototype.performCounter;
    Game_Battler.prototype.performCounter = function(target) {
        _Game_Battler_performCounter.apply(this, arguments);
        this.requestBalloonIfNeed(param.balloonIdCounter);
    };

    var _Game_Battler_performEvasion      = Game_Battler.prototype.performEvasion;
    Game_Battler.prototype.performEvasion = function(target) {
        _Game_Battler_performEvasion.apply(this, arguments);
        this.requestBalloonIfNeed(param.balloonIdEvasion);
    };

    var _Game_Battler_performMagicEvasion      = Game_Battler.prototype.performMagicEvasion;
    Game_Battler.prototype.performMagicEvasion = function() {
        _Game_Battler_performMagicEvasion.apply(this, arguments);
        this.requestBalloonIfNeed(param.balloonIdEvasion);
    };

    var _Game_Battler_performActionStart      = Game_Battler.prototype.performActionStart;
    Game_Battler.prototype.performActionStart = function(action) {
        _Game_Battler_performActionStart.apply(this, arguments);
        this.requestBalloonIfNeed(action.getBalloonIdForUsing());
    };

    //=============================================================================
    // Game_Enemy
    //  行動決定時にバルーンを表示します。
    //=============================================================================
    var _Game_Enemy_makeActions      = Game_Enemy.prototype.makeActions;
    Game_Enemy.prototype.makeActions = function() {
        _Game_Enemy_makeActions.apply(this, arguments);
        this.requestBalloonInput();
    };

    Game_Enemy.prototype.requestBalloonInput = function() {
        var number = this.numActions();
        for (var i = 0; i < number; i++) {
            this.requestBalloonIfNeed(this.action(i).getBalloonIdForInput());
        }
    };

    //=============================================================================
    // Game_Action
    //  バルーン情報のメモ欄を取得します。
    //=============================================================================
    Game_Action.prototype.getBalloonIdMetaData = function(names) {
        var metaInfo = getMetaValues(this.item(), names);
        return metaInfo ? getArgNumber(metaInfo, 1) : null;
    };

    Game_Action.prototype.getBalloonIdForInput = function() {
        return this.getBalloonIdMetaData(['BalloonInput', '決定時フキダシ']);
    };

    Game_Action.prototype.getBalloonIdForUsing = function() {
        return this.getBalloonIdMetaData(['BalloonUsing', '使用時フキダシ']);
    };

    //=============================================================================
    // Sprite_Battler
    //  バルーンスプライトを追加します。
    //=============================================================================
    var _Sprite_Battler_update      = Sprite_Battler.prototype.update;
    Sprite_Battler.prototype.update = function() {
        _Sprite_Battler_update.apply(this, arguments);
        if (this._battler) {
            this.updateBalloon();
        }
    };

    Sprite_Battler.prototype.setupBalloon = function() {
        if (this._battler.balloonId() > 0) {
            this.startBalloon();
            this._battler.startBalloon();
        }
    };

    Sprite_Battler.prototype.startBalloon = function() {
        if (!this._balloonSprite) {
            this._balloonSprite = new Sprite_BattlerBalloon();
        }
        this._balloonSprite.setup(this._battler.balloonId());
        this.parent.addChild(this._balloonSprite);
    };

    Sprite_Battler.prototype.updateBalloon = function() {
        if (!this.isBalloonPlaying()) {
            this._battler.endBalloon();
        }
        this.setupBalloon();
        if (this._balloonSprite) {
            this._balloonSprite.x = this.x;
            this._balloonSprite.y = this.y - this.getMainHeight();
            if (!this._balloonSprite.isPlaying()) {
                this.endBalloon();
            }
        }
    };

    Sprite_Battler.prototype.endBalloon = function() {
        if (this._balloonSprite) {
            this.parent.removeChild(this._balloonSprite);
            this._balloonSprite = null;
        }
    };

    Sprite_Battler.prototype.isBalloonPlaying = function() {
        return !!this._balloonSprite;
    };

    Sprite_Battler.prototype.getMainHeight = function() {
        return this.height;
    };

    //=============================================================================
    // Sprite_Actor
    //  バルーンスプライトを追加します。
    //=============================================================================
    Sprite_Actor.prototype.getMainHeight = function() {
        return this._mainSprite.height;
    };

    //=============================================================================
    // Sprite_BattlerBalloon
    //  バトラー表示用のフキダシスプライトです。
    //=============================================================================
    function Sprite_BattlerBalloon() {
        this.initialize.apply(this, arguments);
    }

    Sprite_BattlerBalloon.prototype             = Object.create(Sprite_Balloon.prototype);
    Sprite_BattlerBalloon.prototype.constructor = Sprite_BattlerBalloon;

    Sprite_BattlerBalloon.prototype.speed = function() {
        return Math.floor(Sprite_Balloon.prototype.speed.call(this) * 100 / (param.balloonSpeedRate || 100));
    };

    Sprite_BattlerBalloon.prototype.waitTime = function() {
        return param.balloonWaitTime;
    };
})();


code:
//=============================================================================
// BattleEffectPopup.js
// ----------------------------------------------------------------------------
// (C)2016 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.9.0 2020/02/11 ポップアップメッセージが重なったときに次のポップアップまでのウェイトが指定できる機能を追加
// 1.8.1 2019/02/26 KMS_SomStyleDamage.jsとの競合を解消。こちらのポップアップもKMS_SomStyleDamage.jsと同じ動きをします。
// 1.8.0 2018/10/13 パラメータの型指定機能に対応
//                  コモンイベントが呼び出された場合は無効ポップアップを出さないよう仕様変更
// 1.7.2 2018/10/07 プラグインコマンド「対象者ポップアップ」にて競合等の理由で対象が見付からない場合にエラーを回避するよう修正
// 1.7.1 2017/08/03 YEP_BattleEngineCore.jsと併用したときに、メッセージの種類によってポップアップ位置が変化する問題を修正
// 1.7.0 2017/06/13 行動がガード（耐性によって完全に防がれた）された場合のポップアップを追加
// 1.6.0 2017/06/10 行動が無効だった場合のポップアップを追加
// 1.5.1 2017/06/10 自動戦闘が有効なアクターがいる場合に一部機能が正常に動作しない問題を修正
// 1.5.0 2017/05/30 弱点と耐性のポップアップで弱点や耐性と見なすための閾値を設定できる機能を追加
// 1.4.0 2017/05/20 CounterExtend.jsとの併用でスキルによる反撃が表示されない問題を修正。
//                  ポップアップのイタリック体および縁取り表示を行う機能を追加。
// 1.3.1 2016/12/18 VE_BasicModule.jsとの競合を解消
// 1.3.0 2016/07/14 アクターと敵キャラの通常ダメージにも専用のフラッシュ色を指定できるようになりました。
// 1.2.3 2016/07/13 1.2.2の修正が不完全だったのを対応
// 1.2.2 2016/07/13 YEP_BattleEngineCore.jsと併用したときに、Missが重複して表示される現象を修正
// 1.2.1 2016/07/12 Z座標を指定しているプラグインとの競合を解消するかもしれない
// 1.2.0 2016/07/10 行動失敗時(Miss!)も任意の文字または画像に置き換えられるようになりました。
// 1.1.0 2016/07/09 ポップアップに任意の画像を指定できるようになりました。
//                  フラッシュするフレーム数を指定できるようになりました。
// 1.0.0 2016/07/06 初版
// ----------------------------------------------------------------------------
// [Blog]   : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================

/*:
 * @plugindesc 戦闘行動結果ポップアッププラグイン
 * @author トリアコンタン
 *
 * @param メッセージウェイト
 * @desc ポップアップメッセージが重なったときに次のメッセージが表示されるまでのウェイトフレーム数です。
 * @default 16
 * @type number
 *
 * @param クリティカル
 * @desc クリティカル発生時のポップアップメッセージまたはファイル名です。(img/pictures/)拡張子不要
 * @default CRITICAL!
 * @require 1
 * @dir img/pictures/
 * @type file
 *
 * @param クリティカルカラー
 * @desc クリティカル発生時の文字のフラッシュ色です。R(赤),G(緑),B(青),A(強さ)の順番でカンマ(,)区切りで指定。
 * @default 255,0,0,255
 *
 * @param 回避
 * @desc 回避発生時のポップアップメッセージまたはファイル名です。
 * @default Avoid!
 * @require 1
 * @dir img/pictures/
 * @type file
 *
 * @param 回避カラー
 * @desc 回避発生時の文字のフラッシュ色です。
 * @default 0,128,255,255
 *
 * @param ミス
 * @desc ミス発生時のポップアップメッセージまたはファイル名です。通常のMissは表示されなくなります。
 * @default Miss!
 * @require 1
 * @dir img/pictures/
 * @type file
 *
 * @param ミスカラー
 * @desc ミス発生時の文字のフラッシュ色です。
 * @default 0,0,0,0
 *
 * @param 無効
 * @desc 行動が無効（行動は成功したが有効な効果がなかった）だった時のポップアップメッセージまたはファイル名です。
 * @default Invalid!
 * @require 1
 * @dir img/pictures/
 * @type file
 *
 * @param 無効カラー
 * @desc 無効発生時の文字のフラッシュ色です。
 * @default 0,0,0,0
 *
 * @param ガード
 * @desc 行動がガード（行動は成功したが相手の耐性によって完全に防がれた）された時のポップアップメッセージまたはファイル名です。
 * @default Guard!
 * @require 1
 * @dir img/pictures/
 * @type file
 *
 * @param ガードカラー
 * @desc ガード発生時の文字のフラッシュ色です。
 * @default 0,128,255,255
 *
 * @param 魔法反射
 * @desc 魔法反射時のポップアップメッセージまたはファイル名です。
 * @default Reflection!
 * @require 1
 * @dir img/pictures/
 * @type file
 *
 * @param 魔法反射カラー
 * @desc 魔法反射発生時の文字のフラッシュ色です。
 * @default 0,128,255,255
 *
 * @param 反撃
 * @desc 反撃時のポップアップメッセージまたはファイル名です。
 * @default Counter!
 * @require 1
 * @dir img/pictures/
 * @type file
 *
 * @param 反撃カラー
 * @desc 反撃発生時の文字のフラッシュ色です。
 * @default 0,128,255,255
 *
 * @param 弱点
 * @desc 弱点時のポップアップメッセージまたはファイル名です。
 * @default Weakness!
 * @require 1
 * @dir img/pictures/
 * @type file
 *
 * @param 弱点カラー
 * @desc 弱点発生時の文字のフラッシュ色です。
 * @default 0,255,128,255
 *
 * @param 弱点閾値
 * @desc この値以上なら弱点と見なします。百分率で指定します。
 * @default 200
 *
 * @param 耐性
 * @desc 弱点時のポップアップメッセージまたはファイル名です。
 * @default Resistance!
 * @require 1
 * @dir img/pictures/
 * @type file
 *
 * @param 耐性カラー
 * @desc 耐性発生時の文字のフラッシュ色です。
 * @default 0,0,128,255
 *
 * @param 耐性閾値
 * @desc この値以下なら耐性と見なします。百分率で指定します。
 * @default 50
 *
 * @param 味方ダメージカラー
 * @desc アクターダメージのフラッシュ色です。
 * @default 0,0,0,0
 *
 * @param 敵ダメージカラー
 * @desc 敵キャラダメージのフラッシュ色です。
 * @default 0,0,0,0
 *
 * @param フォントサイズ
 * @desc ポップアップのフォントサイズです。
 * @default 42
 *
 * @param メッセージ最大幅
 * @desc ポップアップメッセージの最大幅です。
 * @default 240
 *
 * @param フラッシュ時間
 * @desc フラッシュカラーがフェードアウトするまでのフレーム数です。
 * @default 60
 *
 * @param X座標補正
 * @desc X座標の補正値です。
 * @default 0
 *
 * @param Y座標補正
 * @desc Y座標の補正値です。
 * @default -40
 *
 * @param イタリック表示
 * @desc ポップアップがイタリック体で表示されます。
 * @default false
 * @type boolean
 *
 * @param 縁取り表示
 * @desc ポップアップが縁取り表示されます。
 * @default false
 * @type boolean
 *
 * @param 画像使用
 * @desc 各種ポップアップに任意のピクチャ(img/pictures)を使用します。メッセージの代わりにファイル名を入力してください。
 * @default false
 * @type boolean
 *
 * @noteParam BEPメッセージ
 * @noteRequire 1
 * @noteDir img/pictures/
 * @noteType file
 * @noteData items
 *
 * @help 戦闘中に行動の結果のメッセージをポップアップします。
 * ポップアップするのは動的に作成した文字列もしくは用意したピクチャです。
 * 表示条件は以下の通りです。
 *
 * ・失敗（通常のMissは表示されなくなります）
 * ・回避（通常のMissは表示されなくなります）
 * ・無効（行動は成功したが有効な効果がなかった）
 * ・ガード（行動は成功したが相手の耐性によって完全に防がれた）
 * ・クリティカル
 * ・反撃
 * ・魔法反射
 * ・弱点（ダメージ倍率が1.0を上回った場合）
 * ・耐性（ダメージ倍率が1.0を下回った場合）
 * ・ステート付与（ステートごとに設定できます）
 * ・コモンイベント（プラグインコマンドから実行します）
 *
 * ※ガードが表示されるのは、ステート有効度もしくは属性有効度が0%の効果が
 * 存在し、かつ他に有効な効果がない場合です。
 * なお、「ステート無効化」で防がれた場合は表示されません。
 *
 * また、ポップアップ時にフラッシュカラーを指定することができます。
 * フラッシュカラーの指定は「赤」「緑」「青」「強さ」の順番で
 * カンマ区切りで指定してください。
 *
 * ステート付与時にメッセージをポップアップをしたい場合
 * ステートのメモ欄に以下の通り指定してください。
 * <BEPメッセージ:state>       # 付加時にメッセージ「state」が表示されます。
 *                             # 画像使用が有効な場合はファイル名を指定します。
 * <BEPカラー:255,255,255,255> # 付加時のフラッシュカラーを指定します。
 *
 * さらに、プラグインコマンドから任意の文字列を自由にポップアップできます。
 * このコマンドはバトルイベントのみ使用可能です。
 *
 * プラグインコマンド詳細
 *  イベントコマンド「プラグインコマンド」から実行。
 *  （パラメータの間は半角スペースで区切る）
 *
 * BEP対象者ポップアップ message 255,0,0,255 # 行動の対象者にmessageがポップ。
 * BEP_TARGET_POPUP message 255,0,0,255      # 上と同じ
 *
 * BEP使用者ポップアップ message 255,0,0,255 # 行動の使用者にmessageがポップ。
 * BEP_USER_POPUP message 255,0,0,255        # 上と同じ
 *
 * ※画像使用が有効な場合はファイル名を指定します。
 *
 * 競合に関する情報
 * 当プラグインは以下のプラグインより下に配置してください。
 *
 * YEP_BattleEngineCore.js
 *
 * 利用規約：
 *  作者に無断で改変、再配布が可能で、利用形態（商用、18禁利用等）
 *  についても制限はありません。
 *  このプラグインはもうあなたのものです。
 */

(function() {
    'use strict';
    var pluginName    = 'BattleEffectPopup';
    var metaTagPrefix = 'BEP';

    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 getParamString = function(paramNames) {
        var value = getParamOther(paramNames);
        return value === null ? '' : value;
    };

    var getParamBoolean = function(paramNames) {
        var value = getParamOther(paramNames);
        return (value || '').toUpperCase() === 'ON' || (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 getParamArrayString = function(paramNames) {
        var values = getParamString(paramNames).split(',');
        for (var i = 0; i < values.length; i++) values[i] = values[i].trim();
        return values;
    };

    var getParamArrayNumber = function(paramNames, min, max) {
        var values = getParamArrayString(paramNames);
        if (arguments.length < 2) min = -Infinity;
        if (arguments.length < 3) max = Infinity;
        for (var i = 0; i < values.length; i++) {
            if (!isNaN(parseInt(values[i], 10))) {
                values[i] = (parseInt(values[i], 10) || 0).clamp(min, max);
            } else {
                values.splice(i--, 1);
            }
        }
        return values;
    };

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

    var getArgArrayNumber = function(args, min, max) {
        var values = getArgArrayString(args, false);
        if (arguments.length < 2) min = -Infinity;
        if (arguments.length < 3) max = Infinity;
        for (var i = 0; i < values.length; i++) values[i] = (parseInt(values[i], 10) || 0).clamp(min, max);
        return values;
    };

    var getArgArrayString = function(args, upperFlg) {
        var values = getArgString(args, upperFlg).split(',');
        for (var i = 0; i < values.length; i++) values[i] = values[i].trim();
        return values;
    };

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

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

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

    //=============================================================================
    // パラメータの取得と整形
    //=============================================================================
    var paramCritical         = getParamString(['Critical', 'クリティカル']);
    var paramCriticalColor    = getParamArrayNumber(['CriticalColor', 'クリティカルカラー'], 0, 256);
    var paramAvoid            = getParamString(['Avoid', '回避']);
    var paramAvoidColor       = getParamArrayNumber(['AvoidColor', '回避カラー'], 0, 256);
    var paramMiss             = getParamString(['Miss', 'ミス']);
    var paramMissColor        = getParamArrayNumber(['MissColor', 'ミスカラー'], 0, 256);
    var paramInvalid          = getParamString(['Invalid', '無効']);
    var paramInvalidColor     = getParamArrayNumber(['InvalidColor', '無効カラー'], 0, 256);
    var paramGuard            = getParamString(['Guard', 'ガード']);
    var paramGuardColor       = getParamArrayNumber(['GuardColor', 'ガードカラー'], 0, 256);
    var paramReflection       = getParamString(['Reflection', '魔法反射']);
    var paramReflectionColor  = getParamArrayNumber(['ReflectionColor', '魔法反射カラー'], 0, 256);
    var paramCounter          = getParamString(['Counter', '反撃']);
    var paramCounterColor     = getParamArrayNumber(['CounterColor', '反撃カラー'], 0, 256);
    var paramWeakness         = getParamString(['Weakness', '弱点']);
    var paramWeaknessColor    = getParamArrayNumber(['WeaknessColor', '弱点カラー'], 0, 256);
    var paramWeaknessLine     = getParamNumber(['WeaknessLine', '弱点閾値']);
    var paramResistance       = getParamString(['Resistance', '耐性']);
    var paramResistanceLine   = getParamNumber(['ResistanceLine', '耐性閾値']);
    var paramResistanceColor  = getParamArrayNumber(['ResistanceColor', '耐性カラー'], 0, 256);
    var paramActorDamageColor = getParamArrayNumber(['ActorDamageColor', '味方ダメージカラー'], 0, 256);
    var paramEnemyDamageColor = getParamArrayNumber(['EnemyDamageColor', '敵ダメージカラー'], 0, 256);
    var paramFontSize         = getParamNumber(['FontSize', 'フォントサイズ'], 16, 128);
    var paramMaxWidth         = getParamNumber(['MaxWidth', 'メッセージ最大幅'], 1);
    var paramFlashDuration    = getParamNumber(['FlashDuration', 'フラッシュ時間'], 1);
    var paramOffsetX          = getParamNumber(['OffsetX', 'X座標補正']);
    var paramOffsetY          = getParamNumber(['OffsetY', 'Y座標補正']);
    var paramUsingPicture     = getParamBoolean(['UsingPicture', '画像使用']);
    var paramUsingItalic      = getParamBoolean(['UsingItalic', 'イタリック表示']);
    var paramUsingOutline     = getParamBoolean(['UsingOutline', '縁取り表示']);
    var paramMessageWait      = getParamNumber(['MessageWait', 'メッセージウェイト']);

    //=============================================================================
    // 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;
        this.pluginCommandBattleEffectPopup(command.replace(metaTagPrefix, ''), args);
    };

    Game_Interpreter.prototype.pluginCommandBattleEffectPopup = function(command, args) {
        switch (getCommandName(command)) {
            case '使用者ポップアップ' :
            case '_USER_POPUP':
                BattleManager._subject.startMessagePopup(getArgString(args[0]), getArgArrayNumber(args[1], 0, 256));
                break;
            case '対象者ポップアップ' :
            case '_TARGET_POPUP':
                var action = BattleManager._action;
                var unit   = action.isForOpponent() ? action.opponentsUnit() : action.friendsUnit();
                var index  = BattleManager._subject._lastTargetIndex;
                var target = unit.members()[index];
                if (target) {
                    target.startMessagePopup(getArgString(args[0]), getArgArrayNumber(args[1], 0, 256));
                } else {
                    console.error('対象者ポップアップのターゲットが見付かりませんでした。index : ' + index);
                    console.error(unit.members());
                }
                break;
        }
    };

    //=============================================================================
    // Game_Action
    //  弱点によってポップアップを設定します。
    //=============================================================================
    var _Game_Action_calcElementRate      = Game_Action.prototype.calcElementRate;
    Game_Action.prototype.calcElementRate = function(target) {
        var result = _Game_Action_calcElementRate.apply(this, arguments);
        if (BattleManager.isInputting()) return result;
        if (result === 0) {
            target.appointMessagePopup(paramGuard, paramGuardColor);
        } else if (result >= paramWeaknessLine / 100) {
            target.appointMessagePopup(paramWeakness, paramWeaknessColor);
        } else if (result <= paramResistanceLine / 100) {
            target.appointMessagePopup(paramResistance, paramResistanceColor);
        }
        return result;
    };

    //=============================================================================
    // Game_Battler
    //  ポップアップメッセージのリクエストに応答します。
    //=============================================================================
    Game_Battler.prototype.clearMessagePopup = function() {
        this._messagePopup = false;
    };

    Game_Battler.prototype.isMessagePopupRequested = function() {
        return this._messagePopup;
    };

    Game_Battler.prototype.startMessagePopup = function(message, flashColor) {
        if (message) {
            this._messagePopup = true;
            this._message      = message;
            this._flashColor   = flashColor;
        }
    };

    Game_Battler.prototype.startAppointMessagePopup = function() {
        this.startMessagePopup(this._appointMessage, this._appointFlashColor);
        this._appointMessage    = '';
        this._appointFlashColor = null;
    };

    Game_Battler.prototype.appointMessagePopup = function(message, flashColor) {
        this._appointMessage    = message;
        this._appointFlashColor = flashColor;
    };

    Game_Battler.prototype.getMessagePopupText = function() {
        return this._message;
    };

    Game_Battler.prototype.hasAppointMessage = function() {
        return !!this._appointMessage;
    };

    Game_Battler.prototype.getMessagePopupFlashColor = function() {
        return this._flashColor;
    };

    var _Game_Battler_stateRate = Game_Battler.prototype.stateRate;
    Game_Battler.prototype.stateRate = function(stateId) {
        var rate = _Game_Battler_stateRate.apply(this, arguments);
        if (rate === 0) {
            this.result().guarded = true;
        }
        return rate;
    };

    //=============================================================================
    // Game_ActionResult
    //  行動が無効だったかどうかを返します。
    //=============================================================================
    var _Game_ActionResult_clear = Game_ActionResult.prototype.clear;
    Game_ActionResult.prototype.clear = function() {
        _Game_ActionResult_clear.apply(this, arguments);
        this.guarded = false;
    };

    Game_ActionResult.prototype.isInvalid = function() {
        return !this.success && !this.missed && !this.evaded && !$gameTemp.isCommonEventReserved();
    };

    Game_ActionResult.prototype.isGuarded = function() {
        return this.guarded && this.isInvalid();
    };

    //=============================================================================
    // Window_BattleLog
    //  ポップアップメッセージをリクエストします。
    //=============================================================================
    Window_BattleLog.prototype.popupMessage = function(target, message, flashColor) {
        target.startMessagePopup(message, flashColor);
    };

    Window_BattleLog.prototype.popupAppointMessage = function(target) {
        target.startAppointMessagePopup();
    };

    var _Window_BattleLog_displayDamage      = Window_BattleLog.prototype.displayDamage;
    Window_BattleLog.prototype.displayDamage = function(target) {
        _Window_BattleLog_displayDamage.apply(this, arguments);
        if (target.result().isGuarded()) {
            this.pushPopupMessage(target, paramGuard, paramGuardColor);
        } else if (target.result().isInvalid()) {
            this.pushPopupMessage(target, paramInvalid, paramInvalidColor);
        }
        if (target.hasAppointMessage()) {
            this.pushPopupAppointMessage(target);
        }
    };

    var _Window_BattleLog_displayCritical      = Window_BattleLog.prototype.displayCritical;
    Window_BattleLog.prototype.displayCritical = function(target) {
        _Window_BattleLog_displayCritical.apply(this, arguments);
        if (target.result().critical) {
            this.pushPopupMessage(target, paramCritical, paramCriticalColor);
        }
    };

    var _Window_BattleLog_displayMiss      = Window_BattleLog.prototype.displayMiss;
    Window_BattleLog.prototype.displayMiss = function(target) {
        _Window_BattleLog_displayMiss.apply(this, arguments);
        this.popupMiss(target);
    };

    Window_BattleLog.prototype.popupMiss = function(target) {
        this.pushPopupMessage(target, paramMiss, paramMissColor);
    };

    var _Window_BattleLog_displayEvasion      = Window_BattleLog.prototype.displayEvasion;
    Window_BattleLog.prototype.displayEvasion = function(target) {
        _Window_BattleLog_displayEvasion.apply(this, arguments);
        this.popupEvasion(target);
    };

    Window_BattleLog.prototype.popupEvasion = function(target) {
        this.pushPopupMessage(target, paramAvoid, paramAvoidColor);
    };

    var _Window_BattleLog_displayCounter      = Window_BattleLog.prototype.displayCounter;
    Window_BattleLog.prototype.displayCounter = function(target) {
        _Window_BattleLog_displayCounter.apply(this, arguments);
        this.popupCounter(target);
    };

    Window_BattleLog.prototype.popupCounter = function(target) {
        this.pushPopupMessage(target, paramCounter, paramCounterColor);
    };

    var _Window_BattleLog_displayReflection      = Window_BattleLog.prototype.displayReflection;
    Window_BattleLog.prototype.displayReflection = function(target) {
        _Window_BattleLog_displayReflection.apply(this, arguments);
        this.popupReflection(target);
    };

    Window_BattleLog.prototype.popupReflection = function(target) {
        this.pushPopupMessage(target, paramReflection, paramReflectionColor);
    };

    var _Window_BattleLog_displayAddedStates      = Window_BattleLog.prototype.displayAddedStates;
    Window_BattleLog.prototype.displayAddedStates = function(target) {
        _Window_BattleLog_displayAddedStates.apply(this, arguments);
        target.result().addedStateObjects().forEach(function(state) {
            var message = getMetaValues(state, ['Message', 'メッセージ']);
            if (message) {
                var flash = getMetaValues(state, ['FlashColor', 'カラー']);
                if (flash) flash = getArgArrayNumber(flash, 0, 256);
                this.pushPopupMessage(target, getArgString(message), flash);
            }
        }, this);
    };

    Window_BattleLog.prototype.pushPopupMessage = function(target, message, flashColor) {
        if (this.hasPopupMessage()) {
            this.push('waitForPopup');
        }
        this.push('popupMessage', target, message, flashColor);
    };

    Window_BattleLog.prototype.pushPopupAppointMessage = function(target) {
        if (this.hasPopupMessage()) {
            this.push('waitForPopup');
        }
        this.push('popupAppointMessage', target);
    };

    Window_BattleLog.prototype.hasPopupMessage = function() {
        return this._methods.some(function(method) {
            return method.name === 'popupMessage' || method.name === 'popupAppointMessage';
        });
    };

    Window_BattleLog.prototype.waitForPopup = function() {
        this._waitCount = paramMessageWait || 0;
    };

    //=============================================================================
    // Sprite_Battler
    //  ポップアップメッセージを作成します。
    //=============================================================================
    var _Sprite_Battler_updateDamagePopup      = Sprite_Battler.prototype.updateDamagePopup;
    Sprite_Battler.prototype.updateDamagePopup = function() {
        this.setupMessagePopup();
        _Sprite_Battler_updateDamagePopup.apply(this, arguments);
    };

    var _Sprite_Battler_pushDamageSprite = Sprite_Battler.prototype.pushDamageSprite;
    Sprite_Battler.prototype.pushDamageSprite = function(sprite) {
        var damage = this._damages;
        this._damages = this._damages.filter(function(sprite) {
            return !sprite.isMessage();
        });
        _Sprite_Battler_pushDamageSprite.apply(this, arguments);
        damage.push(sprite);
        this._damages = damage;
    };

    Sprite_Battler.prototype.setupMessagePopup = function() {
        if (this._battler.isMessagePopupRequested()) {
            if (this._battler.isSpriteVisible()) {
                var sprite = new Sprite_PopupMessage();
                sprite.x   = this.x + this.messageOffsetX();
                sprite.y   = this.y + this.messageOffsetY();
                sprite.setup(this._battler);
                if (!sprite.z) {
                    this.setZPositionOfPopup(sprite);
                }
                this._damages.push(sprite);
                this.parent.addChild(sprite);
            }
            this._battler.clearMessagePopup();
        }
    };

    Sprite_Battler.prototype.setZPositionOfPopup = function(sprite) {
        if (this.z > 0) sprite.z = this.z + 10;
        if (this._mainSprite && this._mainSprite.z > 0) sprite.z = this._mainSprite.z + 10;
    };

    Sprite_Battler.prototype.messageOffsetX = function() {
        return paramOffsetX;
    };

    Sprite_Battler.prototype.messageOffsetY = function() {
        return paramOffsetY;
    };

    //=============================================================================
    // Sprite_Damage
    //  回避メッセージが有効な場合のミス表示を抑制します。
    //=============================================================================
    var _Sprite_Damage_setup      = Sprite_Damage.prototype.setup;
    Sprite_Damage.prototype.setup = function(target) {
        // for YEP_BattleEngineCore.js
        var result = target.shiftDamagePopup ? target.shiftDamagePopup() : target.result();
        if ((!result.evaded || !paramAvoid) && (!result.missed || !paramMiss)) {
            if (target.shiftDamagePopup) {
                target._damagePopup.unshift(result);
            }
            _Sprite_Damage_setup.apply(this, arguments);
        }
        this.setupFlash(result, target);
    };

    Sprite_Damage.prototype.setupFlash = function(result, target) {
        if (!result.missed && !result.evaded && result.hpAffected) {
            var color = target instanceof Game_Actor ? paramActorDamageColor : paramEnemyDamageColor;
            if (color && color.length > 0) this.setupFlashEffect(color);
        }
    };

    Sprite_Damage.prototype.setupFlashEffect = function(flashColor, duration) {
        this._flashColor    = flashColor.clone();
        this._flashDuration = duration || paramFlashDuration;
    };

    Sprite_Damage.prototype.isMessage = function() {
        return false;
    };

    //=============================================================================
    // Sprite_PopupMessage
    //  ポップアップメッセージを表示するスプライトです。
    //=============================================================================
    function Sprite_PopupMessage() {
        this.initialize.apply(this, arguments);
    }

    Sprite_PopupMessage.prototype             = Object.create(Sprite_Damage.prototype);
    Sprite_PopupMessage.prototype.constructor = Sprite_PopupMessage;

    Sprite_PopupMessage.prototype.setup = function(target) {
        var text       = target.getMessagePopupText();
        var bitmap     = paramUsingPicture ? this.setupStaticText(text) : this.setupDynamicText(text);
        var sprite     = this.createChildSprite();
        sprite.bitmap  = bitmap;
        sprite.dy      = 0;
        var flashColor = target.getMessagePopupFlashColor();
        if (flashColor) {
            this.setupFlashEffect(flashColor);
        }
        // Resolve conflict for KMS_SomStyleDamage.js
        if (this.setupSomStyleDamageParameter) {
            this.setupSomStyleDamageParameter();
        }
    };

    Sprite_PopupMessage.prototype.setupDynamicText = function(text) {
        var bitmap      = new Bitmap(paramMaxWidth, paramFontSize + 8);
        bitmap.fontSize = paramFontSize;
        if (paramUsingItalic) {
            bitmap.fontItalic = true;
        }
        if (paramUsingOutline) {
            bitmap.outlineWidth = Math.floor(bitmap.fontSize / 6);
            bitmap.outlineColor = 'gray';
        }
        bitmap.drawText(text, 0, 0, bitmap.width, bitmap.height, 'center');
        return bitmap;
    };

    Sprite_PopupMessage.prototype.setupStaticText = function(textPicture) {
        return ImageManager.loadPicture(textPicture, 0);
    };

    Sprite_PopupMessage.prototype.isMessage = function() {
        return true;
    };
})();


code:
//=============================================================================
// BattleLogToMessage.js
// ----------------------------------------------------------------------------
// (C) 2016 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.11.0 2022/05/10 スキル名の簡易表示が有効なときスキルにアイコンを表示するよう仕様変更
// 1.10.2 2021/03/09 戦闘から逃走、敗北した際はログウィンドウが消えるよう修正
// 1.10.1 2020/06/04 1.9.1の修正により、ステータスウィンドウを下部に配置するとメッセージの上に表示されてしまう問題を修正
// 1.10.0 2020/05/30 バトルログウィンドウのフォントサイズを変更できる機能を追加
// 1.9.2 2020/04/30 1.9.1の修正が不完全だったので再度修正
// 1.9.1 2020/04/29 GraphicalDesignMode.jsと併用したときバトルログウィンドウの位置変更が反映されない問題を修正
// 1.9.0 2019/06/09 表示メッセージが行数の上限を上回った場合に表示がカットされないよう変更
// 1.8.0 2019/04/14 もともとメッセージウィンドウで表示していたものはそのまま表示する設定を追加
// 1.7.0 2018/05/30 スキル名、アイテム名を簡易表示する機能を追加
// 1.6.1 2018/05/05 YEP_MessageCore.jsが有効な場合、メッセージウィンドウの行数はYEP_MessageCore.jsを優先するよう修正
// 1.6.0 2018/03/25 バトルログに表示する内容が空の時、ウィンドウを非表示にできる機能を追加
// 1.5.0 2018/03/25 バトルログの行数を変更できる機能を追加。表示するメッセージが空の場合はメッセージ表示をしないよう変更
// 1.4.1 2018/02/10 戦闘終了のメッセージ表示後にログウィンドウが一瞬だけ残ってしまう現象を修正
// 1.4.0 2018/02/10 メッセージウィンドウを画面上部に固定できる機能を追加
// 1.3.0 2016/10/25 バトルイベント実行中などでログウィンドウを閉じることのできる機能を追加
// 1.2.0 2016/10/18 メッセージスピードの調整機能と、行動終了後に追加ウェイトする機能を追加
// 1.1.0 2016/10/14 ダメージのポップアップを抑制する機能を追加
// 1.0.0 2016/10/12 初版
// ----------------------------------------------------------------------------
// [Blog]   : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================

/*:
 * @plugindesc BattleLogToMessagePlugin
 * @author triacontane
 *
 * @param StatusPosUpper
 * @desc コマンドやステータスのウィンドウを画面上部に配置して、メッセージによって隠れないようにします。
 * @default true
 * @type boolean
 *
 * @param SuppressPopup
 * @desc ダメージのポップアップを非表示にします。
 * @default false
 * @type boolean
 *
 * @param MessagePosUpper
 * @desc メッセージウィンドウ全体を上部に表示します。その場合、ステータス上部配置は無効にしてください。
 * @default false
 * @type boolean
 *
 * @param MessageSpeed
 * @desc メッセージスピードを指定した番号の変数から取得するよう変更します。変数値(0:ウェイトなし 1:通常 2以上:遅くなる)
 * @default 0
 * @type number
 *
 * @param WaitForEndAction
 * @desc 行動終了後、メッセージをクリアする前に指定したフレーム数だけウェイトを掛けます。
 * @default 0
 * @type number
 *
 * @param FontSize
 * @desc ログウィンドウのフォントサイズです。
 * @default 28
 * @type number
 *
 * @param MessageLines
 * @desc ウィンドウの行数です。行数を減らすとダメージ表示等のメッセージが表示されなくなる場合があります。
 * @default 4
 * @type number
 *
 * @param HiddenIfEmpty
 * @desc ウィンドウに表示する内容がないとき、ウィンドウが非表示になります。
 * @default false
 * @type boolean
 *
 * @param SkillViewSimplified
 * @desc スキルおよびアイテムの表示を名称のみの中央表示に切り替えます。
 * @default false
 * @type boolean
 *
 * @param MessageWindowNoApply
 * @desc もともとメッセージウィンドウに表示していたものはプラグインの影響を受けなくなります。
 * @default false
 * @type boolean
 *
 * @help バトルログを画面下部のメッセージウィンドウ内に表示するよう変更します。
 *
 * このプラグインにはプラグインコマンドはありません。
 *
 * This plugin is released under the MIT License.
 */
/*:ja
 * @plugindesc バトルログのメッセージ表示プラグイン
 * @author トリアコンタン
 *
 * @param ステータス上部配置
 * @desc コマンドやステータスのウィンドウを画面上部に配置して、メッセージによって隠れないようにします。
 * @default true
 * @type boolean
 *
 * @param ポップアップ抑制
 * @desc ダメージのポップアップを非表示にします。
 * @default false
 * @type boolean
 *
 * @param メッセージ上部配置
 * @desc メッセージウィンドウ全体を上部に表示します。その場合、ステータス上部配置は無効にしてください。
 * @default false
 * @type boolean
 *
 * @param メッセージ速度変数
 * @desc メッセージスピードを指定した番号の変数から取得するよう変更します。変数の値がフレーム値になります。
 * @default 0
 * @type number
 *
 * @param 行動終了後ウェイト
 * @desc 行動終了後、メッセージをクリアする前に指定したフレーム数だけウェイトを掛けます。
 * @default 0
 * @type number
 *
 * @param フォントサイズ
 * @desc ログウィンドウのフォントサイズです。
 * @default 28
 * @type number
 *
 * @param メッセージ行数
 * @desc ウィンドウの行数です。行数を減らすとダメージ表示等のメッセージが表示されなくなる場合があります。
 * @default 4
 * @type number
 *
 * @param 空の場合に非表示
 * @desc ウィンドウに表示する内容がないとき、ウィンドウが非表示になります。
 * @default false
 * @type boolean
 *
 * @param スキル名簡易表示
 * @desc スキルおよびアイテムの表示を名称のみの中央表示に切り替えます。
 * @default false
 * @type boolean
 *
 * @param メッセージウィンドウ非適用
 * @desc もともとメッセージウィンドウに表示していたものはプラグインの影響を受けなくなります。
 * @default false
 * @type boolean
 *
 * @help バトルログを画面下部のメッセージウィンドウ内に表示するよう変更します。
 *
 * プラグインコマンド詳細
 *  イベントコマンド「プラグインコマンド」から実行。
 *  （パラメータの間は半角スペースで区切る）
 *
 *  BLM_バトルログ閉じる
 *  BLM_BATTLE_LOG_CLOSE
 *
 *  バトルログのウィンドウを閉じます。バトルイベントから実行します。
 *
 *  BLM_バトルログ開く
 *  BLM_BATTLE_LOG_OPEN
 *
 *  バトルログのウィンドウを再度開きます。バトルイベントから実行します。
 *
 * 利用規約：
 *  作者に無断で改変、再配布が可能で、利用形態（商用、18禁利用等）
 *  についても制限はありません。
 *  このプラグインはもうあなたのものです。
 */

(function() {
    'use strict';
    var pluginName    = 'BattleLogToMessage';
    var metaTagPrefix = 'BLM';

    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 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' || (value || '').toUpperCase() === 'TRUE';
    };

    //=============================================================================
    // パラメータの取得と整形
    //=============================================================================
    var paramStatusPosUpper       = getParamBoolean(['StatusPosUpper', 'ステータス上部配置']);
    var paramSuppressPopup        = getParamBoolean(['SuppressPopup', 'ポップアップ抑制']);
    var paramMessagePosUpper      = getParamBoolean(['MessagePosUpper', 'メッセージ上部配置']);
    var paramMessageSpeed         = getParamNumber(['MessageSpeed', 'メッセージ速度変数'], 0);
    var paramWaitForEndAction     = getParamNumber(['WaitForEndAction', '行動終了後ウェイト'], 0);
    var paramMessageLines         = getParamNumber(['MessageLines', 'メッセージ行数'], 0);
    var paramHiddenIfEmpty        = getParamBoolean(['HiddenIfEmpty', '空の場合に非表示']);
    var paramSkillViewSimplified  = getParamBoolean(['SkillViewSimplified', 'スキル名簡易表示']);
    var paramMessageWindowNoApply = getParamBoolean(['MessageWindowNoApply', 'メッセージウィンドウ非適用']);
    var paramFontSize             = getParamNumber(['FontSize', 'フォントサイズ']);

    var _Game_Interpreter_pluginCommand      = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function(command, args) {
        _Game_Interpreter_pluginCommand.apply(this, arguments);
        var commandPrefix = new RegExp('^' + metaTagPrefix);
        if (!command.match(commandPrefix)) return;
        this.pluginCommandBattleLogToMessage(command.replace(commandPrefix, ''), args);
    };

    Game_Interpreter.prototype.pluginCommandBattleLogToMessage = function(command) {
        switch (getCommandName(command)) {
            case '_BATTLE_LOG_OPEN' :
            case '_バトルログ開く' :
                BattleManager.setBattleLogClose(false);
                break;
            case '_BATTLE_LOG_CLOSE' :
            case '_バトルログ閉じる' :
                BattleManager.setBattleLogClose(true);
                break;
        }
    };

    //=============================================================================
    // BattleManager
    //  ウィンドウの開閉状態を管理します。
    //=============================================================================
    var _BattleManager_initMembers = BattleManager.initMembers;
    BattleManager.initMembers      = function() {
        _BattleManager_initMembers.apply(this, arguments);
        this._battleLogClose = false;
    };

    BattleManager.setBattleLogClose = function(value) {
        this._battleLogClose = value;
    };

    BattleManager.isBattleLogClose = function() {
        return this._battleLogClose;
    };

    var _BattleManager_displayRewards = BattleManager.displayRewards;
    BattleManager.displayRewards      = function() {
        this._logWindow.hide();
        _BattleManager_displayRewards.apply(this, arguments);
    };

    var _BattleManager_endBattle = BattleManager.endBattle;
    BattleManager.endBattle = function(result) {
        _BattleManager_endBattle.apply(this, arguments);
        this._logWindow.hide();
    };

    SceneManager.isBattleScene = function() {
        return this._scene instanceof Scene_Battle;
    };

    BattleManager.isStarting = function() {
        return this._phase === 'start';
    };

    //=============================================================================
    // Scene_Battle
    //  ウィンドウのレイアウトを変更します。
    //=============================================================================
    var _Scene_Battle_createAllWindows      = Scene_Battle.prototype.createAllWindows;
    Scene_Battle.prototype.createAllWindows = function() {
        _Scene_Battle_createAllWindows.apply(this, arguments);
        // GraphicalDesignMode.jsと競合するので無効化
        if (!this._logWindow.loadProperty) {
            this._windowLayer.removeChild(this._logWindow);
            this._windowLayer.addChildAt(this._logWindow, this._windowLayer.getChildIndex(this._messageWindow) - 1);
        }
        if (paramStatusPosUpper) {
            this.adjustWindowPositions();
        }
        if (paramMessagePosUpper) {
            this.adjustWindowMessagePositions();
        }
    };

    Scene_Battle.prototype.adjustWindowPositions = function() {
        this._partyCommandWindow.y = 0;
        this._actorCommandWindow.y = 0;
        this._statusWindow.y       = 0;
        this._helpWindow.y         = this._partyCommandWindow.height;
        this._actorWindow.y        = 0;
        this._enemyWindow.y        = 0;
        this._skillWindow.y        = this._helpWindow.y + this._helpWindow.height;
        this._itemWindow.y         = this._skillWindow.y;
    };

    Scene_Battle.prototype.adjustWindowMessagePositions = function() {
        this._messageWindow.y = 0;
        this._logWindow.y     = 0;
    };

    var _Scene_Battle_updateWindowPositions      = Scene_Battle.prototype.updateWindowPositions;
    Scene_Battle.prototype.updateWindowPositions = function() {
        if (BattleManager.isInputting() || BattleManager.isBattleLogClose() || BattleManager.isStarting()) {
            this._logWindow.close();
        } else {
            this._logWindow.open();
        }
        _Scene_Battle_updateWindowPositions.apply(this, arguments);
    };

    //=============================================================================
    // Window_BattleLog
    //  ウィンドウのレイアウトを変更します。
    //=============================================================================
    var _Window_BattleLog_initialize      = Window_BattleLog.prototype.initialize;
    Window_BattleLog.prototype.initialize = function() {
        _Window_BattleLog_initialize.apply(this, arguments);
        this.y        = Graphics.boxHeight - this.windowHeight();
        this.opacity  = 255;
        this.openness = 0;
    };

    Window_BattleLog.prototype.maxLines = function() {
        return paramMessageLines || 4;
    };

    var _Window_BattleLog_update      = Window_BattleLog.prototype.update;
    Window_BattleLog.prototype.update = function() {
        Window_Base.prototype.update.apply(this, arguments);
        _Window_BattleLog_update.apply(this, arguments);
    };

    var _Window_BattleLog_refresh      = Window_BattleLog.prototype.refresh;
    Window_BattleLog.prototype.refresh = function() {
        _Window_BattleLog_refresh.apply(this, arguments);
        if (!paramHiddenIfEmpty) {
            return;
        }
        if (this._lines.length <= 0) {
            this.hide();
        } else {
            this.show();
        }
    };

    var _Window_BattleLog_messageSpeed      = Window_BattleLog.prototype.messageSpeed;
    Window_BattleLog.prototype.messageSpeed = function() {
        return (paramMessageSpeed ? $gameVariables.value(paramMessageSpeed) :
            _Window_BattleLog_messageSpeed.apply(this, arguments));
    };

    Window_BattleLog.prototype.waitForCustom = function(waitCount) {
        this._waitCount = waitCount;
    };

    var _Window_BattleLog_endAction      = Window_BattleLog.prototype.endAction;
    Window_BattleLog.prototype.endAction = function(subject) {
        if (paramWaitForEndAction) {
            this.push('waitForCustom', paramWaitForEndAction);
        }
        _Window_BattleLog_endAction.apply(this, arguments);
    };

    var _Window_BattleLog_standardFontSize = Window_BattleLog.prototype.standardFontSize;
    Window_BattleLog.prototype.standardFontSize = function() {
        return paramFontSize || _Window_BattleLog_standardFontSize.apply(this, arguments);
    };

    var _Window_BattleLog_addText      = Window_BattleLog.prototype.addText;
    Window_BattleLog.prototype.addText = function(text) {
        if (!text) {
            return;
        }
        if (this._lines.length >= this.maxLines()) {
            this._waitCount = 0;
            this.push('clear');
            this.push('addText', text);
            return;
        }
        _Window_BattleLog_addText.apply(this, arguments);
    };

    Window_BattleLog.prototype.drawBackground = function() {};

    if (paramSkillViewSimplified) {
        Window_BattleLog.prototype.displayAction = function(subject, item) {
            var text = '\\i[' + item.iconIndex + ']' + item.name;
            this.push('addText', text);
            this._displayCenterText = text;
        };

        var _Window_BattleLog_drawLineText      = Window_BattleLog.prototype.drawLineText;
        Window_BattleLog.prototype.drawLineText = function(index) {
            if (this._displayCenterText === this._lines[index]) {
                var rect      = this.itemRectForText(index);
                var realWidth = this.drawTextEx(this._lines[index], rect.x, -rect.height, rect.width);
                rect.x += (rect.width / 2 - realWidth / 2);
                this.contents.clearRect(rect.x, rect.y, rect.width, rect.height);
                this.drawTextEx(this._lines[index], rect.x, rect.y, rect.width);
            } else {
                _Window_BattleLog_drawLineText.apply(this, arguments);
            }
        };

        var _Window_BattleLog_endAction2     = Window_BattleLog.prototype.endAction;
        Window_BattleLog.prototype.endAction = function(subject) {
            this._displayCenterText = null;
            _Window_BattleLog_endAction2.apply(this, arguments);
        };
    }

    //=============================================================================
    // Window_Message
    //  戦闘中はメッセージウィンドウを上部に固定します。
    //=============================================================================
    if (!paramMessageWindowNoApply) {
        var _Window_Message_updatePlacement      = Window_Message.prototype.updatePlacement;
        Window_Message.prototype.updatePlacement = function() {
            _Window_Message_updatePlacement.apply(this, arguments);
            if ($gameParty.inBattle() && paramMessagePosUpper) {
                this.y = 0;
            }
        };

        var _Window_Message_numVisibleRows      = Window_Message.prototype.numVisibleRows;
        Window_Message.prototype.numVisibleRows = function() {
            if (SceneManager.isBattleScene() && paramMessageLines > 0 && !$gameSystem.messageRows) {
                return paramMessageLines;
            } else {
                return _Window_Message_numVisibleRows.apply(this, arguments);
            }
        };
    }

    //=============================================================================
    // Game_Battler
    //  ダメージポップアップを抑制します。
    //=============================================================================
    var _Game_Battler_startDamagePopup      = Game_Battler.prototype.startDamagePopup;
    Game_Battler.prototype.startDamagePopup = function() {
        if (!paramSuppressPopup) _Game_Battler_startDamagePopup.apply(this, arguments);
    };

    var _Game_Message_add      = Game_Message.prototype.add;
    Game_Message.prototype.add = function(text) {
        if (!text && $gameParty.inBattle()) {
            return;
        }
        _Game_Message_add.apply(this, arguments);
    };
})();