//=============================================================================
// MOG_DmgPopupEffects.js
//=============================================================================
/*:
 * @plugindesc (v1.0) Adiciona alguns efeitos nos sprites do dano.
 * @author Moghunter
 *
 * @param Duration
 * @desc Duração do dano.
 * @default 90
 *
 * @param PopUp Type
 * @desc Tipo de Animação.
 * 0 - Bouncing    1 - Flying 
 * @default 0 
 *
 * @param Zoom Effect
 * @desc Ativar efeito de Zoom.
 * @default true
 *
 * @param Center Y-Axis
 * @desc Centralizar a posição do dano baseado na altura do battler.
 * @default true  
 *
 * @help  
 * =============================================================================
 * +++ MOG - Damage Popup Effects (v1.0) +++
 * By Moghunter 
 * https://atelierrgss.wordpress.com/
 * =============================================================================
 * Adiciona alguns efeitos nos sprites do dano e novas Strings.
 *
 * É necessário que a imagem tenha a altura dividida por 8 para que as imagens
 * fiquem alinhadas. (O padrão é 5)
 *
 * =============================================================================
 * É possível ajustar a posição do dano usando o comentário abaixo na 
 * caixa de notas.
 *
 *   Damage Offset: X:Y 
 *
 * Exemplo
 *
 *   Damage Offset: 60:20
 *
 */

//=============================================================================
// ** PLUGIN PARAMETERS
//=============================================================================
　　var Imported = Imported || {};
　　Imported.MOG_DmgPopupEffects = true;
　　var Moghunter = Moghunter || {}; 

    Moghunter.parameters = PluginManager.parameters('MOG_DmgPopupEffects');
	Moghunter.dmgp_duration = Number(Moghunter.parameters['Duration'] || 90);
	Moghunter.dmgp_popup_type = Number(Moghunter.parameters['PopUp Type'] || 0);
	Moghunter.dmgp_zoom_effect = String(Moghunter.parameters['Zoom Effect'] || "true");
	Moghunter.dmgp_center_y = String(Moghunter.parameters['Center Y-Axis'] || "true");
	
//=============================================================================
// ** Game Action Result
//=============================================================================

//==============================
// ** Clear
//==============================
var _mog_dmgpop_gaction_clear = Game_ActionResult.prototype.clear
Game_ActionResult.prototype.clear = function() {
	_mog_dmgpop_gaction_clear.call(this);
	this.counter = false;
	this.reflection = false;
};

//=============================================================================
// ** Game Battler
//=============================================================================
var _mog_dmgpop_gbat_initMembers = Game_Battler.prototype.initMembers;
Game_Battler.prototype.initMembers = function() {
	_mog_dmgpop_gbat_initMembers.call(this);
	this._dmgOffsetX = 0;
	this._dmgOffsetY = 0;
};

//==============================
// ** perform Counter
//==============================
var _mog_dmgpop_gbat_performCounter = Game_Battler.prototype.performCounter;
Game_Battler.prototype.performCounter = function() {
    _mog_dmgpop_gbat_performCounter.call(this);
	this.startDamagePopup();
	this._result.counter = true;
};

//==============================
// ** perform Reflection
//==============================
var _mog_dmgpop_gbat_performReflection = Game_Battler.prototype.performReflection;
Game_Battler.prototype.performReflection = function() {
	_mog_dmgpop_gbat_performReflection.call(this);
	this.startDamagePopup();
	this._result.reflection = true;
};

//==============================
// * Notetags
//==============================
Game_Battler.prototype.notetags = function() {
	if (this.isEnemy()) {return this.enemy().note.split(/[\r\n]+/)};
	if (this.isActor()) {return this.actor().note.split(/[\r\n]+/)};
};

//==============================
// * setDmgOffset
//==============================
Game_Battler.prototype.setDmgOffset = function() {
    this.notetags().forEach(function(note) {var note_data = note.split(': ');
		 if (note_data[0].toLowerCase() == "damage offset"){
			 var par = note_data[1].split(':');
		     this._dmgOffsetX = Number(par[0]);
		     this._dmgOffsetY = Number(par[1]);
	}
	},this);	
};

//=============================================================================
// ** Game Actor
//=============================================================================	

//==============================
// * Setup
//==============================
var _mog_dmgpop_gact_setup = Game_Actor.prototype.setup;
Game_Actor.prototype.setup = function(actorId) {
	_mog_dmgpop_gact_setup.call(this,actorId);
	this.setDmgOffset();
};

//=============================================================================
// ** Game Enemy
//=============================================================================	

//==============================
// * Setup
//==============================
var _mog_dmgpop_gemy_setup = Game_Enemy.prototype.setup; 
Game_Enemy.prototype.setup = function(enemyId, x, y) {
	_mog_dmgpop_gemy_setup.call(this,enemyId, x, y);
	this.setDmgOffset();
};


//=============================================================================
// ** Sprite Damage
//=============================================================================

//==============================
// ** initialize
//==============================
var _mog_dmgpopeffect_sprit_dmg_initialize = Sprite_Damage.prototype.initialize;
Sprite_Damage.prototype.initialize = function() {
     _mog_dmgpopeffect_sprit_dmg_initialize.call(this);
	 this._duration = Math.min(Math.max(Moghunter.dmgp_duration,10),999);
	 this._zoomEffect = String(Moghunter.dmgp_zoom_effect) === "true" ? true : false;
	 this._animeType = Math.min(Math.max(Moghunter.dmgp_popup_type,0),2);
	 this._damage = [0,0];
};

//==============================
// ** Setup
//==============================
var _mog_dmgpop_sprdmg_setup = Sprite_Damage.prototype.setup;
Sprite_Damage.prototype.setup = function(target) {
	_mog_dmgpop_sprdmg_setup.call(this,target);
	var result = target.result();
	if (result.counter) {this.createCounter()
    } else if (result.reflection) {this.createReflection()};
};

//==============================
// ** Create Miss
//==============================
Sprite_Damage.prototype.createMiss = function() {
    var w = this.digitWidth();
    var h = this.digitHeight();
    var sprite = this.createChildSprite();
    sprite.setFrame(0, 4 * h, 10 * w, h);
    sprite.dy = 0;
	sprite.x = (6 * w) / 2;
};

//==============================
// ** Create Critical
//==============================
Sprite_Damage.prototype.createCritical = function() {
	var w = this.digitWidth();
    var h = this.digitHeight();
    var sprite = this.createChildSprite();
    sprite.setFrame(0, 5 * h, 10 * w, h);
    sprite.dy = 0;
	sprite.yf2 = h + 5;
	if (this._zoomEffect && this._animeType === 1) {
		sprite.yf3 = 16;
	    sprite.rotation = 0.1;
	};
	sprite.x = (5 * w) / 2;
};

//==============================
// ** Create Counter
//==============================
Sprite_Damage.prototype.createCounter = function() {
    var w = this.digitWidth();
    var h = this.digitHeight();
    var sprite = this.createChildSprite();
    sprite.setFrame(0, 6 * h, 10 * w, h);
    sprite.dy = 0;
	sprite.x = (5 * w) / 2;
};

//==============================
// ** Create Reflect
//==============================
Sprite_Damage.prototype.createReflection = function() {
    var w = this.digitWidth();
    var h = this.digitHeight();
    var sprite = this.createChildSprite();
    sprite.setFrame(0, 7 * h, 10 * w, h);
    sprite.dy = 0;
	sprite.x = (5 * w) / 2;
};

//==============================
// ** CreateChild Sprite
//==============================
Sprite_Damage.prototype.createChildSprite = function() {
    var sprite = new Sprite();
    sprite.bitmap = this._damageBitmap;
    this.setBaseData(sprite);
	return sprite;
};

//==============================
// ** set Base Data
//==============================
Sprite_Damage.prototype.setBaseData = function(sprite) {
	sprite.anchor.x = 0.5;
	sprite.anchor.y = 1;
    sprite.y = -40;	
	sprite.zt = 0;
    sprite.ry = sprite.y;
	sprite.yf = 0;
	sprite.yf2 = 0;
	sprite.yf3 = 0;
	sprite.ex = false;
    this.addChild(sprite);
};

//==============================
// ** Setup Critical Effect
//==============================
var _mog_sprtdmb_setupCriticalEffect = Sprite_Damage.prototype.setupCriticalEffect;
Sprite_Damage.prototype.setupCriticalEffect = function() {
	_mog_sprtdmb_setupCriticalEffect.call(this);
    this.createCritical();
};

//==============================
// ** DigiHeight
//==============================
Sprite_Damage.prototype.digitHeight = function() {
    return this._damageBitmap ? this._damageBitmap.height / 8 : 0;
};

//==============================
// ** set Zoom Effect
//==============================
Sprite_Damage.prototype.setZoomEffect = function(sprite,d,i) {
	   if (!d) {d = 0};
	   if (!i) {i = 0};
	   sprite.scale.x = 2.5;
	   sprite.scale.y = 2.5;
	   sprite.anchor.x = 0.5;
	   sprite.anchor.y = 0.5;	   
	   sprite.yf = this.digitHeight() / 2;
	   this._duration += d;
	   sprite.zt = 5 * i;
};

//==============================
// ** Update Child
//==============================
Sprite_Damage.prototype.updateChild = function(sprite) {
    sprite.setBlendColor(this._flashColor);	
    if (sprite.zt > 0) {sprite.zt -= 1; sprite.opacity = 0};
	if (sprite.zt <= 0) {this.updateDmgSpriteEffect(sprite)};
}

//==============================
// ** Update Dmg Sprite Effect
//==============================
Sprite_Damage.prototype.updateDmgSpriteEffect = function(sprite) {
	if (this._animeType === 0) {this.updateBounceEffect(sprite);
	} else {this.updateFlyEffect(sprite)}
    if (this._zoomEffect) {this.updateZoomEffect(sprite)};
};

//==============================
// ** Update Fly Effect
//==============================
Sprite_Damage.prototype.updateFlyEffect = function(sprite) {
	sprite.yf3 -= 1;
	sprite.y = - sprite.yf2 + sprite.yf3;		
	if (this._duration > 30) {sprite.opacity += 10
    } else { sprite.opacity -= 10};
};

//==============================
// ** Update Bounce Effect
//==============================
Sprite_Damage.prototype.updateBounceEffect = function(sprite) {
	sprite.opacity += 35;
	sprite.dy += 0.5;
	sprite.ry += sprite.dy;
	if (sprite.ry >= 0) {
		sprite.ry = 0;
		sprite.dy *= -0.6;
	};
	sprite.y = Math.round(sprite.ry) - sprite.yf - sprite.yf2;			
};

//==============================
// ** Update Zoom Effect
//==============================
Sprite_Damage.prototype.updateZoomEffect = function(sprite) {
	if (sprite.scale.x > 1.00) {sprite.scale.x -= 0.05};
	sprite.scale.y = sprite.scale.x;
};

//=============================================================================
// ** Sprite Battler
//=============================================================================

//==============================
// ** initMemters
//==============================
var _mog_dmgpopup_sprbat_initMembers = Sprite_Battler.prototype.initMembers;
Sprite_Battler.prototype.initMembers = function() {
	_mog_dmgpopup_sprbat_initMembers.call(this);
	this._dmgCenter = String(Moghunter.dmgp_center_y) === "true" ? true : false;
};

//=============================================================================
// ** Sprite Actor
//=============================================================================

//==============================
// ** damageOffsetX
//==============================
Sprite_Actor.prototype.damageOffsetX = function() {
    return this._battler._dmgOffsetX;
};

//==============================
// ** damageOffsetY
//==============================
Sprite_Actor.prototype.damageOffsetY = function() {
    return this._battler._dmgOffsetY;
};

//=============================================================================
// ** Sprite Enemy
//=============================================================================

//==============================
// ** damageOffsetX
//==============================
Sprite_Enemy.prototype.damageOffsetX = function() {
    return this._battler._dmgOffsetX;
};

//==============================
// ** damageOffsetY
//==============================
Sprite_Enemy.prototype.damageOffsetY = function() {
    if (this._dmgCenter && this.bitmap) {return (-this.bitmap.height / 2) + this._battler._dmgOffsetY + 16;};
	return this._battler._dmgOffsetY;
};