查看: 815|回复: 6

[原创发布] 【脚本】吸血效果(通用吸血+技能吸血+暴击吸血)

[复制链接]
梦石
0
星屑
3037
在线时间
388 小时
注册时间
2015-1-29
回帖
12
发表于 2026-3-6 21:26:27 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 SmallDrop 于 2026-3-12 16:34 编辑

[pre lang="ruby"]#==============================================================================
# $SDrop$
# 吸血效果 By猫易箱
#------------------------------------------------------------------------------
# 更新日志:
#   支持 物理反击 和 魔法反射
#------------------------------------------------------------------------------
# 在 角色、职业、技能、武器、护甲、敌人、状态 备注使用:
#
#   <吸血A 20%>       - 通用吸血:让持有者造成伤害时,产生吸血效果
#   <吸血B 20%>       - 技能吸血:技能专用!让技能自带吸血效果
#   <吸血C 20%>       - 暴击吸血:A的变种,暴击时产生吸血效果
#
#   <吸血加成 100%>   - 攻击方的吸血修正(大于100%增加,小于100%减少)
#   <吸血抗性 100%>   - 受击方的吸血修正(大于100%增加,小于100%减少)
#
#   吸血公式:伤害 × 吸血率 × 吸血加成 × 吸血抗性
#   战斗消息显示:XXX受到了100点的伤害!被偷取了50HP!
#
#==============================================================================

$imported = {} if $imported.nil?
$imported["SDrop_LifeSteal"] = true

#==============================================================================
# ■ RPG::BaseItem
#==============================================================================
class RPG::BaseItem
  #--------------------------------------------------------------------------
  # ● 获取吸血A比率
  #--------------------------------------------------------------------------
  def life_steal_a_rate
    @life_steal_a_rate ||= load_life_steal_a_rate
  end
  
  #--------------------------------------------------------------------------
  # ● 加载吸血A比率
  #--------------------------------------------------------------------------
  def load_life_steal_a_rate
    self.note =~ /<吸血A\s*(\d+)%>/i ? $1.to_i / 100.0 : 0.0
  end
  
  #--------------------------------------------------------------------------
  # ● 获取吸血C比率(暴击时触发)
  #--------------------------------------------------------------------------
  def life_steal_c_rate
    @life_steal_c_rate ||= load_life_steal_c_rate
  end
  
  #--------------------------------------------------------------------------
  # ● 加载吸血C比率
  #--------------------------------------------------------------------------
  def load_life_steal_c_rate
    self.note =~ /<吸血C\s*(\d+)%>/i ? $1.to_i / 100.0 : 0.0
  end
  
  #--------------------------------------------------------------------------
  # ● 获取吸血修正倍率
  #--------------------------------------------------------------------------
  def life_steal_mod_rate
    @life_steal_mod_rate ||= load_life_steal_mod_rate
  end
  
  #--------------------------------------------------------------------------
  # ● 加载吸血修正倍率
  #--------------------------------------------------------------------------
  def load_life_steal_mod_rate
    self.note =~ /<吸血加成\s*(\d+)%>/i ? $1.to_i / 100.0 : 1.0
  end
  
  #--------------------------------------------------------------------------
  # ● 获取吸血抗性倍率
  #--------------------------------------------------------------------------
  def life_steal_resist_rate
    @life_steal_resist_rate ||= load_life_steal_resist_rate
  end
  
  #--------------------------------------------------------------------------
  # ● 加载吸血抗性
  #--------------------------------------------------------------------------
  def load_life_steal_resist_rate
    self.note =~ /<吸血抗性\s*(\d+)%>/i ? $1.to_i / 100.0 : 1.0
  end
end

#==============================================================================
# ■ RPG::Skill
#==============================================================================
class RPG::Skill
  #--------------------------------------------------------------------------
  # ● 获取吸血B比率(技能单独使用)
  #--------------------------------------------------------------------------
  def life_steal_b_rate
    @life_steal_b_rate ||= load_life_steal_b_rate
  end
  
  #--------------------------------------------------------------------------
  # ● 加载吸血B比率
  #--------------------------------------------------------------------------
  def load_life_steal_b_rate
    self.note =~ /<吸血B\s*(\d+)%>/i ? $1.to_i / 100.0 : 0.0
  end
end

#==============================================================================
# ■ Game_BattlerBase
#==============================================================================
class Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● 获取总吸血A比率(从所有特性中累计)
  #--------------------------------------------------------------------------
  def life_steal_a_total
    result = 0.0
    feature_objects.each do |obj|
      result += obj.life_steal_a_rate if obj.respond_to?(:life_steal_a_rate)
    end
    [[result, 1.0].min, 0.0].max
  end
  
  #--------------------------------------------------------------------------
  # ● 获取总吸血C比率(从所有特性中累计)
  #--------------------------------------------------------------------------
  def life_steal_c_total
    result = 0.0
    feature_objects.each do |obj|
      result += obj.life_steal_c_rate if obj.respond_to?(:life_steal_c_rate)
    end
    [[result, 1.0].min, 0.0].max
  end
  
  #--------------------------------------------------------------------------
  # ● 获取总吸血加成倍率(所有修正倍率的乘积)
  #--------------------------------------------------------------------------
  def life_steal_mod_total
    result = 1.0
    feature_objects.each do |obj|
      if obj.respond_to?(:life_steal_mod_rate)
        result *= obj.life_steal_mod_rate
      end
    end
    result
  end
  
  #--------------------------------------------------------------------------
  # ● 获取总吸血抗性倍率(所有抗性倍率的乘积)
  #--------------------------------------------------------------------------
  def life_steal_resist_total
    result = 1.0
    feature_objects.each do |obj|
      if obj.respond_to?(:life_steal_resist_rate)
        result *= obj.life_steal_resist_rate
      end
    end
    result
  end
end

#==============================================================================
# ■ Game_ActionResult
#==============================================================================
class Game_ActionResult
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_accessor :life_steal               # 吸血量
  attr_accessor :life_steal_active         # 是否触发吸血
  attr_accessor :life_steal_c_trigger      # 是否由暴击触发
  
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  alias life_steal_initialize initialize
  def initialize(battler)
    life_steal_initialize(battler)
    @life_steal = 0
    @life_steal_active = false
    @life_steal_c_trigger = false
  end
  
  #--------------------------------------------------------------------------
  # ● 清除
  #--------------------------------------------------------------------------
  alias life_steal_clear clear
  def clear
    life_steal_clear
    @life_steal = 0
    @life_steal_active = false
    @life_steal_c_trigger = false
  end
  
  #--------------------------------------------------------------------------
  # ● 生成伤害
  #--------------------------------------------------------------------------
  alias life_steal_make_damage make_damage
  def make_damage(value, item)
    life_steal_make_damage(value, item)
    @life_steal = @hp_damage if @hp_damage > 0 && @hp_drain == 0
  end
  
  #--------------------------------------------------------------------------
  # ● 获取HP伤害的文字(包含吸血信息)
  #--------------------------------------------------------------------------
  def hp_damage_text
    if @life_steal_active && @hp_damage > 0
      if @life_steal_c_trigger
        # 暴击触发的吸血特殊显示
        fmt = @battler.actor? ? "%s受到了%s点的伤害!被偷取了%sHP!" : "%s受到了%s点的伤害!被偷取了%sHP!"
      else
        fmt = @battler.actor? ? "%s受到了%s点的伤害!被偷取了%sHP!" : "%s受到了%s点的伤害!被偷取了%sHP!"
      end
      sprintf(fmt, @battler.name, @hp_damage, @life_steal)
    elsif @hp_drain > 0
      fmt = @battler.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
      sprintf(fmt, @battler.name, Vocab::hp, @hp_drain)
    elsif @hp_damage > 0
      fmt = @battler.actor? ? Vocab::ActorDamage : Vocab::EnemyDamage
      sprintf(fmt, @battler.name, @hp_damage)
    elsif @hp_damage < 0
      fmt = @battler.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
      sprintf(fmt, @battler.name, Vocab::hp, -hp_damage)
    else
      fmt = @battler.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage
      sprintf(fmt, @battler.name)
    end
  end
end

#==============================================================================
# ■ Game_Action
#==============================================================================
class Game_Action
  #--------------------------------------------------------------------------
  # ● 获取技能/物品的总吸血率
  #--------------------------------------------------------------------------
  def total_life_steal_rate
    rate = 0.0
   
    # 类型A:从所有特性中累计
    rate += subject.life_steal_a_total
   
    # 类型B:从当前技能中获取(如果存在)
    if item && item.respond_to?(:life_steal_b_rate)
      rate += item.life_steal_b_rate
    end
   
    # 类型C:暴击时触发,这里先记录,实际触发在item_apply中判断
    @life_steal_c_rate = subject.life_steal_c_total
   
    [[rate, 1.0].min, 0.0].max
  end
  
  #--------------------------------------------------------------------------
  # ● 获取技能/物品的暴击吸血率
  #--------------------------------------------------------------------------
  def life_steal_c_rate
    @life_steal_c_rate || 0.0
  end
  
  #--------------------------------------------------------------------------
  # ● 判定是否有吸血效果(普通吸血)
  #--------------------------------------------------------------------------
  def life_steal?
    total_life_steal_rate > 0
  end
  
  #--------------------------------------------------------------------------
  # ● 判定是否有暴击吸血效果
  #--------------------------------------------------------------------------
  def life_steal_c?
    life_steal_c_rate > 0
  end
end

#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
  #--------------------------------------------------------------------------
  # ● 应用技能/物品的效果
  #--------------------------------------------------------------------------
  alias life_steal_item_apply item_apply
  def item_apply(user, item)
    # 记录吸血率
    @life_steal_rate = 0
    @life_steal_c_rate = 0
    @life_steal_mod = 1.0
    @life_steal_resist = 1.0
   
    # 获取吸血率 - 直接从user身上获取,不依赖于current_action
    if user.respond_to?(:life_steal_a_total)
      @life_steal_rate = user.life_steal_a_total
    end
   
    # 技能吸血B(从技能本身获取)
    if item && item.respond_to?(:life_steal_b_rate)
      @life_steal_rate += item.life_steal_b_rate
    end
   
    # 暴击吸血C
    if user.respond_to?(:life_steal_c_total)
      @life_steal_c_rate = user.life_steal_c_total
    end
   
    # 吸血加成
    if user.respond_to?(:life_steal_mod_total)
      @life_steal_mod = user.life_steal_mod_total
    end
   
    # 执行原处理(会调用make_damage_value)
    life_steal_item_apply(user, item)
   
    # 处理吸血效果 - 使用最终伤害
    damage_for_steal = @result.hp_damage
   
    if damage_for_steal > 0 && @result.hp_drain == 0
      @life_steal_resist = self.life_steal_resist_total
      
      base_steal = 0
      is_critical_steal = false
      
      if @life_steal_rate > 0
        base_steal = (damage_for_steal * @life_steal_rate).to_i
      end
      
      if @result.critical && @life_steal_c_rate > 0
        c_steal = (damage_for_steal * @life_steal_c_rate).to_i
        base_steal += c_steal
        is_critical_steal = true
      end
      
      if base_steal > 0
        if @life_steal_mod != 1.0
          base_steal = (base_steal * @life_steal_mod).to_i
        end
        
        if @life_steal_resist != 1.0
          base_steal = (base_steal * @life_steal_resist).to_i
        end
        
        if base_steal > 0
          @result.life_steal = base_steal
          @result.life_steal_active = true
          @result.life_steal_c_trigger = is_critical_steal
         
          user.hp += base_steal
         
          # 播放恢复音效(不喜欢的可自行修改或删除)
          Sound.play_recovery if user.actor?
        end
      end
    end
   
    @life_steal_rate = 0
    @life_steal_c_rate = 0
    @life_steal_mod = 1.0
    @life_steal_resist = 1.0
  end
end
#==============================================================================
# ■ Window_BattleLog
#==============================================================================
class Window_BattleLog
  #--------------------------------------------------------------------------
  # ● 显示HP伤害
  #--------------------------------------------------------------------------
  def display_hp_damage(target, item)
    return if target.result.hp_damage == 0 && item && !item.damage.to_hp?
   
    if target.result.hp_damage > 0 && target.result.hp_drain == 0 && !target.result.life_steal_active
      target.perform_damage_effect
    end
   
    Sound.play_recovery if target.result.hp_damage < 0
    add_text(target.result.hp_damage_text)
    wait
  end
end[/pre]

在 角色、职业、技能、武器、护甲、敌人、状态 备注栏添加使用:

<吸血A 20%> 通用吸血:持有者造成伤害时,回复20%HP。

<吸血B 20%> 技能吸血:仅技能备注生效,使该技能造成伤害时回复20%HP。

<吸血C 20%> 暴击吸血:仅暴击时,触发吸血效果。

吸血A 吸血B 吸血C 可组合生效!

示例:

吸血A[10%] + 吸血B[20%] + 吸血C[30%]

角色 对 敌人 使用 吸血技能 同时 该技能暴击了,将会根据伤害吸取60%的HP

没有暴击,吸取30% ◆ 不是吸血技能,但暴击了40% ◆ 两者都不是,10%

注意!吸血ABC造成的吸血效果不会超过原伤害值

如果想“造成100的伤害,吸200的血”可以通过“吸血加成”和“吸血抗性”来实现

<吸血加成 100%>你的 角色/敌人 吸血时的效果修正 [110%等于+10%,90%等于-10%]

<吸血抗性 100%>你的 角色/敌人 被吸血时的效果修正 [90%等于+10%,110%等于-10%]

示例:

吸血A[50%] × 吸血加成[130%] × 吸血抗性[90%]

角色 对 敌人 造成任意伤害,都会吸取65%的HP

如果 敌人 有10%的吸血抗性,那就只会吸取59%的HP

战斗日志会显示吸了多少血
XXX受到了100点的伤害!被偷取了50HP!

评分

参与人数 1赞 +1 收起 理由
BCJT + 1 精品文章

查看全部评分

梦石
0
星屑
7066
在线时间
607 小时
注册时间
2017-11-10
回帖
656

极短21参与

发表于 2026-3-11 08:38:58 | 显示全部楼层
本帖最后由 BCJT 于 2026-3-11 09:01 编辑

效果很棒,但是在反击时好像没有效果,可能是我用了不兼容的脚本
回复

使用道具 举报

梦石
0
星屑
3037
在线时间
388 小时
注册时间
2015-1-29
回帖
12
 楼主| 发表于 2026-3-12 16:10:30 | 显示全部楼层
BCJT 发表于 2026-3-11 08:38
效果很棒,但是在反击时好像没有效果,可能是我用了不兼容的脚本

现在可以了_(:з」∠)_

点评

多谢大佬,这脚本很实用,能实现很多效果!  发表于 2026-3-12 18:20
@BCJT 所以把后方的if user.actor?给删掉就好了  发表于 2026-3-12 17:59
第348行Sound.play_recovery if user.actor?的意思就是只有在角色的攻击触发吸血时才会播放回复的音效  发表于 2026-3-12 17:58
大佬,我又发现个问题:敌人的攻击触发吸血时没有回复的音效!!  发表于 2026-3-12 17:23

评分

参与人数 1赞 +1 收起 理由
BCJT + 1 认可答案

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部