生死を問わず回復



その名前の通り、生死を問わず回復するスキル、アイテムの実装。

※戦闘不能のアクターとそうでないアクターとでアニメーションの表示に時間差が出るのは仕様です。
 (実は修正方法がわからないだけ)

変更点
2009:09:14
・生死問わず回復どころか生死問わず攻撃(死体に鞭打つこと)までも可能だったのをやめることに。
・他スクリプトとの競合でエラー落ちするかもしれないことを回避

2016:03:01
・武器による命中精度対応

#==============================================================================
# ■ 生死問わず回復 By 貪藻矢射妥←
# 
#  その名の通り、生死を問わず回復を行います。
# 
#==============================================================================
# 更新っぽいもの
# 
# 2009:09:14
# ・生死問わず回復どころか生死問わず攻撃(死体に鞭打つこと)までも可能だったのを
#  やめることに。
# ・他スクリプトとの競合でエラー落ちするかもしれないことを回避
# 
# 2016:03:01
# ・武器による命中精度対応

module RDOA
  # 超回復属性
  RECV_HYPER = 22
end

class Game_Battler
  include RDOA
  include BM
  #--------------------------------------------------------------------------
  # ● スキルの効果適用
  #     user  : スキルの使用者 (バトラー)
  #     skill : スキル
  #--------------------------------------------------------------------------
  def skill_effect(user, skill)
    # クリティカルフラグをクリア
    self.critical = false
    # スキルの効果範囲が HP 1 以上の味方で、自分の HP が 0、
    # またはスキルの効果範囲が HP 0 の味方で、自分の HP が 1 以上の場合
    if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
       ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
      # 上記の状態で生死問わず回復スキルでない場合
      if !skill.element_set.include?(RECV_HYPER)
        # メソッド終了
        return false
      end
    end
    # 有効フラグをクリア
    effective = false
    # コモンイベント ID が有効の場合は有効フラグをセット
    effective |= skill.common_event_id > 0
    # 第一命中判定
    hit = skill.hit
    if skill.atk_f > 0
      hit *= user.hit / 100
    end
    
    if $OuterFlgs["Weapon_HitRate"]
      base_hitrate = get_hitrate_base(user)
    else
      base_hitrate = 100
    end
    
    hit_result = (rand(base_hitrate) < hit)
    # 不確実なスキルの場合は有効フラグをセット
    effective |= hit < 100
    # 命中の場合
    if hit_result == true
      # 威力を計算
      power = skill.power + user.atk * skill.atk_f / 100
      if power > 0
        power -= self.pdef * skill.pdef_f / 200
        power -= self.mdef * skill.mdef_f / 200
        power = [power, 0].max
      end
      # 倍率を計算
      rate = 20
      rate += (user.str * skill.str_f / 100)
      rate += (user.dex * skill.dex_f / 100)
      rate += (user.agi * skill.agi_f / 100)
      rate += (user.int * skill.int_f / 100)
      # 基本ダメージを計算
      self.damage = power * rate / 20
      # 属性修正
      self.damage *= elements_correct(skill.element_set)
      self.damage /= 100
      # ダメージの符号が正の場合
      if self.damage > 0
        # 防御修正
        if self.guarding?
          self.damage /= 2
        end
      end
      # 分散
      if skill.variance > 0 and self.damage.abs > 0
        amp = [self.damage.abs * skill.variance / 100, 1].max
        self.damage += rand(amp+1) + rand(amp+1) - amp
      end
      # 第二命中判定
      #eva = 8 * self.agi / user.dex + self.eva
      eva = 8 * self.agi / user.dex + self.eva / 80.0
      hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
      
      # Luk補正
      if MINTO::RGSS["parameter_addition"] and user.is_a?(Game_Enemy)
        #hit = [hit - Math.log(self.luk), 5].max
        hit = [hit - self.luk / 40.0, 5].max
      end
      
      hit = self.cant_evade? ? 100 : hit
      hit_result = (rand(base_hitrate) < hit)
      # 不確実なスキルの場合は有効フラグをセット
      effective |= hit < 100
    end
    # 命中の場合
    if hit_result == true
      # 威力 0 以外の物理攻撃の場合
      if skill.power != 0 and skill.atk_f > 0
        # ステート衝撃解除
        remove_states_shock
        # 有効フラグをセット
        effective = true
      end
      # HP からダメージを減算
      last_hp = self.hp
      self.hp -= self.damage
      effective |= self.hp != last_hp
      # ステート変化
      @state_changed = false
      effective |= states_plus(skill.plus_state_set)
      effective |= states_minus(skill.minus_state_set)
      # 生死問わず回復の場合、強制的に戦闘不能を解除する
      if skill.element_set.include?(RECV_HYPER)
        effective |= states_minus([1])
      end
      # 威力が 0 の場合
      if skill.power == 0
        # ダメージに空文字列を設定
        self.damage = ""
        # ステートに変化がない場合
        unless @state_changed
          # ダメージに "Miss" を設定
          self.damage = MISS_WORD
        end
      end
    # ミスの場合
    else
      # ダメージに "Miss" を設定
      self.damage = MISS_WORD
    end
    # 戦闘中でない場合
    unless $game_temp.in_battle
      # ダメージに nil を設定
      self.damage = nil
    end
    # メソッド終了
    return effective
  end
  #--------------------------------------------------------------------------
  # ● アイテムの効果適用
  #     item : アイテム
  #--------------------------------------------------------------------------
  def item_effect(item)
    # クリティカルフラグをクリア
    self.critical = false
    # アイテムの効果範囲が HP 1 以上の味方で、自分の HP が 0、
    # またはアイテムの効果範囲が HP 0 の味方で、自分の HP が 1 以上の場合
    if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or
       ((item.scope == 5 or item.scope == 6) and self.hp >= 1)
      # 上記の状態で生死問わず回復スキルでない場合
      if !skill.element_set.include?(RECV_HYPER)
        # メソッド終了
        return false
      end
    end
    # 有効フラグをクリア
    effective = false
    # コモンイベント ID が有効の場合は有効フラグをセット
    effective |= item.common_event_id > 0
    # 命中判定
    
    if $OuterFlgs["Weapon_HitRate"]
      base_hitrate = get_hitrate_base(self, false)
    else
      base_hitrate = 100
    end
    
    hit_result = (rand(base_hitrate) < item.hit)
    # 不確実なスキルの場合は有効フラグをセット
    effective |= item.hit < 100
    # 命中の場合
    if hit_result == true
      # 回復量を計算
      recover_hp = maxhp * item.recover_hp_rate / 100 + item.recover_hp
      recover_sp = maxsp * item.recover_sp_rate / 100 + item.recover_sp
      if recover_hp < 0
        recover_hp += self.pdef * item.pdef_f / 20
        recover_hp += self.mdef * item.mdef_f / 20
        recover_hp = [recover_hp, 0].min
      end
      # 属性修正
      recover_hp *= elements_correct(item.element_set)
      recover_hp /= 100
      recover_sp *= elements_correct(item.element_set)
      recover_sp /= 100
      # 分散
      if item.variance > 0 and recover_hp.abs > 0
        amp = [recover_hp.abs * item.variance / 100, 1].max
        recover_hp += rand(amp+1) + rand(amp+1) - amp
      end
      if item.variance > 0 and recover_sp.abs > 0
        amp = [recover_sp.abs * item.variance / 100, 1].max
        recover_sp += rand(amp+1) + rand(amp+1) - amp
      end
      # 回復量の符号が負の場合
      if recover_hp < 0
        # 防御修正
        if self.guarding?
          recover_hp /= 2
        end
      end
      # HP 回復量の符号を反転し、ダメージの値に設定
      self.damage = -recover_hp
      # HP および SP を回復
      last_hp = self.hp
      last_sp = self.sp
      self.hp += recover_hp
      self.sp += recover_sp
      effective |= self.hp != last_hp
      effective |= self.sp != last_sp
      # ステート変化
      @state_changed = false
      effective |= states_plus(item.plus_state_set)
      effective |= states_minus(item.minus_state_set)
      # 生死問わず回復の場合、強制的に戦闘不能を解除する
      if skill.element_set.include?(RECV_HYPER)
        effective |= states_minus([1])
      end
      # パラメータ上昇値が有効の場合
      if item.parameter_type > 0 and item.parameter_points != 0
        # パラメータで分岐
        case item.parameter_type
        when 1  # MaxHP
          @maxhp_plus += item.parameter_points
        when 2  # MaxSP
          @maxsp_plus += item.parameter_points
        when 3  # 腕力
          @str_plus += item.parameter_points
        when 4  # 器用さ
          @dex_plus += item.parameter_points
        when 5  # 素早さ
          @agi_plus += item.parameter_points
        when 6  # 魔力
          @int_plus += item.parameter_points
        end
        # 有効フラグをセット
        effective = true
      end
      # HP 回復率と回復量が 0 の場合
      if item.recover_hp_rate == 0 and item.recover_hp == 0
        # ダメージに空文字列を設定
        self.damage = ""
        # SP 回復率と回復量が 0、パラメータ上昇値が無効の場合
        if item.recover_sp_rate == 0 and item.recover_sp == 0 and
           (item.parameter_type == 0 or item.parameter_points == 0)
          # ステートに変化がない場合
          unless @state_changed
            # ダメージに "Miss" を設定
            self.damage = MISS_WORD
          end
        end
      end
    # ミスの場合
    else
      # ダメージに "Miss" を設定
      self.damage = MISS_WORD
    end
    # 戦闘中でない場合
    unless $game_temp.in_battle
      # ダメージに nil を設定
      self.damage = nil
    end
    # メソッド終了
    return effective
  end
end

class Scene_Battle
  include RDOA
  #--------------------------------------------------------------------------
  # ● スキルまたはアイテムの対象側バトラー設定
  #     scope : スキルまたはアイテムの効果範囲
  #--------------------------------------------------------------------------
  alias diamond_set_target_battlers set_target_battlers
  def set_target_battlers(scope)
    
    #呼び戻す
    diamond_set_target_battlers(scope)
    
    @recover_flg = false
    # 他サイトのスクリプトとの競合を考えて(武器の全体攻撃とか)
    # スキルがnilの場合は処理を行わない
    if @skill != nil && @skill.element_set.include?(RECV_HYPER)
      @recover_flg = true
    end
    
    # 行動側バトラーがエネミーの場合
    if @active_battler.is_a?(Game_Enemy)
      change_enemy  = $game_party.actors
      change_friend = $game_troop.enemies
    # 行動側バトラーがアクターの場合
    elsif @active_battler.is_a?(Game_Actor)
      change_enemy  = $game_troop.enemies
      change_friend = $game_party.actors
    end
    
    # 生死問わず回復スキルが設定される場合で除外されていたターゲットを追加
    case scope
    when 4  # 味方全体
      for obj in change_friend
        if !obj.exist? && @recover_flg
          @target_battlers.push(obj)
        end
      end
    when 5  # 味方単体 (HP 0) 
      index = @active_battler.current_action.target_index
      obj = change_friend[index]
      if obj != nil && !obj.hp0? && @recover_flg
        @target_battlers.push(obj)
      end
    when 6  # 味方全体 (HP 0) 
      for obj in change_friend
        if obj != nil && !obj.hp0? && @recover_flg
          @target_battlers.push(obj)
        end
      end
    end
  end
end
回復スキルに薄緑色の属性を設定してあげるだけ。 ※効果範囲について 超回復属性を設定しれあげれば 味方単体 (HP 0)、味方単体のどちらでも味方の単体に対して生死問わず回復、 味方全体 (HP 0)、味方全体のどちらでも味方の全体に対して生死問わず回復 を行います。

戻る