スリップダメージの修正



回復のスリップダメージは無いのか?SPもスリップダメージにしたいんだけど・・・ってな人にオススメ。



※このスクリプトは小さな本屋の改造素材です。

※以下のモジュールが別途導入必要です。
 VXA風SE

変更点
2007:02:13
・スリップダメージ防御/効果量詳細化 ver.2に対応(というかそれを改造)
・ややこしかったマップでのスリップダメージの設定を簡略化(と、いうか省略化)

2007:02:15
・微修正

2007:04:23
・SPスリップ回復のみを設定するとSPスリップダメージになるバグを修正

2012:03:03
・スリップダメージ用文字列を直値から定数に変更

2015:10:01
・VXA風Sound対応

#----------------------------------------------------------------------------
# スリップダメージ改造 By 貪藻矢射妥←
#----------------------------------------------------------------------------
# 原作:     ▼▲▼ XRXS17. スリップダメージ防御/効果量詳細化 ver.2 ▼▲▼ built101021
# 原作者:   森穂様、XRXS.様
# HP:       小さな本屋 
# アドレス: http://xrxs.at-ninja.jp/
# 
# 必須ライブラリ
# XRXS. 装備属性取得機構
#
# 改造内容:
# (・マップでのスリップダメージ(回復)ができるように改良)
# ・SPのスリップダメージも設定できるように改良
#==============================================================================
# 更新っぽいもの
# 2007:02:13
# ・スリップダメージ防御/効果量詳細化 ver.2に対応(というかそれを改造)
# ・ややこしかったマップでのスリップダメージの設定を簡略化(と、いうか省略化)
# 
# 2007:02:15
# ・微修正
# 
# 2007:04:23
# ・SPスリップ回復のみを設定するとSPスリップダメージになるバグを修正
# 
# 2012:03:03
# ・スリップダメージ用文字列を直値から定数に変更
# 
# 2015:10:01
# ・VXA風Sound対応

#==============================================================================
# --- XRXS. スリップダメージ詳細化 ---
#==============================================================================
module XRXS17
  HP_SLIP_WD = "HPスリップ"
  SP_SLIP_WD = "SPスリップ"
  #--------------------------------------------------------------------------
  # ○ 指定バトラーのスリップダメージの効果量の取得
  #--------------------------------------------------------------------------
  def self.slip_amount(battler)
    # 数値の初期化
    slip_damage_HP = 0
    slip_damage_SP = 0
    slip_damage_H_Val = 0
    slip_damage_S_Val = 0
    # バトラーのステートを取得
    for state_id in battler.states
      # ステートの取得
      state = $data_states[state_id]
      # スリップダメージ有りの場合
      if state.slip_damage
        # そのステートが持っているスリップダメージの
        # LvプラスステートまたはLvマイナスステートを判定。
        for j in state.plus_state_set
          # プラスステートの取得
          plus_state = $data_states[j]
          if plus_state != nil
            if plus_state.name =~ /^#{HP_SLIP_WD}([0-9]+)(%|%)/
              slip_damage_HP += $1.to_i
            end
            if plus_state.name =~ /^#{SP_SLIP_WD}([0-9]+)(%|%)/
              slip_damage_SP += $1.to_i
            end
            if plus_state.name =~ /^#{HP_SLIP_WD}([0-9]+)$/
              slip_damage_H_Val += $1.to_i
            end
            if plus_state.name =~ /^#{SP_SLIP_WD}([0-9]+)$/
              slip_damage_S_Val += $1.to_i
            end
          end
        end
        for j in state.minus_state_set
          # マイナスステートの取得
          minus_state = $data_states[j]
          if minus_state != nil
            if minus_state.name =~ /^#{HP_SLIP_WD}([0-9]+)(%|%)/
              slip_damage_HP -= $1.to_i
            end
            if minus_state.name =~ /^#{SP_SLIP_WD}([0-9]+)(%|%)/
              slip_damage_SP -= $1.to_i
            end
            if minus_state.name =~ /^#{HP_SLIP_WD}([0-9]+)$/
              slip_damage_H_Val -= $1.to_i
            end
            if minus_state.name =~ /^#{SP_SLIP_WD}([0-9]+)$/
              slip_damage_S_Val -= $1.to_i
            end
          end
        end
      end
    end
    # スリップの設定を特にしなかった場合デフォルトのHPスリップダメージ10%に設定する
    if slip_damage_HP == 0 && slip_damage_H_Val == 0 && slip_damage_SP == 0 && slip_damage_S_Val
      slip_damage_HP = 10
    else
      # ダメージを計算
      damage  = battler.maxhp * slip_damage_HP / 100 + slip_damage_H_Val
      damage2 = battler.maxsp * slip_damage_SP / 100 + slip_damage_S_Val
      return damage, damage2
    end
  end
end
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_reader   :states                   # ステート
  attr_accessor :damage                   # HPダメージ値
  attr_accessor :damage2                  # SPダメージ値
  #--------------------------------------------------------------------------
  # ● スリップダメージの効果適用 [条件付再定義]
  #--------------------------------------------------------------------------
  alias xrxs17_slip_damage_effect slip_damage_effect
  def slip_damage_effect
    # スリップ効果量の取得
    slip_damage = XRXS17.slip_amount(self)
    # スリップダメージが指定されていなかった場合
    if slip_damage[0] == 0 && slip_damage[1] == 0
      return xrxs17_slip_damage_effect
    else
      # ダメージを設定
      self.damage = slip_damage[0]
      self.damage2 = slip_damage[1]
      # 分散
      if self.damage.abs > 0
        amp = [self.damage.abs * 15 / 100, 1].max
        self.damage += rand(amp+1) + rand(amp+1) - amp
      end
      if self.damage2.abs > 0
        amp = [self.damage2.abs * 15 / 100, 1].max
        self.damage2 += rand(amp+1) + rand(amp+1) - amp
      end
      # HP&SP からダメージを減算
      if self.damage != 0
        self.hp -= self.damage
      end
      if self.damage2 != 0
        self.sp -= self.damage2
      end
      # メソッド終了
      return true
    end
  end
=begin
  #--------------------------------------------------------------------------
  # ● ステート [スリップダメージ] 判定
  #--------------------------------------------------------------------------
  alias xrxs17_slip_damage? slip_damage?
  def slip_damage?
    if @xrxs17_minus_slip_check_ban
      # スリップ効果量の取得
      slip_damage = XRXS17.slip_amount(self)
      # HPが減少しないスリップタメージの場合
      if slip_damage[0] <= 0# || slip_damage[1] <= 0
        return false
      end
    end
    # 呼び戻す
    return xrxs17_slip_damage?
  end
  #--------------------------------------------------------------------------
  # ○ 回復スリップをスリップダメージ判定から一時的に除外
  #--------------------------------------------------------------------------
  def xrxs17_minus_slip_check_ban=(b)
    @xrxs17_minus_slip_check_ban = b
  end
=end
end
#==============================================================================
# ■ Game_Party
#==============================================================================
class Game_Party
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_reader   :actors                   # アクター
  attr_reader   :states                   # ステート
  #--------------------------------------------------------------------------
  # ● スリップダメージチェック (マップ用)
  #--------------------------------------------------------------------------
  include BM
  alias xrxs17_check_map_slip_damage check_map_slip_damage
  def check_map_slip_damage
    
    for actor in @actors
      if actor.hp > 0 and actor.slip_damage?
        # 初期化
        slip_damage = XRXS17.slip_amount(actor)

        #HPのスリップダメージを実行
        actor.hp -= slip_damage[0]
        if slip_damage[0] > 0
          if actor.hp == 0
            Sound.play_actor_collapse
          end
          $game_screen.start_flash(Color.new(255,   0,   0, HARF8BIT), 4)
          $game_temp.gameover = $game_party.all_dead?
        end
        
        #SPのスリップダメージを実行
        actor.sp -= slip_damage[1]
      end
    end
  end
end
・データベースでの設定の例

戻る