一撃必殺カスタマイズ



・特定のステートにかかっている状態で通常攻撃を受けると即死
・特定のステートにかかっている状態で特定の属性のスキルを受けると即死
・特定のステートにかかっている状態で通常攻撃を受け即死した際に即死表示
・戦闘不能ステートが付加された武器で攻撃し死亡した際に即死表示
・スキルの威力が0で、戦闘不能ステートが付加されたスキルで死亡した際に即死表示
・ステートや属性を変数から配列へ変更
・即死の判定を別関数化
・カスタマイズポイントをモジュールとして定義
・アイテムで即死した場合にも即死表示
・特定のステートにかかっている状態で特定の属性をもつアイテムを受けると即死
・ステートと属性の対応を複数持たせることができるように変更
 (おかげで設定が偉い面倒なことに・・・)
・ステートと属性の組み合わせを一括で指定出来るように変更
 (凄く使い勝手が悪くなっている気が・・・)

VX風Vocabが必要です。

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

2020:11:01
・他スクリプト併用時のアップデート反映

#==============================================================================
# ■ 一撃必殺カスタマイズ β By 貪藻矢射妥←( + 彩夏様、真希様)
# 
# ・特定のステートにかかっている状態で通常攻撃を受けると即死
# ・特定のステートにかかっている状態で特定の属性のスキルを受けると即死
# ・特定のステートにかかっている状態で通常攻撃を受け即死した際に即死表示
# 
# の機能に加え
# 
# ・戦闘不能ステートが付加された武器で攻撃し死亡した際に即死表示
# ・スキルの威力が0で、戦闘不能ステートが付加されたスキルで死亡した際に即死表示
# ・ステートや属性を変数から配列へ変更
# ・即死の判定を別関数化
# ・カスタマイズポイントをモジュールとして定義
# ・アイテムで即死した場合にも即死表示
# ・特定のステートにかかっている状態で特定の属性をもつアイテムを受けると即死
# ・ステートと属性の対応を複数持たせることができるように変更
#  (おかげで設定が偉い面倒なことに・・・)
# ・ステートと属性の組み合わせを一括で指定出来るように変更
#  (凄く使い勝手が悪くなっている気が・・・)
# 
# を追加、変更しております。
# 
# ○ 一言 ○
# 凍結状態 + 斬撃スキル → 即死 はいいとして・・・
# 凍結状態 + 炎スキル  → 即死 はいいのだろうか?
# 
# それはおかしい!ってな意見が多数寄せられた場合、のんびりと対処しようかと
# 思います。
# 
# なお、このスクリプトを考案、改良するにあたって以下の方々の助言や、協力、
# がありました。ここで、あらためてお礼申し上げます
# 彩夏様、真希様
# 
#==============================================================================
# 更新っぽいもの
# 
# 2016:03:01
# ・武器による命中精度対応
# 
# 2020:11:01
# ・他スクリプト併用時のアップデート反映

$OuterFlgs = {} if $OuterFlgs == nil
$OuterFlgs["Death_Critical"] = true

module DEATH_KILLER
  #=============================================================================
  # □ カスタマイズポイント
  #=============================================================================
  # ◆一撃必殺ステート/属性一括フラグ
  #  特定の攻撃/スキル/アイテムを受けると即死において、全て同じ配列を使用する
  #  場合は true にしてください
  #  なお、その場合、使用するのは『PRE_DEATH_ATTACK_STATES』となります。
  PRE_DEATH_STATE_FLG = false
  
  # ステート/属性のID群の設定方法
  # [[[ステートのID群A], [属性のID群A]], [[ステートのID群B], [属性のID群B]], ...]
  #  | <-  ステートと属性の対応 A  -> |  | <-  ステートと属性の対応 B  -> |
  # のように記述します。
  # ※属性を必要としない場合は属性のID群を空にしてください。
  # 
  # EX)
  # [[[3], []], [[7], [17]]] の場合
  # ステート3にかかっている場合は攻撃/スキル/アイテムを受けると即死
  # ステート7にかかっている場合は属性17を含む攻撃/スキル/アイテムを受けると即死
  
  # ◆ある属性の通常攻撃を受けると即死するステート/属性のID群
  PRE_DEATH_ATTACK_STATES = [[[11, 17], [11, 12, 13, 14, 15]]]
  # ◆ある属性のスキルを受けると即死するステート/属性のID群
  PRE_DEATH_SKILL_STATES  = [[[9, 13], [8]], [[10], [9]]]
  # ◆ある属性のアイテムを受けると即死するステート/属性のID群
  PRE_DEATH_ITEM_STATES   = [[[9, 13], [8]], [[10], [9]]]
  
  # ◆即死時に表示する文字列
  DEATH_WORD = "Death"
end

class Game_Battler
  include BM
  #--------------------------------------------------------------------------
  # ● 即死スキル判定2
  #     state_set : ステートのID群
  #--------------------------------------------------------------------------
  def dead_end2(state_set)
    for stt in state_set
      if self.state?(stt)
        self.add_state(1)
        return true
      end
    end
    return false
  end
  #--------------------------------------------------------------------------
  # ● 即死スキル判定
  #     st_el_sets : ステート/属性のID群
  #     action     : アクション要素
  #--------------------------------------------------------------------------
  def dead_end(st_el_sets, action)
    # ステート/属性ID群は一括指定?
    if DEATH_KILLER::PRE_DEATH_STATE_FLG
      st_el_sets = DEATH_KILLER::PRE_DEATH_ATTACK_STATES
    end
    
    for st_els in st_el_sets
      if st_els[1].empty?
        if dead_end2(st_els[0])
          return true
        end
      else
        for ele in st_els[1]
          if action.element_set.include?(ele)
            if dead_end2(st_els[0])
              return true
            end
          end
        end
      end
    end
    
    return false
  end
  
  #--------------------------------------------------------------------------
  # ● 通常攻撃の効果適用
  #     attacker : 攻撃者 (バトラー)
  #--------------------------------------------------------------------------
  def attack_effect(attacker)
    # クリティカルフラグをクリア
    self.critical = false
    
if $OuterFlgs["Weapon_HitRate"]
    base_hitrate = get_hitrate_base(attacker)
else # 元の処理
    base_hitrate = 100
end # $OuterFlgs["Weapon_HitRate"]
    
    # 第一命中判定
    hit_result = (rand(base_hitrate) < attacker.hit)
    # 命中の場合
    if hit_result == true
      # 基本ダメージを計算
      atk = [attacker.atk - self.pdef / 2, 0].max
      self.damage = atk * (20 + attacker.str) / 20
      # 属性修正
      self.damage *= elements_correct(attacker.element_set)
      self.damage /= 100
      # ダメージの符号が正の場合
      if self.damage > 0
        # クリティカル修正
        critical_rate = 100
if $OuterFlgs["VX_2_XP"]
        for st_id in VX_TO_XP::CRITICAL_MOST
          if attacker.states.include?(st_id)
            critical_rate /= VX_TO_XP::CRITICAL_RATE[st_id]
          end
        end
end # $OuterFlgs["VX_2_XP"]
        crt_can_flg = false
if $Atarime["Surume_2000_2_XP"]
        # 必殺防止判定
        crt_can_flg = !armor_element_include?($game_system.hissatu_bosi)
end # $Atarime["Surume_2000_2_XP"]
        if !crt_can_flg && rand(critical_rate) < 4 * attacker.dex / self.agi
if $SilfeedArks["Special_Attack"]
          # アクターの場合 必殺技スキル発動チェック
          if attacker.is_a?(Game_Actor)
            if attacker.critical_skill != nil
              self.critical_skill_flg = true
              return true
            end
          end
end # $SilfeedArks["Special_Attack"]
if $OuterFlgs["VX_2_XP"]
          self.damage *= VX_TO_XP::CRITICAL_BST
else # 元の処理
          self.damage *= 2
end # $OuterFlgs["VX_2_XP"]
          self.critical = true
        end
        
        gurard_flg = false
        # 防御修正
        if self.guarding?
if $OuterFlgs["VX_2_XP"]
          for st_id in VX_TO_XP::SUPER_GUARD
            if self.states.include?(st_id)
              self.damage /= VX_TO_XP::GUARD_RATE[st_id]
              gurard_flg = true
            end
          end
end # $OuterFlgs["VX_2_XP"]
          # 二重計上防止
          if !gurard_flg
            self.damage /= 2
          end
        end
      end
      # 分散
      if self.damage.abs > 0
        amp = [self.damage.abs * 15 / 100, 1].max
        self.damage += rand(amp+1) + rand(amp+1) - amp
      end
      # 第二命中判定
      eva_can_flg = false
if $Atarime["Surume_2000_2_XP"]
      # 回避無視判定
      eva_can_flg = !attacker.element_set.include?($game_system.kaihi_musi)
end # $Atarime["Surume_2000_2_XP"]
      if !eva_can_flg
        #eva = 8 * self.agi / attacker.dex + self.eva
        eva = 8 * self.agi / attacker.dex + self.eva / 80.0
        hit = self.damage < 0 ? 100 : 100 - eva
        
        hit = self.cant_evade? ? 100 : hit
        hit_result = (rand(base_hitrate) < hit)
      end
    end
    # 命中の場合
    if hit_result == true
      
if $SilfeedArks["Special_Attack"]
    # ダメージ吸収の場合、符号反転
    if @counter[0] == 1 and @counter[6]
      self.damage *= -1 
    end
    # スキルキャンセルの場合ダメージを空白して終了
    if @counter[4] and @counter[6]
      self.damage = nil
      return true
    end
end # $SilfeedArks["Special_Attack"]
      
      # 即死判定
if $OuterFlgs["Death_Critical"]
      die_flg = dead_end(DEATH_KILLER::PRE_DEATH_ATTACK_STATES, attacker)
else # 元の処理
      die_flg = false
end # $OuterFlgs["Death_Critical"]
    
      # ステート衝撃解除
      remove_states_shock
      # HP からダメージを減算
if $imported["SPDamage"] && attacker.element_set.include?(KGC::SP_DAMAGE)
      self.sp -= self.damage
else # 元の処理元の処理
      self.hp -= self.damage
end # $imported["SPDamage"]
      
      # ステート変化
      @state_changed = false
      states_plus(attacker.plus_state_set)
      states_minus(attacker.minus_state_set)
      
      # 特定ステート+物理ダメージで即死か即死付加武器による攻撃で死亡した場合
      if (die_flg && $OuterFlgs["Death_Critical"]) || 
        (self.states.include?(1) && attacker.plus_state_set.include?(1))
        # ダメージに"即死"を設定
        self.damage = DEATH_KILLER::DEATH_WORD
      end
      
    # ミスの場合
    else
      # ダメージに "Miss" を設定
      self.damage = MISS_WORD
      # クリティカルフラグをクリア
      self.critical = false
    end
    # メソッド終了
    return true
  end
  
  #--------------------------------------------------------------------------
  # ● スキルの効果適用
  #     user  : スキルの使用者 (バトラー)
  #     skill : スキル
  #--------------------------------------------------------------------------
  def skill_effect(user, skill)
    
    @sp_damage_flg = false
    
    # 他サイトのスクリプトとの競合を考えて(武器の全体攻撃とか)
    # スキルがnilの場合は処理を行わない
if $imported["SPDamage"]
    if @skill != nil && skill.element_set.include?(KGC::SP_DAMAGE)
      @sp_damage_flg = true
    end
end # $imported["SPDamage"]
    
    # クリティカルフラグをクリア
    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 $OuterFlgs["Recover_Dead_or_Alive"]
      # 上記の状態で生死問わず回復スキルでない場合
      if !skill.element_set.include?(DIAMOND::RECV_HYPER)
        # メソッド終了
        return false
      end
else # 元の処理
      # メソッド終了
      return false
end # $OuterFlgs["Recover_Dead_or_Alive"]
    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 # $OuterFlgs["Weapon_HitRate"]
    
    hit_result = (rand(base_hitrate) < hit)
    
    # 不確実なスキルの場合は有効フラグをセット
    effective |= hit < 100
    
if $OuterFlgs["Decoy_De_Koi"]
    if $game_system.act_tgt != nil
      # アクターとターゲットが違う場合(同じだとデコイ作った瞬間に砕け散ります)
      if ($game_system.act_tgt.is_a?(Game_Actor) && user.is_a?(Game_Enemy)) ||
        ($game_system.act_tgt.is_a?(Game_Enemy) && user.is_a?(Game_Actor))
        # ターゲットがデコイ状態の場合
        if $game_system.act_tgt.states.include?(DIAMOND::DECOY_ID)
          effective |= states_minus([DIAMOND::DECOY_ID])
          hit_result = false
        end
      end
    end
end # $OuterFlgs["Decoy_De_Koi"]
    
    # 命中の場合
    if hit_result == true
      # 威力を計算
      power = skill.power + user.atk * skill.atk_f / 100
      #p "威力",power
      if power > 0
        power -= self.pdef * skill.pdef_f / 200
        power -= self.mdef * skill.mdef_f / 200
        if skill.str_f != 0
          power = [power, 0].max
        end
        #p "計算後",power
      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)
      
      #p skill.element_set, self.element_set
      #p "Skill", elements_correct(skill.element_set)
      #p "Self", elements_correct(self.element_set)
      
      # 基本ダメージを計算
      tmp_damage = power * rate / 20
if $OuterFlgs["Skill_Specialite"]
      # ★ モードによる威力の増減
      tmp_damage *= user.actor_pow_rate / 100
      tmp_damage = tmp_damage.to_i
end # $OuterFlgs["Skill_Specialite"]
      # 属性修正
      ec_skill = elements_correct(skill.element_set)
      ec_self  = elements_correct(self.element_set)
      
      #エネミー補正
      if user.is_a?(Game_Enemy)
        ec_skill = 40 if ec_skill == 0
        ec_self  = 40 if ec_self  == 0
      end
      
      tmp_damage *= ec_skill # elements_correct(skill.element_set)
      tmp_damage /= 100
      tmp_damage *= ec_self # elements_correct(self.element_set)
      tmp_damage /= 100
      
      guard_flg = false
      
      # ダメージの符号が正の場合
      if tmp_damage > 0
        # 防御修正
        if self.guarding?
if $OuterFlgs["VX_2_XP"]
          for st_id in VX_TO_XP::SUPER_GUARD
            if self.states.include?(st_id)
              tmp_damage /= VX_TO_XP::GUARD_RATE[st_id]
              guard_flg = true
            end
          end
end # $OuterFlgs["VX_2_XP"]
          # 二重計上防止
          if !guard_flg
            tmp_damage /= 2
          end
        end
      end
      # 分散
      if skill.variance > 0 and tmp_damage.abs > 0
        amp = [tmp_damage.abs * skill.variance / 100, 1].max
        tmp_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 / 100.0
      
      #p eva, tmp_damage
      
      hit = tmp_damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
      
      hit = self.cant_evade? ? 100 : hit
      
      hit_result = (rand(base_hitrate) < hit)
      
      #p hit, hit_result, base_hitrate
      
      # 不確実なスキルの場合は有効フラグをセット
      effective |= hit < 100
    end
    
if $SilfeedArks["Special_Attack"]
    # 当身ダメージ吸収の場合、符号反転
    if @counter[0] == 1 && @counter[6]
      tmp_damage *= -1
    end
    # 当身SP吸収の場合、SP回復
    if @counter[0] == 2 && @counter[6] && !@sp_damage_flg
      self.sp += skill.sp_cost
    end
    # スキルキャンセルの場合ダメージを空白して終了
    if @counter[4] and @counter[6]
      if @sp_damage_flg
        self.damage2 = nil
      else
        self.damage  = nil
      end
      return effective
    end
end # $SilfeedArks["Special_Attack"]
    
    # 命中の場合
    if hit_result == true
      
if $OuterFlgs["Death_Critical"]
      # 即死判定 ★ 一撃必殺カスタマイズ
      dead_end(DEATH_KILLER::PRE_DEATH_SKILL_STATES, skill)
end # $OuterFlgs["Death_Critical"]
      
      # 威力 0 以外の物理攻撃の場合
      if skill.power != 0 and skill.atk_f > 0
        
if $OuterFlgs["Death_Critical"]
        # 即死判定 ★ 一撃必殺カスタマイズ
        dead_end(DEATH_KILLER::PRE_DEATH_ATTACK_STATES, skill)
end # $OuterFlgs["Death_Critical"]
        
        # ステート衝撃解除
        remove_states_shock
        # 有効フラグをセット
        effective = true
      end
      
      if @sp_damage_flg
        self.damage2 = tmp_damage
        # SP からダメージを減算
        last_sp = self.sp
        # 現SPを上回るダメージはなし。
        if self.damage2 > self.sp
          self.damage2 = self.sp
        end
        self.sp -= self.damage2
        effective |= self.sp != last_sp
      else
        self.damage = tmp_damage
        # HP からダメージを減算
        last_hp = self.hp
        self.hp -= self.damage
        effective |= self.hp != last_hp
      end
      # ステート変化
      @state_changed = false
      effective |= states_plus(skill.plus_state_set)
      effective |= states_minus(skill.minus_state_set)
if $OuterFlgs["Recover_Dead_or_Alive"]
      if skill.element_set.include?(DIAMOND::RECV_HYPER)
        effective |= states_minus([1])
      end
end # $OuterFlgs["Recover_Dead_or_Alive"]
      # 威力が 0 の場合
      if skill.power == 0
if self.states.include?(1) && $OuterFlgs["Death_Critical"]
        # ダメージに"即死"を設定
        if @sp_damage_flg
          self.damage2 = DEATH_KILLER::DEATH_WORD
        else
          self.damage  = DEATH_KILLER::DEATH_WORD
        end
else # 元の処理
        # ダメージに空文字列を設定
        if @sp_damage_flg
          self.damage2 = ""
        else
          self.damage  = ""
        end
end # $OuterFlgs["Death_Critical"]
        # ステートに変化がない場合
        unless @state_changed
          
          # ★ 一撃必殺カスタマイズ
if self.states.include?(1) && $OuterFlgs["Death_Critical"]
          # ダメージに"即死"を設定
          if @sp_damage_flg
            self.damage2 = DEATH_KILLER::DEATH_WORD
          else
            self.damage  = DEATH_KILLER::DEATH_WORD
          end
else # 元の処理
          # ダメージに "Miss" を設定
          if @sp_damage_flg
            self.damage2 = MISS_WORD
          else
            self.damage  = MISS_WORD
          end
end # $OuterFlgs["Death_Critical"]
        end
      end
    # ミスの場合
    else
      # ダメージに "Miss" を設定
      if @sp_damage_flg
        self.damage2 = MISS_WORD
      else
        self.damage  = MISS_WORD
      end
    end
    # 戦闘中でない場合
    unless $game_temp.in_battle
      # ダメージに nil を設定
      if @sp_damage_flg
        self.damage2 = nil
      else
        self.damage  = nil
      end
    end
    # メソッド終了
    return effective
  end
  #--------------------------------------------------------------------------
  # ● アイテムの効果適用
  #     item : アイテム
  #--------------------------------------------------------------------------
  ★★★ '0X to XP:パラメーター上昇アイテムの複数化 参照 ★★★
end

戻る