code:
//
//  バトルポップアップ ver1.00
//
// author yana
//

var Imported = Imported || {};
Imported['BattlePopups'] = 1.00;
/*:
 * @plugindesc ver1.00/戦闘時、いろいろな情報をポップアップさせます。
 * @author Yana
 *
 * @param 【基本設定】
 *
 * @param HideBattleLog
 * @desc バトルログを隠す設定です。trueにするとバトルログが消えます。
 * @default
 *
 * @param PopupSize
 * @desc ポップアップするテキストのサイズです。
 * @default 18
 *
 * @param PopupDelay
 * @desc 連続ポップアップ時のディレイです。
 * @default 8
 *
 * @param PopupPattern
 * @desc ポップアップの表示パターンです。
 * @default GrowUp
 *
 * @param ShowCount
 * @desc ポップアップの表示時間です。
 * @default 60
 *
 * @param SuccessionOffsetY
 * @desc ポップアップが連続したとき、ずれるＹ座標の補正値です。
 * @default 4
 *
 * @param ShowAnchorX
 * @desc バトラーに対するポップアップのアンカー位置Xです。
 * @default 0.5
 *
 * @param ShowAnchorY
 * @desc バトラーに対するポップアップのアンカー位置Yです。
 * @default 0
 *
 * @param ShowOffsetX
 * @desc バトラーに対するポップアップの補正X値です。
 * @default 0
 *
 * @param ShowOffsetY
 * @desc バトラーに対するポップアップの補正Y値です。
 * @default 0
 *
 * @param
 * @param 【行動の表示設定】
 *
 * @param PopupActionItem
 * @desc スキルやアイテム使用時にポップアップする名前の設定です。
 * _name:名前 _icon:アイコン 空欄で無効化できます。
 * @default _icon_name
 *
 * @param AttackUseWeaponName
 * @desc アクターがスキル1番で攻撃した際、スキル名ではなく武器名を表示する設定です。trueで有効になります。
 * @default true
 *
 * @param PopupDamageActionItem
 * @desc ダメージスキル等の使用時ポップアップの背景の接尾句です。
 * 背景画像名の最後にこの接尾句を追加した画像が読み込まれます。
 * @default R
 *
 * @param PopupRecoverActionItem
 * @desc 回復スキル等の使用時のポップアップの背景の接尾句です。
 * 背景画像名の最後にこの接尾句を追加した画像が読み込まれます。
 * @default G
 *
 * @param PopupOtherActionItem
 * @desc 上2つ以外の使用時ポップアップの背景の接尾句です。
 * 背景画像名の最後にこの接尾句を追加した画像が読み込まれます。
 * @default
 *
 * @param PopupState
 * @desc ステートにかかった時にポップアップするテキストです。
 * _name:ステート名 _icon:アイコン 空欄で無効化できます。
 * @default _icon_name
 *
 * @param PopupRemoveState
 * @desc ステートが解除された時にポップアップするテキストです。
 * _name:ステート名 _icon:アイコン 空欄で無効化できます。
 * @default \\C[24]_icon_name
 *
 * @param
 * @param 【背景の設定】
 *
 * @param PopupPatternBack
 * @desc 背景ポップアップの表示パターンです。
 * @default GrowUp
 *
 * @param PopupBackPicture
 * @desc 通常ポップアップの背景に使用する画像名です。
 * img/pictures/フォルダに用意してください。
 * @default
 * @require 1
 * @dir img/pictures/
 * @type file
 *
 * @param BigPopupSize
 * @desc 戦闘開始時や勝利時などの大写しポップアップの文字サイズです。
 * @default 72
 *
 * @param BigPopupCount
 * @desc 戦闘開始時や勝利時などの大写しポップアップの表示時間です。
 * @default 90
 *
 * @param BigPopupPattern
 * @desc 戦闘開始時や勝利時などの大写しポップアップの表示パターンです。
 * @default Stretch
 *
 * @param BigPopupBackPicture
 * @desc 戦闘開始時や勝利時などの大写しポップアップの背景に表示する画像名です。
 * @default
 *
 * @param
 * @param 【会敵時等の設定】
 *
 * @param EmergePopup
 * @desc 戦闘開始時に不意打ちや先制攻撃が発生しなかった時に表示するポップアップのテキストです。
 * @default ＥＮＧＡＧＥ！
 *
 * @param SurprisePopup
 * @desc 戦闘開始時に不意打ちが発生した時に表示するポップアップのテキストです。
 * @default ＳＵＲＰＲＩＳＥ！
 *
 * @param PreemptivePopup
 * @desc 戦闘開始時に先制攻撃が発生した時に表示するポップアップのテキストです。
 * @default ＰＲＥＥＭＰＴＩＶＥ！
 *
 * @param EscapePopup
 * @desc 戦闘から逃げ出した時に表示するポップアップのテキストです。
 * @default ＥＳＣＡＰＥ！
 *
 * @param VictoryPopup
 * @desc 戦闘に勝利した時に表示するポップアップのテキストです。
 * @default ＶＩＣＴＯＲＹ！
 *
 * @param DefeatedPopup
 * @desc 戦闘に敗北した時に表示するポップアップのテキストです。
 * @default ＤＥＦＥＡＴＥＤ！
 *
 * @param
 * @param 【回避などの設定】
 *
 * @param CriticalPopupA
 * @desc アクターのクリティカル時にポップアップするテキストです。
 * @default \C[2]クリティカル！
 *
 * @param CriticalPopupE
 * @desc エネミーのクリティカル時にポップアップするテキストです。
 * @default \C[10]クリティカル！
 *
 * @param EffectivePopup
 * @desc 攻撃が弱点の時にポップアップするテキストです。
 * @default \C[6]弱点！
 *
 * @param NotEffectivePopup
 * @desc 攻撃に耐性を持つ時にポップアップするテキストです。
 * @default \C[5]レジスト！
 *
 * @param EvasionPopupP
 * @desc 物理攻撃を回避した時にポップアップするテキストです。
 * @default 回避！
 *
 * @param EvasionPopupM
 * @desc 魔法攻撃を回避した時にポップアップするテキストです。
 * @default 魔法回避！
 *
 * @param CounterPopup
 * @desc 反撃が発動した時にポップアップするテキストです。
 * @default 反撃！
 *
 * @param ReflectionPopup
 * @desc 反射が発動した時にポップアップするテキストです。
 * @default 反射！
 *
 * @param SubstitutePopup
 * @desc 身替りが発動した時にポップアップするテキストです。
 * @default 身代わり！
 *
 * @param
 * @param 【強化の設定】
 *
 * @param BuffPopupHp
 * @desc HPアップの強化が付与された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default \I[32]_paramアップ
 *
 * @param BuffPopupMp
 * @desc MPアップの強化が付与された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default \I[33]_paramアップ
 *
 * @param BuffPopupAtk
 * @desc 攻撃力アップの強化が付与された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default \I[34]_paramアップ
 *
 * @param BuffPopupDef
 * @desc 防御力アップの強化が付与された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default \I[35]_paramアップ
 *
 * @param BuffPopupMat
 * @desc 魔法力アップの強化が付与された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default \I[36]_paramアップ
 *
 * @param BuffPopupMdf
 * @desc 魔法防御力アップの強化が付与された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default \I[37]_paramアップ
 *
 * @param BuffPopupAgi
 * @desc 敏捷性アップの強化が付与された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default \I[38]_paramアップ
 *
 * @param BuffPopupLuk
 * @desc 運アップの強化が付与された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default \I[39]_paramアップ
 *
 * @param
 * @param 【弱体の設定】
 *
 * @param DebuffPopupHp
 * @desc HPダウンの弱体が付与された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default \I[48]_paramダウン
 *
 * @param DebuffPopupMp
 * @desc MPダウンの弱体が付与された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default \I[49]_paramダウン
 *
 * @param DebuffPopupAtk
 * @desc 攻撃力ダウンの弱体が付与された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default \I[50]_paramダウン
 *
 * @param DebuffPopupDef
 * @desc 防御力ダウンの弱体が付与された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default \I[51]_paramダウン
 *
 * @param DebuffPopupMat
 * @desc 魔法力ダウンの弱体が付与された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default \I[52]_paramダウン
 *
 * @param DebuffPopupMdf
 * @desc 魔法防御力ダウンの弱体が付与された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default \I[53]_paramダウン
 *
 * @param DebuffPopupAgi
 * @desc 敏捷性ダウンの弱体が付与された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default \I[54]_paramダウン
 *
 * @param DebuffPopupLuk
 * @desc 運ダウンの弱体が付与された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default \I[55]_paramダウン
 *
 * @param
 * @param 【強化解除時の設定】
 *
 * @param BuffRemovePopupHp
 * @desc HPの強化が解除された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default _param強化解除
 *
 * @param BuffRemovePopupMp
 * @desc MPの強化が解除された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default _param強化解除
 *
 * @param BuffRemovePopupAtk
 * @desc 攻撃力の強化が解除された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default _param強化解除
 *
 * @param BuffRemovePopupDef
 * @desc 防御力の強化が解除された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default _param強化解除
 *
 * @param BuffRemovePopupMat
 * @desc 魔法力の強化が解除された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default _param強化解除
 *
 * @param BuffRemovePopupMdf
 * @desc 魔法防御力の強化が解除された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default _param強化解除
 *
 * @param BuffRemovePopupAgi
 * @desc 敏捷性の強化が解除された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default _param強化解除
 *
 * @param BuffRemovePopupLuk
 * @desc 運の強化が解除された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default _param強化解除
 *
 * @param
 * @param 【弱体解除時の設定】
 *
 * @param DebuffRemovePopupHp
 * @desc HPの弱体が解除された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default _param弱体解除
 *
 * @param DebuffRemovePopupMp
 * @desc MPの弱体が解除された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default _param弱体解除
 *
 * @param DebuffRemovePopupAtk
 * @desc 攻撃力の弱体が解除された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default _param弱体解除
 *
 * @param DebuffRemovePopupDef
 * @desc 防御力の弱体が解除された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default _param弱体解除
 *
 * @param DebuffRemovePopupMat
 * @desc 魔法力の弱体が解除された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default _param弱体解除
 *
 * @param DebuffRemovePopupMdf
 * @desc 魔法防御力の弱体が解除された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default _param弱体解除
 *
 * @param DebuffRemovePopupAgi
 * @desc 敏捷性の弱体が解除された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default _param弱体解除
 *
 * @param DebuffRemovePopupLuk
 * @desc 運の弱体が解除された時にポップアップするテキストです。
 * _paramをパラメータ名に置き換えます。
 * @default _param弱体解除
 *
 * @help ------------------------------------------------------
 * プラグインコマンド
 * ------------------------------------------------------
 * ************************************************
 * BattlePopup pos ～
 * バトルポップアップ 位置 ～
 * ************************************************
 * バトルポップアップを指定した位置に呼び出します。
 *
 * 位置の設定は、マップシーンであれば、
 * -1:プレイヤー、0:呼び出したイベント、1以上:対応するIDのイベント
 * に設定されます。
 *
 * バトルシーンであれば、
 * 0～999:対応するメンバーインデックスのアクター
 * 1000～:-1000をして、対応するメンバーインデックスのエネミー
 * となります。
 *
 * また、x,yと記述することで、直接ポップアップ位置を指定することも可能です。
 * この際のx,yは、ポップアップの中心下端(x=0.5,y=1.0)となります。
 *
 * ～には以下のパラメータを,で区切って、任意で指定します。
 * textは必須です。必ず指定してください。
 *
 * text:表示したいテキスト
 * pattern:表示パターン Normalでフェード、GrowUpで縦ストレッチ、Stretchで横ストレッチ
 * size:文字サイズ
 * back:背景の画像名 背景画像はimg/pictures/に用意してください
 * count:表示時間
 *
 * ************************************************
 * BattlePopup SetText type ～
 * バトルポップアップ テキスト設定 種類 ～
 * ************************************************
 * 指定した種類(エンカウントや勝利時など)のポップアップするテキストを変更します。
 *
 * typeまたは種類のところには以下のいずれかを指定してください。
 * Emerge
 * エンカウント
 * Surprise
 * 不意打ち
 * Preemptive
 * 先制
 * Victory
 * 勝利
 * Escape
 * 逃亡
 * Defeated
 * 敗北
 *
 * ～の部分には、BattlePopup 位置 ～と同じ設定が可能です。
 * textは必ず指定してください。
 *
 * ------------------------------------------------------
 * 使用方法
 * ------------------------------------------------------
 * スキルやアイテムのメモ欄に、
 * <使用ポップアップ:xxx>
 * または、
 * <UsePopup:xxx>
 * と記述すると、スキルやアイテムを使用した際にxxxをポップアップで表示します。
 * この際、xxxに記述されたテキストのうち、_iconはそのスキルやアイテムのアイコンに、
 * _nameはそのスキルやアイテムの名前に変換されます。
 * また、xxxの後に,で区切ってパラメータを指定することが可能です。
 * 指定可能なパラメータはプラグインコマンドと同じです。
 * 例:表示パターンをStretch、背景画像をMiniWindowRに設定して、アイコン付きで名前をポップアップ
 * <使用ポップアップ:_icon_name,pattern:Stretch,back:MiniWindowR>
 *
 * ************************************************
 * ステートのメモ欄に
 * <付与ポップアップ:xxx>
 * または、
 * <AddPopup:xxx>
 * と記述すると、ステートが付与された際にxxxをポップアップで表示します。
 * この際、上記の使用ポップアップと同じように名前の変換やパラメータの設定が可能です。
 *
 * ************************************************
 * ステートのメモ欄に
 * <解除ポップアップ:xxx>
 * または、
 * <RemovePopup:xxx>
 * と記述すると、ステートが解除された際にxxxをポップアップで表示します。
 * それ以外は同上です。
 *
 * ************************************************
 * ステートのメモ欄に
 * <継続ポップアップ:xxx>
 * または、
 * <ContinuationPopup:xxx>
 * と記述すると、継続メッセージが表示されるタイミングでxxxをポップアップで表示します。
 * それ以外は同上です。
 *
 * ************************************************
 * バトルポップアップでは、\V、\G、\N、\P、\C、\I加え、専用の制御文字、\SGが使用可能です。
 * \SG[xxx] 文字の代わりにimg/pictures/フォルダ内のxxxの画像を表示します。
 *
 * ------------------------------------------------------
 * 利用規約
 * ------------------------------------------------------
 * 使用に制限はありません。商用、アダルト、いずれにも使用できます。
 * 二次配布も制限はしませんが、サポートは行いません。
 * 著作表示は任意です。行わなくても利用できます。
 * 要するに、特に規約はありません。
 * バグ報告や使用方法等のお問合せはネ実ツクールスレ、または、Twitterにお願いします。
 * https://twitter.com/yanatsuki_
 * 素材利用は自己責任でお願いします。
 * ------------------------------------------------------
 * 更新履歴:
 * ver1.00:
 * 公開
 */

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

    var parameters = PluginManager.parameters('BattlePopups');
    var hideBattleLog = parameters['HideBattleLog'] === 'true';
    var showAnchorX = Number(parameters['ShowAnchorX']);
    var showAnchorY = Number(parameters['ShowAnchorY']);
    var showOffsetX = Number(parameters['ShowOffsetX']);
    var showOffsetY = Number(parameters['ShowOffsetY']);
    var popupActionItem = parameters['PopupActionItem'] || '';
    var popupDamageActionItem = parameters['PopupDamageActionItem'] || '';
    var popupRecoverActionItem = parameters['PopupRecoverActionItem'] || '';
    var popupOtherActionItem = parameters['PopupOtherActionItem'] || '';
    var popupState = parameters['PopupState'] || '';
    var popupRemoveState = parameters['PopupRemoveState'] || '';
    var popupSize = Number(parameters['PopupSize']) || 18;
    var popupDelay = Number(parameters['PopupDelay']) || 0;
    var popupPattern = parameters['PopupPattern'] || 0;
    var popupPatternBack = parameters['PopupPatternBack'] || 0;
    var popupBackPicture = parameters['PopupBackPicture'] || 0;
    var showCount = Number(parameters['ShowCount']) || 60;
    var successionOffsetY = Number(parameters['SuccessionOffsetY']) || 0;
    var bigPopupSize = Number(parameters['BigPopupSize']);
    var bigPopupCount = Number(parameters['BigPopupCount']) || 60;
    var bigPopupPattern = parameters['BigPopupPattern'] || 0;
    var bigPopupBackPicture = parameters['BigPopupBackPicture'];
    var emergePopup = parameters['EmergePopup'];
    var surprisePopup = parameters['SurprisePopup'];
    var preemptivePopup = parameters['PreemptivePopup'];
    var escapePopup = parameters['EscapePopup'];
    var victoryPopup = parameters['VictoryPopup'];
    var defeatedPopup = parameters['DefeatedPopup'];
    var criticalPopupA = parameters['CriticalPopupA'];
    var criticalPopupE = parameters['CriticalPopupE'];
    var effectivePopup = parameters['EffectivePopup'];
    var notEffectivePopup = parameters['NotEffectivePopup'];
    var evasionPopupP = parameters['EvasionPopupP'];
    var evasionPopupM = parameters['EvasionPopupM'];
    var counterPopup = parameters['CounterPopup'];
    var reflectionPopup = parameters['ReflectionPopup'];
    var substitutePopup = parameters['SubstitutePopup'];
    var attackUseWeaponName = parameters['AttackUseWeaponName'] === 'true';
    var buffPopups = [parameters['BuffPopupHp'],parameters['BuffPopupMp'],
                      parameters['BuffPopupAtk'],parameters['BuffPopupDef'],
                      parameters['BuffPopupMat'],parameters['BuffPopupMdf'],
                      parameters['BuffPopupAgi'],parameters['BuffPopupLuk']];
    var debuffPopups = [parameters['DebuffPopupHp'],parameters['DebuffPopupMp'],
                        parameters['DebuffPopupAtk'],parameters['DebuffPopupDef'],
                        parameters['DebuffPopupMat'],parameters['DebuffPopupMdf'],
                        parameters['DebuffPopupAgi'],parameters['DebuffPopupLuk']];
    var buffRemovePopups = [parameters['BuffRemovePopupHp'],parameters['BuffRemovePopupMp'],
                            parameters['BuffRemovePopupAtk'],parameters['BuffRemovePopupDef'],
                            parameters['BuffRemovePopupMat'],parameters['BuffRemovePopupMdf'],
                            parameters['BuffRemovePopupAgi'],parameters['BuffRemovePopupLuk']];
    var debuffRemovePopups = [parameters['DebuffRemovePopupHp'],parameters['DebuffRemovePopupMp'],
                              parameters['DebuffRemovePopupAtk'],parameters['DebuffRemovePopupDef'],
                              parameters['DebuffRemovePopupMat'],parameters['DebuffRemovePopupMdf'],
                              parameters['DebuffRemovePopupAgi'],parameters['DebuffRemovePopupLuk']];

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

    var __BManager_startBattle = BattleManager.startBattle;
    BattleManager.startBattle = function() {
        __BManager_startBattle.call(this);
        if (this._preemptive) {
            this._logWindow.showBattlePopup(null,$gameSystem.preemptivePopup(),{size:bigPopupSize});
        } else if (this._surprise) {
            this._logWindow.showBattlePopup(null,$gameSystem.surprisePopup(),{size:bigPopupSize});
        } else {
            this._logWindow.showBattlePopup(null,$gameSystem.emergePopup(),{size:bigPopupSize});
        }
    };

    var __BManager_processVictory = BattleManager.processVictory;
    BattleManager.processVictory = function() {
        this._logWindow.showBattlePopup(null,$gameSystem.victoryPopup(),{size:bigPopupSize});
        __BManager_processVictory.call(this);
    };

    var __BManager_processEscape = BattleManager.processEscape;
    BattleManager.processEscape = function() {
        var success = __BManager_processEscape.call(this);
        if(success) this._logWindow.showBattlePopup(null,$gameSystem.escapePopup(),{size:bigPopupSize});
        return success;
    };

    var __BManager_processDefeat = BattleManager.processDefeat;
    BattleManager.processDefeat = function() {
        this._logWindow.showBattlePopup(null,$gameSystem.defeatedPopup(),{size:bigPopupSize});
        __BManager_processDefeat.call(this);
    };
    ////////////////////////////////////////////////////////////////////////////////////

    Game_System.prototype.preemptivePopup = function() {
        if (this._preemptivePopup === undefined) this._preemptivePopup = preemptivePopup;
        return this._preemptivePopup;
    }

    Game_System.prototype.surprisePopup = function() {
        if (this._surprisePopup === undefined) this._surprisePopup = surprisePopup;
        return this._surprisePopup;
    }

    Game_System.prototype.emergePopup = function() {
        if (this._emergePopup === undefined) this._emergePopup = emergePopup;
        return this._emergePopup;
    }

    Game_System.prototype.victoryPopup = function() {
        if (this._victoryPopup === undefined) this._victoryPopup = victoryPopup;
        return this._victoryPopup;
    }

    Game_System.prototype.escapePopup = function() {
        if (this._escapePopup === undefined) this._escapePopup = escapePopup;
        return this._escapePopup;
    }

    Game_System.prototype.defeatedPopup = function() {
        if (this._defeatedPopup === undefined) this._defeatedPopup = defeatedPopup;
        return this._defeatedPopup;
    }

    Game_System.prototype.setPopupText = function(args) {
        switch(args[1]){
            case 'Surprise':
            case '不意打ち':
                this._surprisePopup = args[2];
                break;
            case 'Preemptive':
            case '先制':
                this._preemptivePopup = args[2];
                break;
            case 'Emerge':
            case 'エンカウント':
                this._emergePopup = args[2];
                break;
            case 'Victory':
            case '勝利':
                this._victoryPopup = args[2];
                break;
            case 'Escape':
            case '逃げる':
                this._escapePopup = args[2];
                break;
            case 'Defeated':
            case '敗北':
                this._defeatedPopup = args[2];
                break;
        }
    };

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

    var __GBBase_mostImportantStateText = Game_BattlerBase.prototype.mostImportantStateText;
    Game_BattlerBase.prototype.mostImportantStateText = function() {
        var result = __GBBase_mostImportantStateText.call(this);
        var states = this.states();
        this.result()._continuationPopup = [];
        for (var i = 0; i < states.length; i++) {
            var text = '';
            if (states[i].meta['ContinuationPopup']) text = states[i].meta['ContinuationPopup'];
            if (states[i].meta['継続ポップアップ']) text = states[i].meta['継続ポップアップ'];
            if (text){
                text = text.replace(/_name/gi,states[i].name);
                text = text.replace(/_icon/gi,'\\I[' + states[i].iconIndex + ']');
                this.result()._continuationPopup.push(text);
            }
        }
        return result;
    };

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

    Game_Actor.prototype.popupOffsetX = function() {
        var ox = showOffsetX;
        if (this.actor().meta['BattlePopupOffsetX'] !== undefined) ox = Number(this.actor().meta['BattlePopupOffsetX']);
        if (this.actor().meta['バトルポップアップ補正X'] !== undefined) ox = Number(this.actor().meta['バトルポップアップ補正X']);
        return ox;
    };

    Game_Actor.prototype.popupOffsetY = function() {
        var oy = showOffsetY;
        if (this.actor().meta['BattlePopupOffsetY'] !== undefined) oy = Number(this.actor().meta['BattlePopupOffsetY']);
        if (this.actor().meta['バトルポップアップ補正Y'] !== undefined) oy = Number(this.actor().meta['バトルポップアップ補正Y']);
        return oy;
    };

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

    Game_Enemy.prototype.popupOffsetX = function() {
        var ox = showOffsetX;
        if (this.enemy().meta['BattlePopupOffsetX'] !== undefined) ox = Number(this.enemy().meta['BattlePopupOffsetX']);
        if (this.enemy().meta['バトルポップアップ補正X'] !== undefined) ox = Number(this.enemy().meta['バトルポップアップ補正X']);
        return ox;
    };

    Game_Enemy.prototype.popupOffsetY = function() {
        var oy = showOffsetY;
        if (this.enemy().meta['BattlePopupOffsetY'] !== undefined) oy = Number(this.enemy().meta['BattlePopupOffsetY']);
        if (this.enemy().meta['バトルポップアップ補正Y'] !== undefined) oy = Number(this.enemy().meta['バトルポップアップ補正Y']);
        return oy;
    };

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

    var __GAction_calcElementRate = Game_Action.prototype.calcElementRate;
    Game_Action.prototype.calcElementRate = function(target) {
        var result = __GAction_calcElementRate.call(this,target);
        if (result > 1.0) target.result()._effective = 1;
        if (result < 1.0) target.result()._effective = -1;
        return result;
    };

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

    var __GAResult_clear = Game_ActionResult.prototype.clear;
    Game_ActionResult.prototype.clear = function() {
        __GAResult_clear.call(this);
        this.clearPopupStatus();
    };

    Game_ActionResult.prototype.clearPopupStatus = function() {
        this._sIndex = 0;
        this._effective = 0;
        this._continuationPopup = [];
    };

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

    var __GInterpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function(command, args) {
        __GInterpreter_pluginCommand.call(this, command, args);
        if (command === 'BattlePopup' || command === 'バトルポップアップ'){
            if (args[0] === 'SetText' || args[0] === 'テキスト設定'){
                $gameSystem.setPopupText(args);
            } else {
                this.callBattlePopup(args);
            }
        }
    };

    Game_Interpreter.prototype.callBattlePopup = function(args) {
        var pos = args[0];
        var args = args[1].split(',');
        var character = null;
        var x = 0;
        var y = 0;
        var text = '';
        var pattern = popupPattern;
        var fontSize = popupSize;
        var backPicture = popupBackPicture;
        var count = showCount;
        var sIndex = 0;
        var fixed = !$gameParty.inBattle();
        var battler = null;

        if (/(-?\d+),(-?\d+),?(.+)?/.exec(pos)) {
            x = Number(RegExp.$1);
            y = Number(RegExp.$2);
            fixed = RegExp.$3 ? eval(RegExp.$3) : false;
        } else if ($gameParty.inBattle()){
            var id = eval(pos);
            if (id === -1) {
                character = BattleManager._subject;
            } else {
                character = id < 1000 ? $gameParty.members()[id] : $gameTroop.members()[id - 1000];
            }

            if(character) {
                if (character.isActor()) {
                    battler = BattleManager._spriteset._actorSprites[character.index()];
                    var sprite = battler._mainSprite;
                    x = sprite.width * (0.5 - showAnchorX) + character.popupOffsetX();
                    y = (sprite.height * (1.0 - showAnchorY)) - (fontSize + 4) + character.popupOffsetY();
                } else {
                    battler = BattleManager._spriteset._enemySprites.filter(function (e) {
                        return e._battler === character;
                    })[0];
                    x = battler.width * (0.5 - showAnchorX) + character.popupOffsetX();
                    y = (battler.height * battler.scale.y * (1.0 -showAnchorY)) - (fontSize + 4) + character.popupOffsetY();
                }
                sIndex = character.result()._sIndex;
                character.result()._sIndex++;
            }
        } else {
            character = this.character(eval(pos));
            x = 24;//character._realX * $gameMap.tileWidth() + 24;
            y = 0;//character._realY * $gameMap.tileHeight();
            battler = character;
        }
        args.forEach(function(str){
            if (/(.+?):(.+)?/.exec(str)) {
                switch (RegExp.$1) {
                    case 'text':    text = RegExp.$2;                break;
                    case 'pattern': pattern = RegExp.$2;             break;
                    case 'size':    fontSize = Number(RegExp.$2);    break;
                    case 'back':    backPicture = String(RegExp.$2); break;
                    case 'count':   count = Number(RegExp.$2);       break;
                }
            } else {
                text = str;
            }
        }.bind(this));
        if(!$gameParty.inBattle()) y -= (fontSize + 4);
        this.reserveShowCommonPopup(x,y,text,pattern,sIndex,fontSize,backPicture,count,fixed,battler);
    };

    Game_Interpreter.prototype.reserveShowCommonPopup = function(x,y,text,pattern,sIndex,size,picture,count,fixed,battler) {
        if (picture) ImageManager.loadPicture(picture);
        if (ImageManager.isReady()) {
            CommonPopupManager.showCommonPopup(x, y, text, pattern, sIndex, size, picture, count, fixed,battler);
        } else {
            if (!this._reserveShowCP) this._reserveShowCP = [];
            this._reserveShowCP.push([x,y,text,pattern,sIndex,size,picture,count,fixed,battler]);
        }
    };

    var __GInterpreter_update = Game_Interpreter.prototype.update;
    Game_Interpreter.prototype.update = function() {
        __GInterpreter_update.call(this);
        if (this._reserveShowCP && this._reserveShowCP.length > 0){
            if(ImageManager.isReady()){
                this._reserveShowCP.forEach(function(cp){
                    CommonPopupManager.showCommonPopup(cp[0],cp[1],cp[2],cp[3],cp[4],cp[5],cp[6],cp[7],cp[8],cp[9]);
                }.bind(this));
                this._reserveShowCP = [];
            }
        }
    };

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

    var __WBLog_initialize = Window_BattleLog.prototype.initialize;
    Window_BattleLog.prototype.initialize = function() {
        __WBLog_initialize.call(this);
        if (hideBattleLog) this.hide();
    };

    var __WBLog_update = Window_BattleLog.prototype.update;
    Window_BattleLog.prototype.update = function() {
        __WBLog_update.call(this);
        if (ImageManager.isReady()) this.executeBattlePopups();
    };
    var __WBLog_performActionStart = Window_BattleLog.prototype.performActionStart;
    Window_BattleLog.prototype.performActionStart = function(subject, action) {
        __WBLog_performActionStart.call(this, subject, action);
        subject.result()._sIndex = 0;
        var item = action.item();
        var text = item.meta['UsePopup'];
        var backName = popupBackPicture;
        if (action.isDamage() || action.isDrain()) {
            backName += popupDamageActionItem;
        } else if (action.isRecover()) {
            backName += popupRecoverActionItem;
        } else {
            backName += popupOtherActionItem;
        }
        if (!text) text = item.meta['使用ポップアップ'];
        if (!text && popupActionItem && item.iconIndex > 0) text = popupActionItem;
        if (attackUseWeaponName && action.isAttack() && subject.isActor()) item = subject.weapons()[0];
        if (text) {
            text = text.replace(/_name/gi,item.name);
            text = text.replace(/_icon/gi, '\\I[' + item.iconIndex + ']');
            this.showBattlePopup(subject, text, {back:backName});
        }
    };

    var __WBLog_displayCounter = Window_BattleLog.prototype.displayCounter;
    Window_BattleLog.prototype.displayCounter = function(target) {
        __WBLog_displayCounter.call(this, target);
        var text = counterPopup;
        if (text && !Imported['ExtendIntercept']) this.showBattlePopup(target, text);
    };

    var __WBLog_displayReflection = Window_BattleLog.prototype.displayReflection;
    Window_BattleLog.prototype.displayReflection = function(target) {
        __WBLog_displayReflection.call(this, target);
        var text = reflectionPopup;
        if (text && !Imported['ExtendIntercept']) this.showBattlePopup(target, text);
    };

    var __WBLog_displaySubstitute = Window_BattleLog.prototype.displaySubstitute;
    Window_BattleLog.prototype.performSubstitute = function(substitute, target) {
        __WBLog_displaySubstitute.call(this, substitute, target);
        var text = substitutePopup;
        if (text && !Imported['ExtendIntercept']) this.showBattlePopup(substitute, text);
    };

    var __WBLog_displayAddedStates = Window_BattleLog.prototype.displayAddedStates;
    Window_BattleLog.prototype.displayAddedStates = function(target) {
        __WBLog_displayAddedStates.call(this,target);
        target.result().addedStateObjects().forEach(function(state){
            if (!target.isDeathStateAffected()) {
                var text = state.meta['AddedPopup'];
                if (!text) text = state.meta['付与ポップアップ'];
                if (!text && popupState && state.iconIndex > 0) text = popupState;
                if (text) {
                    text = text.replace(/_name/gi, state.name);
                    text = text.replace(/_icon/gi, '\\I[' + state.iconIndex + ']');
                    this.showBattlePopup(target, text);
                }
            }
        }.bind(this));
    };
    var __WBLog_displayRemovedStates = Window_BattleLog.prototype.displayRemovedStates;
    Window_BattleLog.prototype.displayRemovedStates = function(target) {
        __WBLog_displayRemovedStates.call(this,target);
        target.result().removedStateObjects().forEach(function(state) {
            var text = state.meta['RemovedPopup'];
            if (!text) text = state.meta['解除ポップアップ'];
            if (!text && popupRemoveState && state.iconIndex > 0) text = popupRemoveState;
            if (text) {
                text = text.replace(/_name/gi, state.name);
                text = text.replace(/_icon/gi, '\\I[' + state.iconIndex + ']');
                this.showBattlePopup(target, text);
            }
        }, this);
    };

    var __WBLog_displayChangedBuffs = Window_BattleLog.prototype.displayChangedBuffs;
    Window_BattleLog.prototype.displayChangedBuffs = function(target) {
        __WBLog_displayChangedBuffs.call(this, target);
        var result = target.result();
        result.addedBuffs.forEach(function(paramId){
            this.popupChangedBuff(target,buffPopups[paramId],paramId);
        }.bind(this));
        result.addedDebuffs.forEach(function(paramId){
            this.popupChangedBuff(target,debuffPopups[paramId],paramId);
        }.bind(this));
        result.removedBuffs.forEach(function(paramId){
            console.log(result.addedDebuffs)
            if (result.addedBuffs.contains(paramId)) {
                this.popupChangedBuff(target, buffRemovePopups[paramId], paramId);
            } else if (result.addedDebuffs.contains(paramId)) {
                this.popupChangedBuff(target, debuffRemovePopups[paramId], paramId);
            }
        }.bind(this));
    };

    Window_BattleLog.prototype.popupChangedBuff = function(target,text,paramId) {
        if (text){
            text = text.replace(/_param/gi,TextManager.param(paramId));
            this.showBattlePopup(target,text);
        }
    };

    var __WBLog_displayCritical = Window_BattleLog.prototype.displayCritical;
    Window_BattleLog.prototype.displayCritical = function(target) {
        __WBLog_displayCritical.call(this, target);
        var text = '';
        if (target.result()._effective > 0){
            text = effectivePopup;
        } else if (target.result()._effective < 0){
            text = notEffectivePopup;
        }
        if (text) this.showBattlePopup(target,text);
        text = '';
        if (target.result().critical) {
            if (target.isActor()) {
                text = criticalPopupE;
            } else {
                text = criticalPopupA;
            }
            if (text) this.showBattlePopup(target,text);
        }
    };

    var __WBLog_displayEvasion = Window_BattleLog.prototype.displayEvasion;
    Window_BattleLog.prototype.displayEvasion = function(target) {
        __WBLog_displayEvasion.call(this, target);
        var text = '';
        if (target.result().physical) {
            text = evasionPopupP;
        } else {
            text = evasionPopupM;
        }
        if (text) this.showBattlePopup(target, text);
    };

    var __WBLog_displayCurrentState = Window_BattleLog.prototype.displayCurrentState;
    Window_BattleLog.prototype.displayCurrentState = function(subject) {
        __WBLog_displayCurrentState.call(this, subject);
        subject.result()._continuationPopup.forEach(function(text){
            this.showBattlePopup(subject, text);
        }.bind(this));
    };

    Window_BattleLog.prototype.showBattlePopup = function(target,text,extend){
        var x = 0;
        var y = 0;
        var ary = text.split(',');
        var count = target ? showCount : bigPopupCount;
        text = '';
        var pattern = target ? popupPattern : bigPopupPattern;
        var backPicture = target ? popupBackPicture : bigPopupBackPicture;
        var fontSize = popupSize;
        var battler = null;
        if (extend) {
            for (key in extend){
                switch(key) {
                    case 'text':    text = extend[key];        break;
                    case 'pattern': pattern = extend[key];     break;
                    case 'size':    fontSize = extend[key];    break;
                    case 'back':    backPicture = extend[key]; break;
                    case 'count':   count = extend[key];       break;
                }
            }
        }
        ary.forEach(function(str){
            if (/(.+?):(.+)?/.exec(str)) {
                switch (RegExp.$1) {
                    case 'text':    text = RegExp.$2;                break;
                    case 'pattern': pattern = RegExp.$2;             break;
                    case 'size':    fontSize = Number(RegExp.$2);    break;
                    case 'back':    backPicture = String(RegExp.$2); break;
                    case 'count':   count = Number(RegExp.$2);       break;
                }
            } else {
                text = str;
            }
        }.bind(this));
        if (target) {
            if (!target.result()._sIndex) target.result()._sIndex = 0;
            if (target.isActor()) {
                battler = BattleManager._spriteset._actorSprites[target.index()];
                var sprite = battler._mainSprite;
                x = sprite.width * (0.5 - showAnchorX) + target.popupOffsetX();
                y = -(sprite.height * (1.0 - showAnchorY)) - (fontSize + 4) + target.popupOffsetY();
            } else {
                battler = BattleManager._spriteset._enemySprites.filter(function (e) {
                    return e._battler === target
                })[0];
                x = battler.width * (0.5 - showAnchorX) + target.popupOffsetX();
                y = -(battler.height * battler.scale.y * (1.0 - showAnchorY)) - (fontSize + 4) + target.popupOffsetY();
            }
            this.stackCommonPopup(x,y,text,pattern,target.result()._sIndex, fontSize, backPicture,count,battler);
            target.result()._sIndex++;
        } else {
            x = Graphics.boxWidth / 2;
            y = Graphics.boxHeight / 2 - fontSize / 2;
            this.stackCommonPopup( x, y, text, pattern, 0, fontSize, backPicture,count,battler);
        }
    };

    Window_BattleLog.prototype.stackCommonPopup = function(x,y,text,pattern,sIndex,fontSize,backPicture,count,battler) {
        if (!this._popupStacks) this._popupStacks = [];
        if (backPicture) ImageManager.loadPicture(backPicture);
        text.replace(/\\SG\[(.+?)\]/gi,function(){
            ImageManager.loadPicture(arguments[1]);
            return arguments[0];
        }.bind(this));
        this._popupStacks.push([x,y,text,pattern,sIndex,fontSize,backPicture,count,false,battler]);
    };

    Window_BattleLog.prototype.executeBattlePopups = function() {
        this._popupStacks.forEach(function(s) {
            CommonPopupManager.showCommonPopup(s[0],s[1],s[2],s[3],s[4],s[5],s[6],s[7],s[8],s[9]);
        }.bind(this));
        this._popupStacks = [];
    };

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

    CommonPopupManager.showCommonPopup = function (x, y, text, pattern, sIndex, fontSize, backPicture, count, fixed, battler) {
        var fontColor = 0;
        var oneHeight = (fontSize + 8);
        var height = oneHeight;
        var n = 0;
        var m = 0;
        var backDelay = 0;
        var sy = sIndex * (fontSize + successionOffsetY);
        y -= sy;
        text = this.window().convertEscapeCharacters(text);
        var ox = 0;
        var stext = text.replace(/\x1bC\[\d+\]/gi, '');
        stext = stext.replace(/\\C\[\d+\]/gi, '');
        stext = stext.replace(/\x1bI\[\d+\]/gi,'あ');
        stext = stext.replace(/\x1bSG\[(.+?)\]/gi,function() {
            var name = arguments[1];
            var bitmap = ImageManager.loadPicture(name);
            ox += bitmap.width;
            return '';
        }.bind(this));
        var textSize = stext.length;
        this.window().contents.fontSize = fontSize;
        var totalWidth = this.window().textWidth(stext) + ox;
        var bitmap = null;
        if(backPicture) {
            bitmap = ImageManager.loadPicture(backPicture);
            var arg = CommonPopupManager.setPopup([]);
            arg.bitmap = bitmap;
            var w = arg.bitmap.width;
            var h = arg.bitmap.height;
            arg.x = x - w / 2;
            arg.y = y + height / 2;// - arg.bitmap.height/2;
            arg.moveX = 0;
            arg.moveY = 0;
            arg.anchorX = 0;
            arg.anchorY = 1.0;
            arg.delay = sIndex * popupDelay;
            arg.fixed = fixed ? true : false;
            arg.pattern = popupPatternBack;
            arg.count = textSize * 2 + count + 10;
            arg.extend = [20, arg.count - 10];
            //arg.y += h * arg.anchorY;
            arg.x += w * arg.anchorX;
            arg.y += arg.anchorY * h / 2;
            arg.battler = battler;
            backDelay = 10;
            this._lastIndex =this._tempCommonSprites.setNullPos(arg);
        }
        text = text.replace(/\x1b/g,'\\');
        for (var i = 0, max = text.length; i < max; i++) {
            var char = text[i];
            var flag = false;
            var offsetX = 0;
            var offsetY = 0;
            if (char === '\\') {
                var code = text[i];
                for (var j = i; j < max; j++) {
                    code += text[j];
                    if (text[j] === ']') {
                        if (code.match(/\\C\[(\d+)\]/gi)) {
                            fontColor = RegExp.$1;
                            flag = true;
                        }
                        i = j;
                        char = code;
                        break;
                    }
                }
                if (flag) continue;
            }
            char = char.replace(/\\\\/g,'\\');
            var bitmap = null;
            var oy = 0;
            var ooy = 0;
            this.window().contents.fontSize = fontSize;
            var width = this.window().textWidth(char);
            if (/\\I\[\d+\]/i.exec(char)){
                width = fontSize + 2;
                offsetY = 0;
                offsetX = -2;
                ooy = (28 - fontSize) / 2;
            }
            if (/\\SG\[(.+)\]/i.exec(char)){
                bitmap = ImageManager.loadPicture(RegExp.$1);
                this.window().contents = bitmap;
                width = bitmap.width;
                height = bitmap.height;
            } else {
                height = oneHeight;
                bitmap = new Bitmap(width + 8, height);
                oy = (fontSize - this.window().standardFontSize()) / 2 + 2 + ooy;
                var tx = '\\FS[' + fontSize + ']' + '\\C[' + fontColor + ']' + char;
                this.window().contents = bitmap;
                this.window().drawTextEx(tx, 4, oy);
            }
            var arg = this.setPopup([]);
            arg.bitmap = bitmap;
            arg.x = x + n - (totalWidth / 2) + offsetX;
            arg.y = y + offsetY - 1;
            arg.moveX = 0;
            arg.moveY = 0;
            arg.anchorX = 0;
            arg.anchorY = 0;
            arg.delay = 2 * m + sIndex * popupDelay + backDelay;
            arg.fixed = fixed ? true : false;
            if (pattern === 0){
                arg.moveY = -24;
                arg.y += 24;
            } else if (pattern === -1){
                arg.anchorX = 0.5;
            } else {
                arg.anchorY = 1.0;
            }
            arg.y += height * arg.anchorY;
            arg.x += width * arg.anchorX;
            arg.pattern = pattern;
            arg.count = count;
            arg.battler = battler;
            this._lastIndex = this._tempCommonSprites.setNullPos(arg);
            n+=width;
            m++;
        }
    };

    ////////////////////////////////////////////////////////////////////////////////////
}());


code:
//=============================================================================
// BattleResultsPopup.js
//=============================================================================

/*:
 * @plugindesc Displays a battle results window instead of text messages.
 * @author Yoji Ojima
 *
 * @help This plugin does not provide plugin commands.
 */

/*:ja
 * @plugindesc 戦闘結果の表示をポップアップ形式に変更します。
 * @author Yoji Ojima
 *
 * @help このプラグインには、プラグインコマンドはありません。
 */

(function() {

    var resultDisplaying = 0;

    var _BattleManager_initMembers = BattleManager.initMembers;
    BattleManager.initMembers = function() {
        _BattleManager_initMembers.call(this);
        resultDisplaying = 0;
    };

    var _BattleManager_update = BattleManager.update;
    BattleManager.update = function() {
        _BattleManager_update.call(this);
        if (resultDisplaying > 0) {
            if (++resultDisplaying >= 60) {
                if (Input.isTriggered('ok') || TouchInput.isTriggered()) {
                    resultDisplaying = 0;
                }
            }
        }
    };

    var _BattleManager_isBusy = BattleManager.isBusy;
    BattleManager.isBusy = function() {
        return _BattleManager_isBusy.call(this) || resultDisplaying > 0;
    };

    BattleManager.displayVictoryMessage = function() {
    };

    BattleManager.displayRewards = function() {
        resultDisplaying = 1;
    };

    Game_Actor.prototype.shouldDisplayLevelUp = function() {
        return false;
    };

    var _Scene_Battle_update = Scene_Battle.prototype.update;
    Scene_Battle.prototype.update = function() {
        _Scene_Battle_update.call(this);
        if (resultDisplaying > 30 && !this._resultWindow) {
            this._resultWindow = new Window_BattleResults();
            this.addWindow(this._resultWindow);
        }
    };

    var _Scene_Battle_stop = Scene_Battle.prototype.stop;
    Scene_Battle.prototype.stop = function() {
        _Scene_Battle_stop.call(this);
        if (this._resultWindow) {
            this._resultWindow.close();
        }
    };

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

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

    Window_BattleResults.prototype.initialize = function() {
        var rewards = BattleManager._rewards;
        var width = 400;
        var height = this.fittingHeight(Math.min(9, rewards.items.length + 1));
        var statusHeight = this.fittingHeight(4);
        var x = (Graphics.boxWidth - width) / 2;
        var y = (Graphics.boxHeight - statusHeight - height) / 2;
        Window_Base.prototype.initialize.call(this, x, y, width, height);
        this.refresh();
        this.openness = 0;
        this.open();
    };

    Window_BattleResults.prototype.refresh = function() {
        var x = this.textPadding();
        var y = 0;
        var width = this.contents.width;
        var lineHeight = this.lineHeight();
        var rewards = BattleManager._rewards;
        var items = rewards.items;
        this.contents.clear();

        this.resetTextColor();
        this.drawText(rewards.exp, x, y);
        x += this.textWidth(rewards.exp) + 6;
        this.changeTextColor(this.systemColor());
        this.drawText(TextManager.expA, x, y);
        x += this.textWidth(TextManager.expA + '  ');

        this.resetTextColor();
        this.drawText(rewards.gold, x, y);
        x += this.textWidth(rewards.gold) + 6;
        this.changeTextColor(this.systemColor());
        this.drawText(TextManager.currencyUnit, x, y);

        x = 0;
        y += lineHeight;

        items.forEach(function(item) {
            this.drawItemName(item, x, y, width);
            y += lineHeight;
        }, this);
    };

})();

repo_name: onms/sister

license: unknown


code:
//=============================================================================
// Plugin for RPG Maker MV
// BattleVoice.js
//=============================================================================
// [Update History]
// - BattleVoice.js
// 2015.Nov    Ver1.0.0 First Release
// 2016.Aug    Ver1.1.0 Strict Option Input
// 2019.Feb.27 Ver1.2.0 Random Play
// - BattkeVoiceMZ
// 2020.Jan    Ver1.0.0 First release: Add plugin commands
// 2020.Oct.06 Ver1.1.0 Add situations: on counter attack and on reflect magic
// 2020.Nov.09 Ver1.2.0 Add situations: on evade attack and on battle starts
// 2021.Feb.21 Ver1.3.0 Add situations: on receive recover magic from ally
// - BattleVoice.js again
// 2021.Feb.21 Ver1.4.0 forcedly adapt MV version(closed version)
// 2021.Feb.24 Ver2.0.0 Ver.up based on MZ Ver1.3.0
// 2021.Mar.25 Ver2.1.0 enables to set delay when recovery received

/*:
 * @target MV
 * @plugindesc [Ver2.1.0]Play voice SE at battle when actor does spcified action
 * @author Sasuke KANNAZUKI
 *
 * @param ON switch ID
 * @desc play se only when the switch is ON.
 * This setting interlocks with option Battle Voice.
 * @type switch
 * @default 1
 *
 * @param volume
 * @desc volume of SEs. this setting is common among all voice SEs.
 * (Default:90)
 * @type number
 * @min 0
 * @max 100000
 * @default 90
 *
 * @param pitch
 * @desc pitch of SEs. this setting is common among all voice SEs.
 * (Default:100)
 * @type number
 * @min 10
 * @max 100000
 * @default 100
 *
 * @param pan
 * @desc pan of SEs. this setting is common among all voice SEs.
 * 0:center, <0:left, >0:right (Default:0)
 * @type number
 * @min -100
 * @max 100
 * @default 0
 *
 * @param Battle Voice Name at Option
 * @desc display name at option
 * @type text
 * @default Battle Voice
 *
 * @param waitForReceive
 * @text Delay Frames Of Receiver
 * @desc Set the frames from recover invoke to receive
 * @type number
 * @default 30
 *
 * @noteParam attackVoice
 * @noteRequire 1
 * @noteDir audio/se/
 * @noteType file
 * @noteData actors
 *
 * @noteParam recoverVoice
 * @noteRequire 1
 * @noteDir audio/se/
 * @noteType file
 * @noteData actors
 *
 * @noteParam friendMagicVoice
 * @noteRequire 1
 * @noteDir audio/se/
 * @noteType file
 * @noteData actors
 *
 * @noteParam magicVoice
 * @noteRequire 1
 * @noteDir audio/se/
 * @noteType file
 * @noteData actors
 *
 * @noteParam skillVoice
 * @noteRequire 1
 * @noteDir audio/se/
 * @noteType file
 * @noteData actors
 *
 * @noteParam damageVoice
 * @noteRequire 1
 * @noteDir audio/se/
 * @noteType file
 * @noteData actors
 *
 * @noteParam evadeVoice
 * @noteRequire 1
 * @noteDir audio/se/
 * @noteType file
 * @noteData actors
 *
 * @noteParam defeatedVoice
 * @noteRequire 1
 * @noteDir audio/se/
 * @noteType file
 * @noteData actors
 *
 * @noteParam firstVoice
 * @noteRequire 1
 * @noteDir audio/se/
 * @noteType file
 * @noteData actors
 *
 * @noteParam victoryVoice
 * @noteRequire 1
 * @noteDir audio/se/
 * @noteType file
 * @noteData actors
 *
 * @noteParam counterVoice
 * @noteRequire 1
 * @noteDir audio/se/
 * @noteType file
 * @noteData actors
 *
 * @noteParam reflectVoice
 * @noteRequire 1
 * @noteDir audio/se/
 * @noteType file
 * @noteData actors
 *
 * @noteParam fromAllyVoice
 * @noteRequire 1
 * @noteDir audio/se/
 * @noteType file
 * @noteData actors
 *
 * @help
 * This plugin runs under RPG Maker MV.
 *
 * This plugin enables to play SE (assumed battle voice) at
 *  various situations.
 *
 * [Summary]
 * Player can change voice ON/OFF by Option Scene (except Title).
 * This setting interlocks switch ID set at plugin parameter.
 *
 * [note specification]
 * write down each actor's note at following format to set SE filename.
 * [[Voices when an actor perform something]]
 * <attackVoice:filename>  plays when actor does normal attack.
 * <recoverVoice:filename>   plays when actor uses HP recovering magic.
 * <friendMagicVoice:filename> plays when actor spells magic for friend
 *  except HP recovering. if this is not set but <magicVoice:filename> is set,
 *  it plays <magicVoice:filename> setting file.
 * <magicVoice:filename>   plays when actor spells magic(except for friend).
 * <skillVoice:filename>   plays when actor uses special skill except magic.
 * [[Voices when an actor affected from any battler]]
 * <damageVoice:filename>    plays when actor takes damage.
 * <evadeVoice:filename>    plays when actor evades enemy attack.
 * <defeatedVoice:filename>   plays when actor is died.
 * <counterVoice:filename>   plays when counter attack invokes.
 * <reflectVoice:filename>   plays when actor reflects magic.
 * <fromAllyVoice:filename> plays when actor received HP recover magic.
 *   It doesn't play when magic user is the same as receiver.
 *   It assumes the phrase 'Thank you' and so on.
 * [[Voices when battle exceeds]]
 * if plural actors attend the battle, randomly selected actor's SE is adopted.  * <firstVoice:filename>   plays when battle starts except surprised.
 * <victoryVoice:filename>   plays when battle finishes.
 *
 * *NOTE* Here 'magic' skill means its 'Skill Type' is included in
 *  '[SV]Magic Skills' on 'System '.
 *
 * [Advanced option 1]
 * If you want to play one of several voices randomly,
 * write filenames with colon as follows:
 * <attackVoice:atk1,atk2,atk3>
 * in this case, at attack, plays atk1 atk2, or atk3 randomly.
 *
 * If set no SE one of filenames,
 * <attackVoice:atk1,atk2,$>
 * in this case, at attack, plays atk1 atk2, or doesn't play SE.
 *
 * You can set the same filename twice or more than.
 * <attackVoice:atk1,atk2,atk2,$>
 * in this case, 25% atk1, 50% atk2, 25% don't play.
 *
 * *NOTE* When set SEs at this notation, these files might be excluded at
 *  deployment with option 'Exclude unused files'.
 *  To prevent this, I recommend to make dummy event and set each SE to
 *  'Play SE' on the Contents.
 *
 * [Plugin Commands]
 *
 * **Set voice on each situation**
 * BattleVoice set arg1 arg2 arg3
 *  - arg1 must be actor id.
 *  - arg2 must be a situation.
 *   attack , recover, friendMagic, magic, skill, damage, evaded,
 *   dead, counter, reflect, fromAlly, first or victory
 *  -arg3 must be voice file name. the same as note, by split comma,
 *   plural setting enables.
 * ex.
 * BattleVoice 1 attack attackVoice
 *  set actor whose id is 1 voice for attack.
 *
 * **Reset voice on each situation**
 * BattleVoice reset arg1 arg2
 *  - arg1 must be actor id.
 *  - arg2 must be a situation.
 * ex.
 * BattleVoice reset 2 attack
 *  reset actor whose id is 2 voice for attack.
 *
 * **Reset all situations' voice to default**
 * BattleVoice allReset arg1
 *  - arg1 must be actor id to reset all situation
 *   (note: voice for actor's each skill is not reset)
 *
 * **Assign actor voice to each skill**
 * BattleVoice skillSet arg1 arg2 arg3
 *  - arg1 must be actor id
 *  - arg2 must be skill id to set original voice
 *  - arg3 must be voice file name. the same as note, by split comma,
 *   plural setting enables.
 * ex.
 * BattleVoice skillSet 3 8 fire1
 *  sets fire1 when an actor whose id is 3 uses skill whose id is 8
 *
 * **Reset actor voice to each skill**
 * BattleVoice skillReset arg1 arg2
 *  - arg1 must be actor id
 *  - arg2 must be skill id to reset original voice
 * ex.
 * BattleVoice skillReset 2 15
 *  reset voice for an actor whose id is 2's skill whose id is 15.
 *
 * **Reset all voices assigned to skills**
 * BattleVoice skillAllReset arg1
 *  - arg1 must be actor id to reset all skill's voice.
 *  (note: voice for situations are not reset)
 *
 * [License]
 * this plugin is released under MIT license.
 * http://opensource.org/licenses/mit-license.php
 */
/*:ja
 * @target MV
 * @plugindesc [Ver2.1.0]アクターの戦闘時の行動にボイスSEを設定します。
 * @author 神無月サスケ
 *
 * @param ON switch ID
 * @text ボイス演奏スイッチID
 * @desc このスイッチが ON の時のみ、ボイスSEを演奏します。
 * オプション「バトルボイス」と連動します。
 * @type switch
 * @default 1
 *
 * @param volume
 * @text 共通ボリューム
 * @desc ボイスSEのボリュームです。この設定が全てのボイスSEの
 * 共通となります。(既定値:90)
 * @type number
 * @min 0
 * @max 100000
 * @default 90
 *
 * @param pitch
 * @text 共通ピッチ
 * @desc ボイスSEのピッチです。この設定が全てのボイスSEの
 * 共通となります。(既定値:100)
 * @type number
 * @min 10
 * @max 100000
 * @default 100
 *
 * @param pan
 * @text 共通位相
 * @desc ボイスSEの位相。この設定が全てのボイスSE共通になります。
 * 0:中央, 負数:左寄り, 正数:右寄り (既定値:0)
 * @type number
 * @min -100
 * @max 100
 * @default 0
 *
 * @param Battle Voice Name at Option
 * @text バトルボイス表示名
 * @desc オプション画面での表示名です。
 * @type string
 * @default バトルボイス
 *
 * @param waitForReceive
 * @text 被回復時ウェイト
 * @desc 回復魔法が使われてから受け取ったアクターが発声するまでのフレーム数
 * @type number
 * @default 30
 *
 * @noteParam attackVoice
 * @noteRequire 1
 * @noteDir audio/se/
 * @noteType file
 * @noteData actors
 *
 * @noteParam recoverVoice
 * @noteRequire 1
 * @noteDir audio/se/
 * @noteType file
 * @noteData actors
 *
 * @noteParam friendMagicVoice
 * @noteRequire 1
 * @noteDir audio/se/
 * @noteType file
 * @noteData actors
 *
 * @noteParam magicVoice
 * @noteRequire 1
 * @noteDir audio/se/
 * @noteType file
 * @noteData actors
 *
 * @noteParam skillVoice
 * @noteRequire 1
 * @noteDir audio/se/
 * @noteType file
 * @noteData actors
 *
 * @noteParam damageVoice
 * @noteRequire 1
 * @noteDir audio/se/
 * @noteType file
 * @noteData actors
 *
 * @noteParam evadeVoice
 * @noteRequire 1
 * @noteDir audio/se/
 * @noteType file
 * @noteData actors
 *
 * @noteParam defeatedVoice
 * @noteRequire 1
 * @noteDir audio/se/
 * @noteType file
 * @noteData actors
 *
 * @noteParam firstVoice
 * @noteRequire 1
 * @noteDir audio/se/
 * @noteType file
 * @noteData actors
 *
 * @noteParam victoryVoice
 * @noteRequire 1
 * @noteDir audio/se/
 * @noteType file
 * @noteData actors
 *
 * @noteParam counterVoice
 * @noteRequire 1
 * @noteDir audio/se/
 * @noteType file
 * @noteData actors
 *
 * @noteParam reflectVoice
 * @noteRequire 1
 * @noteDir audio/se/
 * @noteType file
 * @noteData actors
 *
 * @noteParam fromAllyVoice
 * @noteRequire 1
 * @noteDir audio/se/
 * @noteType file
 * @noteData actors
 *
 @help
 * このプラグインは、RPGツクールMVに対応しています。
 *
 * 戦闘中のシチュエーションに応じてにバトルボイスを演奏可能にします。
 *
 * ■概要
 * ゲーム中のオプション画面(タイトル画面以外)でON/OFFが可能です。
 * この設定は、このプラグインのパラメータで指定したスイッチと連動しています。
 * デフォルトではOFFになっています。
 *
 * ■メモ設定方法
 * それぞれのアクターのメモに以下の書式で書いてください。
 * filename はボイスSEのファイル名にしてください。
 * ◆アクター行動時
 * <attackVoice:filename>  通常攻撃の時に再生されるボイスです。
 * <recoverVoice:filename>   HP回復魔法を使用した時に再生されるボイスです。
 * <friendMagicVoice:filename>   HP回復以外の味方向け魔法を使用した時に
 *  再生されるボイスです。省略された場合で<magicVoice:filename>が
 *  設定されている場合は、そちらが再生されます。
 * <magicVoice:filename> 味方向け以外の魔法を使用した時に再生されるボイスです。
 * <skillVoice:filename>   必殺技を使用した時に再生されるボイスです。
 * ◆アクターが対象になった時
 * <damageVoice:filename>    ダメージを受けた時に再生されるボイスです。
 * <evadeVoice:filename>    攻撃を回避した時に再生されるボイスです。
 * <defeatedVoice:filename>   戦闘不能になった時に再生されるボイスです。
 * <counterVoice:filename>   カウンター攻撃発動時に再生されるボイスです。
 * <reflectVoice:filename>   魔法を反射する時に再生されるボイスです。
 * <fromAllyVoice:filename> HP回復魔法を受けた時に再生されるボイスです。
 *  自分自身に使った場合は再生されません
 *  「ありがとう」など感謝の言葉を想定しています。
 * ◆バトルの進捗に応じて
 * アクターが複数いる場合、生きているアクターの中からランダムで再生されます。
 * <firstVoice:filename>    戦闘開始時に再生されるボイスです。
 *  ただし、不意打ちの際は再生されません。
 * <victoryVoice:filename>   戦闘勝利時に再生されるボイスです。
 *
 * 注意：ここでいう「魔法」の定義は、そのスキルのスキルタイプが、
 * 「システム2」タブの「[SV]魔法スキル」に含まれているものです。
 *
 * ■拡張機能１
 * 上記のメモのfilename を、コロンで複数指定すると、その中からランダムで
 * 再生されます。例えば、以下のように指定した場合、
 * <attackVoice:atk1,atk2,atk3>
 * atk1 atk2 atk3 のいずれかのボイスがランダムで再生されます。
 *
 * 無音を指定したい場合は、$ を入れてください。
 * <attackVoice:atk1,atk2,$>
 * この場合、atk1, atk2, 無音の中から選ばれます。
 *
 * 同じファイル名を複数回指定可能です。
 * <attackVoice:atk1,atk2,atk2,$>
 * この場合、25%でatk1、50%でatk2、25%で演奏なしになります。
 *
 * 注意：この形式で設定を行った場合、デプロイメントの「不要ファイルの削除」で
 *  削除される可能性があります。例えばダミーイベントを作り、これらのSEを
 *  演奏するなどして、適宜対処してください。
 *
 * ■プラグインコマンド
 * ◆各シチュエーションでのボイスの変更
 * BattleVoice set arg1 arg2 arg3
 *  - arg1 は対象のアクターID
 *  - arg2 はシチュエーション文字列。以下から選んでください
 *   attack (通常攻撃時), recover (回復魔法使用時),
 *   friendMagic (味方対象魔法使用時) magic (通常魔法使用時)
 *   skill (非魔法スキル使用時), damage (被ダメージ時), evaded (攻撃回避時),
 *   dead (戦闘不能時), counter (カウンター発動時), reflect (魔法反射発動時),
 *   fromAlly (回復魔法を受けた時),
 *   first (戦闘開始時) or victory (戦闘勝利時).
 *  -arg3 はボイスSE名。セミコロンで複数指定可能
 * 例.
 * BattleVoice 1 attack attackVoice
 *  アクターID1の攻撃時(attack)にattackVoiceというSEを再生します。
 *
 * ◆各シチュエーションでのボイスのリセット
 * BattleVoice reset arg1 arg2
 *  - arg1 は対象のアクターID
 *  - arg2 はシチュエーション文字列。上記を参考に。
 * 例.
 * BattleVoice reset 2 attack
 *  アクターID2の攻撃時ボイスをリセットしメモ設定に戻します。
 *
 * ◆全シチュエーションのボイスの一括リセット
  * BattleVoice allReset arg1
 *   - arg1 は対象のアクターID
 *   (注: スキル毎に設定されたボイスはリセットされません)
 *
 * ◆スキル番号にボイスを割り当てる
 * BattleVoice skillSet arg1 arg2 arg3
 *  - arg1 は対象のアクターID
 *  - arg2 はスキルID
 *  - arg3 は演奏するSE名
 * 例.
 * BattleVoice skillSet 3 8 fire1
 *   アクターID3がスキルID8を使用した時にfire1を演奏します
 *
 * ◆スキル番号に割り当てたボイスを解除
 * BattleVoice skillReset arg1 arg2
 *  - arg1 は対象のアクターID
 *  - arg2 はスキルID
 * 例.
 * BattleVoice skillReset 2 15
 *  アクターID2がスキルID15を使用した時のボイスをなくします。
 *
 * ◆スキル番号に割り当てられた全ボイスを一括リセット
 * BattleVoice skillAllReset arg1
 *  - arg1 は対象のアクターID
 *  (注意: シチュエーションに割り当てられたボイスはリセットされません。)
 *
 * ■ライセンス表記
 * このプラグインは MIT ライセンスで配布されます。
 * ご自由にお使いください。
 * http://opensource.org/licenses/mit-license.php
 */
(function() {
  var pluginName = 'BattleVoice';

  //
  // process parameters
  //
  var parameters = PluginManager.parameters(pluginName);
  var pitch = Number(parameters['pitch'] || 100);
  var volume = Number(parameters['volume'] || 90);
  var pan = Number(parameters['pan'] || 0);
  var playSwitchId = Number(parameters['ON switch ID'] || 1);
  var strBattleVoice = parameters['Battle Voice Name at Option'] ||
    'Battle Voice';
  var waitForReceive = Number(parameters['waitForReceive'] || 30);

  //
  // process plugin commands
  //
  var _Game_Interpreter_pluginCommand =
   Game_Interpreter.prototype.pluginCommand;
  Game_Interpreter.prototype.pluginCommand = function(command, args) {
    _Game_Interpreter_pluginCommand.call(this, command, args);
    if (command === pluginName) {
      var actor = $gameActors.actor(+args[1]);
      if (!actor) {
        return;
      }
      actor.battleVoices = actor.battleVoices || {};
      actor.skillVoices = actor.skillVoices || {};
      switch (args[0]) {
      case 'set':
        actor.battleVoices[args[2]] = args[3];
        break;
      case 'reset':
        actor.battleVoices[args[2]] = null;
        break;
      case 'allReset':
        actor.battleVoices = {};
        break;
      case 'skillSet':
        actor.skillVoices[+args[2]] = args[3];
        break;
      case 'skillReset':
        actor.skillVoices[+args[2]] = null;
        break;
      case 'skillAllReset':
        actor.skillVoices = {};
        break;
      }
    }
  };

  //
  // set play options (interlock with switch)
  //
  var doesDisplaySpecialOptions = function() {
    return !SceneManager.isPreviousScene(Scene_Title);
  };

  var _Window_Options_makeCommandList =
   Window_Options.prototype.makeCommandList;
  Window_Options.prototype.makeCommandList = function() {
    if (doesDisplaySpecialOptions()) {
      this.addCommand(strBattleVoice, 'battleVoice');
    }
    _Window_Options_makeCommandList.call(this);
  };

  var _Window_Options_getConfigValue =
   Window_Options.prototype.getConfigValue;
  Window_Options.prototype.getConfigValue = function(symbol) {
    switch (symbol) {
    case 'battleVoice':
      return $gameSwitches.value(playSwitchId);
    default:
      return _Window_Options_getConfigValue.call(this, symbol);
    }
  };

  var _Window_Options_setConfigValue =
   Window_Options.prototype.setConfigValue;
  Window_Options.prototype.setConfigValue = function(symbol, volume) {
    switch (symbol) {
    case 'battleVoice':
      return $gameSwitches.setValue(playSwitchId, volume);
    default:
      return _Window_Options_setConfigValue.call(this, symbol, volume);
    }
  };

  var _Scene_Options_maxCommands = Scene_Options.prototype.maxCommands;
  Scene_Options.prototype.maxCommands = function() {
    var rowNum = _Scene_Options_maxCommands.call(this);
    return doesDisplaySpecialOptions() ? rowNum + 1 : rowNum;
  };

  //
  // play actor voice
  //
  var canPlayActorVoice = function() {
    return $gameSwitches.value(playSwitchId);
  };

  var split = function(name) {
    if (!name) {
      return name;
    }
    var names = name.split(',');
    return names[Math.randomInt(names.length)];
  };

  var createAudioByFileName = function(name) {
    var audio = {};
    audio.name = name;
    audio.pitch = pitch;
    audio.volume = volume;
    audio.pan = pan
    return audio;
  };

  var playActorVoice = function(actor, type) {
    if (!canPlayActorVoice()) {
      return;
    }
    var name = '';
    var a = actor.battleVoices || {};
    var m = actor.actor().meta;
    switch(type){
      case 'attack':
        name = split(a.attack || m.attackVoice);
        break;
      case 'recover':
        name = split(a.recover || m.recoverVoice);
        break;
      case 'friendmagic':
        name = split(a.friendMagic || m.friendMagicVoice || m.magicVoice);
        break;
      case 'magic':
        name = split(a.magic || m.magicVoice);
        break;
      case 'skill':
        name = split(a.skill || m.skillVoice);
        break;
      case 'damage':
        name = split(a.damage || m.damageVoice);
        break;
      case 'evade':
        name = split(a.evade || m.evadeVoice);
        break;
      case 'dead':
        name = split(a.dead || m.defeatedVoice);
        break;
      case 'counter':
        name = split(a.counter || m.counterVoice);
        break;
      case 'reflect':
        name = split(a.reflect || m.reflectVoice);
        break;
      case 'fromAlly':
        name = split(a.fromAlly || m.fromAllyVoice);
        break;
      case 'first':
        name = split(a.first || m.firstVoice);
        break;
      case 'victory':
        name = split(a.victory || m.victoryVoice);
        break;
    }
    if (name && name !=="$") {
      var audio = createAudioByFileName(name);
      AudioManager.playSe(audio);
    }
  };

  var isSkillVoice = function(actor, action) {
    if (!actor.skillVoices || !action.isSkill()) {
      return false;
    }
    return !!actor.skillVoices[action._item.itemId()];
  };

  var playSkillVoice = function(actor, action) {
    if (!canPlayActorVoice()) {
      return;
    }
    var name = split(actor.skillVoices[action._item.itemId()]);
    if (name && name !=="$") {
      var audio = createAudioByFileName(name);
      AudioManager.playSe(audio);
    }
  };

  //
  // functions for call actor voice.
  //
  var _Game_Actor_performAction = Game_Actor.prototype.performAction;
  Game_Actor.prototype.performAction = function(action) {
    _Game_Actor_performAction.call(this, action);
    if (isSkillVoice(this, action)) {
      playSkillVoice(this, action);
    } else if (action.isAttack()) {
      playActorVoice(this, 'attack');
    } else if (action.isMagicSkill() && action.isHpRecover()) {
      playActorVoice(this, 'recover');
    } else if (action.isMagicSkill() && action.isForFriend()) {
      playActorVoice(this, 'friendmagic');
    } else if (action.isMagicSkill()) {
      playActorVoice(this, 'magic');
    } else if (action.isSkill() && !action.isGuard()) {
      playActorVoice(this, 'skill');
    }
  };

  var _Game_Actor_performDamage = Game_Actor.prototype.performDamage;
  Game_Actor.prototype.performDamage = function() {
    _Game_Actor_performDamage.call(this);
    playActorVoice(this, 'damage');
  };

  var _Game_Actor_performEvasion = Game_Actor.prototype.performEvasion;
  Game_Actor.prototype.performEvasion = function() {
    _Game_Actor_performEvasion.call(this);
    playActorVoice(this, 'evade');
  };

  var _Game_Actor_performCollapse = Game_Actor.prototype.performCollapse;
  Game_Actor.prototype.performCollapse = function() {
    _Game_Actor_performCollapse.call(this);
    if ($gameParty.inBattle()) {
      playActorVoice(this, 'dead');
    }
  };

  var _BattleManager_invokeCounterAttack = BattleManager.invokeCounterAttack;
  BattleManager.invokeCounterAttack = function(subject, target) {1
    if (target.isActor()) {
      playActorVoice(target, 'counter');
    }
    _BattleManager_invokeCounterAttack.call(this, subject, target);
  };

  var _BattleManager_invokeMagicReflection =
    BattleManager.invokeMagicReflection;
  BattleManager.invokeMagicReflection = function(subject, target) {
    if (target.isActor()) {
      playActorVoice(target, 'reflect');
    }
    _BattleManager_invokeMagicReflection.call(this, subject, target);
  };

  var _Game_System_onBattleStart = Game_System.prototype.onBattleStart;
  Game_System.prototype.onBattleStart = function() {
    _Game_System_onBattleStart.call(this);
    var candidates = $gameParty.aliveMembers().filter(function(actor) {
       return actor.actor().meta.firstVoice ||
         (actor.battleVoices && actor.battleVoices.first);
    });
    if (candidates.length > 0) {
      var index = Math.randomInt(candidates.length);
      var actor = candidates[index];
      if (!BattleManager._surprise) {
        playActorVoice(actor, 'first');
      }
    }
  };

  var _BattleManager_processVictory = BattleManager.processVictory;
  BattleManager.processVictory = function() {
    var candidates = $gameParty.aliveMembers().filter(function(actor) {
      return actor.actor().meta.victoryVoice ||
        (actor.battleVoices && actor.battleVoices.victory);
    });
    if (candidates.length > 0) {
      var index = Math.randomInt(candidates.length);
      var actor = candidates[index];
      playActorVoice(actor, 'victory');
    }
    _BattleManager_processVictory.call(this);
  };

  //
  // When recover received, wait some frames until play.
  //
  Game_Battler.prototype.doesPlayFromAlly = function() {
    return false;
  };

  Game_Actor.prototype.doesPlayFromAlly = function() {
    // not play voice if target is the same as magic user
    return this !== BattleManager._subject;
  };

  Window_BattleLog.prototype.waitAlly = function() {
    this._waitCount = waitForReceive;
  };

  Window_BattleLog.prototype.playReceiveVoice = function(target) {
    playActorVoice(target, 'fromAlly');
  };

  var _Window_BattleLog_performRecovery =
    Window_BattleLog.prototype.performRecovery;
  Window_BattleLog.prototype.performRecovery = function(target) {
    if (target.doesPlayFromAlly()) {
      this.push('waitAlly');
      this.push('playReceiveVoice', target);
    }
    _Window_BattleLog_performRecovery.call(this, target);
  };
})();


code:
//=============================================================================
// BattleendFade.js
//=============================================================================

/*:ja
 * @plugindesc ver1.00 八百長不可避
 * @author まっつＵＰ
 *
 * @param switchId
 * @desc このIDのスイッチがオンの時
 * 戦闘終了時にマップbgm等の再開を行いません。
 * @type switch
 * @default 10
 *
 * @param switchId2
 * @desc このIDのスイッチがオンの時
 * 戦闘終了時にフェードインしません。
 * @type switch
 * @default 10
 *
 * @help
 *
 * RPGで笑顔を・・・
 *
 * このヘルプとパラメータの説明をよくお読みになってからお使いください。
 *
 * パラメータswitchIdのスイッチにより
 * 戦闘終了時も戦闘bgmが垂れ流しになります。
 * この場合でも
 * スイッチをオフにした後にスクリプトで
 * BattleManager.replayBgmAndBgs();
 * を処理すれば戦闘前のbgmやbgsを流すことができます。
 *
 * パラメータswitchId2のスイッチにより
 * バトルシーン終了時とマップシーン再開時に起こる
 * フェードインを無効にすることができます。
 * この機能によってフェードインを無効にした時は
 * イベントコマンド「画面のフェードイン」を使ってください。
 *
 * このプラグインを利用する場合は
 * readmeなどに「まっつＵＰ」の名を入れてください。
 * また、素材のみの販売はダメです。
 * 上記以外の規約等はございません。
 * もちろんツクールMVで使用する前提です。
 * 何か不具合ありましたら気軽にどうぞ。
 *
 * 免責事項：
 * このプラグインを利用したことによるいかなる損害も制作者は一切の責任を負いません。
 *
 */

(function() {

var parameters = PluginManager.parameters('BattleendFade');
var BFswitchId = Number(parameters['switchId'] || 10);
var BFswitchId2 = Number(parameters['switchId2'] || 10);

var _BattleManager_replayBgmAndBgs = BattleManager.replayBgmAndBgs;
BattleManager.replayBgmAndBgs = function() {
    if($gameSwitches.value(BFswitchId)) return;
    _BattleManager_replayBgmAndBgs.call(this);
};

var _BattleManager_updateBattleEnd = BattleManager.updateBattleEnd;
BattleManager.updateBattleEnd = function() {
    if($gameSwitches.value(BFswitchId2)) $gameScreen.startFadeOut(24);
    _BattleManager_updateBattleEnd.call(this);
};

})();


code:
//
//  発動前コモン ver1.01
//
// ------------------------------------------------------
// Copyright (c) 2016 Yana
// Released under the MIT license
// http://opensource.org/licenses/mit-license.php
// ------------------------------------------------------
//
// author Yana
//

var Imported = Imported || {};
Imported['BeforeCommon'] = 1.01;

/*:
 * @plugindesc ver1.01/スキルやアイテムの発動前に、スキルやアイテムに設定されたコモンイベントを発生させます。
 * @author Yana
 *
 * @param IndexVariableID
 * @desc 発動者のインデックスを保存する変数IDです。
 * 発動者がエネミーの場合は値に+1000されます。
 * @default 11
 *
 * @param TargetIndexVariableID
 * @desc 対象のインデックスを保存する変数IDです。
 * 対象が2体以上の場合は変数の値は-1が設定されます。
 * @default 12
 *
 * @help------------------------------------------------------
 *  プラグインコマンドはありません。
 * ------------------------------------------------------
 * ------------------------------------------------------
 * 設定方法
 * ------------------------------------------------------
 *
 * スキルやアイテムのメモ欄に
 * <発動前コモン:x>
 * または、
 * <BeforeCommon:x>
 * と記述することで、スキルやアイテムが発生する前に、
 * IDがx番のコモンイベントの実行を予約します。
 *
 * また、IndexVariableIDで指定した番号の変数に、行動者のインデックスが、
 * TargetIndexVariableIDで指定した番号の変数に、対象のインデックスが格納されます。
 * ただし、対象のインデックスは対象が単体の時しか格納されず、かつ、
 * エネミーの行動では、コモンを実行するタイミングで対象が決定していないため、
 * 対象には-1(特定不可)が設定されます。
 *
 * ------------------------------------------------------
 * 利用規約
 * ------------------------------------------------------
 * 当プラグインはMITライセンスで公開されています。
 * 使用に制限はありません。商用、アダルト、いずれにも使用できます。
 * 二次配布も制限はしませんが、サポートは行いません。
 * 著作表示は任意です。行わなくても利用できます。
 * 要するに、特に規約はありません。
 * バグ報告や使用方法等のお問合せはネ実ツクールスレ、または、Twitterにお願いします。
 * https://twitter.com/yanatsuki_
 * 素材利用は自己責任でお願いします。
 * ------------------------------------------------------
 * 更新履歴:
 * ver1.01:
 * 対象を保存する変数の設定を追加。
 * ver1.00:
 * 公開
 */

(function() {

    'use strict';

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

    var parameters = PluginManager.parameters('BeforeCommon');
    var indexVariableId = Number(parameters['IndexVariableID']);
    var targetIndexVariableId = Number(parameters['TargetIndexVariableID']) || 0;

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

    DataManager.isBeforeCommon = function(item) {
        if (!item){ return false }
        if (item.meta['発動前コモン']){ return true }
        if (item.meta['BeforeCommon']){ return true }
        return false;
    };

    DataManager.beforeCommonEffect = function(item) {
        var effects = [];
        if (item.meta['発動前コモン']){
            effects = Number(item.meta['発動前コモン']);
        } else if (item.meta['BeforeCommon']) {
            effects = Number(item.meta['BeforeCommon']);
        }
        return effects;
    };

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

    var __BManager_startAction = BattleManager.startAction;
    BattleManager.startAction = function() {
        var action = this._subject.currentAction();
        if (this.checkBeforeCommon(action)) { return }
        __BManager_startAction.call(this);
        this._execBeforeCommon = false;
    };

    BattleManager.checkBeforeCommon = function(action) {
        if (action && !this._execBeforeCommon && DataManager.isBeforeCommon(action.item())){
            this._execBeforeCommon = true;
            var beforeCommon = DataManager.beforeCommonEffect(action.item());
            $gameTemp.reserveCommonEvent(beforeCommon);
            var sId =  this._subject.index();
            var tId = action._targetIndex;
            if (this._subject.isEnemy()) sId += 1000;
            if (this._subject.isActor() && action.isForOpponent() && tId >= 0) tId += 1000;
            if (this._subject.isEnemy() && action.isForFriend() && tId >= 0) tId += 1000;
            if (action.isForUser()) tId = sId;
            if (indexVariableId) $gameVariables._data[indexVariableId] = sId;
            if (targetIndexVariableId) $gameVariables._data[targetIndexVariableId] = tId;
            this._phase = 'turn';
            return true;
        }
        return false;
    };

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

    var __GBattler_removeCurrentAction = Game_Battler.prototype.removeCurrentAction;
    Game_Battler.prototype.removeCurrentAction = function () {
        if (!BattleManager._execBeforeCommon){
            __GBattler_removeCurrentAction.call(this);
        }
    };

    ////////////////////////////////////////////////////////////////////////////////////
}());