# XMS.「XRXS19.DamageEX」追加パーツ
# by Tetra-Z
#
# 追加分
# ・回復かつステート変化を持つスキルで、対象のHPがフルだと使えないバグの修正
# ・「現HP威力」「減HP威力」の武器への適応
# ・「%ダメージ」「最大%ダメージ」SP版「SP%ダメージ」「最大SP%ダメージ」
# ・「現SP威力」「減SP威力」「現在SPダメージ」「差分SPダメージ」
# ・「防御能力」ランクE「SP身代わり」(オマケ、不要なら「★」を検索してコメントアウトで)
#
# 上書き : class Game_Battler
#            def set_xrxs19_special_effect(set)
#            def effect_it(user, skill = nil)

#------------------------------------------------------------------------------
# ▽ 特殊効果の設定 ( 名称設定、取得設定 ) 
#==============================================================================
module XRXS19_Fixed_Valuables
  ELEMENT_NAME_FIXDAMAGE_NOWSPP = "SP%ダメージ"     # 「  SP%ダメージ  」属性の名前
  ELEMENT_NAME_FIXDAMAGE_MAXSPP = "最大SP%ダメージ" # 「最大SP%ダメージ」属性の名前
  ELEMENT_NAME_FIXDAMAGE_USERSP = "現在SPダメージ"   # 「 現在SPダメージ 」属性の名前
  ELEMENT_NAME_FIXDAMAGE_DIFFSP = "差分SPダメージ"   # 「 差分SPダメージ 」属性の名前
end
#------------------------------------------------------------------------------
#==============================================================================
# □ 定数
#==============================================================================
module XRXS19
  FIXDAMAGE_NOWSPP = 12
  FIXDAMAGE_MAXSPP = 14
  FIXDAMAGE_USERSP = 15
  FIXDAMAGE_DIFFSP = 16
end
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
  #--------------------------------------------------------------------------
  # ○ 指定の配列の特殊効果を設定
  #--------------------------------------------------------------------------
  def set_xrxs19_special_effect(set)
    # SPダメージ (true/false)
    self.current_action.sp_damage = element_include?(set, ELEMENT_NAME_SP_DAMAGE)
    # CPダメージ (true/false)
    self.current_action.cp_damage = element_percent(set, ELEMENT_NAME_CP_DAMAGE)
    # HP/SP吸収 (数値%)
    self.current_action.hp_drain  = element_percent(set, ELEMENT_NAME_HP_DRAIN)
    self.current_action.sp_drain  = element_percent(set, ELEMENT_NAME_SP_DRAIN)
    # 必殺 (数値%)
    returnar = element_check(set, ELEMENT_NAME_CRITICAL_HIT)
    percent = returnar[0] ? (returnar[2] == 0 ? 100 : returnar[2]) : 0
    self.current_action.critical_hit = percent
    # 必中 (true/false)
    self.current_action.certain_hit = element_include?(set, ELEMENT_NAME_CERTAIN_HIT)
    # 特殊ダメージ種別
    self.current_action.special_damage_kind =
      element_include?(set, ELEMENT_NAME_NO_DAMAGE)        ? XRXS19::NO_DAMAGE :
      element_include?(set, ELEMENT_NAME_FIXDAMAGE_NOWHPP) ? XRXS19::FIXDAMAGE_NOWHPP :
      element_include?(set, ELEMENT_NAME_FIXDAMAGE_MAXHPP) ? XRXS19::FIXDAMAGE_MAXHPP :
      element_include?(set, ELEMENT_NAME_FIXDAMAGE_NOWSPP) ? XRXS19::FIXDAMAGE_NOWSPP :
      element_include?(set, ELEMENT_NAME_FIXDAMAGE_MAXSPP) ? XRXS19::FIXDAMAGE_MAXSPP :
      element_include?(set, ELEMENT_NAME_FIXDAMAGE_USERHP) ? XRXS19::FIXDAMAGE_USERHP :
      element_include?(set, ELEMENT_NAME_FIXDAMAGE_DIFFHP) ? XRXS19::FIXDAMAGE_DIFFHP :
      element_include?(set, ELEMENT_NAME_FIXDAMAGE_USERSP) ? XRXS19::FIXDAMAGE_USERSP :
      element_include?(set, ELEMENT_NAME_FIXDAMAGE_DIFFSP) ? XRXS19::FIXDAMAGE_DIFFSP :
      0
    # 固定ダメージ値
    self.current_action.fix_damage = element_amount(set, ELEMENT_NAME_FIXDAMAGE)
    # 追加分散度
    self.current_action.add_variance = element_amount(set, ELEMENT_NAME_ADD_VARIANCE)
  end
  #--------------------------------------------------------------------------
  # ○ 効果適用
  #--------------------------------------------------------------------------
  def effect_it(user, skill = nil)
    # 初期化
    user.current_action.hp_drain     = 0 if user.current_action.hp_drain.nil?
    user.current_action.sp_drain     = 0 if user.current_action.sp_drain.nil?
    user.current_action.critical_hit = 0 if user.current_action.critical_hit.nil?
    user.current_action.special_damage_kind = 0 if user.current_action.special_damage_kind.nil?
    # 実行前の数値・ステートを保持
    last_hp = self.hp
    last_sp = self.sp
    last_states = self.states.dup
    # 特殊効果:必中
    if user.current_action.certain_hit
      self.certain_hit = true
    end
    # 特殊効果:現HP威力
    if skill != nil and element_include?(user.skill_element_set(skill), "現HP威力")
      skill = skill.dup
      skill.power = (1.0 * skill.power * user.hp / user.maxhp).floor
    elsif skill == nil and element_include?(user.element_set, "現HP威力")
      user = user.dup
      user.atk = (1.0 * user.atk * user.hp / user.maxhp).floor
    end
    # 特殊効果:減HP威力
    if skill != nil and element_include?(user.skill_element_set(skill), "減HP威力")
      skill = skill.dup
      skill.power = (1.0 * skill.power * (user.maxhp - user.hp) / user.maxhp).floor
    elsif skill == nil and element_include?(user.skill_element_set(skill), "減HP威力")
      user = user.dup
      user.atk = (1.0 * user.atk * (user.maxhp - user.hp) / user.maxhp).floor
    end
    # 特殊効果:現SP威力
    if skill != nil and element_include?(user.skill_element_set(skill), "現SP威力")
      skill = skill.dup
      skill.power = (1.0 * skill.power * user.sp / user.maxsp).floor
    elsif skill == nil and element_include?(user.element_set, "現SP威力")
      user = user.dup
      user.atk = (1.0 * user.atk * user.sp / user.maxsp).floor
    end
    # 特殊効果:減SP威力
    if skill != nil and element_include?(user.skill_element_set(skill), "減SP威力")
      skill = skill.dup
      skill.power = (1.0 * skill.power * (user.maxsp - user.sp) / user.maxsp).floor
    elsif skill == nil and element_include?(user.skill_element_set(skill), "減SP威力")
      user = user.dup
      user.atk = (1.0 * user.atk * (user.maxsp - user.sp) / user.maxsp).floor
    end
    
    #/---
    # 基本実行、skill が nil かどうかで通常攻撃とスキルを分別
    save_in_battle = $game_temp.in_battle
    $game_temp.in_battle = true
    if skill == nil
      bool = xrxs19_attack_effect(user)
    else
      bool = xrxs19_skill_effect(user, skill)
    end
    $game_temp.in_battle = save_in_battle
    #---/
    
    # HP回復スキルの判定
    if skill != nil and skill.power < 0 and !user.current_action.sp_damage
      # 既に最大HPかつステート不変かどうかで有効フラグをセット
      bool = false if (last_hp == self.maxhp and last_states == self.states)
    elsif user.current_action.sp_damage # SPダメージの場合は一旦trueへ
      bool = true
    end
    # 必中の解除
    self.certain_hit = false
    #
    # --- ダメージを測定 -------------------------------------------------
    #
    damage    = self.damage
    damage_sp = 0
    #
    # --- ダメージを変化させる -------------------------------------------
    #
    # 特殊効果:消費金額に順ずる固定ダメージ
    if skill != nil and element_include?(user.skill_element_set(skill), "銭投げ")
      # ゴールドの消費
      last_gold = $game_party.gold
      $game_party.gain_gold(-1 * ($game_party.gold * skill.variance / 100 + skill.power))
      self.hp += damage if bool
      damage = last_gold - $game_party.gold
      bool = true
    end
    # 基本実行でfalseの場合ここで終了する ("銭投げ"は確実成功)
    if !bool or !damage.is_a?(Numeric)
      return bool
    end
    # 特殊効果デメリット
    if XRXS19::DEMERIT and damage > 0 and 
       (user.current_action.hp_drain > 0 or
        user.current_action.sp_drain > 0 or 
        user.current_action.critical_hit > 0)
      damage = damage * 2/3
    end
    # 特殊効果:防御能力の判定
    if damage > 0 and self.guarding?
      case battler_element_rank?(self, "防御能力")
      when 2 # 特殊効果:防御能力 2(強防御)
        damage /= 2
      when 1 # 特殊効果:防御能力 1(無効防御)
        damage = 0
      when 4
        if rand(2) > 0
          damage = 0
        else
          damage *= 2
        end
      # 防御能力E:「SP身代わり」追加分1/2ここから★
      when 5
        damage *= 2
      # 防御能力E:「SP身代わり」追加分1/2ここまで★
      when 6
        damage *= 4
      end
    end
    # 特殊効果:必殺
    if user.current_action.critical_hit > 0
      # クリティカルが発生していた場合、それを取りやめる
      if self.critical
        self.critical = false # フラグを消して
        damage /= 2           # ダメージの半分を
      end
      # クリティカル判定
      if rand(100) < user.current_action.critical_hit
        self.critical = true
        damage       *= 2
      end
    end
    # 特殊効果:固定ダメージ ( 固定ダメージ故クリティカルを禁止 )
    case user.current_action.special_damage_kind
    when XRXS19::FIXDAMAGE_NOWHPP # 「%ダメージ」
      if skill == nil
        damage = last_hp / 2 + 1
      else
        damage = last_hp * skill.power / 100
      end
      self.critical = false
    when XRXS19::FIXDAMAGE_MAXHPP # 「最大%ダメージ」
      if skill == nil
        damage = self.maxhp / 4 + 1
      else
        damage = self.maxhp * skill.power / 100
      end
      self.critical = false
    when XRXS19::FIXDAMAGE_NOWSPP # 「SP%ダメージ」
      if skill == nil
        damage = last_sp / 2 + 1
      else
        damage = last_sp * skill.power / 100
      end
      self.critical = false
    when XRXS19::FIXDAMAGE_MAXSPP # 「最大SP%ダメージ」
      if skill == nil
        damage = self.maxsp / 4 + 1
      else
        damage = self.maxsp * skill.power / 100
      end
      self.critical = false
    when XRXS19::FIXDAMAGE_USERHP # 「現在HPダメージ」
      damage = user.hp
      self.critical = false
    when XRXS19::FIXDAMAGE_DIFFHP # 「差分HPダメージ」
      damage = user.maxhp - user.hp
      self.critical = false
    when XRXS19::FIXDAMAGE_USERSP # 「現在SPダメージ」
      damage = user.sp
      self.critical = false
    when XRXS19::FIXDAMAGE_DIFFSP # 「差分SPダメージ」
      damage = user.maxsp - user.sp
      self.critical = false
    when XRXS19::NO_DAMAGE # 「ダメージ無し」
      damage = 0
      self.damage = nil
      self.critical = false
    end
    # 特殊効果「分散度」(RGSS標準仕様)
    if user.current_action.add_variance != 0
      variance = user.current_action.add_variance
      if variance > 0 and damage.abs > 0
        amp = [damage.abs * variance / 100, 1].max
        damage += rand(amp+1) + rand(amp+1) - amp
      end
    end
    # 特殊効果「固定ダメージ」
    if user.current_action.fix_damage != 0
      damage = user.current_action.fix_damage
    end
    # 特殊効果:CPダメージ
    if user.current_action.cp_damage > 0
      if defined? self.cp
        # 今回のダメージの、最大HPに対する割合を計算
        damage_cp = user.current_action.cp_damage * 65535 * damage / self.maxhp / 100
        self.cp  -= damage_cp
        damage    = damage * (100 - user.current_action.cp_damage)/100
        self.damage = damage == 0 ? nil : damage
      end
    end
    # 特殊効果:SPダメージ
    # 防御能力E:「SP身代わり」追加分2/2↓ここ(「or」)から★
    if (user.current_action.sp_damage or (self.guarding? and 
       battler_element_rank?(self, "防御能力") == 5 and 
       damage > 0 and self.sp > 0))
    # 防御能力E:「SP身代わり」追加分2/2ここまで★
      damage_sp = damage
      damage    = 0
      self.damage = nil
      # SP回復スキルの判定
      if skill != nil and skill.power < 0
        # 既に最大SPかつステート不変かどうかで有効フラグをセット
        bool = false if (self.sp == self.maxsp and last_states == self.states)
      end
    end
    #
    # --- ダメージを適用する ---------------------------------------------
    #
    self.hp        = last_hp - damage
    self.damage    = damage if self.damage.is_a?(Numeric)
    self.sp       -= damage_sp if damage_sp != 0
    self.damage_sp = damage_sp == 0 ? nil : damage_sp
    real_damage    = (last_hp - self.hp) + (last_sp - self.sp)
    #
    # 特殊効果「HP吸収」「SP吸収」
    #
    if user.current_action.hp_drain > 0
      user.damage  = 0 if user.damage == nil # nil の場合はリセット
      drain_point  = -real_damage * user.current_action.hp_drain / 100
      user.damage += drain_point
      user.hp     -= drain_point
      if user.damage == 0
        user.damage  = nil
      end
    elsif user.current_action.sp_drain > 0
      user.damage_sp  = 0 if user.damage_sp == nil # nil の場合はリセット
      drain_point     = -real_damage * user.current_action.sp_drain / 100
      user.damage_sp += drain_point
      user.sp        -= drain_point
      if user.damage_sp == 0
        user.damage_sp  = nil
      end
    end
    # 終了
    return bool
  end
end


[PR]田丸麻紀さん愛用ダイエット:大人気サプリメント!注文殺到中です