じ☆ve冰风 发表于 7 天前

【脚本】吸血效果

RUBY 代码
#==============================================================================
# $SDrop$
# 吸血效果By猫易箱
#------------------------------------------------------------------------------
# 在 角色、职业、技能、武器、护甲、敌人、状态 备注使用:
#
#          - 通用吸血:让持有者造成伤害时,产生吸血效果
#          - 技能吸血:技能专用!让技能自带吸血效果
#          - 暴击吸血:A的变种,暴击时产生吸血效果
#
#      - 攻击方的吸血修正(大于100%增加,小于100%减少)
#      - 受击方的吸血修正(大于100%增加,小于100%减少)
#
#   吸血公式:伤害 × 吸血率 × 吸血加成 × 吸血抗性
#   战斗消息显示:XXX受到了100点的伤害!被偷取了50HP!
#
#==============================================================================

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

#==============================================================================
# ■ RPG::BaseItem
#==============================================================================
classRPG::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 =~ //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 =~ //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 =~ //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 =~ //i ? $1.to_i / 100.0 : 1.0
end
end

#==============================================================================
# ■ RPG::Skill
#==============================================================================
classRPG::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 =~ //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.eachdo |obj|
      result += obj.life_steal_a_rateif obj.respond_to?(:life_steal_a_rate)
    end
    [.min, 0.0].max
end

#--------------------------------------------------------------------------
# ● 获取总吸血C比率(从所有特性中累计)
#--------------------------------------------------------------------------
def life_steal_c_total
    result = 0.0
    feature_objects.eachdo |obj|
      result += obj.life_steal_c_rateif obj.respond_to?(:life_steal_c_rate)
    end
    [.min, 0.0].max
end

#--------------------------------------------------------------------------
# ● 获取总吸血加成倍率(所有修正倍率的乘积)
#--------------------------------------------------------------------------
def life_steal_mod_total
    result = 1.0
    feature_objects.eachdo |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.eachdo |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_damageif@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

    [.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

    if user.current_action
      action = user.current_action
      @life_steal_rate = action.total_life_steal_rate
      @life_steal_c_rate = action.life_steal_c_rate
    end

    # 记录使用者的吸血加成倍率
    @life_steal_mod = user.life_steal_mod_totalif user.respond_to?(:life_steal_mod_total)

    # 执行原处理
    life_steal_item_apply(user, item)

    # 处理吸血效果
    if@result.hp_damage > 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 = (@result.hp_damage * @life_steal_rate).to_i
      end

      # 处理暴击吸血(如果本次攻击是暴击)
      if@result.critical && @life_steal_c_rate > 0
      c_steal = (@result.hp_damage * @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_recoveryif 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)
    returnif 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_recoveryif target.result.hp_damage < 0
    add_text(target.result.hp_damage_text)
    wait
end
end


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

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

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

暴击吸血:仅暴击时,触发吸血效果。

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

如:
吸血A × 吸血B × 吸血C
吸血A × 吸血A × 吸血B
吸血C × 吸血C × 吸血C

注意!吸血ABC最大的组合限制为100%

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

吸血时的效果修正

被吸血时的效果修正

110%等于+10%,90%等于-10%

战斗日志会显示吸了多少血
XXX受到了100点的伤害!被偷取了50HP!
            本帖来自P1论坛作者SmallDrop,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=498671若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页: [1]
查看完整版本: 【脚本】吸血效果