code:
/*
 * ==============================================================================
 * ** Victor Engine MV - Damge Popup
 * ------------------------------------------------------------------------------
 *  VE_DamgePopup.js
 * ==============================================================================
 */

var Imported = Imported || {};
Imported['VE - Damge Popup'] = '2.04';

var VictorEngine = VictorEngine || {};
VictorEngine.DamgePopup = VictorEngine.DamgePopup || {};

(function () {

    VictorEngine.DamgePopup.loadDatabase = DataManager.loadDatabase;
    DataManager.loadDatabase = function () {
        VictorEngine.DamgePopup.loadDatabase.call(this);
        PluginManager.requiredPlugin.call(PluginManager, 'VE - Damge Popup', 'VE - Basic Module', '1.20');
    };

    VictorEngine.DamgePopup.requiredPlugin = PluginManager.requiredPlugin;
    PluginManager.requiredPlugin = function (name, required, version) {
        if (!VictorEngine.BasicModule) {
            var msg = 'The plugin ' + name + ' requires the plugin ' + required;
            msg += ' v' + version + ' or higher installed to work properly.';
            msg += ' Go to http://victorenginescripts.wordpress.com/ to download the plugin.';
            throw new Error(msg);
        } else {
            VictorEngine.DamgePopup.requiredPlugin.call(this, name, required, version)
        };
    };

})();

/*:
 * @plugindesc v2.04 - Customize the Damage Popup display.
 * @author Victor Sant
 *
 * @param == Basic Setup ==
 * @default ==============================
 *
 * @param Height Adjust
 * @desc Adjust popup postion based on target graphic height.
 * true - ON     fase - OFF
 * @default false
 *
 * @param Overlap Adjust
 * @desc Adjust Y position if multiple damage diplays overlaps.
 * Default: -32 (Numeric, can be negative)
 * @default -32
 *
 * @param Delay Adjust
 * @desc Delay for multiple simultaneous damage diplay.
 * Default: 0 (Numeric)
 * @default 0
 *
 * @param == HP Damage ==
 * @default ==============================
 *
 * @param HP Damage Text
 * @desc Text display for HP damage popup.
 * %1 = Damage value.
 * @default %1
 *
 * @param HP Damage Fontface
 * @desc HP damage text font name.
 * Default: this.standardFontFace() (allows script code)
 * @default this.standardFontFace()
 *
 * @param HP Damage Fontsize
 * @desc HP damage text font size.
 * Default: this.standardFontSize() (allows script code)
 * @default this.standardFontSize()
 *
 * @param HP Damage Color
 * @desc HP damage text font color.
 * Default: this.normalColor() (allows script code)
 * @default this.normalColor()
 *
 * @param HP Damage Roll
 * @desc Roullete effect for HP damage digits.
 * true - ON     fase - OFF
 * @default false
 *
 * @param HP Damage Delay
 * @desc Delay for each HP damage digit display.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param HP Damage Offset X
 * @desc HP damage popup display offset X.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param HP Damage Offset Y
 * @desc HP damage popup display offset Y.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param HP Damage Motion
 * @desc Motion for the HP damage popup.
 * Default: Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 * @default Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 *
 * @param == MP Damage ==
 * @default ==============================
 *
 * @param MP Damage Text
 * @desc Text display for MP damage popup.
 * %1 = Damage value.
 * @default %1
 *
 * @param MP Damage Fontface
 * @desc MP damage text display font name.
 * Default: this.standardFontFace() (allows script code)
 * @default this.standardFontFace()
 *
 * @param MP Damage Fontsize
 * @desc MP damage text display font size.
 * Default: this.standardFontSize() (allows script code)
 * @default this.standardFontSize()
 *
 * @param MP Damage Color
 * @desc MP damage text display font color.
 * Default: '#BB99FF' (allows script code)
 * @default '#BB99FF'
 *
 * @param MP Damage Roll
 * @desc Roullete effect for MP damage digits.
 * true - ON     fase - OFF
 * @default false
 *
 * @param MP Damage Delay
 * @desc Delay for each MP damage digit display.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param MP Damage Offset X
 * @desc MP damage popup display offset X.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param MP Damage Offset Y
 * @desc MP damage popup display offset Y.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param MP Damage Motion
 * @desc Motion for the MP damage popup.
 * Default: Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 * @default Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 *
 * @param == TP Damage ==
 * @default ==============================
 *
 * @param TP Damage Text
 * @desc Text display for TP damage popup.
 * %1 = Damage value.
 * @default %1
 *
 * @param TP Damage Fontface
 * @desc TP damage text display font name.
 * Default: this.standardFontFace() (allows script code)
 * @default this.standardFontFace()
 *
 * @param TP Damage Fontsize
 * @desc TP damage text display font size.
 * Default: this.standardFontSize() (allows script code)
 * @default this.standardFontSize()
 *
 * @param TP Damage Color
 * @desc TP damage text display font color.
 * Default: '#FFBB99' (allows script code)
 * @default '#FFBB99'
 *
 * @param TP Damage Roll
 * @desc Roullete effect for TP damage digits.
 * true - ON     fase - OFF
 * @default false
 *
 * @param TP Damage Delay
 * @desc Delay for each TP damage digit display.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param TP Damage Offset X
 * @desc TP damage popup display offset X.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param TP Damage Offset Y
 * @desc TP damage popup display offset Y.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param TP Damage Motion
 * @desc Motion for the TP damage popup.
 * Default: Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 * @default Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 *
 * @param == HP Recovery ==
 * @default ==============================
 *
 * @param HP Recover Text
 * @desc Text display for HP recovery popup.
 * %1 = Recovery value.
 * @default %1
 *
 * @param HP Recover Fontface
 * @desc HP recovery text display font name.
 * Default: this.standardFontFace() (allows script code)
 * @default this.standardFontFace()
 *
 * @param HP Recover Fontsize
 * @desc HP recovery text display font size.
 * Default: this.standardFontSize() (allows script code)
 * @default this.standardFontSize()
 *
 * @param HP Recover Color
 * @desc HP recovery text display font color.
 * Default: '#BBFF99' (allows script code)
 * @default '#BBFF99'
 *
 * @param HP Recover Roll
 * @desc Roullete effect for HP recovery digits.
 * true - ON     fase - OFF
 * @default false
 *
 * @param HP Recover Delay
 * @desc Delay for each HP recovery digit display.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param HP Recover Offset X
 * @desc HP recovery popup display offset X.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param HP Recover Offset Y
 * @desc HP recovery popup display offset Y.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param HP Recover Motion
 * @desc Motion for the HP recovery popup.
 * Default: Zoom, Move Up, Move Up, Move Up, Move Up
 * @default Zoom, Move Up, Move Up, Move Up, Move Up
 *
 * @param == MP Recovery ==
 * @default ==============================
 *
 * @param MP Recover Text
 * @desc Text display for MP recovery popup.
 * %1 = Recovery value.
 * @default %1
 *
 * @param MP Recover Fontface
 * @desc MP recovery text display font name.
 * Default: this.standardFontFace() (allows script code)
 * @default this.standardFontFace()
 *
 * @param MP Recover Fontsize
 * @desc MP recovery text display font size.
 * Default: this.standardFontSize() (allows script code)
 * @default this.standardFontSize()
 *
 * @param MP Recover Color
 * @desc MP recovery text display font color.
 * Default: '#99BBFF' (allows script code)
 * @default '#99BBFF'
 *
 * @param MP Recover Roll
 * @desc Roullete effect for MP recovery digits.
 * true - ON     fase - OFF
 * @default false
 *
 * @param MP Recover Delay
 * @desc Delay for each MP recovery digit display.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param MP Recover Offset X
 * @desc MP recovery popup display offset X.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param MP Recover Offset Y
 * @desc MP recovery popup display offset Y.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param MP Recover Motion
 * @desc Motion for the MP recovery popup.
 * Default: Zoom, Move Up, Move Up, Move Up, Move Up
 * @default Zoom, Move Up, Move Up, Move Up, Move Up
 *
 * @param == TP Recovery ==
 * @default ==============================
 *
 * @param TP Recover Text
 * @desc Text display for TP recovery popup.
 * %1 = Recovery value.
 * @default %1
 *
 * @param TP Recover Fontface
 * @desc TP recovery text display font name.
 * Default: this.standardFontFace() (allows script code)
 * @default this.standardFontFace()
 *
 * @param TP Recover Fontsize
 * @desc TP recovery text display font size.
 * Default: this.standardFontSize() (allows script code)
 * @default this.standardFontSize()
 *
 * @param TP Recover Color
 * @desc TP recovery text display font color.
 * Default: '#FFFF99' (allows script code)
 * @default '#FFFF99'
 *
 * @param TP Recover Roll
 * @desc Roullete effect for TP recovery digits.
 * true - ON     fase - OFF
 * @default false
 *
 * @param TP Recover Delay
 * @desc Delay for each TP recovery digit display.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param TP Recover Offset X
 * @desc TP recovery popup display offset X.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param TP Recover Offset Y
 * @desc TP recovery popup display offset Y.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param TP Recover Motion
 * @desc Motion for the TP recovery popup.
 * Default: Zoom, Move Up, Move Up, Move Up, Move Up
 * @default Zoom, Move Up, Move Up, Move Up, Move Up
 *
 * @param == Miss Popup ==
 * @default ==============================
 *
 * @param Miss Text
 * @desc Text display for Miss popup. (leave blank for no text)
 * Default: Miss
 * @default Miss
 *
 * @param Miss Fontface
 * @desc Miss text font name.
 * Default: this.standardFontFace() (allows script code)
 * @default this.standardFontFace()
 *
 * @param Miss Fontsize
 * @desc Miss text font size.
 * Default: this.standardFontSize() (allows script code)
 * @default this.standardFontSize()
 *
 * @param Miss Color
 * @desc Miss text font color.
 * Default: '#BBBBBB' (allows script code)
 * @default '#BBBBBB'
 *
 * @param Miss Offset X
 * @desc Miss popup display offset X.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param Miss Offset Y
 * @desc Miss popup display offset Y.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param Miss Motion
 * @desc Motion for the miss popup.
 * Default: Wait, Wait, Wait, Wait, Wait
 * @default Wait, Wait, Wait, Wait, Wait
 *
 * @param == Critical Popup ==
 * @default ==============================
 *
 * @param Critical Text
 * @desc Text display for Critical popup. (leave blank for no text)
 * Default: Critical
 * @default Critical
 *
 * @param Critical Fontface
 * @desc Critical text font name.
 * Default: this.standardFontFace() (allows script code)
 * @default this.standardFontFace()
 *
 * @param Critical Fontsize
 * @desc Critical text font size.
 * Default: this.standardFontSize() (allows script code)
 * @default this.standardFontSize()
 *
 * @param Critical Color
 * @desc Critical text font color.
 * Default: '#FF9999' (allows script code)
 * @default '#FF9999'
 *
 * @param Critical Offset X
 * @desc Critical popup display offset X.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param Critical Offset Y
 * @desc Critical popup display offset Y.
 * Default: -32 (Numeric, can be negative)
 * @default -32
 *
 * @param Critical Flash Color
 * @desc Flash color for damage digits during criticals.
 * Default: '#FF0000' (Hexadecimal, leave blank for no flash)
 * @default '#FF0000'
 *
 * @param Critical Motion
 * @desc Motion for the critical popup.
 * Default: Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 * @default Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 *
 * @param == State Add Popup ==
 * @default ==============================
 *
 * @param State Add Text
 * @desc Text display for State Add popup. (leave blank for no text)
 * %1 = State Name.    %2 = State Icon.
 * @default +%1
 *
 * @param State Add Fontface
 * @desc State Add text font name.
 * Default: this.standardFontFace() (allows script code)
 * @default this.standardFontFace()
 *
 * @param State Add Fontsize
 * @desc State Add text font size.
 * Default: this.standardFontSize() (allows script code)
 * @default this.standardFontSize()
 *
 * @param State Add Color
 * @desc State Add text font color.
 * Default: '#FFFFBB' (allows script code)
 * @default '#FFFFBB'
 *
 * @param State Add Offset X
 * @desc State Add popup display offset X.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param State Add Offset Y
 * @desc State Add popup display offset Y.
 * Default: 32 (Numeric, can be negative)
 * @default 32
 *
 * @param State Add Motion
 * @desc Motion for the State Add popup.
 * Default: Wait, Wait, Wait, Wait, Wait
 * @default Wait, Wait, Wait, Wait, Wait
 *
 * @param == State Remove Popup ==
 * @default ==============================
 *
 * @param State Remove Text
 * @desc Text display for State Add popup. (leave blank for no text)
 * %1 = State Name.    %2 = State Icon.
 * @default -%1
 *
 * @param State Remove Fontface
 * @desc State Remove text font name.
 * Default: this.standardFontFace() (allows script code)
 * @default this.standardFontFace()
 *
 * @param State Remove Fontsize
 * @desc State Remove text font size.
 * Default: this.standardFontSize() (allows script code)
 * @default this.standardFontSize()
 *
 * @param State Remove Color
 * @desc State Remove text font color.
 * Default: '#FFFFBB' (allows script code)
 * @default '#FFFFBB'
 *
 * @param State Remove Offset X
 * @desc State Remove popup display offset X.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param State Remove Offset Y
 * @desc State Remove popup display offset Y.
 * Default: 32 (Numeric, can be negative)
 * @default 32
 *
 * @param State Remove Motion
 * @desc Motion for the State Remove popup.
 * Default: Wait, Wait, Wait, Wait, Wait
 * @default Wait, Wait, Wait, Wait, Wait
 *
 * @param == Buff Add Popup ==
 * @default ==============================
 *
 * @param Buff Add Text
 * @desc Text display for Buff Add popup. (leave blank for no
 * text)  %1 = Param Name  %2 = Debuff Icon  %3 = Debuff Level
 * @default %1 increased
 *
 * @param Buff Add Fontface
 * @desc Buff Add text font name.
 * Default: this.standardFontFace() (allows script code)
 * @default this.standardFontFace()
 *
 * @param Buff Add Fontsize
 * @desc Buff Add text font size.
 * Default: this.standardFontSize() (allows script code)
 * @default this.standardFontSize()
 *
 * @param Buff Add Color
 * @desc Buff Add text font color.
 * Default: '#BBFF99' (allows script code)
 * @default '#BBFF99'
 *
 * @param Buff Add Offset X
 * @desc Buff Add popup display offset X.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param Buff Add Offset Y
 * @desc Buff Add popup display offset Y.
 * Default: 32 (Numeric, can be negative)
 * @default 32
 *
 * @param Buff Add Motion
 * @desc Motion for the Buff Add popup.
 * Default: Wait, Wait, Wait, Wait, Wait
 * @default Wait, Wait, Wait, Wait, Wait
 *
 * @param == Debuff Add Popup ==
 * @default ==============================
 *
 * @param Debuff Add Text
 * @desc Text display for Debuff Add popup. (leave blank for no
 * text)  %1 = Param Name  %2 = Debuff Icon  %3 = Debuff Level
 * @default %1 decreased
 *
 * @param Debuff Add Fontface
 * @desc Debuff Add text font name.
 * Default: this.standardFontFace() (allows script code)
 * @default this.standardFontFace()
 *
 * @param Debuff Add Fontsize
 * @desc Debuff Add text font size.
 * Default: this.standardFontSize() (allows script code)
 * @default this.standardFontSize()
 *
 * @param Debuff Add Color
 * @desc Debuff Add text font color.
 * Default: '#FFFFBB' (allows script code)
 * @default '#FFFFBB'
 *
 * @param Debuff Add Offset X
 * @desc Debuff Add popup display offset X.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param Debuff Add Offset Y
 * @desc Debuff Add popup display offset Y.
 * Default: 32 (Numeric, can be negative)
 * @default 32
 *
 * @param Debuff Add Motion
 * @desc Motion for the Debuff Add popup.
 * Default: Wait, Wait, Wait, Wait, Wait
 * @default Wait, Wait, Wait, Wait, Wait
 *
 * @param == Buff Remove Popup ==
 * @default ==============================
 *
 * @param Buff Remove Text
 * @desc Text display for Buff Remove popup. (leave blank for no
 * text)  %1 = Param Name  %2 = Debuff Icon
 * @default %1 cleared
 *
 * @param Buff Remove Fontface
 * @desc Buff Remove text font name.
 * Default: this.standardFontFace() (allows script code)
 * @default this.standardFontFace()
 *
 * @param Buff Remove Fontsize
 * @desc Buff Remove text font size.
 * Default: this.standardFontSize() (allows script code)
 * @default this.standardFontSize()
 *
 * @param Buff Remove Color
 * @desc Buff Remove text font color.
 * Default: '#BBFFFF' (allows script code)
 * @default '#BBFFFF'
 *
 * @param Buff Remove Offset X
 * @desc Buff Remove popup display offset X.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param Buff Remove Offset Y
 * @desc Buff Remove popup display offset Y.
 * Default: 32 (Numeric, can be negative)
 * @default 32
 *
 * @param Buff Remove Motion
 * @desc Motion for the Buff Remove popup.
 * Default: Wait, Wait, Wait, Wait, Wait
 * @default Wait, Wait, Wait, Wait, Wait
 *
 * @param == Counter Popup ==
 * @default ==============================
 *
 * @param Counter Text
 * @desc Text display for Counter popup. (leave blank for no text)
 * Default: Counter
 * @default Counter
 *
 * @param Counter Fontface
 * @desc Counter text font name.
 * Default: this.standardFontFace() (allows script code)
 * @default this.standardFontFace()
 *
 * @param Counter Fontsize
 * @desc Counter text font size.
 * Default: this.standardFontSize() (allows script code)
 * @default this.standardFontSize()
 *
 * @param Counter Color
 * @desc Counter text font color.
 * Default: '#FF9999' (allows script code)
 * @default '#FF9999'
 *
 * @param Counter Offset X
 * @desc Counter popup display offset X.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param Counter Offset Y
 * @desc Counter popup display offset Y.
 * Default: -16 (Numeric, can be negative)
 * @default -16
 *
 * @param Counter Motion
 * @desc Motion for the Counter popup.
 * Default: Pop High, Wait, Wait, Wait, Stretch
 * @default Pop High, Wait, Wait, Wait, Stretch
 *
 * @param == Reflect Popup ==
 * @default ==============================
 *
 * @param Reflect Text
 * @desc Text display for Reflect popup. (leave blank for no text)
 * Default: Reflect
 * @default Reflect
 *
 * @param Reflect Fontface
 * @desc Reflect text font name.
 * Default: this.standardFontFace() (allows script code)
 * @default this.standardFontFace()
 *
 * @param Reflect Fontsize
 * @desc Reflect text font size.
 * Default: this.standardFontSize() (allows script code)
 * @default this.standardFontSize()
 *
 * @param Reflect Color
 * @desc Reflect text font color.
 * Default: '#99BBFF' (allows script code)
 * @default '#99BBFF'
 *
 * @param Reflect Offset X
 * @desc Reflect popup display offset X.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param Reflect Offset Y
 * @desc Reflect popup display offset Y.
 * Default: -16 (Numeric, can be negative)
 * @default -16
 *
 * @param Reflect Motion
 * @desc Motion for the Reflect popup.
 * Default: Pop High, Wait, Wait, Wait, Stretch
 * @default Pop High, Wait, Wait, Wait, Stretch
 *
 * @param == Substitute Popup ==
 * @default ==============================
 *
 * @param Substitute Text
 * @desc Text display for Substitute popup. (leave blank for no text)
 * Default: Substitute
 * @default Substitute
 *
 * @param Substitute Fontface
 * @desc Substitute text font name.
 * Default: this.standardFontFace() (allows script code)
 * @default this.standardFontFace()
 *
 * @param Substitute Fontsize
 * @desc Substitute text font size.
 * Default: this.standardFontSize() (allows script code)
 * @default this.standardFontSize()
 *
 * @param Substitute Color
 * @desc Substitute text font color.
 * Default: '#99BBFF' (allows script code)
 * @default '#99BBFF'
 *
 * @param Substitute Offset X
 * @desc Substitute popup display offset X.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param Substitute Offset Y
 * @desc Substitute popup display offset Y.
 * Default: -16 (Numeric, can be negative)
 * @default -16
 *
 * @param Substitute Motion
 * @desc Motion for the Substitute popup.
 * Default: Pop High, Wait, Wait, Wait, Stretch
 * @default Pop High, Wait, Wait, Wait, Stretch
 *
 * @param == Weak Popup ==
 * @default ==============================
 *
 * @param Weak Text
 * @desc Text display for Weak popup. (leave blank for no text)
 * Default: Weak
 * @default Weak
 *
 * @param Weak Fontface
 * @desc Weak text font name.
 * Default: this.standardFontFace() (allows script code)
 * @default this.standardFontFace()
 *
 * @param Weak Fontsize
 * @desc Weak text font size.
 * Default: this.standardFontSize() (allows script code)
 * @default this.standardFontSize()
 *
 * @param Weak Color
 * @desc Weak text font color.
 * Default: '#FFBB99' (allows script code)
 * @default '#FFBB99'
 *
 * @param Weak Flash Color
 * @desc Flash color for damage digits when hit a weakness.
 * Default: '#FF8844' (allows script code, blank for no flash)
 * @default '#FF8844'
 *
 * @param Weak Offset X
 * @desc Weak popup display offset X.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param Weak Offset Y
 * @desc Weak popup display offset Y.
 * Default: -32 (Numeric, can be negative)
 * @default -32
 *
 * @param Weak Motion
 * @desc Motion for the Weak popup.
 * Default: Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 * @default Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 *
 * @param == Resist Popup ==
 * @default ==============================
 *
 * @param Resist Text
 * @desc Text display for Resist popup. (leave blank for no text)
 * Default: Resist
 * @default Resist
 *
 * @param Resist Fontface
 * @desc Resist text font name.
 * Default: this.standardFontFace() (allows script code)
 * @default this.standardFontFace()
 *
 * @param Resist Fontsize
 * @desc Resist text font size.
 * Default: this.standardFontSize() (allows script code)
 * @default this.standardFontSize()
 *
 * @param Resist Color
 * @desc Resist text font color.
 * Default: '#BBFFFF' (allows script code)
 * @default '#BBFFFF'
 *
 * @param Resist Flash Color
 * @desc Flash color for damage digits when hit a resistance.
 * Default: '#4488FF' (allows script code, blank for no flash)
 * @default '#4488FF'
 *
 * @param Resist Offset X
 * @desc Resist popup display offset X.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param Resist Offset Y
 * @desc Resist popup display offset Y.
 * Default: -32 (Numeric, can be negative)
 * @default -32
 *
 * @param Resist Motion
 * @desc Motion for the Resist popup.
 * Default: Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 * @default Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 *
 * @param == Immune Popup ==
 * @default ==============================
 *
 * @param Immune Text
 * @desc Text display for Immune popup. (leave blank for no text)
 * Default: Immune
 * @default Immune
 *
 * @param Immune Fontface
 * @desc Immune text font name.
 * Default: this.standardFontFace() (allows script code)
 * @default this.standardFontFace()
 *
 * @param Immune Fontsize
 * @desc Immune text font size.
 * Default: this.standardFontSize() (allows script code)
 * @default this.standardFontSize()
 *
 * @param Immune Color
 * @desc Immune text font color.
 * Default: '#BBBBBB' (allows script code)
 * @default '#BBBBBB'
 *
 * @param Immune Flash Color
 * @desc Flash color for damage digits when hit a immunity.
 * Default: '#444444' (allows script code, blank for no flash)
 * @default '#444444'
 *
 * @param Immune Offset X
 * @desc Immune popup display offset X.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param Immune Offset Y
 * @desc Immune popup display offset Y.
 * Default: -32 (Numeric, can be negative)
 * @default -32
 *
 * @param Immune Motion
 * @desc Motion for the Immune popup.
 * Default: Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 * @default Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 *
 * @param == Absorb Popup ==
 * @default ==============================
 *
 * @param Absorb Text
 * @desc Text display for Absorb popup. (leave blank for no text)
 * Default: Absorb
 * @default Absorb
 *
 * @param Absorb Fontface
 * @desc Absorb text font name.
 * Default: this.standardFontFace() (allows script code)
 * @default this.standardFontFace()
 *
 * @param Absorb Fontsize
 * @desc Absorb text font size.
 * Default: this.standardFontSize() (allows script code)
 * @default this.standardFontSize()
 *
 * @param Absorb Color
 * @desc Absorb text font color.
 * Default: '#BBFF99' (allows script code)
 * @default '#BBFF99'
 *
 * @param Absorb Flash Color
 * @desc Flash color for damage digits when absorb damage.
 * Default: @@ (allows script code, blank for no flash)
 * @default
 *
 * @param Absorb Offset X
 * @desc Absorb popup display offset X.
 * Default: 0 (Numeric, can be negative)
 * @default 0
 *
 * @param Absorb Offset Y
 * @desc Absorb popup display offset Y.
 * Default: -32 (Numeric, can be negative)
 * @default -32
 *
 * @param Absorb Motion
 * @desc Motion for the Absorb popup.
 * Default: Zoom, Move Up, Move Up, Move Up, Move Up
 * @default Zoom, Move Up, Move Up, Move Up, Move Up
 *
 * @param == Popup Motions ==
 * @default ==============================
 *
 * @param Wait
 * @desc Popup wait motion.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 20
 *
 * @param Move Up
 * @desc Popup move up motion.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, -15, 0, 20
 *
 * @param Move Down
 * @desc Popup move down motion.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 15, 0, 20
 *
 * @param Move Left
 * @desc Popup move left motion.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, -15, 0, 0, 20
 *
 * @param Move Right
 * @desc Popup move right motion.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 15, 0, 0, 20
 *
 * @param Zoom
 * @desc Popup zoom motion.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 300, 300, 0, 0, 0, 30
 *
 * @param Stretch
 * @desc Popup stretch motion.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 400, 0, -30, 0, 30
 *
 * @param Melt
 * @desc Popup melt motion.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 400, 0, 30, 0, 30
 *
 * @param Pop High
 * @desc Popup high pop motion.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, -60, 15
 *
 * @param Fall High
 * @desc Popup fall high motion.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 60, 15
 *
 * @param Pop Low
 * @desc Popup low pop motion.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, -20, 15
 *
 * @param Fall Low
 * @desc Popup low fall motion.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 20, 15
 *
 * @param == Custom Motions ==
 * @default ==============================
 *
 * @param Custom 1
 * @desc Popup custom motion 1.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 2
 * @desc Popup custom motion 2.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 3
 * @desc Popup custom motion 3.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 4
 * @desc Popup custom motion 4.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 5
 * @desc Popup custom motion 5.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 6
 * @desc Popup custom motion 6.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 7
 * @desc Popup custom motion 7.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 8
 * @desc Popup custom motion 8.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 9
 * @desc Popup custom motion 9.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 10
 * @desc Popup custom motion 10.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 11
 * @desc Popup custom motion 11.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 12
 * @desc Popup custom motion 12.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 13
 * @desc Popup custom motion 13.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 14
 * @desc Popup custom motion 14.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 15
 * @desc Popup custom motion 15.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 16
 * @desc Popup custom motion 16.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 17
 * @desc Popup custom motion 17.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 18
 * @desc Popup custom motion 18.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 19
 * @desc Popup custom motion 19.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 20
 * @desc Popup custom motion 20.
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @help
 * ==============================================================================
 *  Notetags:
 * ==============================================================================
 *
 * ==============================================================================
 *  Hide Add Popup (for States)
 * ------------------------------------------------------------------------------
 *  <hide add popup>
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 *  The state will not display a popup when added if the plugin paramater
 *  'State Popup' is turned On.
 * ==============================================================================
 *
 * ==============================================================================
 *  Hide Remove Popup (for States)
 * ------------------------------------------------------------------------------
 *  <hide remove popup>
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 *  The state will not display a popup when removed if the plugin paramater
 *  'State Popup' is turned On.
 * ==============================================================================
 *
 * ==============================================================================
 *  Hide Remove Popup (for Actors and Enemies)
 * ------------------------------------------------------------------------------
 *  <popup offset: X, Y>
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 *  Adjust the popup position display for the battle.
 *     X: position X (Numeric, can be negative)
 *     Y: position X (Numeric, can be negative)
 *   The X offset will be inverted if the battler is facing right.
 * ==============================================================================
 *
 * =============================================================================
 * Additional Information:
 * ------------------------------------------------------------------------------
 *
 *  - Popup Font Setup
 *  Each popup type has different configurable values to setup the disply font.
 *  Most of the setup for this plugin is made through plugin parameters.
 *  Several of those plugin parameters allows the use of script codes. If this is
 *  the case, you can use any valid code for basic windows.
 *
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 *
 *  - Popup Offset
 *  The parameters 'Offset X' and 'Offset Y' defines the popup offset position.
 *  They muust be numeric values.
 *
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 *
 *  - Popup Fontface
 *  The parameters 'Fontface' defines the font name for the popup display.
 *  You can use script codes that returns a string with the fontname se the
 *  value for it.
 *
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 *
 *  - Popup Fontsize
 *  The parameters 'Fontsize' defines the font size for the popup display.
 *  You can use script codes that returns numeric values as the value for it.
 *
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 *
 *  - Popup Color
 *  The parameter 'Color' defines the font color for the popup display.
 *  The color must be either a hex color code (#000000) or a script code
 *  that returns a color value.
 *
 *  If using the plugin 'SFonts' the hex color will not work, instead you need
 *  to call this.textColor(X), where X is the SFont color Id.
 *
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 *
 *  - Damage Delays
 *  The popup for HP, MP and TP have a digit delay setup. This make it so the
 *  digitis are shown one at each time, instead of all at once. This value can be
 *  postive or negative. If positive the digits are shown from left to right, if
 *  negative they are shown from right to left.
 *
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 *
 *  - Damage Roll
 *  The popup for HP, MP and TP have a digit roll setup. This make it so the
 *  digitis randomly changes at the start of the popup effect, revealing the
 *  actual damage digit number after some frames.
 *
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 *
 *  - Damage Motions
 *  The popup movement is controlled by a sequence of motions. The combination
 *  of motion values define how the damage popup will behave.
 *  There are 12 pre made motion setup:
 *   - wait
 *   - move down
 *   - move up
 *   - move left
 *   - move right
 *   - zoom
 *   - stretch
 *   - melt
 *   - pop high
 *   - fall high
 *   - pop low
 *   - fall low
 *  Those 12 motions can also be combined with more 20 custom motions to make
 *  the damage movement.
 *
 *  Ex.: rise high, fall high, rise low, fall low, wait  // Bouncing movement.
 *       zoom, move up, move up, move up, move up  // Zoom in and the move up.
 *       zoom, custom 1, custom 2, wait  // Zoom in, use custom motion then wait.
 *
 *  You can add how many setups you want to each motion, they are played in the
 *  same order they are placed.
 *
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 *
 *  - Motions Setup
 *  Each motion has 6 configurable numeric values:
 *  Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 *   - Zoom X : horizontal zoom. (100 = default size)
 *   - Zoom Y : vertical zoom.   (100 = default size)
 *   - Move X : horizontal move distance. (Can be negative, 0 for no mevement)
 *   - Move Y : vertical move distance.   (Can be negative, 0 for no mevement)
 *   - Gravity : Gravity effect height.   (Can be negative, 0 for no mevement)
 *   - Duration : Motion duration in frames.
 *
 *  Zoom : The zoom movement is transitory. For a zoom in, use a high zoom value
 *   followed by a motion with lower zoom value. For a zoom out, use a lower zoom
 *   value followed by a motion with higher zoom value.
 *
 *  Move : The damg will move for the duration. It will move to the opposite
 *   direction if the value is negative. The horizontal movement is inverted
 *   if the battle mode is set to sideview and the battler is facing right.
 *
 *  Gravity : Gravity movement effect. Positive values will make the display to
 *   'fall' with incresing speed. Negative values will make the display 'jump'
 *   with decreasing speed.
 *
 *  Duration : Duration, in frames, for this motion. The duration of the popup
 *  is the total duration for all motions.
 *
 *  Ex.: 100, 100, 0, 0, 0, 30   // waiting motion
 *       100, 100, 0, 40, 30, 30 // bouncin right motion
 *       300, 300, 0, 0, 0, 30   // zoom motion
 *
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 *
 *  - Custom Popup Calls
 *  You can make script calls to show custom popup effects on a battler:
 *
 *  battler.callCustomPopup(text, motion, font, size, color, x, y)
 *
 *  battler : must be a valid Game_Battler object.
 *  text   : the text do be displayed.
 *  motion : motion sequence for the popup effect.
 *  font  : font name for the popup text.
 *  size  : font size for the popup text.
 *  color : font color for the popup text.
 *  x : popup effect offset X.
 *  y : popup effect offset Y.
 *
 *  All values except the offset x and offset y must be Strings. You can use the
 *  same values as you use for the plugin parameters setup. It's adivised that
 *  you store the values on local variables to make the setup more readable.
 *  You can ommit any value beside the text and motion.
 *
 *  Ex.:
 *   var text = 'Cancel';
 *   var motion = 'Pop High, Wait, Wait, Wait, Stretch';
 *   var font = 'this.standardFontFace()';
 *   var size = 'this.standardFontSize()';
 *   var color = '#BBFFFF';
 *   this.callCustomPopup(text, motion, font, size, color)
 *
 *   ** Notice that the code use 'this' for the battler, so it's a code to be
 *   used on a Game_Battler class (or it's children).
 *
 * ==============================================================================
 *
 * ==============================================================================
 *  Version History:
 * ------------------------------------------------------------------------------
 *  v 1.00 - 2016.04.21 > First release.
 *  v 2.00 - 2016.04.21 > Plugin recoded, it now uses the Game Font instead of
 *                      > images for damage popup display.
 *  v 2.01 - 2016.05.09 > Fixed issue with the plugin not working without the
 *                        Control Text plugin.
 *                      > Fixed issue with MP popup display.
 *  v 2.02 - 2016.05.12 > Comatibility with Basic Module 1.20.
 *  v 2.03 - 2016.05.31 > Comatibility with Battle Motions.
 *  v 2.04 - 2017.07.20 > Fixed issue with popup not showing randomly for the
 *                        1st action.
 * =============================================================================
 */
/*:ja
 * @plugindesc v2.04 ダメージポップアップ表示をカスタマイズできます
 * @author Victor Sant
 *
 * @param == Basic Setup ==
 * @text -- 基本設定 --
 * @default ==============================
 *
 * @param Height Adjust
 * @text 高さ調整
 * @type boolean
 * @on 有効
 * @off 無効
 * @desc 対象画像の高さに応じてポップアップの位置を調整
 * 有効:true / 無効:fase
 * @default false
 *
 * @param Overlap Adjust
 * @text オーバーラップ調整
 * @desc 複数ダメージ表示が重なった時のY位置の調整
 * デフォルト:-32 (正負の数値)
 * @default -32
 *
 * @param Delay Adjust
 * @text 持続調整
 * @desc 複数ダメージ表示を同時に行う場合の持続時間
 * デフォルト:0 (数値)
 * @default 0
 *
 * @param == HP Damage ==
 * @text -- HPダメージ --
 * @default ==============================
 *
 * @param HP Damage Text
 * @text HPダメージテキスト
 * @desc HPダメージポップアップのテキスト表示
 * %1:ダメージ値
 * @default %1
 *
 * @param HP Damage Fontface
 * @text HPダメージフォント名
 * @desc HPダメージテキストのフォント名
 * デフォルト:this.standardFontFace() (スクリプト使用可)
 * @default this.standardFontFace()
 *
 * @param HP Damage Fontsize
 * @text HPダメージのフォントサイズ
 * @desc HPダメージテキストのフォントサイズ
 * デフォルト:this.standardFontSize() (スクリプト使用可)
 * @default this.standardFontSize()
 *
 * @param HP Damage Color
 * @text HPダメージのフォント色
 * @desc HPダメージのフォント色
 * デフォルト:this.normalColor() (スクリプト使用可)
 * @default this.normalColor()
 *
 * @param HP Damage Roll
 * @text HPダメージロール
 * @type boolean
 * @on 有効
 * @off 無効
 * @desc HPダメージの値表示のルーレット効果
 * 有効:true / 無効:fase
 * @default false
 *
 * @param HP Damage Delay
 * @text HPダメージ持続時間
 * @desc HPダメージの各値表示の持続時間
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param HP Damage Offset X
 * @text HPダメージオフセットX
 * @desc HPダメージポップアップの表示オフセットX
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param HP Damage Offset Y
 * @text HPダメージオフセットY
 * @desc HPダメージポップアップの表示オフセットY
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param HP Damage Motion
 * @text HPダメージモーション
 * @desc HPダメージポップアップの動作。デフォルト:Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 * @default Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 *
 * @param == MP Damage ==
 * @text -- MPダメージ --
 * @default ==============================
 *
 * @param MP Damage Text
 * @text MPダメージテキスト
 * @desc MPダメージポップアップのテキスト表示
 * %1:ダメージ値
 * @default %1
 *
 * @param MP Damage Fontface
 * @text MPダメージのフォント名
 * @desc MPダメージテキストのフォント名
 * デフォルト:this.standardFontFace() (スクリプト使用可)
 * @default this.standardFontFace()
 *
 * @param MP Damage Fontsize
 * @text MPダメージのフォントサイズ
 * @desc MPダメージテキストのフォントサイズ
 * デフォルト:this.standardFontSize() (スクリプト使用可)
 * @default this.standardFontSize()
 *
 * @param MP Damage Color
 * @text MPダメージのフォント色
 * @desc MPダメージのフォント色
 * デフォルト:'#BB99FF' (スクリプト使用可)
 * @default '#BB99FF'
 *
 * @param MP Damage Roll
 * @text MPダメージロール
 * @type boolean
 * @on 有効
 * @off 無効
 * @desc MPダメージ桁表示のルーレット効果
 * 有効:true / 無効:fase
 * @default false
 *
 * @param MP Damage Delay
 * @text MPダメージ持続時間
 * @desc MPダメージの各桁表示の持続時間
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param MP Damage Offset X
 * @text MPダメージオフセットX
 * @desc MPダメージポップアップ表示オフセットX
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param MP Damage Offset Y
 * @text MPダメージオフセットY
 * @desc MPダメージポップアップ表示オフセットY
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param MP Damage Motion
 * @text MPダメージモーション
 * @desc MPダメージポップアップの動作。デフォルト:Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 * @default Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 *
 * @param == TP Damage ==
 * @text -- TPのダメージ --
 * @default ==============================
 *
 * @param TP Damage Text
 * @text TPダメージテキスト
 * @desc TPダメージポップアップのテキスト表示
 * %1:ダメージ値
 * @default %1
 *
 * @param TP Damage Fontface
 * @text TPダメージのフォント名
 * @desc TPダメージのテキスト表示フォント名
 * デフォルト:this.standardFontFace() (スクリプト使用可)
 * @default this.standardFontFace()
 *
 * @param TP Damage Fontsize
 * @text TPダメージのフォントサイズ
 * @desc TPダメージテキスト表示フォントサイズ
 * デフォルト:this.standardFontSize() (スクリプト使用可)
 * @default this.standardFontSize()
 *
 * @param TP Damage Color
 * @text TPダメージのフォント色
 * @desc TPダメージテキストのフォント色
 * デフォルト:'#FFBB99' (スクリプト使用可)
 * @default '#FFBB99'
 *
 * @param TP Damage Roll
 * @text TPダメージロール
 * @type boolean
 * @on 有効
 * @off 無効
 * @desc TPダメージ値のルーレット効果
 * 有効:true / 無効:fase
 * @default false
 *
 * @param TP Damage Delay
 * @text TPダメージ持続時間
 * @desc TPダメージの各値表示の持続時間
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param TP Damage Offset X
 * @text TPダメージオフセットX
 * @desc TPダメージポップアップ表示オフセットX
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param TP Damage Offset Y
 * @text TPダメージオフセットY
 * @desc TPダメージポップアップ表示オフセットY
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param TP Damage Motion
 * @text TPダメージモーション
 * @desc TPダメージポップアップの動作。デフォルト:Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 * @default Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 *
 * @param == HP Recovery ==
 * @text -- HP回復 --
 * @default ==============================
 *
 * @param HP Recover Text
 * @text HP回復テキスト
 * @desc HP回復ポップアップのテキスト表示
 * %1:回復値
 * @default %1
 *
 * @param HP Recover Fontface
 * @text HP回復のフォント名
 * @desc HP回復のテキストのフォント名
 * デフォルト:this.standardFontFace() (スクリプト使用可)
 * @default this.standardFontFace()
 *
 * @param HP Recover Fontsize
 * @text HP回復フォントサイズ
 * @desc HP回復のテキストのフォントサイズ
 * デフォルト:this.standardFontSize() (スクリプト使用可)
 * @default this.standardFontSize()
 *
 * @param HP Recover Color
 * @text HP回復のフォント色
 * @desc HP回復テキストのフォント色
 * デフォルト:'#BBFF99' (スクリプト使用可)
 * @default '#BBFF99'
 *
 * @param HP Recover Roll
 * @text HP回復ロール
 * @type boolean
 * @on 有効
 * @off 無効
 * @desc HP回復値表示のルーレット効果
 * 有効:true / 無効:fase
 * @default false
 *
 * @param HP Recover Delay
 * @text HP回復持続時間
 * @desc HP回復の各値表示の持続時間
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param HP Recover Offset X
 * @text HP回復オフセットX
 * @desc HP回復ポップアップ表示オフセットX
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param HP Recover Offset Y
 * @text HP回復オフセットY
 * @desc HP回復ポップアップの表示オフセットY
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param HP Recover Motion
 * @text HP回復モーション
 * @desc HP回復ポップアップの動作
 * デフォルト:Zoom, Move Up, Move Up, Move Up, Move Up
 * @default Zoom, Move Up, Move Up, Move Up, Move Up
 *
 * @param == MP Recovery ==
 * @text -- MP回復 --
 * @default ==============================
 *
 * @param MP Recover Text
 * @text MP回復テキスト
 * @desc MP回復ポップアップのテキスト表示
 * %1:回復値
 * @default %1
 *
 * @param MP Recover Fontface
 * @text MP回復のフォント名
 * @desc MP回復テキストのフォント名
 * デフォルト:this.standardFontFace() (スクリプト使用可)
 * @default this.standardFontFace()
 *
 * @param MP Recover Fontsize
 * @text MP回復のフォントサイズ
 * @desc MP回復テキストのフォントサイズ
 * デフォルト:this.standardFontSize() (スクリプト使用可)
 * @default this.standardFontSize()
 *
 * @param MP Recover Color
 * @text MP回復のフォント色
 * @desc MP回復テキストのフォント色
 * デフォルト:'#99BBFF' (スクリプト使用可)
 * @default '#99BBFF'
 *
 * @param MP Recover Roll
 * @text MP回復ロール
 * @type boolean
 * @on 有効
 * @off 無効
 * @desc MP回復値表示のルーレット効果
 * 有効:true / 無効:fase
 * @default false
 *
 * @param MP Recover Delay
 * @text MP回復持続時間
 * @desc MP回復値表示の持続時間
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param MP Recover Offset X
 * @text MP回復オフセットX
 * @desc MP回復ポップアップ表示オフセットX
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param MP Recover Offset Y
 * @text MP回復オフセットY
 * @desc MP回復ポップアップの表示オフセットY
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param MP Recover Motion
 * @text MP回復モーション
 * @desc MP回復ポップアップの動作
 * デフォルト:Zoom, Move Up, Move Up, Move Up, Move Up
 * @default Zoom, Move Up, Move Up, Move Up, Move Up
 *
 * @param == TP Recovery ==
 * @text -- TP回復 --
 * @default ==============================
 *
 * @param TP Recover Text
 * @text TP回復テキスト
 * @desc TP回復ポップアップのテキスト表示
 * %1:回復値
 * @default %1
 *
 * @param TP Recover Fontface
 * @text TP回復のフォント名
 * @desc TP回復のテキスト表示フォント名
 * デフォルト:this.standardFontFace() (スクリプト使用可)
 * @default this.standardFontFace()
 *
 * @param TP Recover Fontsize
 * @text TP回復のフォントサイズ
 * @desc TP回復のテキスト表示フォントサイズ
 * デフォルト:this.standardFontSize() (スクリプト使用可)
 * @default this.standardFontSize()
 *
 * @param TP Recover Color
 * @text TP回復のフォント色
 * @desc TP回復のテキスト表示フォント色
 * デフォルト:'#FFFF99' (スクリプト使用可)
 * @default '#FFFF99'
 *
 * @param TP Recover Roll
 * @text TP回復ロール
 * @type boolean
 * @on 有効
 * @off 無効
 * @desc TP回復値表示のルーレット効果
 * 有効:true / 無効:fase
 * @default false
 *
 * @param TP Recover Delay
 * @text TP回復持続時間
 * @desc TP回復値表示の持続時間
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param TP Recover Offset X
 * @text TP回復オフセットX
 * @desc TP回復ポップアップ表示オフセットX
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param TP Recover Offset Y
 * @text TP回復オフセットY
 * @desc TP回復ポップアップの表示オフセットY
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param TP Recover Motion
 * @text TP回復モーション
 * @desc TP回復ポップアップの動作
 * デフォルト:Zoom, Move Up, Move Up, Move Up, Move Up
 * @default Zoom, Move Up, Move Up, Move Up, Move Up
 *
 * @param == Miss Popup ==
 * @text -- ミスのポップアップ --
 * @default ==============================
 *
 * @param Miss Text
 * @text ミスのテキスト
 * @desc ミスのポップアップのテキスト表示(非表示の場合、無入力)
 * デフォルト:ミス
 * @default ミス
 *
 * @param Miss Fontface
 * @text ミスのフォント名
 * @desc ミスのテキストのフォント名
 * デフォルト:this.standardFontFace() (スクリプト使用可)
 * @default this.standardFontFace()
 *
 * @param Miss Fontsize
 * @text ミスのフォントサイズ
 * @desc ミスのテキストフォントサイズ
 * デフォルト:this.standardFontSize() (スクリプト使用可)
 * @default this.standardFontSize()
 *
 * @param Miss Color
 * @text ミスのフォント色
 * @desc ミスのテキストフォント色
 * デフォルト:'#BBBBBB' (スクリプト使用可)
 * @default '#BBBBBB'
 *
 * @param Miss Offset X
 * @text ミスのオフセットX
 * @desc ミスのポップアップ表示オフセットX
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param Miss Offset Y
 * @text ミスのオフセットY
 * @desc ミスのポップアップ表示オフセットY
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param Miss Motion
 * @text ミスのモーション
 * @desc ミスのポップアップの動作
 * デフォルト:Wait, Wait, Wait, Wait, Wait
 * @default Wait, Wait, Wait, Wait, Wait
 *
 * @param == Critical Popup ==
 * @text -- 会心のポップアップ --
 * @default ==============================
 *
 * @param Critical Text
 * @text 会心テキスト
 * @desc 会心テキストのポップアップ表示(非表示の場合、無入力)
 * デフォルト:会心
 * @default 会心
 *
 * @param Critical Fontface
 * @text 会心フォント名
 * @desc 会心テキストのフォント名
 * デフォルト:this.standardFontFace() (スクリプト使用可)
 * @default this.standardFontFace()
 *
 * @param Critical Fontsize
 * @text 会心フォントサイズ
 * @desc 会心テキストのフォントサイズ
 * デフォルト:this.standardFontSize() (スクリプト使用可)
 * @default this.standardFontSize()
 *
 * @param Critical Color
 * @text 会心フォント色
 * @desc 会心テキストのフォント色
 * デフォルト:'#FF9999' (スクリプト使用可)
 * @default '#FF9999'
 *
 * @param Critical Offset X
 * @text 会心オフセットX
 * @desc 会心ポップアップの表示オフセットX
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param Critical Offset Y
 * @text 会心オフセットY
 * @desc 会心ポップアップの表示オフセットY
 * デフォルト:-32 (正負の数値)
 * @default -32
 *
 * @param Critical Flash Color
 * @text 会心フラッシュ色
 * @desc 会心中のダメージ値の点滅色
 * デフォルト:'#FF0000' (Hexadecimal, leave blank for no flash)
 * @default '#FF0000'
 *
 * @param Critical Motion
 * @text 会心モーション
 * @desc 会心ポップアップの動作
 * デフォルト:Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 * @default Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 *
 * @param == State Add Popup ==
 * @text -- ステート付加のポップアップ --
 * @default ==============================
 *
 * @param State Add Text
 * @text ステート付加テキスト
 * @desc ステート付加のポップアップ表示(非表示の場合、無入力)
 * %1:ステート名 / %2:ステートアイコン
 * @default +%1
 *
 * @param State Add Fontface
 * @text ステート付加フォント名
 * @desc ステート付加のテキストのフォント名
 * デフォルト:this.standardFontFace() (スクリプト使用可)
 * @default this.standardFontFace()
 *
 * @param State Add Fontsize
 * @text ステート付加フォントサイズ
 * @desc ステート付加のフォントサイズ
 * デフォルト:this.standardFontSize() (スクリプト使用可)
 * @default this.standardFontSize()
 *
 * @param State Add Color
 * @text ステート付加フォント色
 * @desc ステート付加テキストのフォント色
 * デフォルト:'#FFFFBB' (スクリプト使用可)
 * @default '#FFFFBB'
 *
 * @param State Add Offset X
 * @text ステート付加オフセットX
 * @desc ステート付加のポップアップのオフセットX
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param State Add Offset Y
 * @text ステート付加オフセットY
 * @desc ステート付加のポップアップのオフセットY
 * デフォルト:32 (正負の数値)
 * @default 32
 *
 * @param State Add Motion
 * @text ステート付加モーション
 * @desc ステート付加のポップアップ動作
 * デフォルト:Wait, Wait, Wait, Wait, Wait
 * @default Wait, Wait, Wait, Wait, Wait
 *
 * @param == State Remove Popup ==
 * @text -- ステート解除のポップアップ --
 * @default ==============================
 *
 * @param State Remove Text
 * @text ステート解除テキスト
 * @desc ステート解除ポップアップのテキスト表示(非表示の場合、無入力)
 * %1:ステート名 / %2:ステートアイコン
 * @default -%1
 *
 * @param State Remove Fontface
 * @text ステート解除フォント名
 * @desc ステート解除テキストのフォント名
 * デフォルト:this.standardFontFace() (スクリプト使用可)
 * @default this.standardFontFace()
 *
 * @param State Remove Fontsize
 * @text ステート解除フォントサイズ
 * @desc ステート解除テキストのフォントサイズ
 * デフォルト:this.standardFontSize() (スクリプト使用可)
 * @default this.standardFontSize()
 *
 * @param State Remove Color
 * @text ステート解除フォント色
 * @desc ステート解除テキストのフォント色
 * デフォルト:'#FFFFBB' (スクリプト使用可)
 * @default '#FFFFBB'
 *
 * @param State Remove Offset X
 * @text ステート解除オフセットX
 * @desc ステート解除ポップアップのオフセットX
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param State Remove Offset Y
 * @text ステート解除オフセットY
 * @desc ステート解除ポップアップのオフセットY
 * デフォルト:32 (正負の数値)
 * @default 32
 *
 * @param State Remove Motion
 * @text ステート解除モーション
 * @desc ステート解除のポップアップ動作
 * デフォルト:Wait, Wait, Wait, Wait, Wait
 * @default Wait, Wait, Wait, Wait, Wait
 *
 * @param == Buff Add Popup ==
 * @text -- 強化付加のポップアップ --
 * @default ==============================
 *
 * @param Buff Add Text
 * @text 強化付加テキスト
 * @desc 強化付加ポップアップのテキスト表示(非表示の場合、無入力)
 * %1:能力名 / %2:強化アイコン / %3:強化レベル
 * @default %1 強化
 *
 * @param Buff Add Fontface
 * @text 強化付加フォント名
 * @desc 強化付加テキストフォント名
 * デフォルト:this.standardFontFace() (スクリプト使用可)
 * @default this.standardFontFace()
 *
 * @param Buff Add Fontsize
 * @text 強化付加フォントサイズ
 * @desc 強化付加テキストのフォントサイズ
 * デフォルト:this.standardFontSize() (スクリプト使用可)
 * @default this.standardFontSize()
 *
 * @param Buff Add Color
 * @text 強化付加フォント色
 * @desc 強化付加テキストのフォント色
 * デフォルト:'#BBFF99' (スクリプト使用可)
 * @default '#BBFF99'
 *
 * @param Buff Add Offset X
 * @text 強化付加オフセットX
 * @desc 強化付加ポップアップのオフセットX
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param Buff Add Offset Y
 * @text 強化付加オフセットY
 * @desc 強化付加ポップアップのオフセットY
 * デフォルト:32 (正負の数値)
 * @default 32
 *
 * @param Buff Add Motion
 * @text 強化付加モーション
 * @desc 強化付加ポップアップの動作
 * デフォルト:Wait, Wait, Wait, Wait, Wait
 * @default Wait, Wait, Wait, Wait, Wait
 *
 * @param == Debuff Add Popup ==
 * @text -- 弱体付加のポップアップ --
 * @default ==============================
 *
 * @param Debuff Add Text
 * @text 弱体付加テキスト
 * @desc 弱体付加ポップアップのテキスト表示(非表示の場合、無入力)
 * %1:能力名 / %2:弱体アイコン / %3:弱体レベル
 * @default %1 弱体
 *
 * @param Debuff Add Fontface
 * @text 弱体付加フォント名
 * @desc 弱体付加テキストのフォント名
 * デフォルト:this.standardFontFace() (スクリプト使用可)
 * @default this.standardFontFace()
 *
 * @param Debuff Add Fontsize
 * @text 弱体付加フォントサイズ
 * @desc 弱体付加テキストのフォントサイズ
 * デフォルト:this.standardFontSize() (スクリプト使用可)
 * @default this.standardFontSize()
 *
 * @param Debuff Add Color
 * @text 弱体付加フォント色
 * @desc 弱体付加テキストフォントの色
 * デフォルト:'#FFFFBB' (スクリプト使用可)
 * @default '#FFFFBB'
 *
 * @param Debuff Add Offset X
 * @text 弱体付加オフセットX
 * @desc 弱体付加ポップアップ表示オフセットX
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param Debuff Add Offset Y
 * @text 弱体付加オフセットY
 * @desc 弱体付加ポップアップ表示オフセットY
 * デフォルト:32 (正負の数値)
 * @default 32
 *
 * @param Debuff Add Motion
 * @text 弱体付加モーション
 * @desc 弱体付加ポップアップの動作
 * デフォルト:Wait, Wait, Wait, Wait, Wait
 * @default Wait, Wait, Wait, Wait, Wait
 *
 * @param == Buff Remove Popup ==
 * @text -- 強化解除のポップアップ --
 * @default ==============================
 *
 * @param Buff Remove Text
 * @text 強化解除テキスト
 * @desc 強化解除ポップアップのテキスト表示 (非表示の場合、無入力)
 * %1:能力名 / %2:弱体アイコン
 * @default %1 解除
 *
 * @param Buff Remove Fontface
 * @text 強化解除のフォント名
 * @desc 強化解除テキストのフォント名
 * デフォルト:this.standardFontFace() (スクリプト使用可)
 * @default this.standardFontFace()
 *
 * @param Buff Remove Fontsize
 * @text 強化解除のフォントサイズ
 * @desc 強化解除テキストのフォントサイズ
 * デフォルト:this.standardFontSize() (スクリプト使用可)
 * @default this.standardFontSize()
 *
 * @param Buff Remove Color
 * @text 強化解除フォント色
 * @desc 強化解除テキストのフォント色
 * デフォルト:'#BBFFFF' (スクリプト使用可)
 * @default '#BBFFFF'
 *
 * @param Buff Remove Offset X
 * @text 強化解除オフセットX
 * @desc 強化解除ポップアップのオフセットX
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param Buff Remove Offset Y
 * @text 強化解除オフセットY
 * @desc 強化解除ポップアップのオフセットY
 * デフォルト:32 (正負の数値)
 * @default 32
 *
 * @param Buff Remove Motion
 * @text 強化解除モーション
 * @desc 強化解除ポップアップの動作
 * デフォルト:Wait, Wait, Wait, Wait, Wait
 * @default Wait, Wait, Wait, Wait, Wait
 *
 * @param == Counter Popup ==
 * @text -- 反撃ポップアップ --
 * @default ==============================
 *
 * @param Counter Text
 * @text 反撃テキスト
 * @desc 反撃ポップアップのテキスト表示(非表示の場合、無入力)
 * デフォルト:反撃
 * @default 反撃
 *
 * @param Counter Fontface
 * @text 反撃フォント名
 * @desc 反撃テキストのフォント名
 * デフォルト:this.standardFontFace() (スクリプト使用可)
 * @default this.standardFontFace()
 *
 * @param Counter Fontsize
 * @text 反撃フォントサイズ
 * @desc 反撃テキストのフォントサイズ
 * デフォルト:this.standardFontSize() (スクリプト使用可)
 * @default this.standardFontSize()
 *
 * @param Counter Color
 * @text 反撃フォント色
 * @desc 反撃テキストのフォント色
 * デフォルト:'#FF9999' (スクリプト使用可)
 * @default '#FF9999'
 *
 * @param Counter Offset X
 * @text 反撃オフセットX
 * @desc 反撃ポップアップのオフセットX
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param Counter Offset Y
 * @text 反撃オフセットY
 * @desc 反撃ポップアップのオフセットY
 * デフォルト:-16 (正負の数値)
 * @default -16
 *
 * @param Counter Motion
 * @text 反撃モーション
 * @desc 反撃ポップアップの動作
 * デフォルト:Pop High, Wait, Wait, Wait, Stretch
 * @default Pop High, Wait, Wait, Wait, Stretch
 *
 * @param == Reflect Popup ==
 * @text -- 反射ポップアップ --
 * @default ==============================
 *
 * @param Reflect Text
 * @text 反射テキスト
 * @desc 反射ポップアップのテキスト表示(非表示の場合、無入力)
 * デフォルト:反射
 * @default 反射
 *
 * @param Reflect Fontface
 * @text 反射フォント名
 * @desc 反射テキストのフォント名
 * デフォルト:this.standardFontFace() (スクリプト使用可)
 * @default this.standardFontFace()
 *
 * @param Reflect Fontsize
 * @text 反射フォントサイズ
 * @desc 反射テキストのフォントサイズ
 * デフォルト:this.standardFontSize() (スクリプト使用可)
 * @default this.standardFontSize()
 *
 * @param Reflect Color
 * @text 反射フォント色
 * @desc 反射テキストフォントの色
 * デフォルト:'#99BBFF' (スクリプト使用可)
 * @default '#99BBFF'
 *
 * @param Reflect Offset X
 * @text 反射オフセットX
 * @desc 反射ポップアップのオフセットX
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param Reflect Offset Y
 * @text 反射オフセットY
 * @desc 反射ポップアップのオフセットY
 * デフォルト:-16 (正負の数値)
 * @default -16
 *
 * @param Reflect Motion
 * @text 反射モーション
 * @desc 反射ポップアップの動作
 * デフォルト:Pop High, Wait, Wait, Wait, Stretch
 * @default Pop High, Wait, Wait, Wait, Stretch
 *
 * @param == Substitute Popup ==
 * @text -- 身代わりポップアップ --
 * @default ==============================
 *
 * @param Substitute Text
 * @text 身代わりテキスト
 * @desc 身代わりポップアップのテキスト表示(非表示の場合、無入力)
 * デフォルト:身代わり
 * @default 身代わり
 *
 * @param Substitute Fontface
 * @text 身代わりフォント
 * @desc 身代わりテキストのフォント名
 * デフォルト:this.standardFontFace() (スクリプト使用可)
 * @default this.standardFontFace()
 *
 * @param Substitute Fontsize
 * @text 身代わりフォントサイズ
 * @desc 身代わりテキストのフォントサイズ
 * デフォルト:this.standardFontSize() (スクリプト使用可)
 * @default this.standardFontSize()
 *
 * @param Substitute Color
 * @text 身代わりフォント色
 * @desc 身代わりテキストフォントの色
 * デフォルト:'#99BBFF' (スクリプト使用可)
 * @default '#99BBFF'
 *
 * @param Substitute Offset X
 * @text 身代わりオフセットX
 * @desc 身代わりポップアップのオフセットX
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param Substitute Offset Y
 * @text 身代わりオフセットY
 * @desc 身代わりポップアップのオフセットY
 * デフォルト:-16 (正負の数値)
 * @default -16
 *
 * @param Substitute Motion
 * @text 身代わりモーション
 * @desc 身代わりポップアップの動作
 * デフォルト:Pop High, Wait, Wait, Wait, Stretch
 * @default Pop High, Wait, Wait, Wait, Stretch
 *
 * @param == Weak Popup ==
 * @text -- 弱点ポップアップ --
 * @default ==============================
 *
 * @param Weak Text
 * @text 弱点テキスト
 * @desc 弱点ポップアップのテキスト表示(非表示の場合、無入力)
 * デフォルト:弱点
 * @default 弱点
 *
 * @param Weak Fontface
 * @text 弱点フォント
 * @desc 弱点テキストのフォント名
 * デフォルト:this.standardFontFace() (スクリプト使用可)
 * @default this.standardFontFace()
 *
 * @param Weak Fontsize
 * @text 弱点フォントサイズ
 * @desc 弱点テキストのフォントサイズ
 * デフォルト:this.standardFontSize() (スクリプト使用可)
 * @default this.standardFontSize()
 *
 * @param Weak Color
 * @text 弱点フォント色
 * @desc 弱点テキストフォントの色
 * デフォルト:'#FFBB99' (スクリプト使用可)
 * @default '#FFBB99'
 *
 * @param Weak Flash Color
 * @text 弱点フラッシュ色
 * @desc 弱点フラッシュ色
 * デフォルト:'#FF8844' (スクリプト使用可。フラッシュ無しは無入力)
 * @default '#FF8844'
 *
 * @param Weak Offset X
 * @text 弱点オフセットX
 * @desc 弱点ポップアップのオフセットX
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param Weak Offset Y
 * @text 弱点オフセットY
 * @desc 弱点ポップアップのオフセットY
 * デフォルト:-32 (正負の数値)
 * @default -32
 *
 * @param Weak Motion
 * @text 弱点モーション
 * @desc 弱点ポップアップの動作。デフォルト:Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 * @default Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 *
 * @param == Resist Popup ==
 * @text -- 耐性ポップアップ --
 * @default ==============================
 *
 * @param Resist Text
 * @text 耐性テキスト
 * @desc 耐性ポップアップのテキスト表示(非表示の場合、無入力)
 * デフォルト:耐性
 * @default 耐性
 *
 * @param Resist Fontface
 * @text 耐性フォント
 * @desc 耐性テキストのフォント名
 * デフォルト:this.standardFontFace() (スクリプト使用可)
 * @default this.standardFontFace()
 *
 * @param Resist Fontsize
 * @text 耐性フォントサイズ
 * @desc 耐性テキストのフォントサイズ
 * デフォルト:this.standardFontSize() (スクリプト使用可)
 * @default this.standardFontSize()
 *
 * @param Resist Color
 * @text 耐性フォント色
 * @desc 耐性テキストフォント色
 * デフォルト:'#BBFFFF' (スクリプト使用可)
 * @default '#BBFFFF'
 *
 * @param Resist Flash Color
 * @text 耐性フラッシュ色
 * @desc 耐性フラッシュ色
 * デフォルト:'#4488FF' (スクリプト使用可。フラッシュ無しは無入力)
 * @default '#4488FF'
 *
 * @param Resist Offset X
 * @text 耐性オフセットX
 * @desc 耐性ポップアップのオフセットX
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param Resist Offset Y
 * @text 耐性オフセットY
 * @desc 耐性ポップアップのオフセットY
 * デフォルト:-32 (正負の数値)
 * @default -32
 *
 * @param Resist Motion
 * @text 耐性モーション
 * @desc Motion for the Resist popup.
 * @desc 耐性ポップアップの動作。デフォルト:Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 * @default Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 *
 * @param == Immune Popup ==
 * @text -- 耐性ポップアップ --
 * @default ==============================
 *
 * @param Immune Text
 * @text 無効化テキスト
 * @desc 無効化ポップアップのテキスト表示(非表示の場合、無入力)
 * デフォルト:無効化
 * @default 無効化
 *
 * @param Immune Fontface
 * @text 無効化フォント
 * @desc 無効化テキストのフォント名
 * デフォルト:this.standardFontFace() (スクリプト使用可)
 * @default this.standardFontFace()
 *
 * @param Immune Fontsize
 * @text 無効化フォントサイズ
 * @desc 無効化テキストのフォントサイズ
 * デフォルト:this.standardFontSize() (スクリプト使用可)
 * @default this.standardFontSize()
 *
 * @param Immune Color
 * @text 無効化フォント色
 * @desc 無効化テキストフォント色
 * デフォルト:'#BBBBBB' (スクリプト使用可)
 * @default '#BBBBBB'
 *
 * @param Immune Flash Color
 * @text 無効化フラッシュ色
 * @desc 無効化フラッシュ色
 * デフォルト:'#444444' (スクリプト使用可。フラッシュ無しは無入力)
 * @default '#444444'
 *
 * @param Immune Offset X
 * @text 無効化オフセットX
 * @desc 無効化ポップアップのオフセットX
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param Immune Offset Y
 * @text 無効化オフセットY
 * @desc 無効化ポップアップのオフセットY
 * デフォルト:-32 (正負の数値)
 * @default -32
 *
 * @param Immune Motion
 * @text 無効化モーション
 * @desc Motion for the Immune popup.
 * @desc 無効化ポップアップの動作。デフォルト:Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 * @default Pop High, Fall High, Pop Low, Fall Low, Wait, Wait
 *
 * @param == Absorb Popup ==
 * @text -- 吸収ポップアップ --
 * @default ==============================
 *
 * @param Absorb Text
 * @text 吸収テキスト
 * @desc 吸収ポップアップのテキスト表示(非表示の場合、無入力)
 * デフォルト:吸収
 * @default 吸収
 *
 * @param Absorb Fontface
 * @text 吸収フォント
 * @desc 吸収テキストのフォント名
 * デフォルト:this.standardFontFace() (スクリプト使用可)
 * @default this.standardFontFace()
 *
 * @param Absorb Fontsize
 * @text 吸収フォントサイズ
 * @desc 吸収テキストのフォントサイズ
 * デフォルト:this.standardFontSize() (スクリプト使用可)
 * @default this.standardFontSize()
 *
 * @param Absorb Color
 * @text 吸収フォント色
 * @desc 吸収テキストフォント色
 * デフォルト:'#BBFF99' (スクリプト使用可)
 * @default '#BBFF99'
 *
 * @param Absorb Flash Color
 * @text 吸収フラッシュ色
 * @desc 吸収フラッシュ色
 * デフォルト:@@ (スクリプト使用可。フラッシュ無しは無入力)
 * @default
 *
 * @param Absorb Offset X
 * @text 吸収オフセットX
 * @desc 吸収ポップアップのオフセットX
 * デフォルト:0 (正負の数値)
 * @default 0
 *
 * @param Absorb Offset Y
 * @text 吸収オフセットY
 * @desc 吸収ポップアップのオフセットY
 * デフォルト:-32 (正負の数値)
 * @default -32
 *
 * @param Absorb Motion
 * @text 吸収モーション
 * @desc Motion for the Absorb popup.
 * @desc 吸収ポップアップの動作
 * デフォルト:Zoom, Move Up, Move Up, Move Up, Move Up
 * @default Zoom, Move Up, Move Up, Move Up, Move Up
 *
 * @param == Popup Motions ==
 * @text -- ポップアップ動作 --
 * @default ==============================
 *
 * @param Wait
 * @text 待機
 * @desc ポップアップ待機の動作
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 20
 *
 * @param Move Up
 * @text 上に移動
 * @desc ポップアップは上に移動
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, -15, 0, 20
 *
 * @param Move Down
 * @text 下に移動
 * @desc ポップアップは下に移動
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 15, 0, 20
 *
 * @param Move Left
 * @text 左に移動
 * @desc ポップアップは左に移動
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, -15, 0, 0, 20
 *
 * @param Move Right
 * @text 右に移動
 * @desc ポップアップが右に移動
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 15, 0, 0, 20
 *
 * @param Zoom
 * @text ズーム
 * @desc ポップアップのズーム動作
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 300, 300, 0, 0, 0, 30
 *
 * @param Stretch
 * @text ストレッチ
 * @desc ポップアップのストレッチモーション
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 400, 0, -30, 0, 30
 *
 * @param Melt
 * @text メルト
 * @desc ポップアップが溶けます。
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 400, 0, 30, 0, 30
 *
 * @param Pop High
 * @text ポップ高
 * @desc 高くポップする動き
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, -60, 15
 *
 * @param Fall High
 * @text 落下高
 * @desc 落ちる高さをポップアップ
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 60, 15
 *
 * @param Pop Low
 * @text ポップ低
 * @desc 低くポップ
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, -20, 15
 *
 * @param Fall Low
 * @text 落下低
 * @desc 低く落下する動作をポップアップ
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 20, 15
 *
 * @param == Custom Motions ==
 * @text -- カスタム --
 * @default ==============================
 *
 * @param Custom 1
 * @text カスタム1
 * @desc ポップアップカスタムモーション1
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 2
 * @text カスタム2
 * @desc ポップアップカスタムモーション2
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 3
 * @text カスタム3
 * @desc ポップアップカスタムモーション3
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 4
 * @text カスタム4
 * @desc ポップアップカスタムモーション4
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 5
 * @text カスタム5
 * @desc ポップアップカスタムモーション5
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 6
 * @text カスタム6
 * @desc ポップアップカスタムモーション6
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 7
 * @text カスタム7
 * @desc ポップアップカスタムモーション7
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 8
 * @text カスタム8
 * @desc ポップアップカスタムモーション8
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 9
 * @text カスタム9
 * @desc ポップアップカスタムモーション9
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 10
 * @text カスタム10
 * @desc ポップアップカスタムモーション10
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 11
 * @text カスタム11
 * @desc ポップアップカスタムモーション11
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 12
 * @text カスタム12
 * @desc ポップアップカスタムモーション12
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 13
 * @text カスタム13
 * @desc ポップアップカスタムモーション13
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 14
 * @text カスタム14
 * @desc ポップアップカスタムモーション14
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 15
 * @text カスタム15
 * @desc ポップアップカスタムモーション15
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 16
 * @text カスタム16
 * @desc ポップアップカスタムモーション16
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 17
 * @text カスタム17
 * @desc ポップアップカスタムモーション17
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 18
 * @text カスタム18
 * @desc ポップアップカスタムモーション18
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 19
 * @text カスタム19
 * @desc ポップアップカスタムモーション19
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @param Custom 20
 * @text カスタム20
 * @desc ポップアップカスタムモーション20
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 * @default 100, 100, 0, 0, 0, 30
 *
 * @help
 * 翻訳:ムノクラ
 * https://fungamemake.com/
 * https://twitter.com/munokura/
 *
 * 元プラグイン:
 * https://victorenginescripts.wordpress.com/rpg-maker-mv/damage-popup/
 *
 *
 * ===========================================================================
 * 必要プラグイン
 * ===========================================================================
 *
 * このプラグインを使用するには、下記のプラグインが必要です。
 * - VE_BasicModule
 *
 *
 * ===========================================================================
 *  メモタグ
 * ===========================================================================
 *
 * ===========================================================================
 *  付加ポップアップ非表示 (ステート)
 * ---------------------------------------------------------------------------
 *  <hide add popup>
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 * プラグインパラメーター'State Popup'がOnになっている場合、
 * 付与したステートはポップアップを表示しません。
 * ===========================================================================
 *
 * ===========================================================================
 *  解除ポップアップ非表示 (ステート)
 * ---------------------------------------------------------------------------
 *  <hide remove popup>
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 * プラグインパラメーター'State Popup'がOnになっている場合、
 * 解除してもステートはポップアップを表示しません。
 * ===========================================================================
 *
 * ===========================================================================
 *  ポップアップオフセット (アクター、敵キャラ)
 * ---------------------------------------------------------------------------
 *  <popup offset: X, Y>
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 * 戦闘のポップアップ位置を調整します。
 *    X: position X (正負の数値)
 *    Y: position X (正負の数値)
 *  バトラーが右を向いている場合は、Xオフセットが反転します。
 * ===========================================================================
 *
 * ===========================================================================
 * 追加情報
 * ---------------------------------------------------------------------------
 *
 *  - Popup Font Setup
 * それぞれのポップアップタイプには、
 * 表示フォントを設定するための異なる設定値があります。
 * このプラグインの設定のほとんどは、
 * プラグインのパラメータによって行われます。
 * それらのプラグインパラメータのいくつかは
 * スクリプトの使用を許可しています。
 * この場合、基本的なウィンドウで有効なコードを使用できます。
 *
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 *
 *  - Popup Offset
 * パラメータ'Offset X'と'Offset Y'は、
 * ポップアップのオフセット位置を定義します。
 * これらは数値でなければなりません。
 *
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 *
 *  - Popup Fontface
 * パラメータ'Font face'は、ポップアップ表示のフォント名を定義します。
 * フォント名を文字列として返すスクリプトコードを使用できます。
 *
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 *
 *  - Popup Fontsize
 * パラメータ'Font size'は、ポップアップ表示のフォントサイズを定義します。
 * 数値を返すスクリプトコードを使用できます。
 *
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 *
 *  - Popup Color
 * 'Color'パラメータは、ポップアップ表示のフォント色を定義します。
 * 色は、16進数のカラーコード(#000000)か、
 * 色の値を返すスクリプトコードのいずれかでなければなりません。
 *
 * 'SFonts'プラグインを使用している場合、16進数色は機能しません。
 * その代わりにthis.textColor(X)を呼び出す必要があります。
 *
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 *
 *  - Damage Delays
 * HP、MP、TPのポップアップには桁数遅延の設定があります。
 * 一度に全ての数字を表示するのではなく、一度に一桁ずつ表示されます。
 * この値は正負の値に設定できます。
 * 正の場合は左から右に、負の場合は右から左に表示されます。
 *
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 *
 *  - Damage Roll
 * HP、MP、TPのポップアップには桁数ロールが設定されています。
 * ポップアップ効果の開始時にランダムに桁が変化し、
 * いくつかのフレームの後に実際のダメージ桁数が明らかになるようになっています。
 *
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 *
 *  - Damage Motions
 * ポップアップの動きは、一連のモーションによって制御されます。
 * モーションの値の組み合わせによって、
 * ダメージポップアップがどのように動作するかを定義します。
 * 12種類のモーション設定が用意されています。
 *   - wait
 *   - move down
 *   - move up
 *   - move left
 *   - move right
 *   - zoom
 *   - stretch
 *   - melt
 *   - pop high
 *   - fall high
 *   - pop low
 *   - fall low
 * また、これらの12のモーションは、20以上のカスタムモーションと組み合わせて、
 * ダメージの動きを作ることができます。
 *
 *  例 : rise high, fall high, rise low, fall low, wait
 *         // 跳ねる動き
 *       zoom, move up, move up, move up, move up
 *         // ズームインして上に移動
 *       zoom, custom 1, custom 2, wait
 *         // ズームイン、カスタムモーションを使用してから待機
 *
 * それぞれのモーションに必要な設定数を追加することができ、
 * それらは配置された順番で再生されます。
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 *
 *  - Motions Setup
 * 各モーションには、設定可能な6つの値があります。
 * Zoom X, Zoom Y, Move X, Move Y, Gravity, Duration
 *   - Zoom X : 水平方向のズーム (デフォルト:100)
 *   - Zoom Y : 垂直方向のズーム (デフォルト:100)
 *   - Move X : 水平方向の移動距離 (正負の値。不動は0)
 *   - Move Y : 垂直方向の移動距離 (正負の値。不動は0)
 *   - Gravity : 重力効果の高さ    (正負の値。不動は0)
 *   - Duration : フレーム単位での動作時間
 *
 *  Zoom :
 * ズームの動きは一過性のものです。
 * ズームインでは、高いズーム値を使用し、
 * その後に低いズーム値のモーションを使用します。
 * ズームアウトする場合、
 * 低いズーム値の後に高いズーム値のモーションを使用します。
 *
 *  Move :
 * ダメージはその間移動します。
 * 値がマイナスの場合は逆方向に移動します。
 * バトルモードがサイドビューに設定されていて、バトラーが右を向いている場合、
 * 横方向の動きが反転します。
 *
 *  Gravity :
 * 重力移動効果。
 * 正の値は速度の低下とともに表示を'落下'させます。
 * 負の値は速度の低下とともに表示を'跳ぶ'ようにします。
 *
 *  Duration :
 * このモーションの持続時間(フレーム単位)。
 * ポップアップの持続時間は、全てのモーションの持続時間の合計です。
 *
 *  例 : 100, 100, 0, 0, 0, 30   // 待機動作
 *       100, 100, 0, 40, 30, 30 // 右にバウンド
 *       300, 300, 0, 0, 0, 30   // ズーム動作
 *
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 *
 *  - Custom Popup Calls
 * バトラーにカスタムポップアップエフェクトを表示する
 * スクリプトコールを行うことができます。
 *
 *  battler.callCustomPopup(text, motion, font, size, color, x, y)
 *
 *  battler : 有効な Game_Battler オブジェクト
 *  text   : 表示テキスト
 *  motion : ポップアップ効果のモーションシーケンス
 *  font  : ポップアップテキストのフォント名
 *  size  : ポップアップテキストのフォントサイズ
 *  color : ポップアップテキストのフォント色
 *  x : ポップアップ効果のオフセットX
 *  y : ポップアップ効果のオフセットY
 *
 * オフセットXとオフセットY以外の値は全て文字列でなければなりません。
 * プラグインのパラメータ設定で使用するのと同じ値を使用できます。
 * 設定を読みやすくするために、
 * ローカル変数に値を格納することが推奨されています。
 * テキストとモーション以外の値を省略できます。
 *
 *  例 :
 *   var text = 'Cancel';
 *   var motion = 'Pop High, Wait, Wait, Wait, Stretch';
 *   var font = 'this.standardFontFace()';
 *   var size = 'this.standardFontSize()';
 *   var color = '#BBFFFF';
 *   this.callCustomPopup(text, motion, font, size, color)
 *
 * **このコードはバトラーに'this'を使用していることに注意してください。
 *
 * ===========================================================================
 *  Version History:
 * ---------------------------------------------------------------------------
 *  v 1.00 - 2016.04.21 > First release.
 *  v 2.00 - 2016.04.21 > Plugin recoded, it now uses the Game Font instead of
 *                      > images for damage popup display.
 *  v 2.01 - 2016.05.09 > Fixed issue with the plugin not working without the
 *                        Control Text plugin.
 *                      > Fixed issue with MP popup display.
 *  v 2.02 - 2016.05.12 > Comatibility with Basic Module 1.20.
 *  v 2.03 - 2016.05.31 > Comatibility with Battle Motions.
 *  v 2.04 - 2017.07.20 > Fixed issue with popup not showing randomly for the
 *                        1st action.
 * ===========================================================================
 */

(function () {

    //=============================================================================
    // Parameters
    //=============================================================================

    if (Imported['VE - Basic Module']) {
        var parameters = VictorEngine.getPluginParameters();
        VictorEngine.Parameters = VictorEngine.Parameters || {};
        VictorEngine.Parameters.DamgePopup = {};
        VictorEngine.Parameters.DamgePopup.HeightAdjust = eval(parameters["Height Adjust"]);
        VictorEngine.Parameters.DamgePopup.OverlapAdjust = Number(parameters["Overlap Adjust"]) || 0;
        VictorEngine.Parameters.DamgePopup.DelayAdjust = Number(parameters["Delay Adjust"]) || 0;
        VictorEngine.Parameters.DamgePopup.Wait = String(parameters["Wait"]).trim();
        VictorEngine.Parameters.DamgePopup.Up = String(parameters["Move Up"]).trim();
        VictorEngine.Parameters.DamgePopup.Down = String(parameters["Move Down"]).trim();
        VictorEngine.Parameters.DamgePopup.Left = String(parameters["Move Left"]).trim();
        VictorEngine.Parameters.DamgePopup.Right = String(parameters["Move Right"]).trim();
        VictorEngine.Parameters.DamgePopup.Zoom = String(parameters["Zoom"]).trim();
        VictorEngine.Parameters.DamgePopup.Stretch = String(parameters["Stretch"]).trim();
        VictorEngine.Parameters.DamgePopup.Melt = String(parameters["Melt"]).trim();
        VictorEngine.Parameters.DamgePopup.PopHigh = String(parameters["Pop High"]).trim();
        VictorEngine.Parameters.DamgePopup.PopLow = String(parameters["Pop Low"]).trim();
        VictorEngine.Parameters.DamgePopup.FallHigh = String(parameters["Fall High"]).trim();
        VictorEngine.Parameters.DamgePopup.FallLow = String(parameters["Fall Low"]).trim();
        var list = ['HP Damage', 'MP Damage', 'TP Damage', 'HP Recover', 'MP Recover', 'TP Recover', 'Miss',
            'Critical', 'State Add', 'State Remove', 'Buff Add', 'Debuff Add', 'Buff Remove',
            'Counter', 'Reflect', 'Substitute', 'Weak', 'Resist', 'Immune', 'Absorb'
        ];
        for (var i = 0; i < list.length; i++) {
            var type = list[i];
            VictorEngine.Parameters.DamgePopup[type + ' Text'] = String(parameters[type + ' Text']).trim();
            VictorEngine.Parameters.DamgePopup[type + ' Fontface'] = String(parameters[type + ' Fontface']).trim();
            VictorEngine.Parameters.DamgePopup[type + ' Fontsize'] = String(parameters[type + ' Fontsize']).trim();
            VictorEngine.Parameters.DamgePopup[type + ' Color'] = String(parameters[type + ' Color']).trim();
            VictorEngine.Parameters.DamgePopup[type + ' Motion'] = String(parameters[type + ' Motion']).trim();
            VictorEngine.Parameters.DamgePopup[type + ' Flash'] = String(parameters[type + ' Flash Color']).trim();
            VictorEngine.Parameters.DamgePopup[type + ' Delay'] = Number(parameters[type + ' Delay']) || 0;
            VictorEngine.Parameters.DamgePopup[type + ' Offset X'] = Number(parameters[type + ' Offset X']) || 0;
            VictorEngine.Parameters.DamgePopup[type + ' Offset Y'] = Number(parameters[type + ' Offset Y']) || 0;
            VictorEngine.Parameters.DamgePopup[type + ' Roll'] = eval(parameters[type + ' Roll'] || 'false');
        }
        var list = ['Wait', 'Move Up', 'Move Down', 'Move Left', 'Move Right', 'Zoom', 'Stretch', 'Melt',
            'Pop High', 'Pop Low', 'Fall High', 'Fall Low'
        ];
        for (var i = 0; i < list.length; i++) {
            var type = list[i];
            VictorEngine.Parameters.DamgePopup[type] = String(parameters[type]).trim();
        }
        for (var i = 1; i < 21; i++) {
            var type = list[i];
            VictorEngine.Parameters.DamgePopup['Custom ' + String(i)] = String(parameters['Custom ' + String(i)]).trim();
        }
    }

    //=============================================================================
    // VictorEngine
    //=============================================================================

    VictorEngine.DamgePopup.loadParameters = VictorEngine.loadParameters;
    VictorEngine.loadParameters = function () {
        VictorEngine.DamgePopup.loadParameters.call(this);
        VictorEngine.DamgePopup.processParameters();
    };

    VictorEngine.DamgePopup.loadNotetagsValues = VictorEngine.loadNotetagsValues;
    VictorEngine.loadNotetagsValues = function (data, index) {
        VictorEngine.DamgePopup.loadNotetagsValues.call(this, data, index);
        if (this.objectSelection(index, ['state'])) {
            VictorEngine.DamgePopup.loadNotes1(data);
        }
        if (this.objectSelection(index, ['actor', 'enemy'])) {
            VictorEngine.DamgePopup.loadNotes2(data);
        }
    };

    VictorEngine.DamgePopup.processParameters = function () {
        if (!this.loaded) {
            this.loaded = true;
            this.processPopup();
            this.processMotions();
        }
    };

    VictorEngine.DamgePopup.loadNotes1 = function (data) {
        data.hidePopup = data.hidePopup || {};
        data.hidePopup.add = !!data.note.match(/<hide add popup>/i);
        data.hidePopup.rmv = !!data.note.match(/<hide remove popup>/i);
    };

    VictorEngine.DamgePopup.loadNotes2 = function (data) {
        data.popupOffset = data.popupOffset || {
            x: 0,
            y: 0
        };
        var regex = new RegExp('<popup offset[ ]*:[ ]*(\\d+)[ ]*,[ ]*(\\d+)[ ]*>', 'gi');
        while (match = regex.exec(data.note)) {
            data.popupOffset.x = Number(match[1]);
            data.popupOffset.y = Number(match[2]);
        };
    };

    VictorEngine.DamgePopup.processPopup = function () {
        this.popup = {};
        var list = ['HP Damage', 'MP Damage', 'TP Damage', 'HP Recover', 'MP Recover', 'TP Recover', 'Miss',
            'Critical', 'State Add', 'State Remove', 'Buff Add', 'Debuff Add', 'Buff Remove',
            'Counter', 'Reflect', 'Substitute', 'Weak', 'Resist', 'Immune', 'Absorb'
        ];
        for (var i = 0; i < list.length; i++) {
            this.popup[list[i]] = this.setupPopup(list[i]);
        }
    };

    VictorEngine.DamgePopup.processMotions = function () {
        var parameters = VictorEngine.Parameters.DamgePopup;
        this.motions = {};
        var list = ['Wait', 'Move Up', 'Move Down', 'Move Left', 'Move Right', 'Zoom',
            'Stretch', 'Melt', 'Pop High', 'Pop Low', 'Fall High', 'Fall Low'
        ];
        for (var i = 0; i < list.length; i++) {
            this.motions[list[i].toLowerCase()] = this.setupMotions(parameters[list[i]]);
        }
        for (var i = 1; i < 21; i++) {
            this.motions['custom ' + String(i)] = this.setupMotions(parameters['Custom ' + String(i)]);
        }
    };

    VictorEngine.DamgePopup.setupPopup = function (type) {
        var parameters = VictorEngine.Parameters.DamgePopup;
        var result = {};
        var motion = parameters[type + ' Motion'];
        result.list = motion.split(/\s*[,;]\s*/).map(function (value) {
            return value.toLowerCase()
        });
        result.text = parameters[type + ' Text'];
        result.font = parameters[type + ' Fontface'];
        result.size = parameters[type + ' Fontsize'];
        result.roll = parameters[type + ' Roll'];
        result.delay = parameters[type + ' Delay'];
        result.color = parameters[type + ' Color'];
        result.flash = parameters[type + ' Flash'];
        result.x = parameters[type + ' Offset X'];
        result.y = parameters[type + ' Offset Y'];
        return result;
    };

    VictorEngine.DamgePopup.setupMotions = function (motion) {
        var result = {};
        var list = motion.split(/\s*[,;]\s*/);
        result.zoom = {
            x: Number(list[0]) || 100,
            y: Number(list[1]) || 100
        };
        result.move = {
            x: Number(list[2]) || 0,
            y: Number(list[3]) || 0
        };
        result.gravity = Number(list[4]) || 0;
        result.duration = Math.max(Number(list[5]), 1) || 20;
        return result;
    };

    //=============================================================================
    // BattleManager
    //=============================================================================

    VictorEngine.DamgePopup.invokeCounterAttack = BattleManager.invokeCounterAttack;
    BattleManager.invokeCounterAttack = function (subject, target) {
        target.requestReactionPopup('Counter');
        VictorEngine.DamgePopup.invokeCounterAttack.call(this, subject, target);
    };

    VictorEngine.DamgePopup.invokeMagicReflection = BattleManager.invokeMagicReflection;
    BattleManager.invokeMagicReflection = function (subject, target) {
        target.requestReactionPopup('Reflect');
        VictorEngine.DamgePopup.invokeMagicReflection.call(this, subject, target);
    };

    VictorEngine.DamgePopup.applySubstitute = BattleManager.applySubstitute;
    BattleManager.applySubstitute = function (target) {
        var substitute = VictorEngine.DamgePopup.applySubstitute.call(this, target);
        if (target !== substitute) {
            target.requestReactionPopup('Substitute');
        }
        return substitute;
    };

    //=============================================================================
    // Game_Action
    //=============================================================================

    VictorEngine.DamgePopup.calcElementRate = Game_Action.prototype.calcElementRate;
    Game_Action.prototype.calcElementRate = function (target) {
        var result = VictorEngine.DamgePopup.calcElementRate.call(this, target);
        if (result > 1) {
            this._resist = 'Weak';
        } else if (result > 0 && result < 1) {
            this._resist = 'Resist';
        } else if (result === 0) {
            this._resist = 'Immune';
        } else if (result < 0) {
            this._resist = 'Absorb';
        } else {
            this._resist = ''
        }
        return result
    };

    VictorEngine.DamgePopup.executeDamage = Game_Action.prototype.executeDamage;
    Game_Action.prototype.executeDamage = function (target, value) {
        VictorEngine.DamgePopup.executeDamage.call(this, target, value);
        var result = target.result();
        if (value > 0 && result.critical) {
            result.resist = 'Critical';
        } else if (this._resist !== 'Absorb' && value >= 0) {
            result.resist = this._resist;
        } else if (this._resist === 'Absorb' && value < 0) {
            result.resist = 'Absorb';
        }
    };

    //=============================================================================
    // Game_ActionResult
    //=============================================================================

    VictorEngine.DamgePopup.clear = Game_ActionResult.prototype.clear;
    Game_ActionResult.prototype.clear = function () {
        VictorEngine.DamgePopup.clear.call(this);
        this.mpAffected = false;
        this.tpAffected = false;
        this.resist = '';
    };

    //=============================================================================
    // Game_Battler
    //=============================================================================

    VictorEngine.DamgePopup.gainMp = Game_Battler.prototype.gainMp;
    Game_Battler.prototype.gainMp = function (value) {
        this._result.mpAffected = true;
        VictorEngine.DamgePopup.gainMp.call(this, value);
    };

    VictorEngine.DamgePopup.gainTp = Game_Battler.prototype.gainTp;
    Game_Battler.prototype.gainTp = function (value) {
        this._result.tpAffected = true;
        VictorEngine.DamgePopup.gainTp.call(this, value);
    };

    Game_Battler.prototype.requestReactionPopup = function (reaction) {
        this._reactionPopup = reaction;
    };

    Game_Battler.prototype.reactionPopup = function () {
        return this._reactionPopup;
    };

    Game_Battler.prototype.clearReactionPopup = function () {
        this._reactionPopup = '';
    };

    Game_Battler.prototype.callCustomPopup = function (text, motion, font, size, color, x, y) {
        var result = {};
        result.list = motion.split(/\s*[,;]\s*/).map(function (value) {
            return value.toLowerCase()
        });
        result.text = String(text).trim();
        result.font = String(font) || 'this.standardFontFace()';
        result.size = String(size) || 'this.standardFontSice()';
        result.color = String(color) || 'this.normalColor()';
        result.x = Number(x) || 0;
        result.y = Number(y) || 0;
        this._customPopup = result;
    };

    Game_Battler.prototype.customPopup = function () {
        return this._customPopup;
    };

    Game_Battler.prototype.clearCustomPopup = function () {
        this._customPopup = null;
    };

    //=============================================================================
    // Game_Actor
    //=============================================================================

    Game_Actor.prototype.popupOffset = function () {
        return this.actor() ? this.actor().popupOffset : {
            x: 0,
            y: 0
        };
    };

    //=============================================================================
    // Game_Enemy
    //=============================================================================

    Game_Enemy.prototype.popupOffset = function () {
        return this.enemy() ? this.enemy().popupOffset : {
            x: 0,
            y: 0
        };
    };

    //=============================================================================
    // Sprite_Battler
    //=============================================================================

    /* Overwritten function */
    Sprite_Battler.prototype.setupDamagePopup = function () {
        if (this._battler.isDamagePopupRequested()) {
            if (this._battler.isSpriteVisible()) {
                this.setupDamagePopupSprites();
            }
            this._battler.clearDamagePopup();
            this._battler.clearResult();
        }
        if (this._battler.reactionPopup()) {
            if (this._battler.isSpriteVisible()) {
                var type = this._battler.reactionPopup();
                this.damagePopupSprite(type);
            }
            this._battler.clearReactionPopup();
        }
        if (this._battler.customPopup()) {
            if (this._battler.isSpriteVisible()) {
                var value = this._battler.customPopup();
                this.damagePopupSprite('Custom', value);
            }
            this._battler.clearCustomPopup();
        }
    };

    VictorEngine.DamgePopup.initMembers = Sprite_Battler.prototype.initMembers;
    Sprite_Battler.prototype.initMembers = function () {
        VictorEngine.DamgePopup.initMembers.call(this);
        this._damageDelay = 0
        this._damageSprites = 0;
    };

    VictorEngine.DamgePopup.update = Sprite_Battler.prototype.update;
    Sprite_Battler.prototype.update = function () {
        VictorEngine.DamgePopup.update.call(this);
        if (this._damages.length === 0) {
            this._damageSprites = 0;
        }
        if (this._battler && !this._popupTest) {
            this.popupTest();
        }
    };

    Sprite_Battler.prototype.popupTest = function () {
        var value = {
            damage: 0,
            resist: ''
        };
        this.damagePopupSprite('Popup Test', value);
        this._popupTest = true;
    };

    Sprite_Battler.prototype.setupDamagePopupSprites = function () {
        this._damageDelay = 0;
        var result = this._battler.result();
        if (result.missed || result.evaded) {
            this.damagePopupSprite('Miss');
        }
        if (result.tpAffected) {
            this.tpDamagePopup(result);
        }
        if (result.mpAffected) {
            this.mpDamagePopup(result);
        }
        if (result.hpAffected) {
            this.hpDamagePopup(result);
        }
        this.addStatesPopup(result.addedStates);
        this.removeStatesPopup(result.removedStates);
        this.addBuffsPopup(result.addedBuffs);
        this.addDebuffsPopup(result.addedDebuffs);
        this.removeBuffsPopup(result.removedBuffs);
    };

    Sprite_Battler.prototype.tpDamagePopup = function (result) {
        var type = result.tpDamage < 0 ? 'TP Recover' : 'TP Damage';
        var value = {
            damage: result.tpDamage,
            resist: result.resist
        };
        this.damagePopupSprite(type, value);
    };

    Sprite_Battler.prototype.mpDamagePopup = function (result) {
        var type = result.mpDamage < 0 ? 'MP Recover' : 'MP Damage';
        var value = {
            damage: result.mpDamage,
            resist: result.resist
        };
        this.damagePopupSprite(type, value);
    };

    Sprite_Battler.prototype.hpDamagePopup = function (result) {
        var type = result.hpDamage < 0 ? 'HP Recover' : 'HP Damage';
        var value = {
            damage: result.hpDamage,
            resist: result.resist
        };
        this.damagePopupSprite(type, value);
    };

    Sprite_Battler.prototype.addStatesPopup = function (states) {
        states.forEach(function (id) {
            var state = $dataStates[id];
            var value = {
                name: state.name,
                icon: state.iconIndex
            }
            if (!state.hidePopup.add) {
                this.damagePopupSprite('State Add', value);
            }
        }, this);
    };

    Sprite_Battler.prototype.removeStatesPopup = function (states) {
        states.forEach(function (id) {
            var state = $dataStates[id];
            var value = {
                name: state.name,
                icon: state.iconIndex
            };
            if (!state.hidePopup.rmv) {
                this.damagePopupSprite('State Remove', value);
            }
        }, this);
    };

    Sprite_Battler.prototype.addBuffsPopup = function (buffs) {
        buffs.forEach(function (id) {
            var level = this._battler._buffs[id];
            var name = VictorEngine.paramName(id);
            var icon = this._battler.buffIconIndex(level > 0 ? level : 1, id);
            var value = {
                name: name,
                icon: icon,
                level: level
            };
            this.damagePopupSprite('Buff Add', value);
        }, this);
    };

    Sprite_Battler.prototype.addDebuffsPopup = function (buffs) {
        buffs.forEach(function (id) {
            var level = this._battler._buffs[id];
            var name = VictorEngine.paramName(id);
            var icon = this._battler.buffIconIndex(level < 0 ? level : -1, id);
            var value = {
                name: name,
                icon: icon,
                level: level
            };
            this.damagePopupSprite('Debuff Add', value);
        }, this);
    };

    Sprite_Battler.prototype.removeBuffsPopup = function (buffs) {
        buffs.forEach(function (id) {
            var name = VictorEngine.paramName(id);
            var icon = this._battler.buffIconIndex(1, icon);
            var value = {
                name: name,
                icon: icon
            };
            this.damagePopupSprite('Buff Remove', value);
        }, this);
    };

    Sprite_Battler.prototype.damagePopupSprite = function (type, value) {
        var sprite = new Sprite_CustomDamage();
        var delay = VictorEngine.Parameters.DamgePopup.DelayAdjust;
        var offset = this._battler.popupOffset();
        var overlap = VictorEngine.Parameters.DamgePopup.OverlapAdjust * this._damageSprites;
        var adjust = VictorEngine.Parameters.DamgePopup.HeightAdjust ? this.center().y : 8;
        sprite.x = this.x + (this._battler.isFacingRight() ? -offset.x : offset.x);
        sprite.y = this.y + this.damageOffsetY() + offset.y + overlap - adjust;
        sprite.delay(this._damageDelay);
        sprite.setup(this._battler, type, value);
        this._damages.push(sprite);
        this.parent.addChild(sprite);
        this._damageSprites++;
        this._damageDelay += VictorEngine.Parameters.DamgePopup.DelayAdjust;
    };

})();

//=============================================================================
// Window_DamageSprite
//=============================================================================

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

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

(function () {

    Window_DamageSprite.prototype.initialize = function (sprite) {
        this._sprite = sprite;
        Window_Base.prototype.initialize.call(this);
        this.opacity = 0;
    };

    Window_DamageSprite.prototype.spriteFontface = function () {
        return eval(this._sprite.font);
    };

    Window_DamageSprite.prototype.spriteFontsize = function () {
        return eval(this._sprite.size);
    };

    Window_DamageSprite.prototype.spriteFontColor = function () {
        return eval(this.getFontColor(this._sprite.color));
    };

    Window_DamageSprite.prototype.textHeight = function () {
        return Math.max(this.spriteFontsize() + 12, Window_Base._iconHeight);
    };

    Window_DamageSprite.prototype.resetFontSettings = function () {
        this.contents.fontFace = this.spriteFontface();
        this.contents.fontSize = this.spriteFontsize();
        this.changeTextColor(this.spriteFontColor())
        this.contents.outlineColor = 'rgba(0, 0, 0, 1)';
        this.contents.outlineWidth = 5;
    };

    Window_DamageSprite.prototype.processDrawIcon = function (iconIndex, textState) {
        this.drawIcon(iconIndex, textState.x + 2, textState.y - 2);
        textState.x += Window_Base._iconWidth + 4;
    };

})();

//=============================================================================
// Sprite_CustomDamage
//=============================================================================

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

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

(function () {

    Sprite_CustomDamage.prototype.initialize = function () {
        Sprite.prototype.initialize.call(this);
        this._textStep = 0;
        this._digitStep = 0;
        this._digitDelay = 0
        this._texts = [];
        this._digits = [];
        this._random = [];
        this._textMotion = [];
        this._digitMotion = [];
        this._flashColor = [0, 0, 0, 0];
        this._flashDuration = 0;
    };

    Sprite_CustomDamage.prototype.delay = function (delay) {
        this._delay = delay;
    };

    Sprite_CustomDamage.prototype.damageDigits = function (type) {
        return (type === 'HP Damage' || type === 'MP Damage' || type === 'TP Damage' ||
            type === 'HP Recover' || type === 'MP Recover' || type === 'TP Recover' ||
            type === 'Popup Test');
    };

    Sprite_CustomDamage.prototype.setup = function (target, type, value) {
        this._invert = target.isFacingRight();
        this._value = value || {};
        this._type = type;
        if (this.damageDigits(this._type)) {
            if (value.resist) {
                this.createText(value.resist);
            }
            this.createDigits(this._type)
        }
        this.createText(this._type);
        this.setupDuration();
        this.setupSpriteAdjust(target);
        this.setupFlashEffect();
    };

    Sprite_CustomDamage.prototype.setupSpriteAdjust = function (target) {
        this._mainSpriteX = target.mainSprite() ? (target.mainSprite().x || 0) : 0
        this._mainSpriteY = target.mainSprite() ? (target.mainSprite().y || 0) : 0
    };

    Sprite_CustomDamage.prototype.setupFlashEffect = function () {
        var resist = this._value.resist;
        var sprite = this._texts[0];
        if (resist && sprite) {
            var hex = sprite.setup.flash;
            if (hex) {
                var color = VictorEngine.hexToRgb(eval(sprite.window.getFontColor(hex)));
                if (color) {
                    color.push(160);
                    this._flashColor = color;
                    this._flashDuration = Math.floor(this._starting * 2 / 3);
                }
            }
        }
    };

    Sprite_CustomDamage.prototype.popupMotion = function (type) {
        type = type === 'Popup Test' ? 'HP Damage' : type;
        return type === 'Custom' ? this._value : VictorEngine.DamgePopup.popup[type];
    };

    Sprite_CustomDamage.prototype.motions = function (type) {
        var motion = VictorEngine.DamgePopup.motions;
        return motion[type] || motion['wait'];
    };

    Sprite_CustomDamage.prototype.setupDuration = function () {
        var textDuration = this.getDuration(this._texts) || 0;
        var digitDuration = this.getDuration(this._digits) || 0;
        this._duration = Math.max(textDuration, digitDuration) + this._digitDelay;
        this._starting = this._duration;
        for (var i = 0; i < this._texts.length; i++) {
            this._texts[i].duration = textDuration;
            this._texts[i].starting = textDuration;
        }
        for (var i = 0; i < this._digits.length; i++) {
            this._digits[i].duration = digitDuration;
            this._digits[i].starting = digitDuration;
        }
    };

    Sprite_CustomDamage.prototype.getDuration = function (sprites) {
        return sprites.map(function (sprite) {
            return this.getSpriteDuration(sprite);
        }, this).sort(function (a, b) {
            return a - b
        })[0];
    };

    Sprite_CustomDamage.prototype.getSpriteDuration = function (sprite) {
        var result = 0;
        var object = this;
        return sprite.motion.reduce(function (r, type) {
            var motion = object.motions(type) || {};
            return r + (motion.duration || 0);
        }, sprite.delay);
    };

    Sprite_CustomDamage.prototype.createDigits = function (type) {
        var setup = this.popupMotion(type);
        var motion = setup.list.clone();
        var delay = setup.delay || 0;
        var string = Math.abs(this._value.damage).toString();
        for (var i = 0; i < string.length; i++) {
            var sprite = this.createDigitSprite(setup, motion);
            var width = sprite.window.textWidthEx('0');
            var n = Number(string[i]);
            this._random[i] = 0;
            sprite.sx = (i - (string.length - 1) / 2) * width;
            sprite.sy = 0;
            sprite.digit = n;
            sprite.delay = delay < 0 ? Math.abs(delay) * (string.length - i) : delay * i;
            this.setupDigits(sprite, i);
        }
    };

    Sprite_CustomDamage.prototype.createText = function (type) {
        var setup = this.popupMotion(type);
        var list = setup.list.clone();
        var text = this.setupSpriteText(type, setup);
        var sprite = this.createTextSprite(setup, list);
        this.drawSpriteText(sprite, type, text)
    };

    Sprite_CustomDamage.prototype.setupSpriteText = function (type, setup) {
        var value = this._value;
        if (value.text) {
            return value.text;
        } else {
            var text = setup.text;
            if (type === 'State Add' || type === 'State Remove') {
                text = text.format(value.name, '\\i[' + String(value.icon) + ']');
            }
            if (type === 'Buff Add' || type === 'Debuff Add' || type === 'Buff Remove') {
                text = text.format(value.name, '\\i[' + String(value.icon) + ']', String(value.level));
            }
            return text;
        }
    };

    Sprite_CustomDamage.prototype.drawSpriteText = function (sprite, type, text) {
        var window = sprite.window;
        var padding = window.standardPadding() * 2 + 4;
        if (this.damageDigits(type)) {
            var width = window.textWidthEx('0') * this._digits.length;
            var list = text.split('%1');
            var w1 = window.textWidthEx(list[0]) + width;
            var w2 = window.textWidthEx(list[1]) + padding + w1;
            var h = window.textHeight() + padding;
            window.move(0, 0, w2, h);
            window.createContents();
            window.drawTextEx(list[0], 2, 2);
            window.drawTextEx(list[1], w1 + 2, 2);
            sprite.bitmap = window.contents;
            sprite.anchor.x = 0;
            sprite.sx = width / 2 - w1;
            sprite.sy = 0;
        } else {
            var w = window.textWidthEx(text) + padding;
            var h = window.textHeight() + padding;
            window.move(0, 0, w, h);
            window.createContents();
            window.drawTextEx(text, 2, 2);
            sprite.bitmap = window.contents;
            sprite.sx = 0;
            sprite.sy = 0;
        }
    };

    Sprite_CustomDamage.prototype.refreshMotion = function (sprite) {
        var step = sprite.step || 0;
        var list = sprite.motion;
        var type = list[step];
        var next = list[step + 1];
        sprite.text = {};
        sprite.text.steps = list.length;
        sprite.text.motion = this.motions(type) || {};
        sprite.text.duration = sprite.text.motion.duration || 0;
        sprite.text.starting = sprite.text.motion.duration || 0;
        var motion = !step && next ? this.motions(next) : sprite.text.motion;
        sprite.text.zoom = {
            x: motion.zoom.x / 100,
            y: motion.zoom.y / 100
        };
        sprite.step = step + 1;
    };

    Sprite_CustomDamage.prototype.setupDigits = function (sprite, i) {
        var window = sprite.window
        var padding = window.standardPadding() * 2 + 4;
        var w = window.textWidthEx('0') + padding;
        var h = window.textHeight() + padding;
        var roll = sprite.setup.roll && sprite.duration >= sprite.starting / 2;
        var n = roll ? (this._random[i] + Math.randomInt(9) + 1) % 10 : sprite.digit;
        var row = sprite.baseRow;
        this._random[i] = n;
        window.move(0, 0, w, h);
        window.createContents();
        window.drawTextEx(String(n), 2, 2);
        sprite.bitmap = window.contents;
    };

    Sprite_CustomDamage.prototype.createTextSprite = function (setup, motion) {
        var sprite = this.createChildSprite(setup, motion);
        this._texts.push(sprite)
        return sprite;
    };

    Sprite_CustomDamage.prototype.createDigitSprite = function (setup, motion) {
        var sprite = this.createChildSprite(setup, motion);
        this._digits.push(sprite)
        return sprite;
    };

    Sprite_CustomDamage.prototype.createChildSprite = function (setup, motion) {
        var sprite = new Sprite();
        sprite.motion = motion;
        sprite.setup = setup;
        this.refreshMotion(sprite);
        sprite.anchor.x = 0.5;
        sprite.anchor.y = 0.5;
        sprite.opacity = 0;
        sprite.delay = 0;
        sprite.mx = setup.x;
        sprite.my = setup.y;
        sprite.scale.x = sprite.text.motion.zoom.x / 100;
        sprite.scale.y = sprite.text.motion.zoom.y / 100;
        sprite.x = Math.floor(sprite.sx + sprite.mx);
        sprite.y = Math.floor(sprite.sy + sprite.my);
        sprite.window = new Window_DamageSprite(setup);
        this.addChild(sprite);
        return sprite;
    };

    Sprite_CustomDamage.prototype.update = function () {
        if (this._delay > 0) {
            this._delay--;
        } else {
            Sprite.prototype.update.call(this);
            if (this._duration > 0) {
                this._duration--;
                if (this._texts.length > 0) this.updateTexts();
                if (this._digits.length > 0) this.updateDigits();
                this.updateFlash();
            }
        }
    };

    Sprite_CustomDamage.prototype.updateTexts = function (sprite) {
        for (var i = 0; i < this._texts.length; i++) {
            var sprite = this._texts[i];
            this.updateChild(sprite);
            if (sprite.text.duration === 0) this.refreshMotion(sprite);
        }
    };

    Sprite_CustomDamage.prototype.updateDigits = function () {
        var length = this._digits.length;
        for (var i = 0; i < this._digits.length; i++) {
            var sprite = this._digits[i];
            this.updateChild(sprite);
            sprite.setBlendColor(this._flashColor);
            if (sprite.setup.roll && sprite.text.duration % 4 === 0) this.setupDigits(sprite, i);
            if (sprite.text.duration === 0) this.refreshMotion(sprite);
        }
    };

    Sprite_CustomDamage.prototype.updateChild = function (sprite) {
        if (sprite.delay > 0) {
            sprite.delay--
        } else if (sprite.duration > 0) {
            sprite.duration--;
            sprite.text.duration--;
            this.updateMove(sprite);
            this.updateZoom(sprite);
            this.updateOpacity(sprite);
        }
    };

    Sprite_CustomDamage.prototype.updateFlash = function () {
        if (this._flashDuration > 0) {
            var d = this._flashDuration--;
            this._flashColor[3] *= (d - 1) / d;
        }
    };

    Sprite_CustomDamage.prototype.updateOpacity = function (sprite) {
        if (sprite.duration >= sprite.starting - 10) {
            sprite.opacity = 255 * (sprite.starting - sprite.duration) / 10;
        }
        if (sprite.duration < 10) {
            sprite.opacity = 255 * sprite.duration / 10;
        }
        if (this._type === 'Popup Test') {
            sprite.opacity = 0;
        }
    };

    Sprite_CustomDamage.prototype.updateZoom = function (sprite) {
        var d = sprite.text.duration;
        if (d > 0) {
            sprite.scale.x = (sprite.scale.x * (d - 1) + sprite.text.zoom.x) / d;
            sprite.scale.y = (sprite.scale.y * (d - 1) + sprite.text.zoom.y) / d;
        }
    };

    Sprite_CustomDamage.prototype.updateMove = function (sprite) {
        sprite.mx += this.updateMoveX(sprite);
        sprite.my += this.updateMoveY(sprite);
        sprite.x = Math.floor(sprite.sx + sprite.mx + this._mainSpriteX);
        sprite.y = Math.floor(sprite.sy + sprite.my + this._mainSpriteY);
    };

    Sprite_CustomDamage.prototype.updateMoveX = function (sprite) {
        var invert = this._invert ? -1 : 1;
        var duration = sprite.text.duration;
        var starting = sprite.text.starting;
        var gravity = sprite.text.motion.gravity;
        var result = sprite.text.motion.move.x * invert / starting;
        if (gravity > 0) {
            result *= 0.2 + (1.8 * duration / starting);
        } else if (gravity < 0) {
            result *= 0.2 + (1.8 * (starting - duration) / starting);
        }
        return result
    };

    Sprite_CustomDamage.prototype.updateMoveY = function (sprite) {
        var duration = sprite.text.duration;
        var starting = sprite.text.starting;
        var gravity = 2 * sprite.text.motion.gravity / starting;
        var result = sprite.text.motion.move.y / starting;
        if (gravity < 0) {
            result += gravity * duration / starting;
        } else if (gravity > 0) {
            result += gravity * (starting - duration) / starting;
        }
        return result
    };

    Sprite_CustomDamage.prototype.isPlaying = function () {
        return this._duration > 0 || this._delay > 0;
    };

})();