// DarkPlasma_LuckyShield 1.1.1
// Copyright (c) 2020 DarkPlasma

/**
 * 2021/05/24 1.1.1 エラーが出る不具合修正
 * 2021/05/22 1.1.0 ダメージ無効発生時に追加効果を防ぐように修正
 * 2021/02/13 1.0.1 回復にも反応するバグを修正
 * 2020/12/14 1.0.0 初版
 */

/*:ja
 * @plugindesc 運によるダメージ無効システム
 * @author DarkPlasma
 * @license No License
 *
 * @target MZ
 *
 * @param animation
 * @desc 効果発動時に表示するアニメーションを指定します。
 * @text アニメーション
 * @type animation
 * @default 1
 *
 * @param text
 * @desc 効果発動時に表示する文章を設定します。{target}が発動したアクターの名前になります。
 * @text 発動時テキスト
 * @type string
 * @default {target}には運良く当たらなかった
 *
 * @help
 * version: 1.1.1
 * 運によるダメージ無効システムを実現します。
 *
 * 運50ごとに1％の確率で発動し、発動すると受けるダメージが0になります。
 * この効果は味方のみ発動し、敵には発動しません。
 */

(() => {
  'use strict';

  const pluginName = document.currentScript.src.replace(/^.*\/(.*).js$/, function () {
    return arguments[1];
  });

  const pluginParameters = PluginManager.parameters(pluginName);

  const settings = {
    animation: Number(pluginParameters.animation || 1),
    text: String(pluginParameters.text || '{target}には運良く当たらなかった'),
  };

  const _Game_Action_executeDamage = Game_Action.prototype.executeDamage;
  Game_Action.prototype.executeDamage = function (target, value) {
    const result = target.result();
    result.luckyShield = value > 0 && Math.randomInt(5000) < target.luckyShieldRate();
    if (result.luckyShield) {
      value = 0;
    }
    _Game_Action_executeDamage.call(this, target, value);
  };

  const _Game_Action_applyItemEffect = Game_Action.prototype.applyItemEffect;
  Game_Action.prototype.applyItemEffect = function (target, effect) {
    if (target.result().luckyShield) {
      return;
    }
    _Game_Action_applyItemEffect.call(this, target, effect);
  };

  const _Game_ActionResult_clear = Game_ActionResult.prototype.clear;
  Game_ActionResult.prototype.clear = function () {
    _Game_ActionResult_clear.call(this);
    this.luckyShield = false;
  };

  /**
   * ダメージ無効の発動率
   * @return {number}
   */
  Game_Battler.prototype.luckyShieldRate = function () {
    return 0;
  };

  Game_Actor.prototype.luckyShieldRate = function () {
    return this.luk;
  };

  const _Window_BattleLog_displayHpDamage = Window_BattleLog.prototype.displayHpDamage;
  Window_BattleLog.prototype.displayHpDamage = function (target) {
    if (target.result().luckyShield) {
      if (settings.animation) {
        this.showNormalAnimation([target], settings.animation, false);
      }
      if (settings.text) {
        this.addText(settings.text.replace('{target}', target.name()));
      }
    } else {
      _Window_BattleLog_displayHpDamage.call(this, target);
    }
  };
})();
